① 用51单片机实现温度报警器的程序,要正确的
/*使用举例:数码管
scan()
{
char k;
for(k=0;k<4;k++) //4位LED扫描控制
{
discan=0x00;
Disdata=dis_7[_1820display[k]]; //数据显示
if (k==1){DIN=0;} //小数点显示
discan=scan_con[k]; //位选
_18B20_delay(100);
}
}
main()
_18B20_init();//18B20初始化
while(1)
{
EA=0;//在利用18B20测试温度时,要严格遵循时序,禁止一切中断
_18B20_work(_18B20_read()); //处理温度数据
EA=1;//测试完毕,恢复系统中断
scan(); //显示温度值
}
*/
#include "intrins.h" //_nop_();延时函数用
//*****************//
//以下是DS18B20驱动程序
//*****************//
/**************************************************
** 功能描述: DS18B20驱动程序,使用12M晶体
** DQ占用引脚资源P1^7
****************************************************/sbit DQ=P1^7; //温度输入口unsigned char data temp_data[2]={0x00,0x00}; //读出温度暂放
unsigned char data _1820display[5]={0x00,0x00,0x00,0x00,0x00}; //显示单元数据,共4个数据和一个运算暂用
unsigned int temp;
//**************温度小数部分用查表法***********//
unsigned char code ditab[16]=
{
0x00,0x01,0x01,0x02,
0x03,0x03,0x04,0x04,
0x05,0x06,0x06,0x07,
0x08,0x08,0x09,0x09
};/*****************11us延时函数*************************/
//
void _18B20_delay(unsigned int t)
{
for (;t>0;t--);
}/****************DS18B20复位函数************************/
_18B20_reset(void)
{
char presence=1;
while(presence)
{
while(presence)
{
DQ=1;
_nop_();_nop_();//从高拉倒低
DQ=0;
_18B20_delay(50); //550 us
DQ=1;
_18B20_delay(6); //66 us
presence=DQ; //presence=0 复位成功,继续下一步
}
_18B20_delay(45); //延时500 us
presence=~DQ;
}
DQ=1; //拉高电平
}/****************DS18B20写命令函数************************/
//向1-WIRE 总线上写1个字节
void _18B20_write(unsigned char val)
{
unsigned char i;
for(i=8;i>0;i--)
{
DQ=1;
_nop_();_nop_(); //从高拉倒低
DQ=0;
_nop_();_nop_();_nop_();_nop_(); //5 us
DQ=val&0x01; //最低位移出
_18B20_delay(6); //66 us
val=val/2; //右移1位
}
DQ=1;
_18B20_delay(1);
}/****************DS18B20读1字节函数************************/
//从总线上取1个字节
unsigned char _18B20read_byte(void)
{
unsigned char i;
unsigned char value=0;
for(i=8;i>0;i--)
{
DQ=1;
_nop_();_nop_(); //从高拉倒低
value>>=1;
DQ=0;
_nop_();_nop_();_nop_();_nop_(); //4 us
DQ=1;
_nop_();_nop_();_nop_();_nop_(); //4 us
if(DQ)value|=0x80;
_18B20_delay(6); //66 us
}
DQ=1;
return(value);
}
_18B20_read() //读出温度函数
{
_18B20_reset(); //总线复位
_18B20_delay(200);
_18B20_write(0xcc); //发命令
_18B20_write(0x44); //发转换命令
_18B20_reset();
_18B20_delay(1);
_18B20_write(0xcc); //发命令
_18B20_write(0xbe);
temp_data[0]=_18B20read_byte(); //读温度值的低字节
temp_data[1]=_18B20read_byte(); //读温度值的高字节
temp=temp_data[1];
temp<<=8;
temp=temp|temp_data[0]; // 两字节合成一个整型变量。
return temp; //返回温度值
}/****************温度数据处理函数************************///二进制高字节的低半字节和低字节的高半字节组成一字节,这个
//字节的二进制转换为十进制后,就是温度值的百、十、个位值,而剩
//下的低字节的低半字节转化成十进制后,就是温度值的小数部分/********************************************************/
_18B20_work(unsigned int tem)
{
unsigned char n=0;
if(tem>6348) // 温度值正负判断
{
tem=65536-tem;
n=1;
} // 负温度求补码,标志位置1
_1820display[4]=tem&0x0f; // 取小数部分的值
_1820display[0]=ditab[_1820display[4]]; // 存入小数部分显示值
_1820display[4]=tem>>4; // 取中间八位,即整数部分的值
_1820display[3]=_1820display[4]/100; // 取百位数据暂存
_1820display[1]=_1820display[4]%100; // 取后两位数据暂存
_1820display[2]=_1820display[1]/10; // 取十位数据暂存
_1820display[1]=_1820display[1]%10;
/******************数码管符号位显示判断**************************/
if(!_1820display[3])
{
_1820display[3]=0x0a; //最高位为0时不显示
if(!_1820display[2])
_1820display[2]=0x0a; //次高位为0时不显示
}
if(n)
_1820display[3]=0x0b; //负温度时最高位显示"-"
}
/******************1602液晶符号位显示判断**************************/
if(!_1820display[3])
{
_1820display[3]=' '-'0'; //最高位为0时不显示
if(!_1820display[2])
_1820display[2]=' '-'0'; //次高位为0时不显示
}
if(n)
_1820display[3]='-'-'0'; //负温度时最高位显示"-"
} _18B20_init()//18B20初始化
{
_18B20_reset(); //开机先转换一次
_18B20_write(0xcc); //Skip ROM
_18B20_write(0x44); //发转换命令
}
② 求单片机控制温度传感器,LCD显示温度值,温度达到30度时,蜂鸣器报警的报警程序
这个有现成的,楼主可以省很多力气了,请在网上下一个proteusv7.8,里边程序,仿真电路都有。
楼主把两个程序中和一下就可以了。
改起来也不难,自己弄哦。
我受点累,楼主可以这样改:
1.1602引脚挪到P2口,及P3口,程序也要改哈,编译运行,这个非常简单。
2.再把1602剪下,粘贴到18b20那张图上;1602的程序也粘贴到18b20程序上,改掉标号重复的地方,改掉初始化程序。将18b20的结果显示在LCD上,如有必要,删除7段数码管程序。
③ 您好!如何用51单片机显示DS18b20温度传感器的温度变化,并通过蓝牙HC08传送数据给电脑代码有点难。
你好!
蓝牙通讯,是在串口通讯基础之上完成的,
先完成单片机驱动温度传感器,实现DS18B20的读取,
再进行串口通讯,实现和电脑串口收发数据,
加上蓝牙模块,实现无线传输
④ 求单片机程序关于温湿度。传感器采用DHT11,按键四个可以设置温湿度的上下限,显示用lcd1602,超限报警
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
typedef unsigned char unint8; //unint8 代替undigned char 提高可移植性
typedef unsigned char unint16;
unsigned char str1[]={" "};
unsigned char str2[]={" "};
unsigned char code dis1[] = {" Xh RH: "}; //定义数组
unsigned char code dis2[] = {" DO T: "};
sbit buz=P1^0;
sbit TRH = P1^7;//温湿度传感器DHT11数据接入
sbit LCD_RS = P1^1;
sbit LCD_RW = P1^2;
sbit LCD_EN = P1^3;
unint8 TH_data,TL_data,RH_data,RL_data,CK_data;
unint8 TH_temp,TL_temp,RH_temp,RL_temp,CK_temp;
unint8 com_data,untemp,temp;
unint8 respond;
void initcom()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
}
void send(unsigned char temp)
{
//send biao zi
SBUF=temp;
while(!TI);
TI=0;
}
void sendwd()
{
//send wen
uint w_d ;
w_d=TH_data+128;
SBUF=w_d;
while(!TI);
TI=0;
}
void sendsd()
{
//send shi
SBUF=RH_data;
while(!TI);
TI=0;
}
/*********************************************************************************/
void delayNOP() //延时
{
_nop_();
_nop_();
_nop_();
_nop_();
}
/*********************************************************************************/
/*********************************************************************************/
// 毫秒级延时子程序
/*********************************************************************************/
void delay_ms(unsigned int ms)
{
unsigned char i;
while(ms--)
{
for(i = 0; i< 150; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/*********************************************************************************/
/*********************************************************************************/
//5us级延时程序
/*********************************************************************************/
void delay_us()
{
unint8 i;
i--;
i--;
i--;
i--;
i--;
i--;
}
/********************************************************************************/
/********************************************************************************/
// 测试LCD忙碌状态
//lcd_busy()为1时,忙,等待。lcd_busy()为0时,闲,可写指令与数据。
/********************************************************************************/
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(P0&0x80);
LCD_EN = 0;
return(result);
}
/*******************************************************************************/
/*******************************************************************************/
// 写入指令数据到LCD
/*******************************************************************************/
void lcd_wcmd(unsigned char cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/*****************************************************************************/
/*****************************************************************************/
//写显示数据到LCD
//RS=高电平,RW=低电平,E=高脉冲,D0-D7=数据。
/*****************************************************************************/
void lcd_wdata(unsigned char dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/****************************************************************************/
/****************************************************************************/
//LCD初始化设定
/****************************************************************************/
void lcd_init()
{
delay_ms(15);
lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据
delay_ms(5);
lcd_wcmd(0x38);
delay_ms(5);
lcd_wcmd(0x38);
delay_ms(5);
lcd_wcmd(0x0c); //显示开,关光标
delay_ms(5);
lcd_wcmd(0x06); //移动光标
delay_ms(5);
//lcd_wcmd(0x01); //清除LCD的显示内容,如果屏幕过暗,可将这俩句删除
//delay_ms(5);
}
/****************************************************************************/
/****************************************************************************/
//设定LCD显示位置
/****************************************************************************/
void lcd_dis_pos(unsigned char pos)
{
lcd_wcmd(pos | 0x80); //数据指针=80+地址变量
}
/****************************************************************************/
/****************************************************************************/
//收发信号检测,数据读取
/****************************************************************************/
char receive()
{
unint8 i;
com_data=0;
for(i=0;i<=7;i++)
{
respond=2;
while((!TRH)&&respond++);
delay_us();
delay_us();
delay_us();
if(TRH)
{
temp=1;
respond=2;
while((TRH)&&respond++);
}
else
temp=0;
com_data<<=1;
com_data|=temp;
}
return(com_data);
}
/****************************************************************************/
/****************************************************************************/
//湿度读取子程序
//温度高8位== TL_data
//温度低8位== TH_data
//湿度高8位== RH_data
//湿度低8位== RH_data
//校验 8位 == CK_data
//调用的程序有 delay();, Delay_5us();,RECEIVE();
/***************************************************************************/
void read_TRH()
{
//主机拉低18ms
TRH=0;
delay_ms(18);
TRH=1;
//DATA总线由上拉电阻拉高 主机延时20us
delay_us();
delay_us();
delay_us();
delay_us();
//delay_us();
//delay_us();delay_us();delay_us();delay_us();
//主机设为输入 判断从机响应信号
TRH=1;
//判断DHT11是否有低电平响应信号 如不响应则跳出,响应则向下运行
if(!TRH)
{
respond=2;
//判断DHT11发出 80us 的低电平响应信号是否结束
while((!TRH)&& respond++);
respond=2;
//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
while(TRH && respond++);
//数据接收状态
RH_temp = receive();
RL_temp = receive();
TH_temp = receive();
TL_temp = receive();
CK_temp = receive();
TRH=1;
//数据校验
untemp=(RH_temp+RL_temp+TH_temp+TL_temp);
if(untemp==CK_temp)
{
RH_data = RH_temp;
RL_data = RL_temp;
TH_data = TH_temp;
TL_data = TL_temp;
CK_data = CK_temp;
}
}
//湿度整数部分
str1[0] = (char)(0X30+RH_data/10);
str1[1] = (char)(0X30+RH_data%10);
str1[2] = 0x2e; //小数点
//湿度小数部分
str1[3] = (char)(0X30+RL_data/10);
str1[5] = 0X25; //"%"
str1[6] = 0X52; //"R"
str1[7] = 0X48; //"H"
//温度整数部分
str2[0] = (char)(0X30+TH_data/10);
str2[1] = (char)(0X30+TH_data%10);
str2[2] = 0x2e; //小数点
//温度小数部分
str2[3] = (char)(0X30+TL_data/10);
str2[5] = 0X27; //"'"
str2[6] = 0X43; //"C"
}
/****************************************************************************/
//冬天适宜温湿度 夏天适宜温湿度
//湿度:30%--80% 30%--60%
//温度:18℃--25℃ 23℃--28℃
/****************************************************************************/
void baoj()//报警函数
{
if(RH_data>=80) //湿度上限80%
{
buz=0;
delay_ms(200);
buz=1;
delay_ms(10);
}
else if(RH_data<=30) //湿度下限30%
{
buz=0;
delay_ms(200);
buz=1;
delay_ms(10);
}
else if(TH_data>=25) //温度上限25℃
{
buz=0;
delay_ms(200);
buz=1;
delay_ms(10);
}
else if(TH_data<=18) //温度下限18℃
{
buz=0;
delay_ms(200);
buz=1;
delay_ms(10);
}
else
{
buz=1;
}
}
/****************************************************************************/
//主函数
//TH,TL,RH,RL分别代表温湿度的整数和小数部分
/****************************************************************************/
void main()
{
lcd_init();
initcom();
delay_us();
while(1)
{
unsigned char i,n=0x40,m;
read_TRH();
//写字符
for(i=0;i<=7;i++)
{
lcd_dis_pos(i); //显示字符
lcd_wdata(dis1[i]);
lcd_dis_pos(n+i); //显示字符
lcd_wdata(dis2[i]);
}
//写湿度数据
m=0x08;
for(i=0;i<=7;i++)
{
lcd_dis_pos(m);
lcd_wdata(str1[i]);
m++;
}
//写温度数据
m=0x48;
for(i=0;i<=7;i++)
{
lcd_dis_pos(m);
lcd_wdata(str2[i]);
m++;
}
//延时
delay_ms(500);
baoj();//报警
send(0xff);//wsd flags
//delay_ms(10);
sendwd();
//delay_ms(10);
sendsd();
//delay_ms(10);
}
}
⑤ 关于C51单片机温度报警程序的问题 谁能帮我在每段程序后加汉字解释 及怎么实现温度显示及蜂鸣器报警的
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define out P0 ;
#define INT8U unsigned char //宏定义
#define INT16U unsigned int
sbit smg1=P2^0;
sbit smg2=P2^1;
sbit smg3=P2^2;
sbit smg4=P2^3;
sbit Beep=P1^5; //蜂鸣器引脚定义
sbit led=P1^6;
sbit led1=P1^7; //设置灯光报警键
sbit DQ=P2^4; //ds18b20端口
void init_ds18b20(void); //ds18b20初始化子程序
void delay(uchar); //ds18b20工作延时子程序
uchar readbyte(void);//向ds18b20读一个字节数据
/*******************************************************************************/
void writebyte(uchar);//向ds18b20写一个字节数据
uint retemp();//计数变量
uchar key;
uchar a,b,c,d; //计数变量
uchar x[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uint retemp()
{
uint a,b,t;
init_ds18b20(); //初始化ds18b20
writebyte(0xcc); // 跳过读序列号的操作
writebyte(0x44); // 启动温度转换
init_ds18b20();
writebyte(0xcc); //跳过读序号列号的操作
writebyte(0xbe); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=readbyte(); //读出温度低位LSB
b=readbyte(); //读出温度高位MSB
t=b; //将温度高八位送t
t<<=8; //乘以256移到高八位
t=t|a; //高低八位组合成温度值
if(t<0x8000) //如果温度为正计算正温度值
{
key=0;
t=t*0.625;
}
else //否则温度为负,取反
{
key=1;
t=(~t+1)*0.625;
}
return(t); //返回温度值
}
void main()
{
uint i,t;
EA = 1; //开总中断
TMOD = 0x01; //定时器0工作方式1
TR0=1;
delay(100);
while(1)
{
t=retemp(); 读温度值
a=x[t/1000]; //温度千位数
b=x[t/100%10]; //温度百位数
c=x[t/10%10]-0x80; //温度十位数
d=x[t%10]; //温度个位数
if(key==1) //如果key=1
a=0xbf; //a为“负号"
if((key==0)&&(t>320)) //如果key=0 且t大于320
{
led1=0; //点亮led1
ET0=1; //开启定时器0中断
}
else if(t<290) //如果温度小于290
{
led=0; //点亮led
ET0=1; //开启定时器0中断
}
else //否则
{
led1=1; //关闭led1
led=1; //关闭led
ET0=0; //关闭定时器0中断
}
for(i=0;i<50;i++) //循环50次
{smg1=1;P0=a;delay(100);smg1=0; //显示千位
smg2=1;P0=b;delay(100);smg2=0; //显示百位
smg3=1;P0=c;delay(100);smg3=0; //显示十位
smg4=1;P0=d;delay(100);smg4=0; //显示个位
}
}
}
/*ds18b20工作延时子程序*/
void delay (uchar i)
{
do
{_nop_();
_nop_();
_nop_();
i--;
}
while(i);}
/*ds18b20初始化子程序*/
void init_ds18b20()
{
uchar x=0;
DQ=0; //单片机将DQ拉低
delay (120);
DQ=1; //拉高总线
delay(16);
delay(80);
}
/*读一个字节*/
uchar readbyte ()
{uchar i=0,date=0;
for(i=8;i>0;i--)
{
DQ=0; // 给脉冲信号
delay(1);
DQ=1; // 给脉冲信号
date>>=1;
if(DQ)date|=0x80;
delay(11);
}
return(date);
}
/*写一个字节*/
void writebyte(uchar dat)
{uchar i=0;
for(i=8;i>0;i--) //写8位数
{
DQ=0;
DQ=dat&0x01; //写dat的D0位
delay(12);
DQ=1;
dat>>=1;
delay(5);
}
}
/**************************************************
*函数名:中断函数
*描 述:产生矩形脉冲使蜂鸣器发声
**************************************************/
void BeepTimer0(void) interrupt 1
{
Beep = ~Beep;
TH0 = 65335 / 256; //定时器赋初值
TL0 = 65335 % 256;
}
⑥ 51单片机蓝牙模块读取温度
51单片机蓝牙模块读取温度为18B20。51单片机采集18B20文都传感器数据,并经过蓝牙连续发送,蓝牙温度计是接收5位数据的,可在手机上接收。