找回密码
 立即注册

QQ登录

只需一步,快速开始

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

c52单片机板子仿真能跑实物上LCD1602显示屏是一堆白块

[复制链接]
跳转到指定楼层
楼主
如图,仿真的时候是这样的,但是实物用开发板拼好之后是这样的大佬们知道怎么改吗



单片机源程序如下:

  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. typedef unsigned int u16;        //对系统默认数据类型进行重定义
  6. typedef unsigned char u8;

  7. sbit RS=P2^0;
  8. sbit RW=P2^1;
  9. sbit EN=P2^2;
  10. sbit DATO=P1^3;
  11. sbit DATI=P1^2;
  12. sbit CS=P1^0;
  13. sbit Clk=P1^1;
  14. sbit DHT11_DQ=P2^3;
  15. sbit IN1_A=P3^0;
  16. sbit IN2_B=P3^1;
  17. sbit IN3_C=P3^2;
  18. sbit IN4_D=P3^3;
  19. sbit motor=P3^7;
  20. uchar code table[8]={0x0c,0x12,0x12,0x0c,0x00,0x00,0x00,0x00};  
  21. unsigned char datas0[]={0,0,0,0};  //缓冲数据
  22. unsigned char datas1[]={0,0,0,0};  //缓冲数据
  23. uint ch0=0,ch1=0;
  24. int vcc;
  25. uchar dat=0;

  26. void send_pulse_z(u8 step)
  27. {
  28.         u8 temp=step;
  29.         switch(temp)//8个节拍控制:A->AB->B->BC->C->CD->D->DA
  30.         {
  31.                 case 0: IN1_A=1;IN2_B=0;IN3_C=0;IN4_D=0;break;
  32.                 case 1: IN1_A=1;IN2_B=1;IN3_C=0;IN4_D=0;break;
  33.                 case 2: IN1_A=0;IN2_B=1;IN3_C=0;IN4_D=0;break;
  34.                 case 3: IN1_A=0;IN2_B=1;IN3_C=1;IN4_D=0;break;
  35.                 case 4: IN1_A=0;IN2_B=0;IN3_C=1;IN4_D=0;break;
  36.                 case 5: IN1_A=0;IN2_B=0;IN3_C=1;IN4_D=1;break;
  37.                 case 6: IN1_A=0;IN2_B=0;IN3_C=0;IN4_D=1;break;
  38.                 case 7: IN1_A=1;IN2_B=0;IN3_C=0;IN4_D=1;break;
  39.                 default: IN1_A=0;IN2_B=0;IN3_C=0;IN4_D=0;break;//停止相序        
  40.         }               
  41. }

  42. void send_pulse_f(u8 step)
  43. {
  44.         u8 temp=step;
  45.         switch(temp)//8个节拍控制:A->AB->B->BC->C->CD->D->DA
  46.         {
  47.                 case 7: IN1_A=1;IN2_B=0;IN3_C=0;IN4_D=0;break;
  48.                 case 6: IN1_A=1;IN2_B=1;IN3_C=0;IN4_D=0;break;
  49.                 case 5: IN1_A=0;IN2_B=1;IN3_C=0;IN4_D=0;break;
  50.                 case 4: IN1_A=0;IN2_B=1;IN3_C=1;IN4_D=0;break;
  51.                 case 3: IN1_A=0;IN2_B=0;IN3_C=1;IN4_D=0;break;
  52.                 case 2: IN1_A=0;IN2_B=0;IN3_C=1;IN4_D=1;break;
  53.                 case 1: IN1_A=0;IN2_B=0;IN3_C=0;IN4_D=1;break;
  54.                 case 0: IN1_A=1;IN2_B=0;IN3_C=0;IN4_D=1;break;
  55.                 default: IN1_A=0;IN2_B=0;IN3_C=0;IN4_D=0;break;//停止相序        
  56.         }               
  57. }

  58. void delay_10us(u16 ten_us)
  59. {
  60.         while(ten_us--);        
  61. }
  62. void delay_ms(u16 ms)
  63. {
  64.         u16 i,j;
  65.         for(i=ms;i>0;i--)
  66.                 for(j=110;j>0;j--);
  67. }

  68. //复位DHT11
  69. void DHT11_Rst(void)           
  70. {                 
  71.         DHT11_DQ=1;
  72.         delay_10us(1);
  73.         DHT11_DQ=0;         
  74.     delay_ms(25);  
  75.     DHT11_DQ=1;         
  76.         delay_10us(3);  
  77. }


  78. u8 DHT11_Check(void)            
  79. {   
  80.         u8 retry=0;
  81.         
  82.         while (!DHT11_DQ&&retry<100)//判断从机发出 80us 的低电平响应信号是否结束
  83.         {
  84.                 retry++;
  85.                 _nop_();
  86.         };
  87.         if(retry>=100)return 1;
  88.         else retry=0;
  89.     while (DHT11_DQ&&retry<100)//判断从机发出 80us 的高电平是否结束如结束则主机进入数据接收状态
  90.         {
  91.                 retry++;
  92.                 _nop_();
  93.         };         
  94.         if(retry>=100)return 1;            
  95.         return 0;
  96. }

  97. //从DHT11读取一个字节
  98. //返回值:读到的数据
  99. u8 DHT11_Read_Byte(void)   
  100. {        
  101.     u8 i,temp;
  102.         u8 data_byte=0;
  103.         u8 retry=0;

  104.           for(i=0;i<8;i++)//接收8bit的数据
  105.           {
  106. //                while(!DHT11_DQ);//等待50us的低电平开始信号结束
  107.                 while (!DHT11_DQ&&retry<50)//等待50us的低电平开始信号结束
  108.                 {
  109.                         retry++;
  110.                         _nop_();
  111.                 };
  112.                 retry=0;
  113.                 delay_10us(3);//等待40us
  114.                 temp=0;//时间为26us-28us表示接收的为数据'0'
  115.                 if(DHT11_DQ==1)
  116.                         temp=1; //如果26us-28us之后还为高电平则表示接收的数据为'1'
  117. //                while(DHT11_DQ);//等待数据信号高电平'0'为26us-28us'1'为70us
  118.                 while (DHT11_DQ&&retry<100)//等待数据信号高电平'0'为26us-28us'1'为70us
  119.                 {
  120.                         retry++;
  121.                         _nop_();
  122.                 };
  123.                 data_byte<<=1;//接收的数据为高位在前右移
  124.                 data_byte|=temp;
  125.           }

  126.           return data_byte;
  127. }

  128. //从DHT11读取一次数据
  129. //temp:温度值(范围:0~50°)
  130. //humi:湿度值(范围:20%~90%)
  131. //返回值:0,正常;1,读取失败
  132. u8 DHT11_Read_Data(u8 *temp,u8 *humi)   
  133. {        
  134.          u8 buf[5];
  135.         u8 i;
  136.         DHT11_Rst();
  137.         if(DHT11_Check()==0)
  138.         {
  139.                 for(i=0;i<5;i++)//读取40位数据
  140.                 {
  141.                         buf[i]=DHT11_Read_Byte();
  142.                 }
  143.                 if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
  144.                 {
  145.                         *humi=buf[0];
  146.                         *temp=buf[2];
  147.                 }
  148.                
  149.         }else return 1;
  150.         return 0;            
  151. }

  152. u8 DHT11_Init(void)
  153. {
  154.         DHT11_DQ=1;
  155.         DHT11_Rst();         
  156.         return DHT11_Check();        
  157. }

  158. void delay1ms(uint ms)
  159. {  
  160.         uint i,j;
  161.   for(i=0;i<ms;i++)
  162.                 for(j=0;j<100;j++);
  163. }

  164. void wr_com(uchar com)
  165. {
  166.         delay1ms(1);
  167.   RS=0;
  168.   RW=0;
  169.   EN=0;
  170.   P0=com;
  171.   delay1ms(1);
  172.   EN=1;
  173.   delay1ms(1);
  174.   EN=0;
  175. }

  176. void wr_dat(uchar dat)
  177. {
  178.         delay1ms(1);;
  179.   RS=1;
  180.   RW=0;
  181.   EN=0;
  182.   P0=dat;
  183.   delay1ms(1);
  184.   EN=1;
  185.   delay1ms(1);
  186.   EN=0;
  187. }

  188. void wr_new()
  189. {
  190.         uchar i;
  191.   wr_com(0x40);
  192.   for(i=0;i<8;i++)
  193.   {
  194.     wr_dat(table[ i]);
  195.   }
  196. }

  197. void lcd_init()
  198. {        
  199.         delay1ms(15);
  200.   wr_com(0x38);delay1ms(5);
  201.   wr_com(0x08);delay1ms(5);
  202.   wr_com(0x01);delay1ms(5);
  203.   wr_com(0x06);delay1ms(5);
  204.   wr_com(0x0c);delay1ms(5);
  205.   wr_new();
  206.   wr_com(0x80);
  207.   wr_dat('A');
  208.   wr_com(0x89);
  209.   wr_dat('B');
  210.   wr_com(0xc0);
  211.   wr_dat('C');
  212.         wr_com(0xcd);
  213.   wr_dat('%');
  214. }

  215. unsigned char adc0832(unsigned char CH)
  216. {
  217.         unsigned char i,test,adval;
  218.         adval = 0x00;
  219.         test = 0x00;
  220.         Clk = 0;       //初始化
  221.         DATI = 1;
  222.         _nop_();
  223.         CS = 0;
  224.         _nop_();
  225.         Clk = 1;
  226.         _nop_();
  227.         
  228.         
  229.         if ( CH == 0x00 )      //通道选择
  230.         {
  231.                 Clk = 0;
  232.                 DATI = 1;      //通道0的第一位
  233.                 _nop_();
  234.                 Clk = 1;
  235.                 _nop_();
  236.                 Clk = 0;
  237.                 DATI = 0;      //通道0的第二位
  238.                 _nop_();
  239.                 Clk = 1;
  240.                 _nop_();
  241.         }
  242.         else
  243.         {
  244.                 Clk = 0;
  245.                 DATI = 1;      //通道1的第一位
  246.                 _nop_();
  247.                 Clk = 1;
  248.                 _nop_();
  249.                 Clk = 0;
  250.                 DATI = 1;      //通道1的第二位
  251.                 _nop_();
  252.                 Clk = 1;
  253.                 _nop_();
  254.         }
  255.         
  256.         Clk = 0;
  257.         DATI = 1;
  258.         for( i = 0;i < 8;i++ )      //读取前8位的值
  259.         {
  260.                 _nop_();
  261.                 adval <<= 1;
  262.                 Clk = 1;
  263.                 _nop_();
  264.                 Clk = 0;
  265.                 if (DATO)
  266.                 adval |= 0x01;
  267.                 else
  268.                 adval |= 0x00;
  269.         }
  270.         for (i = 0; i < 8; i++)      //读取后8位的值
  271.         {
  272.                 test >>= 1;
  273.                 if (DATO)
  274.                 test |= 0x80;
  275.                 else
  276.                 test |= 0x00;
  277.                 _nop_();
  278.                 Clk = 1;
  279.                 _nop_();
  280.                 Clk = 0;
  281.         }
  282.         if (adval == test)      //比较前8位与后8位的值,如果不相同舍去。若一直出现显示为零,请将该行去掉
  283.         dat = test;
  284.         nop_();
  285.         CS = 1;        //释放ADC0832
  286.         DATO = 1;
  287.         Clk = 1;
  288.         return dat;
  289. }

  290. u8 smog=0;
  291. u8 steps;
  292. void main(void)
  293. {
  294.         u8 temp=0,humi=0;
  295.         lcd_init();
  296.         wr_com(0x01);
  297.         while(DHT11_Init());
  298.         motor=1;
  299.   while(1)
  300.   {
  301.                 DHT11_Read_Data(&temp,&humi);
  302.     ch0=adc0832(0)*1.97;
  303.                 smog=ch0/5;
  304.           //数据处理
  305.                 datas0[2]=smog/100;
  306.           datas0[1]=smog/10%10;   //小数点后两位
  307.                 datas0[0]=smog%10;   //小数点后两位
  308.                
  309.                 ch1=adc0832(1)*1.97;
  310.                
  311.                 //数据处理
  312.                 datas1[3]=ch1/1000;    //个位
  313.           datas1[2]=ch1%1000/100;  //小数点后一位
  314.           datas1[1]=ch1%100/10;   //小数点后两位
  315.                 datas1[0]=ch1%10;   //小数点后两位
  316.                 vcc=datas1[3]*1000+datas1[2]*100+datas1[1]*10+datas1[0];
  317.                
  318.                 wr_com(0x80);
  319.                 wr_dat('s');
  320.                 wr_dat('m');
  321.                 wr_dat('o');
  322.                 wr_dat('g');
  323.                 wr_dat(':');
  324.                 wr_dat(datas0[2]+0x30);
  325.                 wr_dat(datas0[1]+0x30);
  326.     wr_dat(datas0[0]+0x30);
  327.                 wr_dat('%');
  328.                 wr_com(0x8b);
  329.     wr_dat(datas1[2]+0x30);
  330.                 wr_dat('.');
  331.                 wr_dat(datas1[1]+0x30);
  332.     wr_dat(datas1[0]+0x30);
  333.                 wr_dat('V');
  334.                 wr_com(0x80+0x40);
  335.                 wr_dat('t');
  336.                 wr_dat(':');
  337.                 wr_dat(temp/10+0x30);
  338.                 wr_dat(temp%10+0x30);
  339.                 wr_dat('^');
  340.                 wr_dat('C');
  341.                 wr_com(0x88+0x40);
  342.                 wr_dat('h');
  343.                 wr_dat(':');
  344.                 wr_dat(humi/10+0x30);
  345.                 wr_dat(humi%10+0x30);
  346.                 wr_dat('%');
  347.                 if(vcc>177){//大于1.77V
  348.                         send_pulse_f(steps);
  349.                         steps++;
  350.                         if(steps>=8){
  351.                                 steps=0;
  352.                         }
  353.                 }
  354.                 if(vcc<120){
  355.                         send_pulse_z(steps);
  356.                         steps++;
  357.                         if(steps>=8){
  358.                                 steps=0;
  359.                         }
  360.                 }
  361.                 if(temp>40 || humi>80){
  362.                         motor=0;
  363.                 }
  364.                 else motor=1;
  365.                 delay_ms(30);
  366.   }
  367. }

复制代码

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

使用道具 举报

沙发
ID:1078420 发表于 2023-5-18 22:58 | 只看该作者
图片好像没有发出来,就是实物上lcd1602是一行白块
回复

使用道具 举报

板凳
ID:123289 发表于 2023-5-19 08:47 | 只看该作者
先确认实物与仿真是一样的。
回复

使用道具 举报

地板
ID:161164 发表于 2023-5-19 08:51 | 只看该作者
检查接线,检查排阻方向
回复

使用道具 举报

5#
ID:1010435 发表于 2023-5-22 23:03 | 只看该作者
调整下对比度试试,就是第三脚的电压
回复

使用道具 举报

6#
ID:1079228 发表于 2023-5-23 00:23 | 只看该作者
首先查看一下接线,看看硬件接线是否出错,还有单片机型号确认一下
回复

使用道具 举报

7#
ID:526543 发表于 2023-5-23 11:06 | 只看该作者
实物和仿真差距大这呢
回复

使用道具 举报

8#
ID:744809 发表于 2023-5-23 13:47 | 只看该作者
应该是对比度电压不对,要用可调电阻进行调节的。
回复

使用道具 举报

9#
ID:94031 发表于 2023-5-23 15:40 | 只看该作者
程序还牵扯DHT11的操作,如果DHT11不正常,会影响LCD1602。我屏蔽DHT11程序在实物上试,LCD1602显示是正常的。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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