附上单片机的程序,希望大家帮帮我orz指出错误和改正方法
- #include <reg52.h> //调用单片机头文件#define uchar unsigned char //无符号字符型 宏定义 变量范围0~255
- #define uint unsigned int //无符号整型 宏定义 变量范围0~65535
- sbit rs=P2^5; //寄存器选择信号 H:数据寄存器 L:指令寄存器
- sbit rw=P2^6; //寄存器选择信号 H:数据寄存器 L:指令寄存器
- sbit e =P2^7; //片选信号 下降沿触发
- unsigned char i=0,timecount=0,displayOK=0,rate=0,aa=0;
- unsigned int time[6]={0};
- /***********************1ms延时函数*****************************/
- void delay_1ms(uint q)
- {
- uint i,j;
- for(i=0;i<q;i++)
- for(j=0;j<120;j++);
- }
-
- /************ 延时函数 *****************/
- void delay_uint(uint z)
- {
- while(z--);
- }
- /************ 写命令函数 *****************/
- void write_com(uchar com)
- {
- P0=com;
- rw=0;
- rs=0;
- delay_uint(25);
- e=1;
- delay_uint(50);
- e=0;
- }
- /************ 写数据函数 *****************/
- void write_data(uchar dat)
- {
- P0=dat;;
- rw=0;
- rs=1;
- delay_uint(25);
- e=1;
- delay_uint(50);
- e=0;
- }
- /**********************************************************
- *函数名: addr_12864
- *功能:写地址
- *说明:写汉字时要写个地址
- *输入:无
- *返回:无
- **********************************************************/
- void addr_12864(uchar hang,uchar lie) //地址转换
- {
- uchar address;
- switch(hang)
- {
- case 1: address=0x80 + lie ;
- break;
- case 2: address=0x90 + lie ;
- break;
- case 3: address=0x88 + lie ;
- break;
- case 4: address=0x98 + lie ;
- break;
- default :
- break;
- }
- write_com(address);
- }
- /***********************lcd1602上显示两位十进制数************************/
- void write_sfm3(uchar hang,uchar add,uint date)
- {
- addr_12864(hang,add);
- write_data(':');
- write_data(0x30+date/100%10);
- write_data(0x30+date/10%10);
- write_data(0x30+date%10);
- }
- /**********************************************************
- *函数名: write_string
- *功能:在12864上显示字符数据
- *说明:
- *输入:无
- *返回:无
- **********************************************************/
- void write_string(uchar hang,uchar lie,uchar *p)
- {
- addr_12864(hang,lie); //地址转换
- while(*p != '\0')
- {
- write_data(*p);
- p++;
- delay_uint(50);
- }
- }
- /********************************************************************
- * 名称 : init_12864()
- * 功能 : 初始化函数
- * 输入 : cmdcode
- * 输出 : 无
- ***********************************************************************/
- void init_12864()
- {
- write_com(0x30);
- write_com(0x0c);
- write_com(0x01);
- delay_uint(5000);
- write_string(1,0," ");
- write_string(2,0," 心率:000/min ");
- write_string(3,0," ");
- write_string(4,0," ");
- }
- /*************定时器0初始化程序***************/
- void time_init()
- {
- EA = 1; //开总中断
- TMOD = 0X01; //定时器0、定时器1工作方式1
- ET0 = 1; //开定时器0中断
- TR0 = 1; //允许定时器0定时
- }
- /***********外部中断0初始化程序****************/
- void init_int0() //外部中断0初始化程序
- {
- EX0=1; //允许外部中断0中断
- EA=1; //开总中断
- IT0 = 1; //外部中断0负跳变中断
- }
- /****************主函数***************/
- void main()
- {
- init_12864(); //12864初始化
- time_init(); //初始化定时器
- init_int0(); //外部中断0初始化程序
- while(1)
- {
- if(displayOK==0)//如果显示关
- {
- rate = 0;
- }
- else//如果显示开
- {
- rate=60000/(time[1]/5+time[2]/5+time[3]/5+time[4]/5+time[5]/5);
- }
- write_sfm3(2,5,rate);
- delay_1ms(300);
- }
- }
- void int0() interrupt 0
- {
- if(timecount<8) //当连续两次检测时间间隔小于8*50ms=400ms不处理
- {
- TR0=1;//开定时器
- }
- else
- {
- time[i]=timecount*50+TH0+TL0;//算出间隔时间
- TH0 = 0x3c;
- TL0 = 0xb0; // 50ms 12M
- timecount=0;//50ms计数清零
- i++;
- if(i==6)//记录到超过等于6次时间
- {
- i=1;//计数从1开始
- displayOK=1; //测得5次开始显示?
- }
- }
- }
- /*************定时器0中断服务程序***************/
- void time0_int() interrupt 1
- {
- TH0 = 0x3c;
- TL0 = 0xb0; // 50ms 12M
- timecount++;//每50ms一次计数
- if(timecount>25) //当超过25*50ms=1.5s没有检测到信号停止显示
- {
- i=0;//数据个数清零
- timecount=0;//50ms计数清零
- displayOK=0;//显示关
- TR0=0;//定时器关
- TH0 = 0x3c;
- TL0 = 0xb0; // 50ms 12M
- }
- }
复制代码 |