找回密码
 立即注册

QQ登录

只需一步,快速开始

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

12864液晶显示RS485通信温度传输测试稳定实物图+源码

[复制链接]
跳转到指定楼层
楼主
lcd12864显串STC89串RS485通讯温度OK制作出来的实物图如下:


单片机源程序如下:
  1. /*******************************************************************************
  2. *  标题:                                基于433M的无线温度传输模块                         *
  3. *                                                                              *
  4. *  实验说明:本装置用的是433M进行无线传输,理论距离在1KM左右,实际可能会短点, *
  5. 433的启动电流在200mA,所以需要锂电池或者USB进行供电。所以耗电量比较大。        *
  6.                                                                                *
  7. ********************************************************************************
  8. * 实验心得:代码中的数码管显示部分,在proteus中是不显示的,因为DS18B20的温度采 *
  9. 集在ms级别,而数码管全显的刷新时间是在μs级别。所以在仿真中不会成功显示,但是按 *
  10. 照仿真焊接的实物图可以成功显示。如果想让protues也成功显示,需要将数码管显示或者*
  11. 温度采集的部分放入时间中断里面,即可成功显示。但是实际的实物效果不好,会出现跳 *
  12. 动的情况,费眼睛                                                                                                                           *
  13.                                                                                                                                                *
  14. ********************************************************************************/
  15. #include<reg51.h>
  16. #include "ds18b20.h"

  17. unsigned char TP[2];
  18. int Temp;

  19. sbit EN = P2^0;//RS485使能  0接收, 1发送

  20. //--声明全局函数--//
  21. void UsartConfiguration();
  22. void Delay10ms(unsigned int c);   //误差 0us

  23. /*******************************************************************************
  24. * 函 数 名         : main
  25. * 函数功能                   : 主函数
  26. * 输    入         : 无
  27. * 输    出         : 无
  28. *******************************************************************************/

  29. void main()
  30. {
  31.         unsigned char i;
  32.         float tp;
  33.         UsartConfiguration();
  34.         EN = 1;//RS485使能  0接收, 1发送
  35.         while(1)
  36.         {
  37.                 Temp = Ds18b20ReadTemp();
  38.                 if(Temp< 0)                                //当温度值为负数
  39.                   {
  40.                         Temp=Temp-1;
  41.                         tp=~Temp;
  42.                         Temp=tp*0.0625*10+0.5;       
  43.                         //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
  44.                         //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
  45.                         //算由?.5,还是在小数点后面。
  46.                         TP[0] = Temp/256;
  47.                         TP[1] = Temp%256;
  48.          
  49.                   }
  50.                   else
  51.                   {
  52.                     tp = Temp;                       
  53.                         Temp=tp*0.0625*10+0.5;       
  54.                         //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
  55.                         //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
  56.                         //算加上0.5,还是在小数点后面。
  57.                         TP[0] = Temp/256;
  58.                         TP[1] = Temp%256;
  59.                 }
  60.                 for(i=0; i<2; i++)
  61.                 {
  62.                         SBUF = TP[i];   //将要发送的数据放入到发送寄存器
  63.                         while(!TI);                  //等待发送数据完成
  64.                         TI=0;
  65.                         Delay10ms(10);                  //延时一下再发                          //清除发送完成标志位
  66.                 }
  67.        
  68.                    
  69.         }
  70. }
  71. /*******************************************************************************
  72. * 函 数 名         :UsartConfiguration()
  73. * 函数功能                   :设置串口
  74. * 输    入         : 无
  75. * 输    出         : 无
  76. *******************************************************************************/

  77. void UsartConfiguration()
  78. {
  79.         SCON=0X50;                        //设置为工作方式1
  80.         TMOD=0X20;                        //设置计数器工作方式2
  81.         PCON=0X00;                        //波特率加倍
  82.         TH1=0XFA;                    //计数器初始值设置,注意波特率是4800的
  83.         TL1=0XFA;
  84.         EA=1;                                                //打开总中断
  85.         TR1=1;                                            //打开计数器
  86. }

  87. /*******************************************************************************
  88. * 函 数 名         : Delay10ms
  89. * 函数功能                   : 延时函数,延时10ms
  90. * 输    入         : 无
  91. * 输    出         : 无
  92. *******************************************************************************/

  93. void Delay10ms(unsigned int c)   //误差 0us
  94. {
  95.     unsigned char a, b;

  96.         //--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--//
  97.     for (;c>0;c--)
  98.         {
  99.                 for (b=38;b>0;b--)
  100.                 {
  101.                         for (a=130;a>0;a--);
  102.                 }         
  103.         }      
  104. }
复制代码


  1. #include <reg51.h>
  2. #include "ds18b20.h"
  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5. /***************************功能定义***************************/
  6. #define LCD12864_W_COM                        0xF8        //写指令
  7. #define LCD12864_R_COM                        0xFC        //读指令
  8. #define LCD12864_W_DAT                        0xFA        //写数据
  9. #define LCD12864_R_DAT                        0xFE        //读数据
  10. #ifndef __LCD12864_H__
  11. #define __LCD12864_H__
  12. #define LCD12864_COM 0        //输入指令
  13. #define LCD12864_DAT 1        //输入数据
  14. #define LCD12864_CLEAR                        0x01        //清除显示
  15. #define LCD12864_CURSOR                        0x02        //位址归位,游标回原点
  16. #define LCD12864_CURSOR_RLF                0x04        //光标左移,整体显示不移动
  17. #define LCD12864_CURSOR_RRF                0x06        //光标右移,整体显示不移动
  18. #define LCD12864_CURSOR_RLN                0x05        //光标左移,整体显示移动
  19. #define LCD12864_CURSOR_RRN                0x07        //光标右移,整体显示移动
  20. #define LCD12864_DIS_OFF                0x08        //显示状态全关
  21. #define LCD12864_DIS_ON                        0x0E        //显示状态开
  22. #define LCD12864_DIS_CUR_ON                0x0E        //游标显示开
  23. #define LCD12864_DIS_CURS_ON        0x0F        //游标位置显示开
  24. #define LCD12864_CURSOR_RL                0x10        //游标左移
  25. #define LCD12864_CURSOR_RR                0x14        //游标右移
  26. #define LCD12864_CURDIS_RL                0x18        //整体显示左移,光标跟随
  27. #define LCD12864_CURDIS_RR                0x1C        //整体显示又移,光标跟随
  28. #define LCD12864_COM_BASIC                0x30        //基本指令集动作
  29. #define LCD12864_COM_PLOT_ON        0x36        //扩展指令集动作,绘图显示ON
  30. #define LCD12864_COM_PLOT_OFF        0x34        //扩展指令集动作,绘图显示OFF
  31. #define LCD12864_STAND_TO                0x31        //进入待命模式
  32. #define LCD12864_PLACE_ROLL                0x03        //允许输入卷动位址
  33. #define LCD12864_PLACE_IRAM                0x02        //允许输入IRAM位址
  34. #define LCD12864_REVERES_13                0x04        //选择一、三行同时作反白显示
  35. #define LCD12864_REVERES_24                0x05        //选择二、四行同时作反白显示
  36. #define LCD12864_REST_ON                0x08        //进入睡眠模式
  37. #define LCD12864_REST_OFF                0x0C        //脱离睡眠模式
  38. #define LCD12864_W_COM                        0xF8        //写指令
  39. #define LCD12864_R_COM                        0xFC        //读指令
  40. #define LCD12864_W_DAT                        0xFA        //写数据
  41. #define LCD12864_R_DAT                        0xFE        //读数据
  42. //======串口模式=======
  43. sbit LCD12864_CS = P2^7;   //片选信号输入
  44. sbit LCD12864_STD = P2^6;  //串行数据输入
  45. sbit LCD12864_SCLK = P2^5; //串行移位脉冲输入
  46. sbit LCD12864_PSB = P2^4;  //串并模式选择 0:串口,1:并口
  47. sbit LCDRST  = P2^3;
  48. unsigned char code tabe[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};//查表法//0-9数字

  49. //--定义全局变量--//
  50. unsigned char TP[8];//显示用的本地和接收温度共8位。各个位数
  51. int Temp;
  52. int i;
  53. int j = -1;
  54. int receiveData;
  55. unsigned char receive[2];
  56. sbit EN = P2^0;//RS485使能  0接收, 1发送
  57. void UsartConfiguration();
  58. /*******************************************************************************
  59. * 函 数 名         : main
  60. * 函数功能                   : 主函数
  61. * 输    入         : 无
  62. * 输    出         : 无
  63. *******************************************************************************/
  64. /*****************************向12864写入8位数据*************************************/
  65. void LCD12864_Wbyte(uchar byte)
  66. {
  67.         uchar i;

  68.         for(i=0;i<8;i++)
  69.                 {
  70.                 LCD12864_SCLK = 0;
  71.                 byte <<= 1;                         //左移待写入数据,使最高位移至CY
  72.                 LCD12864_STD = CY;        //写入一位数据
  73.                 LCD12864_SCLK = 1;
  74.                 LCD12864_SCLK = 0;   
  75.                 }
  76. }
  77. /***************************从12864读出8位数据***返回:sdat************************************/
  78. uchar LCD12864_Rbyte(void)
  79. {
  80.      uchar i,sdat,temp1,temp2;
  81.      temp1 = 0;
  82.      temp2 = 0;
  83. //==========12864的串行数据输出形式是D7-D6-D5-D4-0-0-0-0-D3-D2-D1-D0-0-0-0-0,故要度两个八位整合==============
  84.      for(i=0;i<8;i++)
  85.                 {
  86.                 temp1=temp1 << 1;
  87.                 LCD12864_SCLK = 0;
  88.                 LCD12864_SCLK = 1;            
  89.                 LCD12864_SCLK = 0;
  90.                 if( LCD12864_STD )        temp1|=0x01;        //tempe1:D7-D6-D5-D4-0-0-0-0
  91.                 }
  92.      for(i=0;i<8;i++)
  93.                 {
  94.                 temp2=temp2 << 1;
  95.                 LCD12864_SCLK = 0;
  96.                 LCD12864_SCLK = 1;            
  97.                 LCD12864_SCLK = 0;
  98.                 if( LCD12864_STD ) temp2|=0x01;   //tempe2:D3-D2-D1-D0-0-0-0-0
  99.                 }
  100.         sdat = ((temp1 & 0xf0)|(temp2 >> 4));  //取出D7\D6\D5\D4\D3\D2\D1\D0                    
  101.         return sdat;  //返回一个值(sdat)
  102. }
  103. /****************************读忙状态**************************************/
  104. void LCD12864_busy( void )
  105. {
  106.         do        LCD12864_Wbyte( LCD12864_R_COM );                //LCD12864_RW=11111,RW(1),RS(0),0
  107.         while( LCD12864_Rbyte() & 0x80 );         //读BF,直到BF == 0
  108. }
  109. /*************************dat_com=0写指令,dat_com=1写数据*****************************************/
  110. void LCD12864_W (bit dat_com,uchar byte)
  111. {
  112.         uchar temp;
  113.         if(dat_com == 0)         //为零,写入指令
  114.                 temp = LCD12864_W_COM;        //11111,RS(0),RW(0),0
  115.         else                            //否则,写入数据
  116.                 temp = LCD12864_W_DAT;        //11111,RS(1),RW(0),0
  117.         LCD12864_CS = 1;                //片选使能
  118.         LCD12864_busy();                //LCD忙检测
  119.         LCD12864_Wbyte(temp);        //写入模式选择,指令还是数据
  120.         LCD12864_Wbyte(byte&0xf0);        //写入字节
  121.         LCD12864_Wbyte((byte<<4)&0xf0);        //写入字节
  122.     LCD12864_CS = 0;                //片选关闭
  123. }
  124. /****************************LCD12864初始化**************************************/

  125. void LCD12864_Init(void)
  126. {
  127.         LCDRST=1;
  128.         LCD12864_PSB = 0;        //选择串口模式
  129.         LCD12864_W(LCD12864_COM,0x30);        //基本指令功能.
  130.         LCD12864_W(LCD12864_COM,0x03);        //允许输入卷动位址
  131.         LCD12864_W(LCD12864_COM,0x0c);                //脱离随眠状态,显示打开,关光标,反白关.
  132.         LCD12864_W(LCD12864_COM,0x01);                //清屏指令.
  133.         LCD12864_W(LCD12864_COM,0x06);        //AC自动加一,光标右移,整体显示不移动   
  134. }
  135. /**************************LCD12864字符位置自定义显示****************************************/
  136. void LCD12864_WPoss(uchar x,uchar y,uchar *buff)
  137. {
  138.         uchar addr,i=0;
  139.         switch (x)
  140.                 {
  141.                 case 0:addr=0x80;break;
  142.                 case 1:addr=0x90;break;
  143.                 case 2:addr=0x88;break;
  144.                 case 3:addr=0x98;break;
  145.                 }
  146.         addr=addr+y;

  147.         LCD12864_W(LCD12864_COM,LCD12864_COM_BASIC);        //8BitMCU,基本指令集合
  148.         LCD12864_W(LCD12864_COM,addr);                                        //显示在自定义位置

  149.         while(buff[i]!='\0')
  150.                 {       
  151.                 LCD12864_W(LCD12864_DAT,buff[i++]);
  152.                 if(++y==16)
  153.                         {
  154.                         y=0;
  155.                         if(++x==4) x=0;

  156.                         switch (x)
  157.                                 {
  158.                                 case 0:addr=0x80;break;
  159.                                 case 1:addr=0x90;break;
  160.                                 case 2:addr=0x88;break;
  161.                                 case 3:addr=0x98;break;
  162.                                 }
  163.                         addr=addr+y;
  164.                         LCD12864_W(LCD12864_COM,addr);
  165.                         }
  166.        
  167.                 }
  168. }
  169. void Disp_img(unsigned char  *img)        //图形方式12864显示字模221 横向取膜
  170. {
  171.         unsigned char i,j;
  172.         unsigned int k = 0;

  173.         LCD12864_W(0,0x36); //图形方式
  174.         for(i=0;i<32;i++)
  175.           {
  176.                 LCD12864_W(0,0x80+i);
  177.                 LCD12864_W(0,0x80);
  178.             for(j=0;j<16;j++)
  179.                 {
  180.                         LCD12864_W(1,img[k++]);
  181.                 }
  182.           }

  183.         for(i=0;i<32;i++)
  184.           {
  185.                 LCD12864_W(0,0x80+i);
  186.                 LCD12864_W(0,0x88);
  187.             for(j=0;j<16;j++)
  188.                 {
  189.                         LCD12864_W(1,img[k++]);
  190.                   }
  191.         }
  192. }
  193. /************************显示11************************************/

  194. void display1(long temp)
  195. {
  196.     uchar dt1,dt2,dt3,dt4,dt5,dt6,dt7,dt8;
  197.         //temp=12345678;
  198.         dt1 = temp%10;//1位
  199.         dt2 = temp%100/10;//2位
  200.         dt3 = temp%1000/100;//3位
  201.         dt4 = temp%10000/1000;//4位

  202.         dt5 = temp%100000/10000;//5位
  203.         dt6 = temp%1000000/100000;//6位
  204.         dt7 = temp%10000000/1000000;//7位
  205.         dt8 = temp/10000000;//8位             最高位  

  206.         LCD12864_WPoss(3,0,"本地温度:");//第1行显示表1
  207.     // LCD12864_W(0,0x80+3);//LCD12864_W ((0或1),****)  0写指令  1写数据

  208.      //LCD12864_W(1,tabe[dt8]);//6位
  209.      //LCD12864_W(1,tabe[dt7]);//5位
  210.      //LCD12864_W(1,tabe[dt6]);//4位
  211.      //LCD12864_W(1,tabe[dt5]);//3位
  212.          //LCD12864_W(1,0x2e);
  213.            LCD12864_W(1,tabe[dt4]);//4位
  214.      LCD12864_W(1,tabe[dt3]);//3位
  215.            LCD12864_W(1,tabe[dt2]);//4位
  216.                  LCD12864_W(1,0x2e);
  217.      LCD12864_W(1,tabe[dt1]);//3位
  218.      LCD12864_WPoss(3,7,"C");//第1行显示表1
  219. }
  220. /************************显示2************************************/

  221. void display2(long temp)
  222. {
  223.     uchar dt1,dt2,dt3,dt4,dt5,dt6,dt7,dt8;
  224.         //temp=12345678;
  225.         dt1 = temp%10;//1位
  226.         dt2 = temp%100/10;//2位
  227.         dt3 = temp%1000/100;//3位
  228.         dt4 = temp%10000/1000;//4位

  229.         dt5 = temp%100000/10000;//5位
  230.         dt6 = temp%1000000/100000;//6位
  231.         dt7 = temp%10000000/1000000;//7位
  232.         dt8 = temp/10000000;//8位             最高位  

  233.         LCD12864_WPoss(2,0,"接收温度:");//第1行显示表1
  234.     // LCD12864_W(0,0x80+3);//LCD12864_W ((0或1),****)  0写指令  1写数据

  235.      //LCD12864_W(1,tabe[dt8]);//6位
  236.      //LCD12864_W(1,tabe[dt7]);//5位
  237.      //LCD12864_W(1,tabe[dt6]);//4位
  238.      //LCD12864_W(1,tabe[dt5]);//3位
  239.          //LCD12864_W(1,0x2e);
  240.            LCD12864_W(1,tabe[dt4]);//4位
  241.      LCD12864_W(1,tabe[dt3]);//3位
  242.            LCD12864_W(1,tabe[dt2]);//4位
  243.                  LCD12864_W(1,0x2e);
  244.      LCD12864_W(1,tabe[dt1]);//3位
  245.      LCD12864_WPoss(2,7,"C");//第1行显示表1
  246.                 LCD12864_WPoss(0,0,"485 串口通讯温度");//第1行显示表1
  247. }

  248. void main()
  249. {
  250.         float tp;
  251.         UsartConfiguration();
  252.         LCD12864_Init();        //
  253.         EN = 0;//RS485使能  0接收, 1发送
  254.         while(1)
  255.         {
  256.                 Temp = Ds18b20ReadTemp();
  257.                 if(Temp< 0)                                //当温度值为负数
  258.                   {
  259.                         Temp=Temp-1;
  260.                         tp=~Temp;
  261.                         Temp=tp*0.0625*10+0.5;       
  262.                         //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
  263.                         //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
  264.                         //算由?.5,还是在小数点后面。
  265.                         TP[4] = (Temp%1000)/100;
  266.                         TP[5] = ((Temp%1000)%100)/10;
  267.                         TP[6] = Temp%10;
  268.                         TP[7] =  12;
  269.             display1(Temp);//显示时间 //Ok       
  270.                   }
  271.                   else
  272.                   {
  273.                     tp = Temp;                       
  274.                         Temp=tp*0.0625*10+0.5;       
  275.                         //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
  276.                         //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
  277.                         //算加上0.5,还是在小数点后面。
  278.                         TP[4] = (Temp%1000)/100;
  279.                         TP[5] = ((Temp%1000)%100)/10;
  280.                         TP[6] = Temp%10;
  281.                         TP[7] =  12;       
  282.                         display1(Temp);//显示时间 //Ok               
  283.                 }
  284.    
  285.                  
  286.                
  287.                
  288.                 if(RI == 1)                                //查看是否接收到数据
  289.                 {
  290.                         j++;  
  291.                         receive[j] = SBUF;        //读取数据
  292.                         if(j==2)
  293.                         {
  294.                             j = 0;
  295.                                 receiveData = 256*receive[0]+receive[1];
  296.                                 receive[0] = SBUF;
  297.                                 TP[0] =  (receiveData%1000)/100;
  298.                                 TP[1] =  ((receiveData%1000)%100)/10;
  299.                                 TP[2] =  receiveData%10;
  300.                                 TP[3] =  12;                       
  301.                         }
  302.                         RI = 0;       
  303.                        
  304.                 }
  305.           
  306.                 display2(receiveData);//显示时间 //Ok
  307.                

  308.         }
  309. }
  310. /*******************************************************************************
  311. * 函 数 名         :UsartConfiguration()
  312. * 函数功能                   :设置串口
  313. * 输    入         : 无
  314. * 输    出         : 无
  315. *******************************************************************************/

  316. void UsartConfiguration()
  317. {
  318.         SCON=0X50;                        //设置为工作方式1
  319.         TMOD=0X20;                        //设置计数器工作方式2
  320.         //PCON=0X80;                        //波特率加倍
  321.         PCON=0x00;                        //波特率未加倍
  322.         TH1=0XFA;                    //计数器初始值设置,注意波特率是4800的
  323.         TL1=0XFA;
  324.         TR1=1;                                            //打开计数器
  325. }
复制代码


所有资料51hei提供下载:
128显串STC89串RS485通讯温度OK.zip (98.73 KB, 下载次数: 93)


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:151749 发表于 2019-1-28 01:17 | 只看该作者
好的,谢谢!
回复

使用道具 举报

板凳
ID:560110 发表于 2020-6-24 23:38 | 只看该作者
感谢分享我要好好看看
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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