找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1327|回复: 0
打印 上一主题 下一主题
收起左侧

单片机带负温度显示检测报警Proteus仿真电路程序

[复制链接]
跳转到指定楼层
楼主
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include "reg52.h"  
  2. //---重定义关键词---//
  3. #define uchar unsigned char
  4. #define uint unsigned int


  5. //--定义使用的IO口--//
  6. sbit DQ =P3^6;
  7. sbit BEEP=P3^7;               //定义蜂鸣器   
  8. sbit ALAM=P1^3;                //定义灯光报警
  9. sbit SET=P3^1;                 //定义调整键
  10. sbit ADD=P3^3;
  11. sbit DEC=P3^2;

  12. bit shanshuo_st;                            //闪烁间隔标志
  13. bit beep_st;                                     //蜂鸣器间隔标志
  14. char shangxian=38;                  //上限报警温度,默认值为38
  15. char xiaxian=-6;                   //下限报警温度,默认值为-6
  16. uchar set_st=0;                             //状态标志

  17. uchar m;                    //温度值全局变量(整数)
  18. char Signed_Current_temp;
  19. uchar n;                             //温度值全局变量(小数)

  20. char num=0;
  21. uchar DisplayData[8];

  22. uchar code DSY_CODE[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
  23. uchar data DSY_IDX[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
  24. uchar code df_table[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};
  25. void Alarm();

  26. /*******************************************************************************
  27. * 函 数 名         : delay
  28. * 函数功能                   : 延时函数,i=1时,大约延时10us
  29. *******************************************************************************/
  30. void delay(uint i)
  31. {
  32.         while(i--);        
  33. }

  34. void Delay1ms(uint y)
  35. {
  36.         uint x;
  37.         for( ; y>0; y--)
  38.         {
  39.                 for(x=110; x>0; x--);
  40.         }
  41. }

  42. void datapros(void)         
  43. {
  44.    
  45.         
  46.         DisplayData[1] = DSY_CODE[m/10];
  47.         DisplayData[2] = DSY_CODE[m%10]&0x7F;
  48.         DisplayData[3] = DSY_CODE[n];

  49. }
  50. //=====================================================================================
  51. //=====================================================================================
  52. //=====================================================================================

  53. /*****延时子程序*****/
  54. void Delay_DS18B20(int num)
  55. {
  56.   while(num--) ;
  57. }
  58. /*****初始化DS18B20*****/
  59. void Init_DS18B20(void)
  60. {
  61.   unsigned char x=0;
  62.   DQ = 1;         //DQ复位
  63.   Delay_DS18B20(28);    //稍做延时
  64.   DQ = 0;         //单片机将DQ拉低
  65.   Delay_DS18B20(80);   //精确延时,大于480us
  66.   DQ = 1;         //拉高总线
  67.   Delay_DS18B20(14);
  68.   x = DQ;           //稍做延时后,如果x=0则初始化成功,x=1则初始化失败
  69.   Delay_DS18B20(20);
  70. }
  71. /*****读一个字节*****/
  72. unsigned char ReadOneChar(void)
  73. {
  74.   unsigned char i=0;
  75.   unsigned char dat = 0;
  76.   for (i=8;i>0;i--)
  77.   {
  78.     DQ = 0;     // 给脉冲信号
  79.     dat>>=1;
  80.     DQ = 1;     // 给脉冲信号
  81.     if(DQ)
  82.     dat|=0x80;
  83.     Delay_DS18B20(4);
  84.   }
  85.   return(dat);
  86. }
  87. /*****写一个字节*****/
  88. void WriteOneChar(unsigned char dat)
  89. {
  90.   unsigned char i=0;
  91.   for (i=8; i>0; i--)
  92.   {
  93.     DQ = 0;
  94.     DQ = dat&0x01;
  95.     Delay_DS18B20(5);
  96.     DQ = 1;
  97.     dat>>=1;
  98.   }
  99. }
  100. /*****读取温度*****/
  101. void ReadTemperature(void)
  102. {
  103.   unsigned char a=0;
  104.   unsigned char b=0;
  105.   //unsigned int t=0;

  106.   uchar ng=0;
  107.   //float tt=0;
  108.   Init_DS18B20();
  109.   WriteOneChar(0xCC);  //跳过读序号列号的操作
  110.   WriteOneChar(0x44);  //启动温度转换
  111.           Delay1ms(15);

  112.   Init_DS18B20();
  113.   WriteOneChar(0xCC);  //跳过读序号列号的操作
  114.   WriteOneChar(0xBE);  //读取温度寄存器
  115.   a=ReadOneChar();     //读低8位
  116.   b=ReadOneChar();    //读高8位
  117.     if((b&0XF8)==0XF8)
  118.    {
  119.       b=~b;
  120.       a=~a+1;
  121.       if(a==0X00)b++;
  122.       ng=1;               //为负数
  123.      
  124.    }
  125.     n=df_table[a&0X0F];
  126.    if(ng==1)
  127.    {
  128.        DisplayData[0] = 0xbf;
  129.    }
  130.    else
  131.    {
  132.       DisplayData[0] = 0xff;
  133.    }
  134.    m=((a&0Xf0)>>4)|((b&0X07)<<4);
  135.    Signed_Current_temp=ng?-m:m;
  136.   

  137.   //t=b;                                   //高8位转移到t
  138. // t<<=8;                           //t数据左移8位
  139. // t=t|a;                           //将t和a按位或,得到一个16位的数
  140.   //tt=t*0.0625;                   //将t乘以0.0625得到实际温度值(温度传感器设置12位精度,最小分辨率是0.0625)
  141. // t= tt*10+0.5;     //放大10倍(将小数点后一位显示出来)输出并四舍五入
  142.   //return(t);                   //返回温度值
  143. }

  144. /*****读取温度*****/
  145. void check_wendu(void)
  146. {
  147.     //uint a,b,c,i;
  148.      uint i;
  149.     for( i=2;i>0;i--){          //重复3次
  150.              ReadTemperature();                          //获取温度值
  151.         //a=c/100;                                                     //计算得到十位数字
  152.         //b=c/10-a*10;                                            //计算得到个位数字
  153.        // m=c/10;                                                      //计算得到整数位
  154.        // n=c-a*100-b*10;                                    //计算得到小数位
  155.        // if(m<0){m=0;n=0;}                                   //设置温度显示上限
  156.         if(m>99){m=99;n=9;}                                   //设置温度显示上限   
  157.          }
  158. }

  159. /*******************************************************************************
  160. * 函数名         :DigDisplay()
  161. * 函数功能                 :数码管显示函数
  162. * 输入           : 无
  163. * 输出                  : 无
  164. *******************************************************************************/
  165. void DigDisplay()
  166. {

  167.         uint i;
  168.         P0=0xff;
  169.         P2=0x00;
  170.         for(i=30;i>0;i--){
  171.         
  172.                                 P2=DSY_IDX[0];
  173.                                         P0=DisplayData[0];//发送数据
  174.                 delay(150); //间隔一段时间扫描        
  175.                 P0=0xff;//消隐
  176.         
  177.                         P2=DSY_IDX[1];
  178.                                 P0=DisplayData[1];//发送数据
  179.                 delay(150); //间隔一段时间扫描        
  180.                 P0=0xff;//消隐
  181.                
  182.                                 P2=DSY_IDX[2];
  183.                                         P0=DisplayData[2];//发送数据
  184.                 delay(150); //间隔一段时间扫描        
  185.                 P0=0xff;//消隐
  186.                         
  187.                                 P2=DSY_IDX[3];
  188.                                         P0=DisplayData[3];//发送数据
  189.                 delay(250); //间隔一段时间扫描        
  190.                 P0=0xff;//消隐
  191.         
  192.          Alarm();   //报警检测
  193.         }


  194. }

  195. /*****报警子程序*****/
  196. void Alarm()
  197. {
  198.         float tem,xiaoshu;
  199.                   tem=Signed_Current_temp;
  200.                   xiaoshu=n;
  201.                   xiaoshu=xiaoshu*0.1;
  202.         if(((tem+xiaoshu)>=shangxian)||((tem-xiaoshu)<xiaxian))
  203.         {
  204.                   
  205.                                  BEEP=!BEEP;
  206.                 ALAM=0;
  207.                
  208.         }
  209.         else
  210.         {
  211.                 BEEP=1;
  212.                 ALAM=1;
  213.         }
  214. }

  215. /*****显示报警温度子程序*****/
  216. void Disp_alarm(char baojing)
  217. {
  218.         uint i;
  219.         P0=0xff;
  220.         P2=0x00;

  221.    for(i=2;i>0;i--){
  222.        P2=DSY_IDX[0];
  223.       if(set_st==1)P0=0x89;       //上限H
  224.         else if(set_st==2)P0=0xC7; //下限L标示
  225.         
  226.         delay(100);
  227.             P0=0xff;//消隐

  228. P2=DSY_IDX[1];
  229. if(baojing<0)
  230.    {
  231.        P0 = 0xbf;
  232.                  baojing=-baojing;
  233.    }
  234.    else
  235.    {
  236.       P0 = 0xff;

  237.    }
  238. delay(100);
  239.          P0=0xff;//消隐

  240.      P2=DSY_IDX[2];
  241.      P0=DSY_CODE[baojing/10];
  242.      delay(100);
  243.          P0=0xff;//消隐

  244.      P2=DSY_IDX[3];
  245.      P0=DSY_CODE[baojing%10];
  246.      delay(200);
  247.          P0=0xff;//消隐

  248.     }

  249. }



  250. /*******************************************************************************
  251. * 函 数 名       : main
  252. * 函数功能                 : 主函数
  253. * 输    入       : 无
  254. * 输    出             : 无
  255. *******************************************************************************/
  256. void main()
  257. {        
  258.    EA=1;
  259.   
  260.   IT0=1;     //外部中断的触发方式,下降沿触发      
  261.    IT1=1;
  262.                 check_wendu();
  263.                 Delay1ms(900);
  264.                 check_wendu();
  265.                 datapros();
  266.          BEEP=1;
  267.     ALAM=1;
  268.         while(1)
  269.         {
  270.         if(SET==0)
  271.       {
  272.           delay(2000);
  273.           do{}while(SET==0);
  274.           set_st++;shanshuo_st=1;
  275.           if(set_st>2)set_st=0;
  276.       }
  277.        if(set_st==0)
  278.       {
  279.                  BEEP=1;
  280.    
  281.           EX0=0;    //关闭外部中断0
  282.           EX1=0;    //关闭外部中断1
  283.                   check_wendu();
  284.             datapros();
  285.             DigDisplay();
  286.         //Alarm();   //报警检测
  287.        }
  288.        else if(set_st==1)
  289.       {
  290.           BEEP=1;    //关闭蜂鸣器
  291.           ALAM=1;
  292.           EX0=1;    //开启外部中断0
  293.           EX1=1;    //开启外部中断1
  294.          
  295.          if(shanshuo_st) {Disp_alarm(shangxian);}
  296.       }
  297.       else if(set_st==2)
  298.       {
  299.           BEEP=1;    //关闭蜂鸣器
  300.           ALAM=1;
  301.           EX0=1;    //开启外部中断0
  302.           EX1=1;    //开启外部中断1
  303.          
  304.           if(shanshuo_st) {Disp_alarm(xiaxian);}
  305.       }

  306.    }

  307. }



  308. /*****外部中断0服务程序*****/
  309. void int0(void) interrupt 0
  310. {

  311.        EX0=0;      //关外部中断0
  312. ……………………

  313. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei附件下载:
仿真代码.7z (65.18 KB, 下载次数: 26)

评分

参与人数 1黑币 +30 收起 理由
admin + 30 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表