基于单片机的温控报警系统设计 (电路+程序+论文)

 

关注【电子开发圈】微信公众号,一起学习吧!

电子DIY、Arduino、51单片机、STM32单片机、FPGA……
电子百科、开发技术、职业经验、趣味知识、科技头条、设备拆机……

点击链接,免费下载100G+电子设计学习资料!

http://mp.weixin.qq.com/mp/homepage?__biz=MzU3OTczMzk5Mg==&hid=7&sn=ad5d5d0f15df84f4a92ebf72f88d4ee8&scene=18#wechat_redirect

 

 

本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确,其输出温度采用数字显示,主要用于对测温比较准确的场所,或科研实验室使用,该设计控制器使用单片机AT89S51,测温传感器使用DS18B20,用3位共阳极LED数码管以串口传送数据,实现温度显示,能准确达到以上要求。

 

基于单片机的温控报警系统设计 (电路+程序+论文)_第1张图片

基于单片机的温控报警系统设计 (电路+程序+论文)_第2张图片

基于单片机的温控报警系统设计 (电路+程序+论文)_第3张图片

基于单片机的温控报警系统设计 (电路+程序+论文)_第4张图片

基于单片机的温控报警系统设计 (电路+程序+论文)_第5张图片

#include
#include 
#include 
code unsigned char seg7code[11]=
{ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90,0x40}; //显示段码
 
sbit TMDAT =P3^1; //DS18B20 的数据输入/输出脚DQ,根据情况设定
 
sbit jia=P2^1;
sbit jian=P2^0;
sbit hong=P1^0;//红色警告灯
sbit sheng=P1^1;//蜂鸣器
sbit lan=P1^2;//兰色灯
bit write=0; //写24C08 的标志;
 
j=30;
unsigned int sdata;//测量到的温度的整数部分
unsigned char xiaoshu1;//小数第一位
unsigned char xiaoshu2;//小数第二位
unsigned char xiaoshu;//两位小数
 
bit fg=1; //温度正负标志
 
////////24C08 读写驱动程序////////////////////
sbit scl=P3^4; // 24c08 SCL
sbit sda=P3^5; // 24c08 SDA

void delay1(unsigned char x)
{ unsigned int i;
for(i=0;i> 1); }
return (dat);
}
//写一个字节 
void tmwbyte (unsigned char dat)
{
unsigned char j,i;
bit testb;
for (j=1;j<=8;j++)
{ testb = dat & 0x01;
dat = dat >> 1;
if (testb)
{ TMDAT = 0; //写0
i++; i++;
TMDAT = 1;
for(i=0;i<8;i++); }
else
{ TMDAT = 0; //写0
for(i=0;i<8;i++);
TMDAT = 1;
i++; i++;}
}
}
void tmstart (void) //发送ds1820 开始转换
{
fashong(); //复位
yanshi(1); //延时
tmwbyte(0xcc); //跳过序列号命令
tmwbyte(0x44); //发转换命令 44H,
}                   
void tmrtemp (void) //读取温度
{
unsigned char a,b;
fashong (); //复位
yanshi (1); //延时
tmwbyte (0xcc); //跳过序列号命令
tmwbyte (0xbe); //发送读取命令
a = tmrbyte (); //读取低位温度
b = tmrbyte (); //读取高位温度
if(b>0x7f) //最高位为1 时温度是负
{a=~a; b=~b+1; //补码转换,取反加一
fg=0; //读取温度为负时fg=0
}
sdata = a/16+b*16; //整数部分
xiaoshu1 = (a&0x0f)*10/16; //小数第一位
xiaoshu2 = (a&0x0f)*100/16%10;//小数
xiaoshu=xiaoshu1*10+xiaoshu2; //小数
}
void DS18B20PRO(void)
{
tmstart();
//yanshi(5); //如果是不断地读取的话可以不延
tmrtemp(); //读取温度,执行完毕温度将存于
}
void Led()
{
if(fg==1) //温度为正时显示的数据
{
  P2=P2&0xef;
P0=seg7code[sdata/10]; //输
Delay(2); P2=P2|0xf0; P2=P2&0xdf;
P0=seg7code[sdata%10]|0x80; //输出个
Delay(2); P2=P2|0xf0; P2=P2&0xbf;
P0=seg7code[xiaoshu1]; //输出小数点
Delay(2); P2=P2|0xf0; P2=P2&0x7f;
P0=seg7code[xiaoshu2]; //输出小
Delay(1); P2=P2|0xf0;
Delay(2); P2=P2|0xf0;P2=P2&0xf7;
P0=seg7code[j/10]; //输出十位
Delay(2); P2=P2|0x0f; P2=P2&0xfb;
P0=seg7code[j%10]|0x80; //输出个位 
Delay(1); P2=P2|0x0f;
 
if(sdata<=j)
{
lan=0;
hong=1;
sheng=1;
};
if(sdata>=j)
{
lan=1;
hong=0;
sheng=0;
}; 
}
if(fg==0) //温度为负时显示的数据
{ P2=P2&0xef;
P0=seg7code[11]; //负号
Delay(8); P2=P2|0xf0; P2=P2&0xdf;
P0=seg7code[sdata/10]|0x80; //输出十位
Delay(8); P2=P2|0xf0; P2=P2&0xbf;
P0=seg7code[sdata%10]; //输出个位
Delay(8); P2=P2|0xf0; P2=P2&0x7f;
P0=seg7code[xiaoshu1]; //输出小
Delay(4); P2=P2|0xf0;
}
}
main()
{fg=1;
x24c08_init(); //初始化24C08
j=x24c08_read(2);//读出保存的数据
while(1)
{
DS18B20PRO();
Led();
if(jia==0)
{Delay(200);j++;}
if(jian==0)
{Delay(200);j--;}
x24c08_write(2,j);
}
}

 

 

你可能感兴趣的:(MCU51系统设计)