內含完整原理圖設計、文檔等
H801ERF3FHW]4%9O}5O{J.png (76.73 KB, 下載次數: 74)
下載附件
原理圖
2021-1-9 19:59 上傳
傳感器的引腳圖.png (48.06 KB, 下載次數: 52)
下載附件
2021-1-9 23:07 上傳
元件清單:
51hei.png (26.14 KB, 下載次數: 61)
下載附件
2021-1-9 23:08 上傳
元件型號 元件名稱 元件標號
10uF 電容 C1
20PF 電容 C2, C3
10uF 電容 C4
1uF 電容 C5, C6
LED-R-3mm 指示燈 D1
LCD12864 液晶 LCD1
10K 可調電阻 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 單片機 U1
ST188 光電開關 U2
LM358 放大器 U3
12M 晶振 Y1
單片機源程序如下:
- #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
- }
- }
復制代碼
所有資料51hei提供下載:
單片機脈搏計 12864.7z
(1.45 MB, 下載次數: 81)
2021-6-23 21:03 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|