找回密码
 立即注册

QQ登录

只需一步,快速开始

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

智能仪器温度检测,12位AD转换

[复制链接]
跳转到指定楼层
楼主
智能仪器温度检测,12位AD转换。


单片机源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit rs = P2 ^ 0;
  6. sbit rw = P2 ^ 1;
  7. sbit ep = P2 ^ 2;
  8. uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88, 0x83,0xc6,0xa1,0x86,0x8e};
  9. /***定义0831引脚***/
  10. sbit CS1=P1^0;
  11. sbit CLK1=P1^1;
  12. sbit DO1=P1^2;
  13. /***定义温度报警引脚***/
  14. sbit P24=P2^4;
  15. sbit P25=P2^5;
  16. /***定义按键引脚***/
  17. sbit Key0=P1^3;
  18. sbit Key1=P1^4;
  19. sbit Key2=P1^5;
  20. sbit Key3=P1^6;
  21. uchar i_flag=0;
  22. uchar len=0;
  23. uchar key_flag=0;
  24. uchar key_operate=0;
  25. uchar counter;
  26. uchar flag=0;
  27. uint Tl=0;
  28. uchar TV;
  29. uint Th[]={100,110,120,120};
  30. uchar tempH[3];
  31. uchar tempL[3];
  32. uchar tmpdata[]={0,0,0};
  33. uchar i=0,i1=0,n=0;
  34. int tmp=0;
  35. /***延时程序1***/
  36. void delayUs()
  37. {     
  38.     _nop_();
  39.     _nop_();     
  40.         _nop_();     
  41.         _nop_();     
  42.         _nop_();
  43.         }
  44. /***延时程序2***/
  45. void delayms(uint i)
  46. {  
  47.         uint j;  
  48.         for(;i>0;i--)   
  49.         for(j=55;j>0;j--);
  50.         }

  51. /***0831初始化和数据读取***/
  52. uchar readad0831()
  53. {   
  54.         uchar i=0,tmp=0;   
  55.         DO1=1;   
  56.         CS1=1;   
  57.         delayUs();   
  58.         CLK1=0;   
  59.     CS1=0;
  60.    delayUs();   
  61.    CLK1=1;   
  62.    delayUs();   
  63.    CLK1=0;   
  64.    delayUs();   
  65.    CLK1=1;   
  66.    delayUs();   
  67.    CLK1=0;   
  68.    delayUs();   
  69.    for(i=0;i<=7;i++)     
  70.    {      
  71.    tmp<<=1;    //左移一位      
  72.    if(DO1)         
  73.    tmp++;         
  74.    CLK1=1;         
  75.    delayUs();         
  76.    CLK1=0;         
  77.    delayUs();     
  78.    }   
  79.    CS1=1;   
  80.    return tmp;
  81.    }
  82. /***主函数***/
  83. void main()
  84. {   
  85.    TMOD=0x01;                  
  86.    TH0=(65535-50000)/256;   //定时器0赋初值   
  87.    TL0=(65535-50000)%256;   
  88.    TH1=(65535-30000)/256;   //定时器1赋初值   
  89.    TL1=(65535-30000)%256;   
  90.    ET1=1;                   //允许定时器1中断   
  91.    ET0=1;                   //允许定时器0中断   
  92.    TR0=1;                   //定时器0开始工作   
  93.    TR1=1;                   //定时器1开始工作   
  94.    EA=1;                    //开放总中断   
  95.    while(1)      
  96.    {      
  97.         P2=P2&0xf0;        //关闭所有数码管      
  98.                 P2=P2|0x01;        //打开第一个数码管      
  99.                 P0=table[i];       //第一个数码管显示数据     
  100.                 delayms(1);     
  101.                 if(flag==0)     
  102.                 {        
  103.                 tmpdata[0]=tmp/100;      //百位         
  104.                  tmpdata[1]=tmp%100/10;   //十位         
  105.                   tmpdata[2]=tmp%100%10;   //个位     
  106.                   if(tmp>=Th[i-1])         //温度上限报警     
  107.                   P24=0;                //红灯亮   
  108.                   else     
  109.                    P24=1;     
  110.                    if(tmp<=Tl)              //温度下限报警     
  111.                    P25=0;                //黄灯亮   
  112.                    else     
  113.                         P25=1;      
  114.                          display(tmpdata);        //显示温度值     
  115.                           }   
  116.                          if(flag==1)                  //报警温度上限值的显示      
  117.                          {     
  118.                          tempH[0]=Th[i-1]/100;     //百位           
  119.                          tempH[1]=Th[i-1]%100/10;  //十位           
  120.                          tempH[2]=Th[i-1]%100%10;  //个位     
  121.                          display(tempH);        
  122.                          }   
  123.                          }
  124.                          }
  125. /***定时器0开中断***/
  126. void timer0() interrupt 1  {   
  127.         TH0=(65535-50000)/256;        //定时器0重新赋初值   
  128.         TL0=(65535-50000)%256;
  129.         /***温度循环检测***/   
  130.         n++;      
  131.         P3=0x00;   
  132.         if(n==50)
  133.      {         
  134.          /***单路温度检测***/   
  135.          if(i_flag==0)     
  136.          {     
  137.          i++;   
  138.          if(i==5)     
  139.          i=1;   
  140.          i1=i;   
  141.           }   
  142.          else     
  143.          {   
  144.          i=i1;     
  145.          }        
  146.          /***四路温度循环检测***/   
  147.          if(i==1)        //第一路     
  148.          {      
  149.          P3=0x01;      
  150.          }   
  151.          else if(i==2)  //第二路      
  152.          {      
  153.          P3=0x02;     
  154.          }      
  155.          else if(i==3)  //第三路     
  156.          {               
  157.          P3=0x04;      
  158.          }   
  159.          else           //第四路     
  160.          {      
  161.          P3=0x08;         
  162.          }   
  163.           n=0;  
  164.            delayUs();     
  165.            TV=readad0831();               //读取温度值   
  166.            tmp=TV*(120.0/255.0)+0.5;      //A/D转换      
  167.            }
  168.            }
  169. /***定时器1开中断***/
  170. void Timer_1(void) interrupt 3 using 2 {  
  171.    TH1=(65536-30000)/256;         //定时器1重新赋初值   
  172.    TL1=(65536-30000)%256;   
  173. if(((!Key0)|(!Key1)|(!Key2)|(!Key3))&(key_flag==0))    //进入按键设置      
  174. {        
  175. key_flag=20;        
  176. while(--key_flag);      //延时去抖动         
  177.   key_flag=1;         
  178.   if(!Key0)               //进入单路温度检测模式         
  179.   {      
  180.   if(key_operate==0)   
  181.    {      
  182.    key_flag=0;       //允许按键长按            
  183.    if(counter++>30)  //Modle键要长按2S生效      
  184.     {         
  185.         i_flag=1;      
  186.         i1=i;               
  187.         key_operate++;      
  188.         flag=0;      
  189.         key_flag=1;  //不允许按键长按         
  190.          }     
  191.          }        
  192.          else      
  193.           {           
  194.            flag=1;        
  195.            }        
  196.            }         
  197.            if(key_flag==1)         //进入单路温度上限值的设定        
  198.            {      
  199.            if(!Key1)            //加1键         
  200.            {        
  201.            Th[i-1]++;           
  202.            }      
  203.            if(!Key2)            //减1键         
  204.            {           
  205.            Th[i-1]--;         
  206.         }         
  207.                 }         
  208.                 if(!Key3)                 //恢复四路温度检测            
  209.                 {        
  210.                 key_operate=0;        
  211.                 counter=0;        
  212.                 flag=0;        
  213.                 i_flag=0;            
  214.                 }         
  215.                 }   
  216.                 if((Key0)&(Key1)&(Key2)&(Key3))     
  217.                 key_flag=0;
  218.                 }
复制代码

所有资料51hei提供下载:
智能仪器温度检测.zip (57.34 KB, 下载次数: 20)


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:543049 发表于 2019-5-30 10:05 | 只看该作者
报警时是哪一个led灯亮啊?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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