基于51单片机的天气温度报警系统

基于AT89C51的天气温度报警系统,采用Protues仿真。
本文引用地址:https://www.eepw.com.cn/article/201611/323835.htm元件:
DS1302时钟芯片
DS18B20温度传感器
LM016L(1602)液晶
AT89C51单片机
LED灯若干
蜂鸣器一只 用于报警本人不写这个报警程序了 其实挺简单的
我只贴出部分主要的代码
完整源代码请到:http://blog.sina.com.cn/u/2311964960(内附图片)
或直接下载: LSD.c (7.4 KB, 下载次数: 72)
/*初始化DS18B20*/
void Init_DS18B20()
{ //初始化DS18B20必须先给DS18B20一个复位脉冲,接收到复位脉冲后DS18B20会返回一个存在脉冲
DQ=1; //DQ先置高电平
_nop_(); //延时
_nop_();
DQ=0; //DQ置低电平(拉低总线),开始初始化
delayus(60); //DQ置低电平后必须延时至少480us,此处延时600us
DQ=1; //然后DQ置高电平(释放总线)
delayus(3); //释放总线后要求延时15-60us,此处延时30us
flag=DQ; //读取DQ并付值flag,如果flag为0,表示返回了一个存在脉冲,初始化完成。相反失败
delayus(20);
}
/*读取DS18B20中的scrathpad一个字节*/
uchar read_scratchpad()
{
uchar i=0;
for (i=8;i>0;i--)
{
DQ=1; //DQ位拉高
_nop_(); //延时1us秒
DQ = 0; // DQ置0拉低总线
dat>>=1; //左移一位
delayus(1); //延时1us-15us,此处延时10us
DQ = 1; // DQ置1释放总线
delayus(1); //延时10us
if(DQ==1){dat|=0x80;} //采样
else{dat|=0x00;}
delayus(5); //延时50us
}
return dat;
}
/*向DS18B20中写入一个字节,写ROM指令用*/
void write_command(uchar com)
{
uchar i=0;
uchar num;
for (i=8; i>0; i--)
{
DQ=1; //先将DQ置1;
_nop_(); //延时
DQ = 0; //DQ置0,拉低总线
num = com&0x01; //读取指令最低位
if(num==1) //如果为1
{
delayus(1); //要求先延时1-15us,此处延时10us
DQ=1; //然后释放总线
delayus(4); //延时大概45us,此处延时40us
}else //如果为0
{
delayus(6); //要求延时60-120us,此处延时60us
DQ=1; //然后DQ置1释放总线
delayus(1); //延时10us
}
com>>=1;
}
delayus(1);
}
/*温度转换*/
void Temperature_conversion()
{
Init_DS18B20(); //初始化DS18B20
write_command(0xCC); // 读取ROM中64-bit code
write_command(0x4E); // 写暂存器,向暂存器中的TH、TL和configuration Register中写数据
write_command(0x50);// 向TH Register位写入数据
write_command(0x00);//向TL Register位写入数据
write_command(0x7F);//向configuration Register写入数据
delay(10);
Init_DS18B20();
write_command(0xCC); // 跳过读序号列号的操作
write_command(0x44); // 启动温度转换
delay(10);
Init_DS18B20();//
write_command(0xCC); //跳过读序号列号的操作
write_command(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
}
评论