找回密码
 立即注册

QQ登录

只需一步,快速开始

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

仿真DS18B20温度计 RES485传到从机,再在lcd1602显示出来

[复制链接]
跳转到指定楼层
楼主

全部资料下载: DS18B20 RES485 液晶1602 显示.rar (98.88 KB, 下载次数: 29)


主机程序:
  1. #include<main.h>
  2. #include<DS18B20.h>

  3. void delay(uint x)
  4. {
  5.         uchar m,n;
  6.         for(m=x;m>0;m--)
  7.         for(n=110;n>0;n--);
  8. }
  9. /***
  10. **函数名:UART_init()
  11. **功能:  串口初始化
  12. ****/
  13. void UART_init()
  14. {
  15.         TMOD=0x20;
  16.         SCON=0x50;
  17.         TH1=0xFD;
  18.         TL1=0xFD;
  19.         TR1=1;

  20.         en=1;           //485一直在写
  21. }
  22. /***
  23. **函数名:UART_sent()
  24. **功能:  串口发送一个字节
  25. ****/
  26. void UART_sent(uchar date)
  27. {
  28.         
  29.         SBUF=date;
  30.         while(!TI);
  31.         TI=0;
  32. }


  33. void main()
  34. {
  35.         int ans;
  36.          uchar flag;
  37.         UART_init();
  38.         while(1)
  39.         {
  40.                 DS18B20_start_change();         //开始读温度
  41.                 delay(1000);
  42.                 ans=DS18B20_read_date();
  43.                 /******判断是否为负温度******/
  44.                 if(ans<0)
  45.                 {
  46.                         ans=-ans;
  47.                         flag=1;
  48.                 }
  49.                 else
  50.                         flag=0;
  51.                
  52.                 if(flag==1)                         //负温度,发送‘-’
  53.                         UART_sent('-');
  54.                 else
  55.                         UART_sent('+');         //正温度,发送‘+’
  56.                 UART_sent( ( uchar )ans);
  57.         }
  58. }
复制代码

从机程序:
  1. #include<main.h>
  2. #include<1602.h>
  3. #include<ds1302.h>
  4. uchar time[]={40,59,23,25,7,3,12};        //2012年7月25日 23:59: 40
  5. uchar code tab1[]="20  -  -   ";
  6. uchar code tab2[]="Temp:      :  :";
  7. uchar flag;
  8. uchar wendu;


  9. void delay(uint x)
  10. {
  11.         uint m,n;
  12.         for(m=x;m>0;m--)
  13.         for(n=110;n>0;n--);
  14. }
  15. /****
  16. *******        串口初始化函数
  17. *****/
  18. void uart_init()
  19. {
  20.         TMOD=0x20;                //9600bps
  21.         SCON=0x50;
  22.         TH1=0xFD;
  23.         TL1=0xFD;
  24.         TR1=1;

  25.         ES=1;
  26.         EA=1;

  27.         UART_EN=0;           //串口一直处于接收状态
  28. }


  29. void main()
  30. {
  31.         
  32.         lcd_init();        
  33.         uart_init();
  34.         lcd_write_str(0x84,tab1);
  35.         lcd_write_str(0xc0,tab2);
  36.         DS1302_set_time(&time);        
  37.         while(1)
  38.         {        
  39.                 DS1302_read_time(&time);         
  40.                 lcd_write_time(0x86,time[6]);  //年
  41.                 switch(time[5])                               //星期
  42.                 {
  43.                         case 1:        lcd_write_str(0x8F,"MON");break;
  44.                         case 2:        lcd_write_str(0x8F,"TUE");break;
  45.                         case 3:        lcd_write_str(0x8F,"WED");break;
  46.                         case 4:        lcd_write_str(0x8F,"THU");break;
  47.                         case 5:        lcd_write_str(0x8F,"FRI");break;
  48.                         case 6:        lcd_write_str(0x8F,"SAT");break;
  49.                         case 7:        lcd_write_str(0x8F,"SUN");break;
  50.                 }
  51.                 lcd_write_time(0x89,time[4]);  //月
  52.                 lcd_write_time(0x8c,time[3]);  //日
  53.                 lcd_write_time(0xc9,time[2]);  //时
  54.                 lcd_write_time(0xcc,time[1]);  //分
  55.                 lcd_write_time(0xcf,time[0]);        //秒
  56.                 if(flag==1)                                                   //显示负温度
  57.                 {
  58.                         lcd_write_com(0xc5);
  59.                         lcd_write_date('-');
  60.                         lcd_wendu(0xc6,wendu);
  61.                 }
  62.                 else                                                         //显示正温度
  63.                 {
  64.                 //        lcd_write_com(0xc5);
  65.                 //        lcd_write_date(' ');
  66.                         lcd_wendu(0xc5,wendu);
  67.                         lcd_write_com(0xc7);
  68.                         lcd_write_date(' ');
  69.                 }        
  70.         }
  71. }
  72. /****
  73. *******        串口中断服务程序函数
  74. *****/
  75. void ser() interrupt 4
  76. {
  77.         static uchar string[2],i;
  78.         if(RI)
  79.         {
  80.                 RI=0;
  81.                 string[i++]=SBUF;
  82.                 if(i>1)
  83.                         i=0;
  84.                 if(string[0]=='-')
  85.                 {         
  86.                         flag=1;                                  //负温度
  87.                 }
  88.                 else
  89.                 {         
  90.                          flag=0;
  91.                 }
  92.                 wendu=string[1];
  93.         }        
  94. }
复制代码




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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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