找回密码
 立即注册

QQ登录

只需一步,快速开始

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

低于或超过某一个温度报警且控制继电器吸停

[复制链接]
跳转到指定楼层
楼主
该系统是温度控制系统。当温度超过上限值时,高温LED灯闪烁,蜂鸣器响,继电器吸合。当温度低于下限值时,低温LED灯闪烁,蜂鸣器响,时继电器松开,
对温度有报警有控制。程序注悉非常详细
所有资料打包下载:
LCD1602显示DS18B20时钟超时报警.zip (59.62 KB, 下载次数: 219)

源码预览:
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. #define LCD1602_DATAPINS P0
  5. sbit LCD1602_E=P2^7;
  6. sbit LCD1602_RW=P2^5;
  7. sbit LCD1602_RS=P2^6;
  8. sbit DSPORT=P3^7; //DS18B20的数据IO口
  9. sbit LED_H=P1^3;  //超温指示灯
  10. sbit LED_L=P1^4;  //超温指示灯
  11. sbit Relay=P1^6;  //温度控制继电器
  12. sbit CLK=P1^5;    //温度越限蜂鸣器报警
  13. sbit Key1=P1^0;   //按键1,备用,本程序未涉及按键
  14. sbit Key2=P1^1;   //按键2,备用,本程序未涉及按键
  15. sbit Key3=P1^2;   //按键3,备用,本程序未涉及按键
  16. void Delay1ms(uint x)  //当晶振=24MHz、x=1,延时1ms
  17. {
  18.         uint y,z;
  19.         for(y=x; y>0; y--)
  20.   for(z=247; z>0; z--);
  21. }
  22. void Delay1us(uint i)  //当晶振=24MHz、i=1,,延时10us
  23. {
  24.   while(i--);
  25. }
  26. /***********************************初始化**********************************/
  27. uchar Ds18b20Init()
  28. {
  29.         uchar i;
  30.         DSPORT = 0;                 //将总线拉低480us~960us
  31.   Delay1us(150); //精确延时=501us,低于777us不能输出温度
  32.         DSPORT = 1;                 //然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低
  33.         i = 0;
  34.         while(DSPORT)         //等待DS18B20拉低总线
  35.         {
  36.                 i++;
  37.                 if(i>50)      //等待>5MS
  38.                 {
  39.                         return 0; //程序能运行到这里,说明DSPORT=1,总线没被拉低,初始化失败,返回while(DSPORT)记下判断
  40.                 }
  41.                 Delay1ms(1);       
  42.         }
  43.         return 1;     //在while(DSPORT)循环中,总线没被拉低,一旦DSPORT=0,总线被拉低,初始化成功,向调用处返回1
  44. }
  45. /**********************************读取一个字节********************************/
  46. uchar Ds18b20ReadByte()
  47. {
  48.         uchar byte, bi;
  49.         uint i, j;       
  50.         for(j=8; j>0; j--)
  51.         {
  52.                 DSPORT = 0;    //先将总线拉低1us   
  53.                 Delay1us(1);   //延时
  54.                 DSPORT = 1;    //然后释放总线
  55.                 Delay1us(1);   //延时   
  56.                 bi = DSPORT;         //读取数据,从最低位开始读取
  57.                 /*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/
  58.                 byte = (byte >> 1) | (bi << 7);                                                  
  59.                 i = 4;                //读取完之后等待48us再接着读取下一个数
  60.                 while(i--);
  61.         }                               
  62.         return byte;
  63. }
  64. /*****************************向18B20写入一个字节******************************/
  65. void Ds18b20WriteByte(uchar dat)
  66. {
  67.         uint i, j;
  68.         for(j=0; j<8; j++)
  69.         {
  70.                 DSPORT = 0;                        //每写入一位数据之前先把总线拉低1us
  71.                 i++;
  72.                 DSPORT = dat & 0x01; //然后写入一个数据,从最低位开始
  73.                 i=6;
  74.                 while(i--); //延时68us,持续时间最少60us
  75.                 DSPORT = 1;        //然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值
  76.                 dat >>= 1;
  77.         }
  78. }
  79. /*********************************让18b20开始转换温度***************************/
  80. void  Ds18b20ChangTemp()
  81. {
  82.         Ds18b20Init();
  83.         Delay1ms(1);
  84.         Ds18b20WriteByte(0xcc);                //跳过ROM操作命令                 
  85.         Ds18b20WriteByte(0x44);          //温度转换命令  
  86. }
  87. /**********************************发送读取温度命令******************************/
  88. void  Ds18b20ReadTempCom()
  89. {       
  90.         Ds18b20Init();
  91.         Delay1ms(1);
  92.         Ds18b20WriteByte(0xcc);         //跳过ROM操作命令
  93.         Ds18b20WriteByte(0xbe);         //发送读取温度命令
  94. }
  95. /************************************读取温度*********************************/
  96. int Ds18b20ReadTemp()
  97. {
  98.         int temp = 0;
  99.         uchar tmh, tml;
  100.         Ds18b20ChangTemp();                                 //先写入转换命令
  101.         Ds18b20ReadTempCom();                        //然后等待转换完后发送读取温度命令
  102.         tml = Ds18b20ReadByte();        //读取温度值共16位,先读低字节
  103.         tmh = Ds18b20ReadByte();        //再读高字节
  104.         temp = tmh;
  105.         temp <<= 8;
  106.         temp |= tml;
  107.         return temp;
  108. }
  109. /***********************向LCD写入一个字节的命令***************************/
  110. void LcdWriteCom(uchar com)          //写入命令
  111. {
  112.         LCD1602_E = 0;     //使能
  113.         LCD1602_RS = 0;           //选择发送命令
  114.         LCD1602_RW = 0;           //选择写入       
  115.         LCD1602_DATAPINS = com;  //放入命令
  116.         Delay1ms(1);                         //等待数据稳定
  117.         LCD1602_E = 1;                 //写入时序
  118.         Delay1ms(5);                   //保持时间
  119.         LCD1602_E = 0;
  120. }
  121. /*************************向LCD写入一个字节的数据*****************************/                             
  122. void LcdWriteData(uchar dat)                        //写入数据
  123. {
  124.         LCD1602_E = 0;        //使能清零
  125.         LCD1602_RS = 1;        //选择输入数据
  126.         LCD1602_RW = 0;        //选择写入
  127.         LCD1602_DATAPINS = dat; //写入数据
  128.         Delay1ms(1);
  129.         LCD1602_E = 1;  //写入时序
  130.         Delay1ms(5);    //保持时间
  131.         LCD1602_E = 0;
  132. }
  133. /*********************************初始化LCD屏**********************************/                  
  134. void LcdInit()                                                  //LCD初始化子程序
  135. {
  136.         LcdWriteCom(0x38);  //开显示
  137.         LcdWriteCom(0x0c);  //开显示不显示光标
  138.         LcdWriteCom(0x06);  //写一个指针加1
  139.         LcdWriteCom(0x01);  //清屏
  140.         LcdWriteCom(0x80);  //设置数据指针起点
  141. }
  142. void LcdDisplay(int temp)            //lcd显示
  143.   {   
  144.     uchar datas[]={0,0,0,0,0}; //定义数组
  145.     float tp;  
  146.     if(temp< 0)                                    //当温度值为负数
  147.     {
  148.       LcdWriteCom(0x80);  //写地址 80表示初始地址
  149.       LcdWriteData('-');  //显示负
  150.       temp=temp-1;        //因为读取的温度是实际温度的补码,所以减1,再取反求出原码
  151.       temp=~temp;
  152.       tp=temp;
  153.       temp=tp*0.0625*100+0.5;        //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
  154.                               //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
  155.                               //算由0.5,还是在小数点后面。
  156.     }
  157.     else
  158.     {                       
  159.       LcdWriteCom(0x80);                  //写地址0x80表示初始地址
  160.       LcdWriteData('+');                   //显示正温度
  161.       tp=temp;                //因为数据处理有小数点所以将温度赋给一个浮点型变量
  162.                               //如果温度是正的那么,那么正数的原码就是补码它本身
  163.       temp=tp*0.0625*100+0.5;        //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
  164.                               //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
  165.                               //算加上0.5,还是在小数点后面。
  166.       CLK=1;                  //防止蜂鸣器响
  167.       LED_H=1;                //防止高温LED灯闪亮
  168.       LED_L=1;                //防止低温LED灯闪亮
  169.       Relay=1;                //防止加温继电器吸合
  170.       if(temp/100-0.5>25)     //判断温度是否高于设定温度
  171.       {
  172.         CLK=~CLK;             //超温蜂鸣器响,也可以其它有源报警声
  173.         LED_H=~LED_H;         //高温LED灯闪亮
  174.         LED_L=1;              //防止低温指示灯点燃
  175.         Relay=1;              //高温加热继电器关闭
  176.         Delay1us(20);         //延时100us
  177.       }
  178.       if(temp/100-0.5<20)     //判断温度是否低于设定温度
  179.       {
  180.         CLK=~CLK;             //超温蜂鸣器响,也可以其它有源报警声
  181.         LED_L=~LED_L;         //低温LED灯闪亮
  182.         LED_H=1;              //防止高温指示灯点燃
  183.         Relay=0;              //低温加热继电器吸合
  184.         Delay1us(20);         //延时100us
  185.       }
  186.     }
  187.     datas[0] = temp / 10000;         //计算百位值
  188.     datas[1] = temp % 10000 / 1000;  //计算十位值
  189.     datas[2] = temp % 1000 / 100;    //计算个位值
  190.     datas[3] = temp % 100 / 10;      //计算小数点后第一位值
  191.     datas[4] = temp % 10;            //计算小数点后第二位值
  192.     LcdWriteCom(0x82);                      //写百位初始地址
  193.     LcdWriteData('0'+datas[0]); //显示百位        
  194.     LcdWriteCom(0x83);                      //写十位初始地址
  195.     LcdWriteData('0'+datas[1]); //显示十位
  196.     LcdWriteCom(0x84);                      //写个位初始地址
  197.     LcdWriteData('0'+datas[2]); //显示个位
  198.     LcdWriteCom(0x85);                      //写‘.’初始地址
  199.     LcdWriteData('.');                       //显示 ‘.’
  200.     LcdWriteCom(0x86);                      //写小数点后第一位初始地址
  201.     LcdWriteData('0'+datas[3]); //显示小数点后第一位数  
  202.     LcdWriteCom(0x87);                      //写小数点后第二位初始地址
  203.     LcdWriteData('0'+datas[4]); //显示小数点后第二位数   
  204.   }
  205. /************************************主函数*******************************************/
  206. void main()
  207. {
  208.         LcdInit();                            //初始化LCD1602
  209.         LcdWriteCom(0x88);        //写'C'地址
  210.         LcdWriteData('C');  //显示'C'
  211.         while(1)
  212.         {
  213.                 LcdDisplay(Ds18b20ReadTemp());
  214.         }
  215. }
复制代码


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:1 发表于 2016-12-3 23:35 | 只看该作者
51黑有你更精彩!!!
回复

使用道具 举报

板凳
ID:108991 发表于 2016-12-14 16:31 | 只看该作者
感激不尽
回复

使用道具 举报

地板
ID:1035250 发表于 2022-6-21 10:49 来自手机 | 只看该作者
可以调温度上下限吗
回复

使用道具 举报

5#
ID:1035250 发表于 2022-6-21 15:19 来自手机 | 只看该作者
谁能根据楼主的资料画一个Proteus仿真图学习一下吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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