单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机实验程序:LCD1602显示温度报警

[复制链接]
跳转到指定楼层
楼主
凯旋小飞 发表于 2017-6-4 13:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
实验6:LCD1602显示温度报警

单片机源程序如下:
  1. /**************************************************************************************
  2. *                              **                                                                                                  *
  3. 实现现象:下载程序后插上LCD1602液晶在开发板上,即可显示
  4. 注意事项:如果不想让点阵模块显示,可以将74HC595模块上的JP595短接片拔掉。                                                                                                                                                                  
  5. ***************************************************************************************/

  6. //DS18B20温度采集,LCD1602显示
  7. #include<reg52.h>
  8. #define uchar unsigned char
  9. #define uint unsigned int
  10. uchar table[]={"  T:                                       "};
  11. uchar table1[]={"  Tmax 32                                              "};
  12. /********IO引脚定义**********/
  13. sbit rs=P2^6;
  14. sbit rw=P2^5;
  15. sbit en=P2^7;
  16. sbit dq=P3^7;
  17. sbit beep=P1^5;

  18. uchar num;
  19. uint tempwarn,d=0,h=0;

  20. void delay(uint n)                //延时程序
  21. {
  22.         while(n--);
  23. }
  24. //液晶写命令程序
  25. void write_com(uchar com)  
  26. {
  27.         rs=0;                        //等0输入命令
  28.         en=0;                        //液晶使能信号初始化
  29.         P0=com;                        //把com参数,液晶的命令值送到P0口
  30.         delay(100);                //延时,按照液晶的时序图的要求
  31.         en=1;                        //使能信号,0到1表示上升沿打开可以写命令数据到液晶里
  32.         delay(100);
  33.         en=0;                        //使能信号回复
  34. }
  35. void write_data(uchar date)           //液晶写数据程序
  36. {
  37.         rs=1;                  //等1表示输入数据
  38.         en=0;
  39.         P0=date;          //把date参数,液晶的数据送到P0口
  40.         delay(100);
  41.         en=1;
  42.         delay(100);
  43.         en=0;
  44. }  //液晶初始化程序
  45. void init()      
  46. {
  47.         en=0;
  48.         write_com(0x38);        //设置16X2显示,5X7点阵,8位数据口
  49.         write_com(0x0c);        //设置开显示,不显示光标
  50.         write_com(0x06);        //写一个字符后地址指针加1
  51.         write_com(0x01);        //显示清0,数据指针清0
  52. }
  53. void  Writebyte(uchar dat)//DS18B20温度芯片的写字节程序
  54. {
  55.         uchar j;
  56.         for(j=0;j<8;j++)
  57.         {
  58.                 dq=0;
  59.                 dq=dat&0x01;
  60.                 delay(5);
  61.                 dq=1;
  62.                 dat>>=1;
  63.         }
  64. }
  65. uchar Readbyte(void)//DS18B20温度芯片读字节程序
  66. {
  67.         uchar i,dat=0;
  68.         for(i=0;i<8;i++)
  69.         {
  70.                 dq=0;
  71.                 dat>>=1;
  72.                 dq=1;
  73.                 if(dq==1)
  74.                 dat|=0x80;
  75.                 delay(4);
  76.         }        
  77.         return dat;
  78. }
  79. void initds18b20(void)//温度芯片初始化程序
  80. {
  81.         uchar x=0;
  82.         dq=1;
  83.         delay(8);
  84.         dq=0;
  85.         delay(80);
  86.         dq=1;
  87.         delay(14);
  88.         x=dq;
  89.         delay(20);
  90. }
  91. void Readtemp(void)//读温度程序
  92. {
  93.         initds18b20();
  94.         Writebyte(0xcc);
  95.         Writebyte(0x44);

  96.         initds18b20();
  97.         Writebyte(0xcc);
  98.         Writebyte(0xbe);
  99.         d=Readbyte();        //温度信号的低8位数据函数
  100.         h=Readbyte();        //温度信号的高8位数据函数
  101. }
  102. get() //温度信号处理程序,把温度信号数据值转换为液晶显示
  103. {
  104.         uint temp,tmp;
  105.         float tt;
  106.         tmp=d;         //低8位数据给tmp
  107.         temp=h;         //高8位数据给temp
  108.         temp<<=8;  //高8位左移8位
  109.         temp|=d;   //高低8位数据或起来再赋给temp
  110.         if((h&0x80)!=0)         //高8位h&10000000是否等0,不等0表示负多少度
  111.         {
  112.                 table[7]='-';        //把-赋给液晶数组的第8个元素,表示-号在第8位,1602一行有16个字符
  113.                 temp=temp-1;
  114.                 temp=~temp;
  115.         }
  116.         else
  117.                 table[7]='+';
  118.                 temp>>=4;
  119.                 table[8]=(temp/100)+'0';        //液晶第9位字符为温度的百位数,例如120度的1
  120.                 table[9]=(temp/10)%10+'0';      //液晶第10位字符为温度的十位数,例如120度的2
  121.                 table[10]=(temp%10)+'0';        //液晶第9位字符为温度的个位数,例如120度的0
  122.                 tmp=tmp&0x0f;                                          //低位温度提取小数数据
  123.                 tt=tmp*0.0625;                                         //小数部分数据转换
  124.                 table[11]='.';                                         //显示小数点
  125.                 table[12]=((uchar)(tt*10))%10+'0';//小数点后面的小数数字
  126.                 tempwarn=temp;               
  127.         return tempwarn;//温度值返回
  128. }
  129. void warn(uint tempwarn)//温度报警程序
  130. {
  131.                 if(tempwarn>=32)//如果温度大于25度并且启动报警
  132.         {
  133.                 beep=0;
  134.                 delay(5000);
  135.                 beep=1;
  136.                 delay(50000);
  137.         }
  138. }
  139. void main()
  140. {        
  141.         rw=0;                              //rw直接置0,应该在液晶初始化前,否则断电后再通电就不能显示,切记!!!
  142.         init();                         //液晶初始化函数
  143.         write_com(0x80+0x40);             //0x80+0x40表示液晶的第二行开始显示
  144.         for(num=0;num<16;num++)            //num<16,16表示显示16位
  145.         {
  146.                 write_data(table1[num]);    //液晶显示需要的内容,调用写液晶数据函数,这行显示拼音dengtianming        
  147.         }
  148.         while(1)                            //大循环,不断检测和更新温度
  149.         {
  150.                  Readtemp();
  151.                  get();
  152.              warn(tempwarn);
  153.                  write_com(0x80);  //液晶的第一行开始地址
  154.                  for(num=0;num<15;num++)//显示16位数据,后面的几位没有用到就写不到16,以免后面的几位会出现一个随机数据显示乱码
  155.                  {
  156.                         write_data(table[num]);//液晶需要显示的内容
  157.                  }
  158. ……………………

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

所有资料51hei提供下载:
实验6:LCD1602显示温度报警.rar (32.49 KB, 下载次数: 130)


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

使用道具 举报

沙发
wpzj 发表于 2018-4-10 10:10 | 只看该作者
绝世好文 啊
回复

使用道具 举报

板凳
嘤叶知秋 发表于 2018-4-25 08:17 来自手机 | 只看该作者
最近正在做相关设计,非常感谢分享
回复

使用道具 举报

地板
铭乐 发表于 2018-5-25 16:27 | 只看该作者
很好,值得学习
回复

使用道具 举报

5#
无效楼层,该帖已经被删除
6#
Jaciky 发表于 2018-12-31 20:25 | 只看该作者
很好,对我正在做的课设很有帮助
回复

使用道具 举报

7#
yaoyao886 发表于 2019-1-11 11:02 | 只看该作者
大佬 请问为什么用了这程序 无论怎么调 声音都是滴 滴 滴,不是尖锐的报警声呢》?
回复

使用道具 举报

8#
无效楼层,该帖已经被删除
9#
tiwen 发表于 2019-1-11 15:06 | 只看该作者
很好 值得学习
回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51黑电子论坛单片机.

Powered by 单片机教程网

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