| 
 一、系统方案 随着科学技术的不断发展带动着电子行业的地位越来越重,现在电子产品几乎在社会的各个领域都可以见到。这些技术的发展有效的带动着社会生产力的发展和信息化的提高,同时电子产品也越来越智能。 本设计采用AT89C51单片机为主控芯片,采用数字型防水温度传感器DS18B20制作温度检测报警器,通过四位数码管显示温度值,系统设立几个按键,可以通过按键进行设置温度的上、下限值,当所采集温度超过设定值时,系统会控制蜂鸣器和对应LED发出声光报警。这个设计简单、成本低、具有实用性。   二、硬件设计 原理图如下:       三、单片机软件设计 1、首先是串口初始化: void Uart_init() {                  TMOD=0x20;//定时器0工作方式1                  EA=1;//开总中断                           TH1=0xfd;           TL1=0xfd;           TR1=1;     ET1=0;                   SM0=0;            SM1=1;            REN=1;           EA=1;         ES=1; }   2、中断服务程序 void Usart() interrupt 4 {         receiveData=SBUF;//出去接收到的数据         RI = 0;//清除接收中断标志位         ES=0;         SBUF=receiveData;//将接收到的数据放入到发送寄存器         while(!TI);                         //等待发送数据完成         TI=0;                                                 //清除发送完成标志位         ES=1; } 3、按键检测程序 /*****外部中断0服务程序*****/ void int0(void) interrupt 0 {         EX0=0;      //关外部中断0         if(DEC==0&&set_st==1)         {                 BEEP=0;                 Delay(2000);                 BEEP=1;                 do                 {                         Disp_alarm(shangxian);                 }                 while(DEC==0);                 if(H_ZF==0&&L_ZF==0)                 {                         shangxian--;                         if(shangxian<=xiaxian+1)                                 shangxian=xiaxian+1;                 }                 else if(H_ZF==0&&L_ZF==1)                 {                         shangxian--;                         if(shangxian<0&&xiaxian==1)                         {                                 shangxian=0;                                 H_ZF=0;                         }                         else if(shangxian<0&&xiaxian>1)                         {                                 shangxian=1;                                 H_ZF=1;                         }                 }                 else if(H_ZF==1)                 {                         shangxian++;                         if(shangxian>=xiaxian-1)                         shangxian=xiaxian-1;                 }         }         else if(DEC==0&&set_st==2)         {                 BEEP=0;                 Delay(2000);                 BEEP=1;                 do                 {                         Disp_alarm(xiaxian);                 }                 while(DEC==0);                 if(L_ZF==0)                 {                         xiaxian--;                         if(xiaxian<0)                         {                                 xiaxian=1;                                 L_ZF=1;                         }                 }                 else if(L_ZF==1)                 {                         xiaxian++;                         if(xiaxian>=55)                         {                                 xiaxian=55;                         }                 }         } } /*****外部中断1服务程序*****/ void int1(void) interrupt 2 {         EX1=0;      //关外部中断1         if(ADD==0&&set_st==1)         {                 BEEP=0;                 Delay(2000);                 BEEP=1;                 do                 {                         Disp_alarm(shangxian);                 }                 while(ADD==0);                 if(H_ZF==0)                 {                         shangxian++;                         if(shangxian>=125)shangxian=125;                 }                 else if(H_ZF==1)                 {                         shangxian--;                         if(shangxian<=0)                         {                                 shangxian=0;                                 H_ZF=0;                         }                 }         }                                  else if(ADD==0&&set_st==2)         {                 BEEP=0;                 Delay(2000);                 BEEP=1;                 do                 {                         Disp_alarm(xiaxian);                 }                 while(ADD==0);                 if(L_ZF==0)                 {                         xiaxian++;                         if(xiaxian>=shangxian-1)                                 xiaxian=shangxian-1;                         }                 else if(H_ZF==0&&L_ZF==1)                 {                         xiaxian--;                         if(xiaxian<=0)                         {                                 if(shangxian==0)                                 {                                         xiaxian=1;                                         L_ZF=1;                                 }                                 else                                 {                                         xiaxian=0;                                         L_ZF=0;                                 }                         }                 }                 else if(H_ZF==1&&L_ZF==1)                 {                         xiaxian--;                         if(xiaxian<=shangxian+1)                                 xiaxian=shangxian+1;                 }         }   } 4、核心算法程序 /*****读取温度*****/ unsigned int ReadTemperature(void) {   unsigned char a=0;   unsigned char b=0;   unsigned int t=0;   float tt=0;   Init_DS18B20();   WriteOneChar(0xCC);  //跳过读序号列号的操作   WriteOneChar(0x44);  //启动温度转换   Init_DS18B20();   WriteOneChar(0xCC);  //跳过读序号列号的操作   WriteOneChar(0xBE);  //读取温度寄存器   a=ReadOneChar();     //读低8位   b=ReadOneChar();    //读高8位   t=b;   t<<=8;   t=t|a;   if(t&0xf800)   {         t=~t+1;         fuhao=1;   }   else   fuhao=0;   tt=t*0.0625;   t= tt*10+0.5;     //放大10倍输出并四舍五入   return(t); } 四、proteus仿真设计 Proteus软件是一款应用比较广泛的工具,它可以在没有硬件平台的基础上通过自身的软件仿真出硬件平台的运行情况,这样就可以通过软件仿真来验证我们设计的方案有没有问题,如果有问题,可以重新选择器件,连接器件,直到达到我们设定的目的,避免我们搭建实物的时候,如果当初选择的方案有问题,我们器件都已经焊接好了,再去卸载下去,再去焊接新的方案的器件,测试,这样会浪费人力和物力,也给开发者带来一定困惑,Proteus仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。   
 |