一.原理图
二.程序 #include <reg52.h> #include <intrins.h>
#define uint unsigned int #define uchar unsigned char #define ulong unsigned long #define LCD_DATA P0
sbit LCD_RS =P2^5; sbit LCD_RW =P2^6; sbit LCD_E =P2^7;
sbit Xintiao =P1^0 ; sbit speaker =P2^4;
void delay5ms(void); //误差 0us void LCD_WriteData(uchar LCD_1602_DATA); /********LCD1602数据写入***********/ void LCD_WriteCom(uchar LCD_1602_COM); /********LCD1602命令写入***********/ void lcd_1602_word(uchar Adress_Com,uchar Num_Adat,uchar *Adress_Data); /*1602字符显示函数,变量依次为字符显示首地址,显示字符长度,所显示的字符*/ void InitLcd();
void Tim_Init();
uchar Xintiao_Change=0; uint Xintiao_Jishu; uchar stop; uchar View_Data[3]; uchar View_L[3]; uchar View_H[3]; uchar Xintiao_H=100; uchar Xintiao_L=40;
uchar Key_Change; uchar Key_Value; uchar View_Con; uchar View_Change;
void main() { InitLcd(); Tim_Init(); lcd_1602_word(0x80,16,"Heart Rate: "); TR0=1; TR1=1; while(1) { if(Key_Change) { Key_Change=0; View_Change=1; switch(Key_Value) { case 1: { View_Con++; if(View_Con==3) View_Con=0; break; } case 2: { if(View_Con==2) { if(Xintiao_H<150) Xintiao_H++; } if(View_Con==1) { if(Xintiao_L<Xintiao_H-1) Xintiao_L++; } break; } case 3: { if(View_Con==2) { if(Xintiao_H>Xintiao_L+1) Xintiao_H--; } if(View_Con==1) { if(Xintiao_L>30) Xintiao_L--; } break; } } } if(View_Change) { View_Change=0; if(stop==0) { if(View_Data[0]==0x30) View_Data[0]=' '; } else { View_Data[0]=' '; View_Data[1]=' '; View_Data[2]=' '; }
switch(View_Con) { case 0: { lcd_1602_word(0x80,16,"Heart Rate: "); lcd_1602_word(0xc0,16," "); lcd_1602_word(0xcd,3,View_Data); break; } case 1: { lcd_1602_word(0x80,16,"Heart Rate: "); lcd_1602_word(0x8d,3,View_Data);
View_L[0]=Xintiao_L/100+0x30; View_L[1]=Xintiao_L%100/10+0x30; View_L[2]=Xintiao_L%10+0x30;
if(View_L[0]==0x30) View_L[0]=' ';
lcd_1602_word(0xC0,16,"Warning L : "); lcd_1602_word(0xCd,3,View_L); break; } case 2: { lcd_1602_word(0x80,16,"Heart Rate: "); lcd_1602_word(0x8d,3,View_Data);
View_H[0]=Xintiao_H/100+0x30; View_H[1]=Xintiao_H%100/10+0x30; View_H[2]=Xintiao_H%10+0x30;
if(View_H[0]==0x30) View_H[0]=' ';
lcd_1602_word(0xC0,16,"Warning H : "); lcd_1602_word(0xCd,3,View_H); break; } } } } }
void Time1() interrupt 3 { static uchar Key_Con,Xintiao_Con; TH1=0xd8; //10ms TL1=0xf0; switch(Key_Con) { case 0: { if((P3&0x07)!=0x07) { Key_Con++; } break; } case 1: { if((P3&0x07)!=0x07) { Key_Con++; switch(P3&0x07) { case 0x06:Key_Value=1;break; case 0x05:Key_Value=2;break; case 0x03:Key_Value=3;break; } } else { Key_Con=0; } break; } case 2: { if((P3&0x07)==0x07) { Key_Change=1; Key_Con=0; } break; } }
switch (Xintiao_Con) { case 0: { if(!Xintiao) { Xintiao_Con++; } break; } case 1: { if(!Xintiao) { Xintiao_Con++; } else { Xintiao_Con=0; } break; } case 2: { if(!Xintiao) { Xintiao_Con++; } else { Xintiao_Con=0; } break; } case 3: { if(!Xintiao) { Xintiao_Con++; } else { Xintiao_Con=0; } break; } case 4: { if(Xintiao) { if(Xintiao_Change==1) { View_Data[0]=(60000/Xintiao_Jishu)/100+0x30; View_Data[1]=(60000/Xintiao_Jishu)%100/10+0x30; View_Data[2]=(60000/Xintiao_Jishu)%10+0x30;
if(((60000/Xintiao_Jishu)>=Xintiao_H)||((60000/Xintiao_Jishu)<=Xintiao_L)) speaker=0; else speaker=1;
View_Change=1; Xintiao_Jishu=0; Xintiao_Change=0; stop=0; } else { Xintiao_Jishu=0; Xintiao_Change=1; } Xintiao_Con=0; break; } } } }
void Time0() interrupt 1 { TH0=0xfc; //1ms TL0=0x18; Xintiao_Jishu++; if(Xintiao_Jishu==5000) { Xintiao_Jishu=0; View_Change=1; Xintiao_Change=0; stop=1; speaker=1; } }
void Tim_Init() { EA=1; ET0=1; ET1=1; TMOD=0x11; TH0=0xfc; //1ms TL0=0x18;
TH1=0xd8; //10ms TL1=0xf0; }
void lcd_1602_word(uchar Adress_Com,uchar Num_Adat,uchar *Adress_Data) { uchar a=0; uchar Data_Word; LCD_WriteCom(Adress_Com); for(a=0;a<Num_Adat;a++) { Data_Word=*Adress_Data; LCD_WriteData(Data_Word); Adress_Data++; } }
/***************1602函数*******************/ void LCD_WriteData(uchar LCD_1602_DATA) /********LCD1602数据写入***********/ { delay5ms(); //操作前短暂延时,保证信号稳定 LCD_E=0; LCD_RS=1; LCD_RW=0; _nop_(); LCD_E=1; LCD_DATA=LCD_1602_DATA; LCD_E=0; LCD_RS=0; }
/********LCD1602命令写入***********/ void LCD_WriteCom(uchar LCD_1602_COM) { delay5ms();//操作前短暂延时,保证信号稳定 LCD_E=0; LCD_RS=0; LCD_RW=0; _nop_(); LCD_E=1; LCD_DATA=LCD_1602_COM; LCD_E=0; LCD_RS=0; }
void InitLcd() { delay5ms(); delay5ms(); LCD_WriteCom(0x38); //display mode LCD_WriteCom(0x38); //display mode LCD_WriteCom(0x38); //display mode LCD_WriteCom(0x06); //显示光标移动位置 LCD_WriteCom(0x0c); //显示开及光标设置 LCD_WriteCom(0x01); //显示清屏 delay5ms(); delay5ms(); }
void delay5ms(void) //误差 0us { unsigned char a,b; for(b=185;b>0;b--) for(a=12;a>0;a--); } 有什么问题私聊我。
|