找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2873|回复: 5
收起左侧

单片机程序显示缺失函数原型UsartConfiguration,LcdInit,LcdWriteCom,求思路

[复制链接]
ID:865578 发表于 2020-12-23 11:14 | 显示全部楼层 |阅读模式
  1. #include<reg51.h>
  2. void main()
  3. {
  4.         int temp;
  5.         int datas1[] = {0, 0, 0, 0, 0};

  6.         UsartConfiguration();
  7.         LcdInit();                         //初始化LCD1602
  8.         LcdWriteCom(0x85);        //写地址 80表示初始地址
  9.         LcdWriteData('C');
  10.         SETTEMP=32;
  11.         datas1[0]=SETTEMP/10;
  12.                 datas1[1]=SETTEMP%10;
  13.                 LcdWriteCom(0x80+0x40+9);
  14.                 LcdWriteData(datas1[0]+'0');        
  15.                 LcdWriteCom(0x80+0x40+10);
  16.                 LcdWriteData(datas1[1]+'0');        
  17.         while(1)
  18.         {
  19.                 temp=Ds18b20ReadTemp();
  20.                 LcdDisplay(temp);
  21.                 Delay1ms(1000);//1s钟刷一次
  22.                 if(k1==0)
  23.                 {
  24.                 Delay1ms(10);
  25.                 SETTEMP=SETTEMP+1;
  26.                 Delay1ms(1000);//1s钟刷一次
  27.                 datas1[0]=SETTEMP/10;
  28.                 datas1[1]=SETTEMP%10;
  29.                 LcdWriteCom(0x80+0x40+9);
  30.                 LcdWriteData(datas1[0]+'0');        
  31.                 LcdWriteCom(0x80+0x40+10);
  32.                 LcdWriteData(datas1[1]+'0');                        
  33.                 }
  34.                 if(k2==0)
  35.                 {
  36.                 Delay1ms(10);
  37.                 SETTEMP=SETTEMP-1;
  38.                 datas1[0]=SETTEMP/10;
  39.                 datas1[1]=SETTEMP%10;
  40.                 LcdWriteCom(0x80+0x40+9);
  41.                 LcdWriteData(datas1[0]+'0');        
  42.                 LcdWriteCom(0x80+0x40+10);
  43.                 LcdWriteData(datas1[1]+'0');        
  44.                 }
  45.         }
  46. }
  47. #include"temp.h"
  48. void Ds18b20WriteByte(unsigned char dat)
  49. {
  50.         unsigned int i,j;
  51.         for(j=0;j<8;j++)
  52.         {
  53.                 DSPORT=0;                        //每写入一位数据之前先把总线拉低1us
  54.                 i++;
  55.                 DSPORT=dat&0x01; //然后写入一个数据,从最低位开始
  56.                 i=6;
  57.                 while(i--); //延时68us,持续时间最少60us
  58.                 DSPORT=1;        //然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值
  59.                 dat>>=1;
  60.         }
  61. }
  62. unsigned char Ds18b20ReadByte()
  63. {
  64.         unsigned char byte,bi;
  65.         unsigned int i,j;        
  66.         for(j=8;j>0;j--)
  67.         {
  68.                 DSPORT=0;//先将总线拉低1us
  69.                 i++;
  70.                 DSPORT=1;//然后释放总线
  71.                 i++;
  72.                 i++;//延时6us等待数据稳定
  73.                 bi=DSPORT;         //读取数据,从最低位开始读取
  74.                 /*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/
  75.                 byte=(byte>>1)|(bi<<7);                                                  
  76.                 i=4;                //读取完之后等待48us再接着读取下一个数
  77.                 while(i--);
  78.         }                                
  79.         return byte;
  80. }
  81. void  Ds18b20ChangTemp()
  82. {
  83.         Ds18b20Init();
  84.         Delay1ms(1);
  85.         Ds18b20WriteByte(0xcc);                //跳过ROM操作命令                 
  86.         Ds18b20WriteByte(0x44);            //温度转换命令
  87. }
  88. void  Ds18b20ReadTempCom()
  89. {        
  90.         Ds18b20Init();
  91.         Delay1ms(1);
  92.         Ds18b20WriteByte(0xcc);         //跳过ROM操作命令
  93.         Ds18b20WriteByte(0xbe);         //发送读取温度命令
  94. }
  95. int Ds18b20ReadTemp()
  96. {
  97.         int temp=0;
  98.         unsigned char tmh,tml;
  99.         Ds18b20ChangTemp();                                 //先写入转换命令
  100.         Ds18b20ReadTempCom();                        //然后等待转换完后发送读取温度命令
  101.         tml=Ds18b20ReadByte();                //读取温度值共16位,先读低字节
  102.         tmh=Ds18b20ReadByte();                //再读高字节
  103.         temp=tmh;
  104.         temp<<=8;
  105.         temp|=tml;
  106.         return temp;
  107. }
  108. void LcdDisplay(int temp)          //lcd显示
  109. {
  110.           unsigned char i, datas[] = {0, 0, 0, 0, 0}; //定义数组
  111.                 float tp;  

  112.           LcdWriteCom(0x80);                //写地址 80表示初始地址
  113.                 tp=temp;
  114.                 temp=tp*0.0625*100+0.5;        
  115.                 if((temp/100)>(SETTEMP-1))
  116.                 {
  117.                         beep=0;
  118.                 }
  119.                 else
  120.                 {
  121.                 beep=1;
  122.                 }
  123.                 //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点
  124.                 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就
  125.                 datas[1] = temp % 10000 / 1000;
  126.                 datas[2] = temp % 1000 / 100;
  127.                 datas[3] = temp % 100 / 10;
  128.                 datas[4] = temp % 10;
  129.                
  130.                
  131.                 str[0]=datas[1]+'0';
  132.                 str[1]=datas[2]+'0';
  133.                 str[2]='.';
  134.                 str[3]=datas[3]+'0';
  135.                 str[4]='T';
  136.                 str[5]=SETTEMP/10+'0';
  137.                 str[6]=SETTEMP%10+'0';
  138.                 str[7]='U';
  139.                 LcdWriteCom(0x80);                 //写地址 80表示初始地址
  140.                 LcdWriteData('t');        
  141.                 LcdWriteCom(0x81);                 //写地址 80表示初始地址
  142.                 LcdWriteData('e');        
  143.                 LcdWriteCom(0x82);                 //写地址 80表示初始地址
  144.                 LcdWriteData('m');
  145.                 LcdWriteCom(0x83);                 //写地址 80表示初始地址
  146.                 LcdWriteData('p');        
  147.                 LcdWriteCom(0x84);                 //写地址 80表示初始地址
  148.                 LcdWriteData(':');               
  149.                 LcdWriteCom(0x85);                 //写地址 80表示初始地址
  150.                 LcdWriteData('0'+datas[1]); //十位
  151.                 LcdWriteCom(0x86);                //写地址 80表示初始地址
  152.                 LcdWriteData('0'+datas[2]); //个位
  153.                 LcdWriteCom(0x87);                //写地址 80表示初始地址
  154.                 LcdWriteData('.');                 //显示 ‘.’
  155.                 LcdWriteCom(0x88);                 //写地址 80表示初始地址
  156.                 LcdWriteData('0'+datas[3]); //显示小数点  
  157.                 LcdWriteCom(0x89);                 //写地址 80表示初始地址
  158.                 LcdWriteData('C'); //显示小数点
  159.                 LcdWriteCom(0x80+0x40);                 //写地址 80表示初始地址
  160.                 for(i=0;i<=8;i++)
  161.                                 {
  162.                                         LcdWriteData(CNCHAR[i]);
  163.                                 }
  164.                 LcdWriteCom(0x80+0x40+13);
  165.                 LcdWriteData('C');               
  166. //                datas1[0]=SETTEMP/10;
  167. //                datas1[1]=SETTEMP%10;
  168. //                LcdWriteCom(0x80+0x40+9);
  169. //                LcdWriteData(datas1[0]+'0');        
  170. //                LcdWriteCom(0x80+0x40+10);
  171. //                LcdWriteData(datas1[1]+'0');        
  172.                 LcdWriteCom(0x80+0x40+11);
  173.                 LcdWriteData('.');        
  174.                 LcdWriteCom(0x80+0x40+12);
  175.                 LcdWriteData('0');
  176.                 }
  177. //串口配置
  178.         SCON &= (uint8_t)((uint8_t)( ~( UART_MODE | UART_RX )));        //清SM0 SM1 REN
  179.         SCON |= (uint8_t)( UART_8BAUDRATE_VOLATILE | UART_RX );
  180.         
  181.         //TIM1配置
  182.         TMOD &= (uint8_t)((uint8_t)( ~TIM1_MODE ));
  183.         TMOD |= TIM1_MODE_2;        //8位自动重装
  184.         PCON = 0x00;
  185.         TH1 = 0xFD;                                //波特率默认配置为9600
  186.         TL1 = 0xFD;
  187.         
  188.         TI = 1;                                        //清发送标志                                                
  189.         TR1 = 1;                                //使能定时器
  190. }
  191. uint8_t drv_uart_rx_bytes( uint8_t* RxBuffer )
  192. {
  193.         uint8_t l_RxLength = 0;
  194.         uint16_t l_UartRxTimOut = 0x7FFF;
  195.         
  196.         while( l_UartRxTimOut-- )                //在超时范围内检测数据
  197.         {
  198.                 if( 0 != RI )                                //检测是否接收到数据
  199.                 {
  200.                         RI = 0;                                        //清标志位               
  201.                         *RxBuffer = SBUF;                //读数据
  202.                         RxBuffer++;
  203.                         l_RxLength++;
  204.                         l_UartRxTimOut = 0x7FFF;//重置超时检测
  205.                 }
  206.         }
  207.         return l_RxLength;                        //等待超时,数据接收完成
  208. }
复制代码
51hei图片20201223111356.png
回复

使用道具 举报

ID:854384 发表于 2020-12-23 14:07 | 显示全部楼层
程序里面LCD函数没有定义完,显示的应该是程序缺失,添加一个头文件,里面定义LCDwrite等函数
回复

使用道具 举报

ID:824490 发表于 2020-12-23 14:17 | 显示全部楼层
你把void main()这个函数放到主C文件的最末就OK了
或者把主C文件中的所有函数(main()除外)的函数名copy到C文件的#include段之后,MAIN()之前。
或者另写一个MAIN.H文件,把这些函数名声明一次。在主C文件中再include这个H文件。
回复

使用道具 举报

ID:824490 发表于 2020-12-23 14:19 | 显示全部楼层
上一条回复错了,应该是你的主C文件没有include到LCD.C的头文件
回复

使用道具 举报

ID:739545 发表于 2020-12-23 14:37 | 显示全部楼层
把函数放到main函数前面去
回复

使用道具 举报

ID:822755 发表于 2020-12-23 23:48 | 显示全部楼层
看函数名,应该是串口设置,液晶初始化,写数据到液晶。这些都可以根据手册自己完成。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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