仿真图
原理图:
单片机源程序:
- #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--);
- }
复制代码
|