找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机温湿度代码,lcd,报警 串口

[复制链接]
跳转到指定楼层
楼主
ID:251105 发表于 2018-6-19 21:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
51温湿度代码,lcd,报警 串口

单片机源程序如下:
  1. /*******************************************************************************
  2. * 实验名                           :温度显示实验
  3. * 使用的IO             :
  4. * 实验效果       :1602显示温度
  5. *        注意                                         :
  6. *******************************************************************************/
  7. typedef unsigned char  U8;  
  8. typedef unsigned short     int uint16_t;
  9. #include<reg51.h>
  10. #include"lcd.h"
  11. #include"temp.h"
  12. sbit beep=P2^0;
  13. sbit k1=P1^4;//jia
  14. sbit k2=P1^5;//jian
  15. unsigned char  outdata[14];  
  16. uchar CNCHAR[13] = "set temp:32.0";
  17. U8  count, count_r=0;
  18. U8  str[15]={"res23205"};
  19. int SETTEMP;
  20. void LcdDisplay(int);
  21. void UsartConfiguration();
  22. SendData(U8 *a)
  23. {
  24.         outdata[0] = a[0];
  25.         outdata[1] = a[1];
  26.         outdata[2] = a[2];
  27.         outdata[3] = a[3];
  28.         outdata[4] = a[4];
  29.         outdata[5] = a[5];
  30.         outdata[6] = a[6];
  31.         outdata[7] = a[7];
  32.         outdata[8] = a[8];
  33.         outdata[9] = a[9];
  34.         outdata[10] = a[10];
  35.         outdata[11] = a[11];
  36.         outdata[12] = a[12];
  37.         outdata[13] = a[13];
  38.        
  39.         SBUF=outdata[0];
  40.         count = 1;
  41. }

  42. /*******************************************************************************
  43. * 函数名         : LcdDisplay()
  44. * 函数功能                   : LCD显示读取到的温度
  45. * 输入           : v
  46. * 输出                  : 无
  47. *******************************************************************************/

  48. void LcdDisplay(int temp)          //lcd显示
  49. {
  50.           unsigned char i, datas[] = {0, 0, 0, 0, 0}; //定义数组
  51.                 float tp;  

  52.           LcdWriteCom(0x80);                //写地址 80表示初始地址
  53.                 tp=temp;
  54.                 temp=tp*0.0625*100+0.5;       
  55.                 if((temp/100)>(SETTEMP-1))
  56.                 {
  57.                         beep=0;
  58.                 }
  59.                 else
  60.                 {
  61.                 beep=1;
  62.                 }


  63.                 //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
  64.                 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
  65.                 datas[1] = temp % 10000 / 1000;
  66.                 datas[2] = temp % 1000 / 100;
  67.                 datas[3] = temp % 100 / 10;
  68.                 datas[4] = temp % 10;
  69.                
  70.                
  71.                 str[0]=datas[1]+'0';
  72.                 str[1]=datas[2]+'0';
  73.                 str[2]='.';
  74.                 str[3]=datas[3]+'0';
  75.                 str[4]='T';
  76.                 str[5]=SETTEMP/10+'0';
  77.                 str[6]=SETTEMP%10+'0';
  78.                 str[7]='U';
  79.                 LcdWriteCom(0x80);                 //写地址 80表示初始地址
  80.                 LcdWriteData('t');       
  81.                 LcdWriteCom(0x81);                 //写地址 80表示初始地址
  82.                 LcdWriteData('e');       
  83.                 LcdWriteCom(0x82);                 //写地址 80表示初始地址
  84.                 LcdWriteData('m');
  85.                 LcdWriteCom(0x83);                 //写地址 80表示初始地址
  86.                 LcdWriteData('p');       
  87.                 LcdWriteCom(0x84);                 //写地址 80表示初始地址
  88.                 LcdWriteData(':');               
  89.                 LcdWriteCom(0x85);                 //写地址 80表示初始地址
  90.                 LcdWriteData('0'+datas[1]); //十位
  91.                 LcdWriteCom(0x86);                //写地址 80表示初始地址
  92.                 LcdWriteData('0'+datas[2]); //个位
  93.                 LcdWriteCom(0x87);                //写地址 80表示初始地址
  94.                 LcdWriteData('.');                 //显示 ‘.’
  95.                 LcdWriteCom(0x88);                 //写地址 80表示初始地址
  96.                 LcdWriteData('0'+datas[3]); //显示小数点  
  97.                 LcdWriteCom(0x89);                 //写地址 80表示初始地址
  98.                 LcdWriteData('C'); //显示小数点
  99.                 LcdWriteCom(0x80+0x40);                 //写地址 80表示初始地址
  100.                 for(i=0;i<=8;i++)
  101.                                 {
  102.                                         LcdWriteData(CNCHAR[i]);
  103.                                 }
  104.                 LcdWriteCom(0x80+0x40+13);
  105.                 LcdWriteData('C');               
  106. //                datas1[0]=SETTEMP/10;
  107. //                datas1[1]=SETTEMP%10;
  108. //                LcdWriteCom(0x80+0x40+9);
  109. //                LcdWriteData(datas1[0]+'0');       
  110. //                LcdWriteCom(0x80+0x40+10);
  111. //                LcdWriteData(datas1[1]+'0');       
  112.                 LcdWriteCom(0x80+0x40+11);
  113.                 LcdWriteData('.');       
  114.                 LcdWriteCom(0x80+0x40+12);
  115.                 LcdWriteData('0');       
  116. }
  117. /*******************************************************************************
  118. * 函 数 名         :UsartConfiguration()
  119. * 函数功能                   :设置串口
  120. * 输    入         : 无
  121. * 输    出         : 无
  122. *******************************************************************************/

  123. void UsartConfiguration()
  124. {
  125.                 TMOD = 0x20;          //定时器T1使用工作方式2
  126.                 TH1 = 253;        // 设置初值
  127.                 TL1 = 253;
  128.                 TR1 = 1;          // 开始计时
  129.                 SCON = 0x50;          //工作方式1,波特率9600bps,允许接收   
  130.                 ES = 1;
  131.                 EA = 1;           // 打开所以中断   
  132.                 TI = 0;
  133.                 RI = 0;
  134. }


  135.                
  136. void RSINTR() interrupt 4 using 2
  137.         {
  138.                 U8 InPut3;
  139.                 if(TI==1) //发送中断          
  140.                 {
  141.                         TI=0;
  142.                         if(count!=14) //发送完5位数据         
  143.                         {
  144.                                 SBUF= outdata[count];
  145.                                 count++;
  146.                         }
  147.                 }

  148.                 if(RI==1)         //接收中断                  
  149.                 {       
  150.                         InPut3=SBUF;
  151.                         if(InPut3=='A')
  152.                         {
  153.                                 SendData(str);
  154.                         }
  155.                         RI=0;
  156.                 }
  157.                 }

  158.        
  159.        
  160. unsigned char drv_uart_rx_bytes( U8* RxBuffer )
  161. {
  162.         U8 l_RxLength = 0;
  163.         uint16_t l_UartRxTimOut = 0xFFFF;
  164.         while( l_UartRxTimOut-- )                //在超时范围内检测数据
  165.         {
  166.                 if( 0 != RI )                                //检测是否接收到数据
  167.                 {
  168.                         RI = 0;                                        //清标志位               
  169.                         *RxBuffer = SBUF;                //读数据
  170.                         RxBuffer++;
  171.                         l_RxLength++;
  172.                         l_UartRxTimOut = 0x7FFF;//重置超时检测
  173.                 }
  174.         }
  175.        
  176.         return l_RxLength;                        //等待超时,数据接收完成
  177. }


  178. /*******************************************************************************
  179. * 函数名         : main
  180. * 函数功能                   : 主函数
  181. * 输入           : 无
  182. * 输出                  : 无
  183. *******************************************************************************/

  184. void main()
  185. {
  186.         int temp;
  187.         int datas1[] = {0, 0, 0, 0, 0};

  188.         UsartConfiguration();
  189.         LcdInit();                         //初始化LCD1602
  190.         LcdWriteCom(0x85);        //写地址 80表示初始地址
  191.         LcdWriteData('C');
  192.         SETTEMP=32;
  193.         datas1[0]=SETTEMP/10;
  194.                 datas1[1]=SETTEMP%10;
  195.                 LcdWriteCom(0x80+0x40+9);
  196.                 LcdWriteData(datas1[0]+'0');       
  197.                 LcdWriteCom(0x80+0x40+10);
  198.                 LcdWriteData(datas1[1]+'0');       
  199.         while(1)
  200.         {
  201.                 temp=Ds18b20ReadTemp();

  202.                 LcdDisplay(temp);
  203.                 Delay1ms(1000);//1s钟刷一次
  204.                 if(k1==0)
  205.                 {
  206.                 Delay1ms(10);
  207.                 SETTEMP=SETTEMP+1;

  208.                 Delay1ms(1000);//1s钟刷一次
  209.                 datas1[0]=SETTEMP/10;
  210.                 datas1[1]=SETTEMP%10;
  211.                 LcdWriteCom(0x80+0x40+9);
  212.                 LcdWriteData(datas1[0]+'0');       
  213.                 LcdWriteCom(0x80+0x40+10);
  214.                 LcdWriteData(datas1[1]+'0');                       
  215.                 }
  216.                 if(k2==0)
  217.                 {
  218.                 Delay1ms(10);
  219.                 SETTEMP=SETTEMP-1;
  220.                 datas1[0]=SETTEMP/10;
  221.                 datas1[1]=SETTEMP%10;
  222.                 LcdWriteCom(0x80+0x40+9);
  223.                 LcdWriteData(datas1[0]+'0');       
  224.                 LcdWriteCom(0x80+0x40+10);
  225.                 LcdWriteData(datas1[1]+'0');       
  226.                
  227.                 }



  228.         }
  229. }

复制代码

所有资料51hei提供下载:
程序.rar (64.85 KB, 下载次数: 19)


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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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