内含完整原理图设计、文档等
元件清单:
元件型号 元件名称 元件标号
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)
|