分享:LCD1602温度检测显示程序(ATmega16)

2019-10-12来源: eefocus关键字:LCD1602  温度检测  显示程序  ATmega16

单片机源程序如下:


  1. //**********************************************************************//

  2. //*************************      头文件定义       **********************//

  3. //**********************************************************************//

  4. #include

  5. #include


  6. //宏定义

  7. #define uchar unsigned char

  8. #define uint unsigned int


  9. //温度18b20(数据线端口)

  10. #define tmp (PINB&BIT(PB3))

  11. #define temp_h PORTB |= BIT(PB3)

  12. #define temp_l PORTB &=~BIT(PB3)

  13. #define temp_o DDRB |= BIT(PB3)

  14. #define temp_i DDRB &=~BIT(PB3)


  15. //LCD1602液晶显示(数据线端口)

  16. #define rs_h PORTB |= BIT(PB0)//数据/命令选择

  17. #define rs_l PORTB &=~BIT(PB0)

  18. #define rw_h PORTB |= BIT(PB1)//读/写选择

  19. #define rw_l PORTB &=~BIT(PB1)

  20. #define en_h PORTB |= BIT(PB2)//使能信号

  21. #define en_l PORTB &=~BIT(PB2)


  22. //温度18b20(变量定义)

  23. unsigned char dat1=0x00;//保存读出的温度 L

  24. unsigned char dat2=0x00;//保存读出的温度 H

  25. unsigned long int dat=0;//保存读出的温度 XS

  26. unsigned char flag=0;//错误标志位

  27. //按键定义

  28. unsigned char key1=0;

  29. unsigned char key2=0;

  30. //unsigned char key3=0;

  31. //unsigned char key4=0;

  32. //返回值变量

  33. unsigned char keyvalue=0;

  34. //温度H

  35. unsigned char tempH=30;

  36. //温度L

  37. unsigned char tempL=20;


  38. //**********************************************************************//

  39. //*************************      IO 端口定义      **********************//

  40. //**********************************************************************//


  41. void IO_init(void)

  42. {          

  43.          DDRA = 0XFF;

  44.          DDRB = 0XF0;

  45.          DDRC = 0XFF;

  46.          DDRD = 0XFF; 

  47.         PORTA = 0X00;

  48.         PORTB = 0X00;

  49.         PORTC = 0XFF;

  50.         PORTD = 0XFF;

  51. }


  52. //**********************************************************************//

  53. //*************************      延时函数         **********************//

  54. //**********************************************************************//


  55. void delayms(uint z)          //8M晶振下,延时1ms

  56. {

  57.          uint x,y;

  58.          for(x=z;x>0;x--)

  59.                   for(y=1333;y>0;y--);

  60. }


  61. //**********************************************************************//

  62. //***************************      18B20        ************************//

  63. //**********************************************************************//


  64. void Ds18b20_reset(void)//DS18B20初始化

  65. {

  66.         uint count;

  67.         temp_o;

  68.         temp_l;

  69.         for(count=700;count>0;count--);//延时480us

  70.         temp_h;

  71.         temp_i;//不须配置PORT内部上拉电阻,MCU输入输出自动切换

  72.         while((tmp==0x08));//&&(i>0)) i--;

  73.         for(count=700;count>0;count--);//延时480us

  74. }

  75. void Ds18b20_write(uchar dat)//向DS18B20写一个字节

  76. {

  77.         uchar count;

  78.         uchar i;

  79.         temp_o;

  80.         for(i=8;i>0;i--)

  81.         {

  82.                 temp_l;

  83.                 for(count=2;count>0;count--);

  84.                 //temp_h;//不能有此语句

  85.                 if(dat&0x01==0x01)

  86.                         temp_h;

  87.                 else

  88.                         temp_l;

  89.                 for(count=120;count>0;count--);//延时60us

  90.                 temp_h;

  91.                 dat>>=1;        

  92.         }        

  93. }

  94. uchar Ds18b20_read(void)//从DS18B20读一个字节

  95. {

  96.         uchar i,datt;

  97.         uchar count;

  98.         for(i=8;i>0;i--)

  99.         {

  100.                 datt>>=1;

  101.                 temp_o;

  102.                 temp_l;

  103.                 for(count=2;count>0;count--);

  104.                 temp_h;//此语句必须有,参考datasheet的P15

  105.                 for(count=1;count>0;count--);

  106.                 temp_i;

  107.                 if(tmp==0x08)

  108.                         datt|=0x80;

  109.                 for(count=120;count>0;count--);        //延时60us

  110.         }

  111.         return datt;

  112. }

  113. void temp_Read(void)//温度读取

  114. {

  115.          Ds18b20_reset();//DS18B20初始化

  116.         Ds18b20_write(0xcc);//跳过ROM

  117.         Ds18b20_write(0x44);//发送温度转换命令

  118.         delayms(1000);//延时1s,等待温度转换完成

  119.         Ds18b20_reset();//DS18B20初始化

  120.         Ds18b20_write(0xcc);//跳过ROM

  121.         Ds18b20_write(0xbe);//发送读温度寄存器命令

  122.         dat1=Ds18b20_read();//读温度值的低字节

  123.         dat2=Ds18b20_read();//读温度值的高字节

  124. }

  125. void temp_display(void)//温度显示

  126. {

  127.         if(dat2>=240)//dat2温度值的高字节为1时为负温度

  128.         {

  129.                 dat=(~(dat2*256+dat1)+1)*0.625;//负温度:取反加一,保留一位小数

  130.                 flag=1;

  131.         }

  132.         else

  133.         {

  134.                 dat=(dat2*256+dat1)*0.625;

  135.                 flag=0;

  136.         }

  137.         if(flag==1)//负温度显示

  138.         {

  139.                  LCD_write_str(0,0," 18B20 ");

  140.                 LCD_write_str(3,1,"Temp:");

  141.                 LCD_write_str(8,1,"-");// 符号“- ”

  142.                 LCD_write_char(9,1,0x30+dat/1000);

  143.                 LCD_write_char(10,1,0x30+dat%1000/100);

  144.                 LCD_write_char(11,1,0x30+dat%100/10);

  145.                 LCD_write_str (12,1,".");// 符号“. ”

  146.                 LCD_write_char(13,1,0x30+dat%10);        

  147.         }

  148.         if(flag==0)//正温度显示

  149.         {           

  150.                 LCD_write_str(0,0," 18B20 ");

  151.                 LCD_write_str(3,1,"Temp:");

  152.                 LCD_write_str(8,1," ");// 符号“+ ”

  153.                 LCD_write_char(9,1,0x30+dat/1000);

  154.                 LCD_write_char(10,1,0x30+dat%1000/100);

  155.                 LCD_write_char(11,1,0x30+dat%100/10);

  156.                 LCD_write_str (12,1,".");// 符号“. ”

  157.                 LCD_write_char(13,1,0x30+dat%10);

  158.         }        

  159. }

  160. void tempH_Setting(void)//最高温度设置显示

  161. {

  162.          LCD_write_str(0,0," temp(H)Setting ");

  163.         LCD_write_char(6,1,0x30+tempH%1000/100);

  164.         LCD_write_char(7,1,0x30+tempH%100/10);

[1] [2] [3]
关键字:LCD1602  温度检测  显示程序  ATmega16 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic476952.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:AVR单片机串口USART与PC通讯实例,讲解原理和程序
下一篇:atmega128 AD 转换

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

能和LCD竞争?中电熊猫实验室成功开发Micro LED新技术
Mikro Mesa Technology于2017年开始与南京中电熊猫合作,在中电熊猫的实验室经过2年的开发,成功开发出无压合低温键结 3um Micro LED巨量转移技术,让Micro LED 显示技术量产之路,又往前推进了一大步。 Mikro Mesa Technology创办人陈立宜表示,该显示技术是Micro LED通往消费型产品应用之路的一大突破,由于芯片尺寸变小,因此Micro LED的材料成本将大幅降低,不但能够与AMOLED比拟,甚至有机会可以与LCD竞争。至于未来在软性显示器以及透明显示器的应用上,能够发展的空间会更大,将可大幅缩短Micro LED技术相关产品上市的时间点。Mikro
发表于 2019-10-09
国内厂商“高产”导致大尺寸LCD面板价格跳水?
大尺寸面板价格持续跳水,主要原因可能来自国内厂商。 随着下游市场需求疲乏,液晶电视面板价格持续下滑,目前55吋液晶电视面板报价已接近100美元关卡。 研究显示,面板价格跳水,主要原因包括中国厂商所引发的价格战,对各家电视制造商造成日益沉重的压力。 《BusinessKorea》报导,市场研究机构IHS Markit周三(25日)公布调查报告,今年9月, 55吋液晶电视面板的平均价格降至102美元,较8月减少6%,已连续5个月呈现衰退,今年以来累计下跌43美元(30.6%),面临跌破100美元大关的危机。 其他尺寸的LCD面板价格也不断下跌,65吋液晶电视面板的平均价格为167美元,比8月减少
发表于 2019-09-28
三星110亿美元升级LCD工厂,实际是暗地里争夺市场?
在国内与LG内讧不断,在大洋彼岸的中国,还有着来自京东方等显示屏巨头迅速崛起,前有狼,后有虎,三星也不得不做出一些改变。 据韩媒报道,三星显示器公司计划投入13万亿韩元(约合110亿美元),升级其在韩国的一个LCD工厂,以生产更先进的屏幕。 该报道援引知情人士的话称,作为苹果的供应商,三星显示器将于下月正式宣布这一投资决定。但报道未提及这一投资的时间框架。韩国的面板制造商正在努力应对液晶电视和智能手机需求放缓、来自中国对手的竞争,以及主要客户向有机发光二极管(OLED)面板的转变。 根据资料显示,三星显示器在全球拥有3家工厂生产线,其中韩国国内就有两家,另外一家远在中国,受多方面影响,目前各工厂显示器
发表于 2019-09-26
三星投资110亿美元要将LCD产线升级成OLED产线
LCD真的不吃香了?三星投资110亿美元要把LCD产线升级成OLED产线。 据韩媒报道,三星显示器公司计划投入13万亿韩元(约合110亿美元),升级其在韩国的一个液晶显示器(LCD)工厂,以生产更先进的屏幕。  该报道援引知情人士的话称,作为苹果的供应商,三星显示器将于下月正式宣布这一投资决定。但报道未提及这一投资的时间框架。 韩国的面板制造商正在努力应对液晶电视和智能手机需求放缓、来自中国对手的竞争,以及主要客户向有机发光二极管(OLED)面板的转变。 三星显示器上月表示,由于市场供应过剩,该公司正考虑暂停其在韩国的一条LCD生产线。该公司目前在韩国有两条LCD生产线,在中
发表于 2019-09-25
三星投资110亿美元要将LCD产线升级成OLED产线
瑞萨电子推出新型全高清1080p LCD视频控制器
高度集成的RAA278842控制器可实时备份并实时显示摄像头视频以防止事故发生,并启用后视镜辅助泊车。2019 年 9 月 24 日,日本东京讯 - 全球领先的半导体解决方案供应商瑞萨电子株式会社(TSE:6723)今日宣布推出汽车行业首款具备4通道MIPI-CSI2输入的全高清1080p LCD视频控制器。RAA278842 LCD视频控制器的4通道(或2个双通道)MIPI-CSI2输入支持每通道高达1Gbps的速率,可与最新一代车用摄像头、应用处理器和图形处理器连接。该控制器还支持150 MHz单通道OpenLDI接口,以及分辨率高达1920 x 1080的各种视频接口与LCD面板尺寸。RAA278842适用于汽车中
发表于 2019-09-24
瑞萨电子推出新型全高清1080p LCD视频控制器
三星开启“提前退休计划”裁减员工,已开始走向衰退?
LCD面板市场不景气,致使三星也开启了员工“提前退休”计划。 据 BusinessKorea消息,三星显示器公司本月推出了一项提前退休计划,以裁减员工数量。 报道称,三星显示器业务部门开始采取提前退休计划,在公司工作5年以上的员工可以申请。此外,该公司还将一些LCD生产线的员工调到OLED生产线。 提前退休补偿包括两年半或三年工资,以及为有孩子的申请人每人额外支付1000万韩元(约合人民币5.9万元)。三星显示器公司还将为申请人提供子女大学毕业前的学费,并考虑提供额外补偿。员工补偿将通过个人退休金账户以退休金的形式发放。 节节败退三星9月份在华关闭最后一家手机工厂——惠州手机工厂,截止
发表于 2019-09-21
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved