STC单片机单片机模块化总结

2019-04-15 19:27发布

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头文件。定义时可以赋初值,声明时不可以赋初值。