控制/MCU
设计功能:
1.ST188光电传感器检测脉搏信号,并有脉搏信号指示灯;
2.具有温度检测功能,可检测人体温度,温度传感器为DS18B20;
3.脉搏和温度检测完成后,LCD1602会显示当前温度和脉搏数值;
4.增加语音播报功能,显示完成后可语音播报脉搏和温度数值;
5.按键可设置脉搏检测的安全范围;
6.超出所设安全范围时,蜂鸣器报警;
部分程序:
#include //调用单片机头文件
#define uchar unsigned char //无符号字符型 宏定义 变量范围0~255
#define uint unsigned int //无符号整型 宏定义 变量范围0~65535
#include
bit flag_300ms ;
bit q;
uchar menu_1=0; //菜单设计的变量
sbit beep = P3^7; //蜂鸣器IO口定义
uchar flag_200ms ;
/ 语音模块控制IO口的定义 */
sbit VRST = P2^4;
sbit VBUSY= P2^0;
sbit VSDA = P2^1;
sbit VCS = P2^2;
sbit VSCL = P2^3;
uchar yujing[3];
uchar code table_num[]="0123456789abcdefg";
sbit rs=P1^0; //寄存器选择信号 H:数据寄存器 L:指令寄存器
sbit rw=P1^1; //寄存器选择信号 H:数据寄存器 L:指令寄存器
sbit e =P1^2; //片选信号 下降沿触发
unsigned char i=0,timecount=0,displayOK=0,rate=0,aa=0;
unsigned int time[6]={0};
uchar rate_l=50,rate_h=120; //心跳报警值
sbit dq = P3^3; //18b20 IO口的定义
uint temperature ; //
/ 1ms延时函数 ******/
void delay_1ms(uint q)
{
uint i,j;
for(i=0;i
for(j=0;j<110;j++);
}
void delay_uint(uint q)
{
while(q--);
}
void write_com(uchar com)
{
delay_uint(25);
e=0;
rs=0;
rw=0;
delay_uint(25);
e=1;
P0=com;
delay_uint(100);
e=0;
}
void write_data(uchar dat)
{
delay_uint(25);
e=0;
rs=1;
rw=0;
delay_uint(25);
e=1;
P0=dat;
delay_uint(100);
e=0;
rs=0;
}
void write_string(uchar hang,uchar add,uchar *p)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
while(1)
{
if(*p == '�') break;
write_data(*p);
p++;
}
}
/ 控制光标函数 ***/
void write_guangbiao(uchar hang,uchar add,uchar date)
{
if(hang == 1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
if(date == 1)
{
write_com(0x0f); //显示光标并且闪烁
}
else
write_com(0x0c); //关闭光标
}
/ lcd1602上显示两位十进制数 */
void write_sfm3(uchar hang,uchar add,uint date)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
write_data(0x30+date/100%10);
write_data(0x30+date/10%10);
write_data(0x30+date%10);
}
void write_sfm4(uchar hang,uchar add,uint date)
{
if(hang==1)
write_com(0x80+add);
else
write_com(0x80+0x40+add);
write_data(0x30+date/100);
write_data(0x30+date%100/10);
write_data('.');
//write_data(0x30+(date%100)/10);
write_data(0x30+(date%100)%10);
}
/ lcd1602初始化设置 */
void init_1602()
{
write_com(0x38);
write_com(0x0c);
write_com(0x06);
delay_uint(1000);
write_string(1,0," 000/min 00. ");
write_string(2,0," H:000 L:000 ");
write_sfm3(2,4,rate_h);
write_sfm3(2,11,rate_l);
}
/ 18b20初始化函数 ******/
void init_18b20()
{
//bit q;
dq = 1; //把总线拿高
delay_uint(2); //15us
dq = 0; //给复位脉冲
delay_uint(80); //750us
dq = 1; //把总线拿高 等待
delay_uint(10); //110us
q = dq; //读取18b20初始化信号
delay_uint(40); //200us
dq = 1; //把总线拿高 释放总线
}
/ 写18b20内的数据 **/
void write_18b20(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{ //写数据是低位开始
dq = 0; //把总线拿低写时间隙开始
dq = dat & 0x01; //向18b20总线写数据了
delay_uint(5); // 60us
dq = 1; //释放总线
dat >>= 1;
}
}
/ 读取18b20内的数据 **/
uchar read_18b20()
{
uchar i,value=0;
for(i=0;i<8;i++)
{
dq = 0; //把总线拿低读时间隙开始
value >>= 1; //读数据是低位开始
delay_uint(1);
dq = 1; //释放总线
if(dq == 1) //开始读写数据
value |= 0x80;
delay_uint(5); //60us 读一个时间隙最少要保持60us的时间
}
return value; //返回数据
}
/ 读取温度的值 读出来的是小数 **/
uint read_temp( )
{
float tt=0;
uint value;
全部0条评论
快来发表一下你的评论吧 !