|
內(nèi)含完整原理圖設(shè)計(jì)、文檔等
原理圖
元件清單:
元件型號(hào) 元件名稱 元件標(biāo)號(hào)
10uF 電容 C1
20PF 電容 C2, C3
10uF 電容 C4
1uF 電容 C5, C6
LED-R-3mm 指示燈 D1
LCD12864 液晶 LCD1
10K 可調(diào)電阻 RV1
10K 電阻 R2
330歐 電阻 R3, R4, R13
20K 電阻 R5, R6
10K 電阻 R7, R8
56k 電阻 R9
6.8K 電阻 R10
24K 電阻 R11
100K 電阻 R12
SW-PB 按鍵 S1
STC89C52 單片機(jī) U1
ST188 光電開(kāi)關(guān) U2
LM358 放大器 U3
12M 晶振 Y1
單片機(jī)源程序如下:
- #include <reg52.h> //調(diào)用單片機(jī)頭文件
- #define uchar unsigned char //無(wú)符號(hào)字符型 宏定義 變量范圍0~255
- #define uint unsigned int //無(wú)符號(hào)整型 宏定義 變量范圍0~65535
- sbit rs=P2^5; //寄存器選擇信號(hào) H:數(shù)據(jù)寄存器 L:指令寄存器
- sbit rw=P2^6; //寄存器選擇信號(hào) H:數(shù)據(jù)寄存器 L:指令寄存器
- sbit e =P2^7; //片選信號(hào) 下降沿觸發(fā)
- unsigned char i=0,timecount=0,displayOK=0,rate=0,aa=0;
- unsigned int time[6]={0};
- /***********************1ms延時(shí)函數(shù)*****************************/
- void delay_1ms(uint q)
- {
- uint i,j;
- for(i=0;i<q;i++)
- for(j=0;j<120;j++);
- }
-
- /************ 延時(shí)函數(shù) *****************/
- void delay_uint(uint z)
- {
- while(z--);
- }
- /************ 寫命令函數(shù) *****************/
- void write_com(uchar com)
- {
-
- P0=com;
- rw=0;
- rs=0;
- delay_uint(25);
- e=1;
- delay_uint(50);
- e=0;
- }
- /************ 寫數(shù)據(jù)函數(shù) *****************/
- void write_data(uchar dat)
- {
- P0=dat;;
- rw=0;
- rs=1;
- delay_uint(25);
- e=1;
- delay_uint(50);
- e=0;
- }
- /**********************************************************
- *函數(shù)名: addr_12864
- *功能:寫地址
- *說(shuō)明:寫漢字時(shí)要寫個(gè)地址
- *輸入:無(wú)
- *返回:無(wú)
- **********************************************************/
- void addr_12864(uchar hang,uchar lie) //地址轉(zhuǎn)換
- {
- 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上顯示兩位十進(jìn)制數(shù)************************/
- 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);
- }
- /**********************************************************
- *函數(shù)名: write_string
- *功能:在12864上顯示字符數(shù)據(jù)
- *說(shuō)明:
- *輸入:無(wú)
- *返回:無(wú)
- **********************************************************/
- void write_string(uchar hang,uchar lie,uchar *p)
- {
- addr_12864(hang,lie); //地址轉(zhuǎn)換
- while(*p != '\0')
- {
- write_data(*p);
- p++;
- delay_uint(50);
- }
- }
- /********************************************************************
- * 名稱 : init_12864()
- * 功能 : 初始化函數(shù)
- * 輸入 : cmdcode
- * 輸出 : 無(wú)
- ***********************************************************************/
- 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," ");
- }
- /*************定時(shí)器0初始化程序***************/
- void time_init()
- {
- EA = 1; //開(kāi)總中斷
- TMOD = 0X01; //定時(shí)器0、定時(shí)器1工作方式1
- ET0 = 1; //開(kāi)定時(shí)器0中斷
- TR0 = 1; //允許定時(shí)器0定時(shí)
- }
- /***********外部中斷0初始化程序****************/
- void init_int0() //外部中斷0初始化程序
- {
- EX0=1; //允許外部中斷0中斷
- EA=1; //開(kāi)總中斷
- IT0 = 1; //外部中斷0負(fù)跳變中斷
- }
- /****************主函數(shù)***************/
- void main()
- {
- init_12864(); //12864初始化
- time_init(); //初始化定時(shí)器
- init_int0(); //外部中斷0初始化程序
- while(1)
- {
- if(displayOK==0)//如果顯示關(guān)
- {
- rate = 0;
- }
- else//如果顯示開(kāi)
- {
- 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) //當(dāng)連續(xù)兩次檢測(cè)時(shí)間間隔小于8*50ms=400ms不處理
- {
- TR0=1;//開(kāi)定時(shí)器
- }
- else
- {
- time[i]=timecount*50+TH0+TL0;//算出間隔時(shí)間
- TH0 = 0x3c;
- TL0 = 0xb0; // 50ms 12M
- timecount=0;//50ms計(jì)數(shù)清零
- i++;
- if(i==6)//記錄到超過(guò)等于6次時(shí)間
- {
- i=1;//計(jì)數(shù)從1開(kāi)始
- displayOK=1; //測(cè)得5次開(kāi)始顯示?
- }
- }
- }
- /*************定時(shí)器0中斷服務(wù)程序***************/
- void time0_int() interrupt 1
- {
- TH0 = 0x3c;
- TL0 = 0xb0; // 50ms 12M
- timecount++;//每50ms一次計(jì)數(shù)
- if(timecount>25) //當(dāng)超過(guò)25*50ms=1.5s沒(méi)有檢測(cè)到信號(hào)停止顯示
- {
- i=0;//數(shù)據(jù)個(gè)數(shù)清零
- timecount=0;//50ms計(jì)數(shù)清零
- displayOK=0;//顯示關(guān)
- TR0=0;//定時(shí)器關(guān)
- TH0 = 0x3c;
- TL0 = 0xb0; // 50ms 12M
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
單片機(jī)脈搏計(jì) 12864.7z
(1.45 MB, 下載次數(shù): 81)
2021-6-23 21:03 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|