找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机连LCD1602无法显示的问题

[复制链接]
跳转到指定楼层
楼主
试了很多方法都无法让显示屏正常显示,不知道是什么原因。用的是mini51单片机(AT89C52),显示屏只是亮,一直无显示。不知有没有做过这个项目的或者熟悉的帮我看看。


以下是代码部分:原计划做一个蜂鸣器警报和按键解除警报的,但现在卡在LCD显示上了
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. sbit busy=P0^7;//检测忙
  6. sbit bee= P1^5;//蜂鸣器
  7. sbit io = P1^1 ;//数据接收端口
  8. sbit rs = P2^0 ; //数据命令选择
  9. sbit rw = P2^1 ;//读写选择
  10. sbit e  = P2^2 ;//使能
  11. sbit K1 = P1^2;//按键终止警报
  12. sbit K2 = P1^3;//按键恢复警报

  13. uchar Tem,Hum,TemHigh,TemLow,HumHigh,HumLow;//温湿度高低8位数据
  14. uchar TemWarnHigh,TemWarnLow,HumWarnHigh,HumWarnLow;//报警的温度和湿度
  15. uchar data1;//传输的数据存放
  16. uchar BeepFlag;//按键报警标志,1为禁用,0为启用

  17. //设置报警温湿度上下限
  18. #define TemWarnHigh 24
  19. #define TemWarnLow  16
  20. #define HumWarnHigh 60
  21. #define HumWarnLow  50


  22. /**********延时模块**********/

  23. void Delay10us()                //11.0592MHz
  24. {
  25.         uchar i;

  26.         _nop_();
  27.         i = 25;
  28.         while (--i);
  29. }

  30. void DelayLong(uint times)
  31. {
  32.     while(times--)
  33.         Delay10us();
  34. }

  35. /**********LCD模块**********/

  36. void LCDBusy()//测试LCD忙碌状态
  37. {
  38.          uchar result ;
  39.          rs = 0 ;
  40.          rw = 1 ;
  41.          do
  42.      {
  43.          e  = 1 ;
  44.          result = busy;
  45.          e  = 0 ;
  46.      }while(result & 0x80);//判断D7是否为1,D7=1表示忙
  47. }

  48. void LCDWriteCmd(uchar cmd)// 写指令
  49. {
  50.         LCDBusy() ;//判断LCD是否忙
  51.         rs = 0 ;
  52.         rw = 0 ;
  53.         P0 = cmd ;//写入指令
  54.         e  = 1 ;
  55.         DelayLong(10);
  56.         e  = 0 ;
  57.         DelayLong(10);
  58. }

  59. void LCDWriteAddr(uchar addr)//写地址
  60. {
  61.         LCDWriteCmd(addr|0x80) ;
  62. }

  63. void LCDWriteByte(uchar dat)//写字节
  64. {
  65.         LCDBusy() ;//判断LCD是否忙
  66.           rs = 1 ;
  67.           rw = 0 ;
  68.           P0 = dat ;//写入数据
  69.           e  = 1 ;
  70.           DelayLong(10);
  71.           e  = 0 ;
  72.           DelayLong(10);
  73. }

  74. void LCDInit()// LCD初始化
  75. {
  76.          LCDWriteCmd(0x38) ;
  77.          DelayLong(500);
  78.          LCDWriteCmd(0x38) ;
  79.      DelayLong(500);
  80.          LCDWriteCmd(0x38) ;
  81.      DelayLong(500);
  82.          LCDWriteCmd(0x38) ;//设置16×2显示,每个方块5×7点阵,8位数据接口
  83.          LCDWriteCmd(0x0C) ;//显示器开,光标关闭
  84.          LCDWriteCmd(0x06) ;//文字不动,地址自动加一
  85.          LCDWriteCmd(0x01) ;//清屏
  86. }

  87. void LCDDisplay(uchar addr, uchar q)//在某一地址显示一字节
  88. {
  89.          Delay10us();
  90.          LCDWriteAddr(addr) ;
  91.      LCDWriteByte(q) ;
  92.          Delay10us();
  93. }

  94. void LCDWarning()
  95. {
  96.     if(Tem>=TemWarnHigh)  //检测的温度高于额定上限
  97.     {
  98.         LCDDisplay(0x08,'T') ;
  99.         LCDDisplay(0x09,'e') ;
  100.         LCDDisplay(0x0A,'m') ;
  101.         LCDDisplay(0x0B,'H') ;
  102.         LCDDisplay(0x0C,'i') ;
  103.         LCDDisplay(0x0D,'g') ;
  104.         LCDDisplay(0x0E,'h') ;
  105.         LCDDisplay(0x0F,'!') ;
  106.     }

  107.     if(Tem<=TemWarnLow)  //检测的温度低于额定下限
  108.     {
  109.         LCDDisplay(0x08,'T') ;
  110.         LCDDisplay(0x09,'e') ;
  111.         LCDDisplay(0x0A,'m') ;
  112.         LCDDisplay(0x0B,'L') ;
  113.         LCDDisplay(0x0C,'o') ;
  114.         LCDDisplay(0x0D,'w') ;
  115.         LCDDisplay(0x0E,'!') ;
  116.     }

  117.         if(Hum>=HumWarnHigh)  //检测的湿度高于额定上限
  118.     {
  119.         LCDDisplay(0x48,'H') ;
  120.         LCDDisplay(0x49,'u') ;
  121.         LCDDisplay(0x4A,'m') ;
  122.         LCDDisplay(0x4B,'H') ;
  123.         LCDDisplay(0x4C,'i') ;
  124.         LCDDisplay(0x4D,'g') ;
  125.         LCDDisplay(0x4E,'h') ;
  126.         LCDDisplay(0x4F,'!') ;
  127.     }

  128.     if(Hum<=HumWarnLow)  //检测的湿度低于额定下限
  129.     {
  130.         LCDDisplay(0x48,'H') ;
  131.         LCDDisplay(0x49,'u') ;
  132.         LCDDisplay(0x4A,'m') ;
  133.         LCDDisplay(0x4B,'L') ;
  134.         LCDDisplay(0x4C,'o') ;
  135.         LCDDisplay(0x4D,'w') ;
  136.         LCDDisplay(0x4E,'!') ;
  137.     }

  138. }

  139. /**********蜂鸣器模块***********/

  140. void BEEP()  //报警函数
  141. {
  142.     if(Tem<=TemWarnLow || Tem>=TemWarnHigh)  //检测的温度超标
  143.         bee=0; //报警

  144.         if(Hum<=HumWarnLow || Hum>=HumWarnHigh)  //检测的湿度超标
  145.         bee=0; //报警
  146. }

  147. /**********DHT11模块***********/

  148. void DHTStart()//开始信号
  149. {
  150.         io=1;//拉高data
  151.         Delay10us();
  152.         io=0;
  153.         DelayLong(180);//微处理器IO设置为高电平且时间>18ms
  154.         io=1;//再拉高data
  155.     Delay10us();
  156. }

  157. uchar DHTReceive()//接收一个字节
  158. {
  159.         uint i;
  160.         uchar temp,count;//temp记录是0还是1,count计数收到第几位
  161.         data1=0;
  162.         for(i=0;i<8;i++)//一次接受8位
  163.         {
  164.         temp=0;//初始收到0,低电平
  165.                 DelayLong(4);//延时40us后判断收到的电平
  166.                 if(io==1)temp=1;//如果收到1,那么传送的是1,否则传送的是0
  167.                 count=2;
  168.                 while((io)&&count++);//io=0则等待,count防止死循环
  169.                 if(count==1)break;
  170.                 data1<<=1;//左移1位
  171.                 data1|=temp;//传输当前位给data存储
  172.         }
  173.         return data1;
  174. }

  175. void receive()//接收数据
  176. {
  177.         uchar TemH,TemL,HumH,HumL,check,sum;
  178.         uint time;
  179.         DHTStart();//开始信号

  180.         //DHT11收到开始信号后进行应答
  181.         time=8;
  182.         while(!io & time>0)time--;//等待DHT拉高80us
  183.         time=8;
  184.         while(io && time>0)time--;//等待DHT拉低80us

  185.         //开始接收数据
  186.         io=1;//主机拉高data
  187.         Delay10us();
  188.         if(!io)//读取DHT11响应信号,DHT11拉低data
  189.         {
  190.         HumH=DHTReceive();//湿度高8位
  191.         HumL=DHTReceive();//湿度低8位
  192.         TemH=DHTReceive();//温度高8位
  193.         TemL=DHTReceive();//温度低8位
  194.         check=DHTReceive();//校验位
  195.         io=0;//拉低延时50us,代表读取结束
  196.         DelayLong(5);
  197.         io=1;

  198.         sum=HumH+HumL+TemH+TemL;//校验
  199.         if(sum==check)//校验通过数据录入
  200.         {
  201.             HumHigh=HumH;
  202.             HumLow=HumL;
  203.             TemHigh=TemH;
  204.             TemLow=TemL;
  205.         }
  206.         }
  207. }

  208. /**********主程序**********/

  209. void main()
  210. {
  211.         BeepFlag=1;
  212.     LCDInit();//LCD初始化
  213.         while(1)
  214.         {

  215.         LCDDisplay(0x00,'T') ; //LCD显示Tem:
  216.         LCDDisplay(0x01,'e') ;
  217.         LCDDisplay(0x02,'m') ;
  218.         LCDDisplay(0x03,':') ;

  219.         LCDDisplay(0x40,'H') ; //LCD显示Hum:
  220.         LCDDisplay(0x41,'u') ;
  221.         LCDDisplay(0x42,'m') ;
  222.         LCDDisplay(0x43,':') ;

  223.                 receive();
  224.                 LCDDisplay(0x04,TemHigh/10+0x30) ;//温度显示
  225.                 LCDDisplay(0x05,TemLow%10+0x30) ;
  226.                 LCDDisplay(0x44,HumHigh/10+0x30) ;//湿度显示
  227.                 LCDDisplay(0x45,HumLow%10+0x30) ;
  228.                 LCDWarning();//超标显示

  229.                 if(!K1)BeepFlag=0;//若K1被按下,则禁用蜂鸣器
  230.         if(!K2)BeepFlag=1;//若K2被按下,则启用蜂鸣器
  231.                 if(BeepFlag) BEEP();
  232.         }
  233. }
复制代码




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

使用道具 举报

沙发
ID:452950 发表于 2020-3-17 14:26 | 只看该作者
先看开发板引脚定义检查显示屏有没有插反,有没有跳线帽影响到显示屏,调节一下对比度
回复

使用道具 举报

板凳
ID:704545 发表于 2020-3-17 15:37 | 只看该作者
检查接口对应是否正确,把对比度调整到屏幕显示有阴影了再调回去一点。对比度调节偏太远了就算程序正常也无法显示出来。先保证硬件正常再看程序有没有问题。
回复

使用道具 举报

地板
ID:584814 发表于 2020-3-17 17:01 | 只看该作者
程序都是抄来的一般不会错。先查接口对应管脚,再调时序(可以换几个不同的网上程序),个人经验是现成的四线(仅数据线少一半)驱动程序一般比较容易启动。1602还是比较容易上手的,网上极客甚至能用单线驱动(自行百度)。
回复

使用道具 举报

5#
ID:372579 发表于 2020-3-17 17:04 | 只看该作者
楼主问题解决了吗
回复

使用道具 举报

6#
ID:155507 发表于 2020-3-17 22:03 | 只看该作者
单片机是根据硬件电路图的设计来写代码的




  1. #include <reg52.h>
  2. #include <intrins.h>

  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. sbit busy= P2^7; //P0^7;//检测忙
  6. sbit bee= P3^6;  //P1^5;//蜂鸣器
  7. sbit io = P1^1; //数据接收端口
  8. sbit rs = P0^7; //P2^0 ; //数据命令选择
  9. sbit rw = P0^6; //P2^1 ;//读写选择
  10. sbit e  = P0^5; //P2^2 ;//使能
  11. sbit K1 = P3^5; //P1^2;//按键终止警报
  12. sbit K2 = P3^4; //P1^3;//按键恢复警报

  13. uchar Tem,Hum,TemHigh,TemLow,HumHigh,HumLow;//温湿度高低8位数据
  14. uchar TemWarnHigh,TemWarnLow,HumWarnHigh,HumWarnLow;//报警的温度和湿度
  15. uchar data1;//传输的数据存放
  16. uchar BeepFlag;//按键报警标志,1为禁用,0为启用

  17. //设置报警温湿度上下限
  18. #define TemWarnHigh 24
  19. #define TemWarnLow  16
  20. #define HumWarnHigh 60
  21. #define HumWarnLow  50


  22. /**********延时模块**********/

  23. void Delay10us()                //11.0592MHz
  24. {
  25.         uchar i;

  26.         _nop_();
  27.         i = 25;
  28.         while (--i);
  29. }

  30. void DelayLong(uint times)
  31. {
  32.         while(times--)
  33.         Delay10us();
  34. }

  35. /**********LCD模块**********/

  36. void LCDBusy()//测试LCD忙碌状态
  37. {
  38.         uchar result ;
  39.         rs = 0 ;
  40.         rw = 1 ;
  41.         do
  42.         {
  43.                 e  = 1 ;
  44.                 result = busy;
  45.                 e  = 0 ;
  46.         }while(result & 0x80);//判断D7是否为1,D7=1表示忙
  47. }

  48. void LCDWriteCmd(uchar cmd)// 写指令
  49. {
  50.         LCDBusy() ;//判断LCD是否忙
  51.         rs = 0 ;
  52.         rw = 0 ;
  53.         P2 = cmd ;//写入指令
  54.         e  = 1 ;
  55.         DelayLong(10);
  56.         e  = 0 ;
  57.         DelayLong(10);
  58. }

  59. void LCDWriteAddr(uchar addr)//写地址
  60. {
  61.         LCDWriteCmd(addr|0x80) ;
  62. }

  63. void LCDWriteByte(uchar dat)//写字节
  64. {
  65.         LCDBusy() ;//判断LCD是否忙
  66.         rs = 1 ;
  67.         rw = 0 ;
  68.         P2 = dat ;//写入数据
  69.         e  = 1 ;
  70.         DelayLong(10);
  71.         e  = 0 ;
  72.         DelayLong(10);
  73. }

  74. void LCDInit()// LCD初始化
  75. {
  76.         LCDWriteCmd(0x38) ;
  77.         DelayLong(500);
  78.         LCDWriteCmd(0x38) ;
  79.         DelayLong(500);
  80.         LCDWriteCmd(0x38) ;
  81.         DelayLong(500);
  82.         LCDWriteCmd(0x38) ;//设置16×2显示,每个方块5×7点阵,8位数据接口
  83.         LCDWriteCmd(0x0C) ;//显示器开,光标关闭
  84.         LCDWriteCmd(0x06) ;//文字不动,地址自动加一
  85.         LCDWriteCmd(0x01) ;//清屏
  86. }

  87. void LCDDisplay(uchar addr, uchar q)//在某一地址显示一字节
  88. {
  89.         Delay10us();
  90.         LCDWriteAddr(addr) ;
  91.         LCDWriteByte(q) ;
  92.         Delay10us();
  93. }

  94. void LCDWarning()
  95. {
  96.         if(Tem>=TemWarnHigh)  //检测的温度高于额定上限
  97.         {
  98.                 LCDDisplay(0x08,'T') ;
  99.                 LCDDisplay(0x09,'e') ;
  100.                 LCDDisplay(0x0A,'m') ;
  101.                 LCDDisplay(0x0B,'H') ;
  102.                 LCDDisplay(0x0C,'i') ;
  103.                 LCDDisplay(0x0D,'g') ;
  104.                 LCDDisplay(0x0E,'h') ;
  105.                 LCDDisplay(0x0F,'!') ;
  106.         }

  107.         if(Tem<=TemWarnLow)  //检测的温度低于额定下限
  108.         {
  109.                 LCDDisplay(0x08,'T') ;
  110.                 LCDDisplay(0x09,'e') ;
  111.                 LCDDisplay(0x0A,'m') ;
  112.                 LCDDisplay(0x0B,'L') ;
  113.                 LCDDisplay(0x0C,'o') ;
  114.                 LCDDisplay(0x0D,'w') ;
  115.                 LCDDisplay(0x0E,'!') ;
  116.         }

  117.         if(Hum>=HumWarnHigh)  //检测的湿度高于额定上限
  118.         {
  119.                 LCDDisplay(0x48,'H') ;
  120.                 LCDDisplay(0x49,'u') ;
  121.                 LCDDisplay(0x4A,'m') ;
  122.                 LCDDisplay(0x4B,'H') ;
  123.                 LCDDisplay(0x4C,'i') ;
  124.                 LCDDisplay(0x4D,'g') ;
  125.                 LCDDisplay(0x4E,'h') ;
  126.                 LCDDisplay(0x4F,'!') ;
  127.         }

  128.         if(Hum<=HumWarnLow)  //检测的湿度低于额定下限
  129.         {
  130.                 LCDDisplay(0x48,'H') ;
  131.                 LCDDisplay(0x49,'u') ;
  132.                 LCDDisplay(0x4A,'m') ;
  133.                 LCDDisplay(0x4B,'L') ;
  134.                 LCDDisplay(0x4C,'o') ;
  135.                 LCDDisplay(0x4D,'w') ;
  136.                 LCDDisplay(0x4E,'!') ;
  137.         }

  138. }

  139. /**********蜂鸣器模块***********/

  140. void BEEP()  //报警函数
  141. {
  142.         if(Tem<=TemWarnLow || Tem>=TemWarnHigh)  //检测的温度超标
  143.         bee=0; //报警

  144.         if(Hum<=HumWarnLow || Hum>=HumWarnHigh)  //检测的湿度超标
  145.         bee=0; //报警
  146. }

  147. /**********DHT11模块***********/

  148. void DHTStart()//开始信号
  149. {
  150.         io=1;//拉高data
  151.         Delay10us();
  152.         io=0;
  153.         DelayLong(180);//微处理器IO设置为高电平且时间>18ms
  154.         io=1;//再拉高data
  155.         Delay10us();
  156. }

  157. uchar DHTReceive()//接收一个字节
  158. {
  159.         uint i;
  160.         uchar temp,count;//temp记录是0还是1,count计数收到第几位
  161.         data1=0;
  162.         for(i=0;i<8;i++)//一次接受8位
  163.         {
  164.                 temp=0;//初始收到0,低电平
  165.                 DelayLong(4);//延时40us后判断收到的电平
  166.                 if(io==1)temp=1;//如果收到1,那么传送的是1,否则传送的是0
  167.                 count=2;
  168.                 while((io)&&count++);//io=0则等待,count防止死循环
  169.                 if(count==1)break;
  170.                 data1<<=1;//左移1位
  171.                 data1|=temp;//传输当前位给data存储
  172.         }
  173.         return data1;
  174. }

  175. void receive()//接收数据
  176. {
  177.         uchar TemH,TemL,HumH,HumL,check,sum;
  178.         uint time;
  179.         DHTStart();//开始信号

  180.         //DHT11收到开始信号后进行应答
  181.         time=8;
  182.         while(!io & time>0)time--;//等待DHT拉高80us
  183.         time=8;
  184.         while(io && time>0)time--;//等待DHT拉低80us

  185.         //开始接收数据
  186.         io=1;//主机拉高data
  187.         Delay10us();
  188.         if(!io)//读取DHT11响应信号,DHT11拉低data
  189.         {
  190.                 HumH=DHTReceive();//湿度高8位
  191.                 HumL=DHTReceive();//湿度低8位
  192.                 TemH=DHTReceive();//温度高8位
  193.                 TemL=DHTReceive();//温度低8位
  194.                 check=DHTReceive();//校验位
  195.                 io=0;//拉低延时50us,代表读取结束
  196.                 DelayLong(5);
  197.                 io=1;

  198.                 sum=HumH+HumL+TemH+TemL;//校验
  199.                 if(sum==check)//校验通过数据录入
  200.                 {
  201.                         HumHigh=HumH;
  202.                         HumLow=HumL;
  203.                         TemHigh=TemH;
  204.                         TemLow=TemL;
  205.                 }
  206.         }
  207. }

  208. /**********主程序**********/

  209. void main()
  210. {
  211.         BeepFlag=1;
  212.         LCDInit();//LCD初始化
  213.         while(1)
  214.         {

  215.                 LCDDisplay(0x00,'T') ; //LCD显示Tem:
  216.                 LCDDisplay(0x01,'e') ;
  217.                 LCDDisplay(0x02,'m') ;
  218.                 LCDDisplay(0x03,':') ;

  219.                 LCDDisplay(0x40,'H') ; //LCD显示Hum:
  220.                 LCDDisplay(0x41,'u') ;
  221.                 LCDDisplay(0x42,'m') ;
  222.                 LCDDisplay(0x43,':') ;

  223.                 receive();
  224.                 LCDDisplay(0x04,TemHigh/10+0x30) ;//温度显示
  225.                 LCDDisplay(0x05,TemLow%10+0x30) ;
  226.                 LCDDisplay(0x44,HumHigh/10+0x30) ;//湿度显示
  227.                 LCDDisplay(0x45,HumLow%10+0x30) ;
  228.                 LCDWarning();//超标显示

  229.                 if(!K1)BeepFlag=0;//若K1被按下,则禁用蜂鸣器
  230.                 if(!K2)BeepFlag=1;//若K2被按下,则启用蜂鸣器
  231.                 if(BeepFlag) BEEP();
  232.         }
  233. }

复制代码




回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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