1.背景介绍
硬件:使用STC90C516RD+单片机
软件:keil 4.10
启动创建项目文件为:STC90C58RD+。
2.程序介绍
2.1 主程序 main.c
#include
#include"MacroAndConst.h"//类型定义
#include"1602.h"
#include"HMC5883L.h"
#include"beep.h"
uchar ge,shi,bai,qian,wan;
unsigned char Flag_FirTime=1;// 等于1表示第一次读取到磁场值
unsigned char Flag_Car_Satus=0;//等于零表示无车
void delay(unsigned int k);
void main(void)
{ //unsigned int i;
BYTE BUF[6]; //注意不能定义为code区域,否则无改变
unsigned int Mag_Buffer[16]; //定义了16个缓冲区缓冲区,注意不能定义为code区域,否则无改变
unsigned int Mag_Sliding;//Mag_Sliding为滑动平均滤波得到的值,供1602液晶显示。
unsigned int Mag_BL;//基准值,在没有检查到车辆时更新,1602液晶显示。
InitLcd();
Init_HMC5883();
Multiple_read_HMC5883(BUF);
Mag_Initial_Fill(BUF,Mag_Buffer);
while(1)
{
if(Flag_Car_Satus==1)
Beep_On();
else
Beep_Off();
Multiple_read_HMC5883(BUF);
Mag_Sliding=Get_Data(Mag_Buffer, Mag_Abs_xyz(BUF),16);
//以下是显示处理
//conversion(BUF[0],&wan,&qian,&bai,&shi,&ge);
conversion(Mag_Sliding,&wan,&qian,&bai,&shi,&ge);
DisplayOneChar(0,1,'S');
DisplayOneChar(1,1,':');
DisplayOneChar(2,1,wan);
DisplayOneChar(3,1,qian);
DisplayOneChar(4,1,bai);
DisplayOneChar(5,1,shi);
DisplayOneChar(6,1,ge);
Mag_Car_Satus(Mag_Sliding,&Mag_BL,&Flag_FirTime,&Flag_Car_Satus);
conversion(Mag_BL,&wan,&qian,&bai,&shi,&ge);
DisplayOneChar(8,1,'B');
DisplayOneChar(9,1,':');
DisplayOneChar(10,1,qian);
DisplayOneChar(11,1,bai);
DisplayOneChar(12,1,shi);
DisplayOneChar(13,1,ge);
conversion(Flag_Car_Satus,&wan,&qian,&bai,&shi,&ge);
DisplayOneChar(8,0,'C');
DisplayOneChar(9,0,':');
DisplayOneChar(10,0,qian);
DisplayOneChar(11,0,bai);
DisplayOneChar(12,0,shi);
DisplayOneChar(13,0,ge);
//for (i=0;i<1000;i++); //延时
}
}
2.2 MacroAndConst.h头文件
#ifndef _MACRO_AND_CONST_H_
#define _MACRO_AND_CONST_H_
typedef unsigned int uint16;
typedef unsigned int UINT16;
typedef unsigned int UINT;
typedef unsigned int uint;
typedef unsigned int word;
typedef unsigned int WORD;
typedef int int16;
typedef int INT16;
typedef unsigned long uint32;
typedef unsigned long UINT32;
typedef unsigned long dword;
typedef unsigned long DWORD;
typedef long int32;
typedef long INT32;
typedef signed char int8;
typedef signed char INT8;
typedef unsigned char uint8;
typedef unsigned char UINT8;
typedef unsigned char byte;
typedef unsigned char BYTE;
typedef unsigned char uchar;
typedef unsigned char UCHAR;
typedef unsigned char BOOL;
#endif
2.3 液晶屏"1602.h"和1602.c
"1602.h"
#ifndef __1602_H__
#define __1602_H__
#include
#include"MacroAndConst.h"
#include
#define DataPort P0 //LCD1602数据端口
sbit LCM_RS=P2^6; //LCD1602命令端口,6
sbit LCM_RW=P2^5; //LCD1602命令端口,5
sbit LCM_EN=P2^7; //LCD1602命令端口 ,7
extern void InitLcd();
extern void DisplayOneChar(uchar X,uchar Y,uchar DData);
#endif
"1602.c"
#include"1602.h"
void WaitForEnable(void)
{
}
void WriteCommandLCM(uchar CMD,uchar Attribc)
{
}
void WriteDataLCM(uchar dataW)
{
}
void InitLcd()
{
}
void DisplayOneChar(uchar X,uchar Y,uchar DData)
{
}
2.3 液晶屏"HMC5883L.h"和HMC5883L.c
"HMC5883L.h"
#ifndef __HMC5883L_H__
#define __HMC5883L_H__
#include
#include //Keil library
#include //Keil library
#include
#include"MacroAndConst.h"
//使用的端口,请按照以下接线
sbit SCL=P1^0; //IIC时钟引脚定义
sbit SDA=P1^1; //IIC数据引脚定义
#define SlaveAddress 0x3C //定义器件在IIC总线中的从地址//*********************************************************
//BYTE BUF[8]; //接收数据缓存区
//显示变量
//int dis_data; //变量
//unsigned char Flag_FirTime=1;// 等于1表示第一次读取到磁场值
//unsigned char Flag_Car_Satus=0;//等于零表示无车
//unsigned int Mag_Buffer[20];
void Delay5us();
void Delay5ms();
void HMC5883_Start();
void HMC5883_Stop();
void HMC5883_SendACK(bit ack);
bit HMC5883_RecvACK();
void HMC5883_SendByte(BYTE dat);
BYTE HMC5883_RecvByte();
void HMC5883_ReadPage();
void HMC5883_WritePage();
void Single_Write_HMC5883(uchar REG_Address,uchar REG_data); //单个写入数据
//uchar Single_Read_HMC5883(uchar REG_Address); //单个读取内部寄存器数据
extern void Init_HMC5883();
extern void Multiple_read_HMC5883(BYTE *BUF);
extern void Mag_Initial_Fill(BYTE *BUF,unsigned int *Mag_Buffer);
extern unsigned int Mag_Abs_xyz(BYTE *BUF);
extern void conversion(uint temp_data,uchar* wan,uchar* qian,uchar* bai,uchar* shi,uchar* ge);
extern unsigned int Get_Data(unsigned int *data_pointer, unsigned int data1, unsigned char data_num);
extern void Mag_Car_Satus(unsigned int Mag_Sliding,unsigned int* Mag_BL,unsigned char *Flag_FirTime,unsigned char *Flag_Car_Satus );
#endif
"HMC5883L.c"
#include"HMC5883L.h"
如下省略,为所有.h文件的实现。
2.4 液晶屏"beep.h"和beep.c
"beep.h"
#ifndef __BEEP_H__
#define __BEEP_H__
#include
#include"MacroAndConst.h"
sbit Buzzer=P1^3;//定义蜂鸣器报警
extern void Beep_On(void);
extern void Beep_Off(void);
#endif
"beep.c"
#include"beep.h"
void Delay_5ms()
{
WORD n = 560;
while (n--);
}
void Beep_On(void)
{
Buzzer=1;
Delay_5ms();
Buzzer=0;
Delay_5ms();
}
void Beep_Off(void)
{
Buzzer=0;
}
3.编程过程中出现问题及总结:
3.1大的原则
3.1.1防止重复包含的措施:头文件中要做如下处理
#ifndef __BEEP_H__
#define __BEEP_H__
body;
#endif
3.1.2
函数体的实现放在.c文件中,需要被外部调用的函数必须在.h文件中用extern声明;而仅被本源文件使用的函数可以放在头文件中声明,也可以不声明。最好声明增强可读性。
全局变量和宏定义做同样的处理
3.1.3
.c源文件不但要保存,最后也要将其加入到项目中去。
3.1.4
"HMC5883L.c"中包含void Delay5ms();则"beep.c"中不能出现同名函数,否则编译出错。
3.1.5 main.c文件中的BYTE BUF[6]; //注意不能定义在code区域,BYTE code BUF[6];因为code区域的内容无法在程序里改变,这样编译虽然通过,但读取值不对。
3.1.6全局变量的定义必须在.c源文件,声明在.h头文件。定义时可以赋初值,声明时不可以赋初值。