找回密码
 立即注册

QQ登录

只需一步,快速开始

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

精确值很高的单片机数码管报警器程序

  [复制链接]
跳转到指定楼层
楼主
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit DQ=P3^6;
  6. sbit BEEP=P3^7;
  7. sbit HI_LED=P1^4;
  8. sbit LO_LED=P1^5;
  9. bit HI_Alarm=0,LO_Alarm=0;
  10. bit DS18B20_IS_OK=1;
  11. uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};  
  12. uchar code df_Table[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};  
  13. uchar CurrentT=0;            
  14. uchar Display_Digit[]={0,0,0,0};      
  15. uchar Temp_Value[]={0x00,0x00};        
  16. uint Time0_Count=0;           
  17. char Alarm_Temp_HL[2]={70,-20};
  18. /***********延时程序*************/
  19. void Delay(uint x)
  20. {
  21.       
  22.         while(--x);
  23.       
  24. }
  25. /**********DS18B20初始化********/
  26. uchar Init_DS18B20()  
  27. {
  28.       
  29.         uchar status;  
  30.       
  31.         DQ=1;Delay(8);  
  32.       
  33.         DQ=0;Delay(90);  
  34.       
  35.         DQ=1;Delay(8);  
  36.       
  37.         status=DQ;  
  38.       
  39.         Delay(100);  
  40.       
  41.         DQ=1;  
  42.       
  43.         return status;  
  44.       
  45. }  
  46. /**********DS18B20读字节********/  
  47. uchar ReadOneByte()  
  48. {   
  49.       
  50.         uchar i,dat=0;  
  51.       
  52.         DQ=1;_nop_();  
  53.       
  54.         for(i=0;i<8;i++)  
  55.                
  56.         {   DQ=0;dat >>=1;DQ=1;_nop_();_nop_();  
  57.       
  58.         if (DQ) dat |=0x80; Delay(30); DQ=1;  
  59.       
  60.         }   
  61.       
  62.         return dat;  
  63.       
  64. }   
  65. /**********DS18B20写字节********/  
  66. void WriteOneByte(uchar dat)  
  67. {  
  68.       
  69.         uchar i;  
  70.       
  71.         for(i=0;i<8;i++)
  72.                
  73.         {   
  74.                
  75.                 DQ=0;DQ=dat & 0x01;Delay(5); DQ=1; dat>>=1;  
  76.                
  77.         }  
  78.       
  79. }  
  80. /**********从DS18B20读取温度********/  
  81. void Read_Temperature()  
  82. {   
  83.       
  84.         if( Init_DS18B20()==1)  
  85.                
  86.                 DS18B20_IS_OK=0;  
  87.       
  88.         else  
  89.                
  90.         {   
  91.                
  92.                 WriteOneByte(0xCC);  
  93.                
  94.                 WriteOneByte(0x44);  
  95.                
  96.                 Init_DS18B20();  
  97.                
  98.                 WriteOneByte(0xCC);  
  99.                
  100.                 WriteOneByte(0xBE);   
  101.                
  102.                 Temp_Value[0]=ReadOneByte();   
  103.                
  104.                 Temp_Value[1]=ReadOneByte();  
  105.                
  106.                 DS18B20_IS_OK=1;  
  107.                
  108.         }  
  109.       
  110. }
  111. /**********给DS18B20设置报警值********/   
  112. void Set_Alarm_Temp_Value()   
  113. {
  114.       
  115.         Init_DS18B20();
  116.       
  117.         WriteOneByte(0xcc);   
  118.       
  119.         WriteOneByte(0x4e);   
  120.       
  121.         WriteOneByte(Alarm_Temp_HL[0]); //写TH
  122.       
  123.         WriteOneByte(Alarm_Temp_HL[1]); //写TL
  124.       
  125.         WriteOneByte(0x7f);    //12位精度
  126.       
  127.         Init_DS18B20();
  128.       
  129.         WriteOneByte(0xcc);    //跳过序列号
  130.       
  131.         WriteOneByte(0x48);    //将温度报警值存入DS18B20
  132.       
  133. } /**********温度值显示******************/  
  134. void Display_Temperature()      //显示温度
  135. {
  136.       
  137.         uchar i;
  138.       
  139.         uchar t=150;                     //延时值
  140.       
  141.         uchar ng=0,np=0;     //负数标示及负号显示位置
  142.       
  143.         char Signed_Current_Temp;
  144.       
  145.         if((Temp_Value[1]&0xf8)==0xf8)  //如果为负数取反加1设置负数标示及负号显示位置
  146.                
  147.         {
  148.                
  149.                 Temp_Value[1]=~Temp_Value[1];
  150.                
  151.                 Temp_Value[0]=~Temp_Value[0]+1;
  152.                
  153.                 if(Temp_Value[0]==0x00)Temp_Value[1]++;
  154.                
  155.                 ng=1;np=0xfd;
  156.                
  157.         }
  158.       
  159.         Display_Digit[0]=df_Table[Temp_Value[0]&0x0f];   
  160.       
  161.         CurrentT=((Temp_Value[0]&0xf0)>>4)|((Temp_Value[1]&0x07)<<4);
  162.       
  163.         Signed_Current_Temp=ng? -CurrentT : CurrentT;
  164.       
  165.         HI_Alarm= Signed_Current_Temp >= Alarm_Temp_HL[0] ? 1:0;
  166.       
  167.         LO_Alarm= Signed_Current_Temp <= Alarm_Temp_HL[1] ? 1:0;
  168.       
  169.         Display_Digit[3]=CurrentT/100;
  170.       
  171.         Display_Digit[2]=CurrentT%100/10;
  172.       
  173.         Display_Digit[1]=CurrentT%10;
  174.       
  175.         if(Display_Digit[3]==0)     
  176.                
  177.         { Display_Digit[3]=10;
  178.       
  179.         np=0xfb;
  180.       
  181.         if(Display_Digit[2]==0)
  182.                
  183.         {  
  184.                
  185.                 Display_Digit[2]=10;
  186.                
  187.                 np=0xf7;
  188.                
  189.         }
  190.       
  191.         }
  192.       
  193.         for(i=0;i<30;i++)    //刷新数码管显示温度值
  194.                
  195.         {
  196.                
  197.                 P0=0X39;P2=0X7F;Delay(t);P2=0XFF;
  198.                
  199.                 P0=0X63;P2=0XBF;Delay(t);P2=0XFF;
  200.                
  201.                 P0=DSY_CODE[Display_Digit[0]];
  202.                
  203.                 P2=0XDF;Delay(t);P2=0XFF;
  204.                
  205.                 P0=(DSY_CODE[Display_Digit[1]])|0X80;
  206.                
  207.                 P2=0XEF;Delay(t);P2=0XFF;
  208.                
  209.                 P0=DSY_CODE[Display_Digit[2]];
  210.                
  211.                 P2=0XF7;Delay(t);P2=0XFF;
  212.                
  213.                 P0=DSY_CODE[Display_Digit[3]];
  214.                
  215.                 P2=0XFB;Delay(t);P2=0XFF;
  216.                
  217.                 if(ng) {P0=0X40;P2=np;Delay(t);P2=0XFF;}
  218.                
  219.         }
  220.       
  221. }
  222. /**********定时器0中断控制报警声音********/  
  223. void T0_INT()interrupt 1
  224. {
  225.       
  226.         TH0=-1000/256;
  227.       
  228.         TL0=-1000%256;
  229.       
  230.         BEEP=!BEEP;
  231.       
  232.         if(++Time0_Count==400)
  233.                
  234.         {
  235.                
  236.                 Time0_Count=0;
  237.                
  238.                 if(HI_Alarm)HI_LED=~HI_LED;
  239.                
  240.                 else HI_LED=1;
  241.                
  242.                 if(LO_Alarm)LO_LED=~LO_LED;
  243.                
  244.                 else LO_LED=1;
  245.                
  246.         }
  247.       
  248. }
  249. void main()
  250. {
  251.       
  252.         IE=0X82;
  253.       
  254.         TMOD=0X01;       //方式1计数
  255.       
  256.         TH0=-1000/256;
  257.       
  258.         TL0=-1000%256;
  259.       
  260.         TR0=0;
  261.       
  262.         HI_LED=1;
  263.       
  264.         LO_LED=1;
  265.       
  266.         Set_Alarm_Temp_Value();
  267.       
  268.         Read_Temperature();
  269.       
  270.         Delay(50000); Delay(50000);
  271.       
  272.         while(1)
  273.                
  274.         {
  275.                
  276.                 Read_Temperature();
  277.                
  278.                 if(DS18B20_IS_OK)
  279.                        
  280.                 {
  281.                        
  282.                         if(HI_Alarm==1||LO_Alarm==1)TR0=1;
  283.                        
  284.                         else TR0=0;
  285.                        
  286.                         Display_Temperature();   
  287.                        
  288.                 }
  289.                
  290.                 else{P0=P2=0X00;}  
  291.                
  292.         }
  293.       
  294. }
复制代码


评分

参与人数 3黑币 +73 收起 理由
shuisheng + 15
yoxi + 8 赞一个!
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:472242 发表于 2019-2-7 01:26 | 只看该作者
好样的,收下了

评分

参与人数 10黑币 +245 收起 理由
钻牛尖滴刘尖尖 + 15
站着说话不腰疼 + 15
sheng7533967 + 15
yoxi + 10
Sawardeakar + 35
areyouok + 35
刀刀见红 + 35
zhengchong60 + 15
shuisheng + 35
Trump1438 + 35

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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