找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1466|回复: 7
收起左侧

关于单片机+Proteus上DHT11数据无法在LCD屏上显示的问题

[复制链接]
ID:1047884 发表于 2022-10-20 12:18 | 显示全部楼层 |阅读模式
小白一枚 不是特别懂C 认为是程序的问题 但不知道怎么改 求助各位大神

DHT11单片机程序:
  1. #include "dht11.h"
  2. #include "delay.h"
  3.       
  4. //复位DHT11
  5. void DHT11_Rst(void)           
  6. {                 
  7.                 DHT11_IO_OUT();         //SET OUTPUT
  8.     DHT11_DQ_OUT=0;         //拉低DQ
  9.     delay_ms(20);            //拉低至少18ms
  10.     DHT11_DQ_OUT=1;         //DQ=1
  11.                 delay_us(30);             //主机拉高20~40us
  12. }
  13. //等待DHT11的回应
  14. //返回1:未检测到DHT11的存在
  15. //返回0:存? DHT11_Check(void)            
  16. u8 DHT11_Check(void)                    
  17. {   
  18.         u8 retry=0;
  19.         DHT11_IO_IN();//SET INPUT         
  20.     while (DHT11_DQ_IN&&retry<100)//DHT11会拉低40~80us
  21.         {
  22.                 retry++;
  23.                 delay_us(1);
  24.         };         
  25.         if(retry>=100)return 1;
  26.         else retry=0;
  27.     while (!DHT11_DQ_IN&&retry<100)//DHT11拉低后会再次拉高40~80us
  28.         {
  29.                 retry++;
  30.                 delay_us(1);
  31.         };
  32.         if(retry>=100)return 1;            
  33.         return 0;
  34. }
  35. //从DHT11读取一个位
  36. //返回值:1/0
  37. u8 DHT11_Read_Bit(void)                          
  38. {
  39.          u8 retry=0;
  40.         while(DHT11_DQ_IN&&retry<100)//等待变为低电平
  41.         {
  42.                 retry++;
  43.                 delay_us(1);
  44.         }
  45.         retry=0;
  46.         while(!DHT11_DQ_IN&&retry<100)//等待变高电平
  47.         {
  48.                 retry++;
  49.                 delay_us(1);
  50.         }
  51.         delay_us(40);//等待40us
  52.         if(DHT11_DQ_IN)return 1;//读出来是数字1
  53.         else return 0;//读出来是数字0                  
  54. }
  55. //从DHT11读取一个字节
  56. //返回值:读到的数据
  57. u8 DHT11_Read_Byte(void)   
  58. {        
  59.     u8 i,dat;
  60.     dat=0;
  61.         for (i=0;i<8;i++)
  62.         {
  63.                    dat<<=1;
  64.             dat|=DHT11_Read_Bit();
  65.     }                                                   
  66.     return dat;
  67. }
  68. //从DHT11读取一次数据
  69. //temp:温度值(范围:0~50°)
  70. //humi:湿度值(范围:20%~90%)
  71. //返回值:0,正常;1,读取失败
  72. u8 DHT11_Read_Data(u8 *temp,u8 *humi)   
  73. {        
  74.          u8 buf[5];
  75.         u8 i;
  76.         DHT11_Rst();
  77.         if(DHT11_Check()==0)
  78.         {
  79.                 for(i=0;i<5;i++)//读取40位数据
  80.                 {
  81.                         buf[i]=DHT11_Read_Byte();
  82.                 }
  83.                 if((buf[0]+buf[1]+buf[2]+buf[3])==buf[4])
  84.                 {
  85.                         *humi=buf[0];
  86.                         *temp=buf[2];
  87.                 }
  88.         }else return 1;
  89.         return 0;            
  90. }
  91. //初始化DHT11的IO口 DQ 同时检测DHT11的存在
  92. //返回1:不存在
  93. //返回0:存在            
  94. u8 DHT11_Init(void)
  95. {         
  96.          GPIO_InitTypeDef  GPIO_InitStructure;
  97.          
  98.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);         //使能PG端口时钟
  99.         
  100.          GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;                                 //PG11端口配置
  101.          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
  102.          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  103.          GPIO_Init(GPIOB, &GPIO_InitStructure);                                 //初始化IO口
  104.          GPIO_SetBits(GPIOB,GPIO_Pin_7);                                                 //PG11 输出高
  105.                            
  106.         DHT11_Rst();  //复位DHT11
  107.         return DHT11_Check();//等待DHT11的回应
  108. }
复制代码

主函数:
  1. #include "sys.h"
  2. #include "GPIO.h"
  3. #include "LCD1602.h"
  4. #include "dht11.h"
  5. #include "delay.h"
  6. #include "sys.h"
  7. #include "stdio.h"
  8. #include "usart.h"
  9. #include "string.h"
  10. #include "ds1302.h"

  11. #define uchar unsigned char
  12. #define uint  unsigned int

  13. unsigned char temperature,humidity;

  14. unsigned char setn = 0;
  15. unsigned char  p_r=0;                                                                 //平年/润年  =0表示平年,=1表示润年

  16. u8 set_shi=0,set_fen=0,set_miao=0,set_nian=0,set_yue=0,set_ri=0,set_week=0;
  17. unsigned char see_NZ = 0;
  18. unsigned char nz_shi=12,nz_fen=0,nz_miao=0;


  19. void Display_Time()//显示时间及温湿度
  20. {
  21.           uint nian_temp;
  22.         
  23.           LCD1602_write_com(0x80);
  24.           LCD1602_write_data('2');
  25.           LCD1602_write_data('0');
  26.           LCD1602_write_data(SysDate.year/10 + 0x30);
  27.     LCD1602_write_data(SysDate.year%10 + 0x30);
  28.           LCD1602_write_data('-');
  29.     LCD1602_write_data(SysDate.mon/10 + 0x30);
  30.           LCD1602_write_data(SysDate.mon%10 + 0x30);
  31.           LCD1602_write_data('-');
  32.     LCD1602_write_data(SysDate.day/10 + 0x30);
  33.           LCD1602_write_data(SysDate.day%10 + 0x30);
  34.           LCD1602_write_data(' ');
  35.     switch(SysDate.week)
  36.     {
  37.     case 1:
  38.         LCD1602_write_data('M');//星期数为1时,显示
  39.         LCD1602_write_data('O');
  40.         LCD1602_write_data('N');
  41.         break;

  42.     case 2:
  43.         LCD1602_write_data('T');//星期数据为2时显示
  44.         LCD1602_write_data('U');
  45.         LCD1602_write_data('E');
  46.         break;

  47.     case 3:
  48.         LCD1602_write_data('W');//星期数据为3时显示
  49.         LCD1602_write_data('E');
  50.         LCD1602_write_data('D');
  51.         break;

  52.     case 4:
  53.         LCD1602_write_data('T');//星期数据为4是显示
  54.         LCD1602_write_data('H');
  55.         LCD1602_write_data('U');
  56.         break;

  57.     case 5:
  58.         LCD1602_write_data('F');//星期数据为5时显示
  59.         LCD1602_write_data('R');
  60.         LCD1602_write_data('I');
  61.         break;

  62.     case 6:
  63.         LCD1602_write_data('S');//星期数据为6时显示
  64.         LCD1602_write_data('A');
  65.         LCD1602_write_data('T');
  66.         break;

  67.     case 7:
  68.         LCD1602_write_data('S');//星期数据为7时显示
  69.         LCD1602_write_data('U');
  70.         LCD1602_write_data('N');
  71.         break;
  72.     }
  73.     LCD1602_write_data(' ');
  74.                
  75.                 nian_temp=2000+SysDate.year;
  76.                 if((nian_temp%400==0)||((nian_temp%100!=0)&&(nian_temp%4==0)))  //判断是否为闰年
  77.                                 p_r=1;
  78.                 else
  79.                                 p_r=0;
  80.                 if(p_r == 1)
  81.                 {
  82.                                 LCD1602_write_data('R');
  83.                 }
  84.                 else
  85.                 {
  86.                                 LCD1602_write_data('P');
  87.                 }
  88.                
  89.     LCD1602_write_com(0x80+0x40);
  90.           LCD1602_write_data(SysDate.hour/10 + 0x30);
  91.     LCD1602_write_data(SysDate.hour%10 + 0x30);
  92.           LCD1602_write_data(':');
  93.     LCD1602_write_data(SysDate.min/10 + 0x30);
  94.           LCD1602_write_data(SysDate.min%10 + 0x30);
  95.           LCD1602_write_data(':');
  96.     LCD1602_write_data(SysDate.sec/10 + 0x30);
  97.           LCD1602_write_data(SysDate.sec%10 + 0x30);
  98.                 LCD1602_write_data(' ');
  99.                 LCD1602_write_data(temperature/10 + 0x30);//显示温度的十位
  100.           LCD1602_write_data(temperature%10 + 0x30);//显示温度的个位
  101.                 LCD1602_write_data('C');
  102.                 LCD1602_write_data(' ');
  103.                 LCD1602_write_data(humidity/10 + 0x30);//显示湿度的十位
  104.           LCD1602_write_data(humidity%10 + 0x30);//湿度个位
  105.                 LCD1602_write_data('%');
  106. }

  107. void Display_alarm_clock()//显示闹钟
  108. {
  109.     LCD1602_write_com(0x80+0x40+4);
  110.           LCD1602_write_data(nz_shi/10 + 0x30);
  111.     LCD1602_write_data(nz_shi%10 + 0x30);
  112.           LCD1602_write_data(':');
  113.     LCD1602_write_data(nz_fen/10 + 0x30);
  114.           LCD1602_write_data(nz_fen%10 + 0x30);
  115.           LCD1602_write_data(':');
  116.     LCD1602_write_data(nz_miao/10 + 0x30);
  117.           LCD1602_write_data(nz_miao%10 + 0x30);
  118.                 LCD1602_write_data(' ');
  119. }

  120. void Display_setTime()//显示设置时间
  121. {
  122.           LCD1602_write_com(0x80);
  123.           LCD1602_write_data('2');
  124.           LCD1602_write_data('0');
  125.           LCD1602_write_data(set_nian/10 + 0x30);
  126.     LCD1602_write_data(set_nian%10 + 0x30);
  127.           LCD1602_write_data('-');
  128.     LCD1602_write_data(set_yue/10 + 0x30);
  129.           LCD1602_write_data(set_yue%10 + 0x30);
  130.           LCD1602_write_data('-');
  131.     LCD1602_write_data(set_ri/10 + 0x30);
  132.           LCD1602_write_data(set_ri%10 + 0x30);
  133.           LCD1602_write_data(' ');
  134.     switch(set_week)
  135.     {
  136.     case 1:
  137.         LCD1602_write_data('M');//星期数为1时,显示
  138.         LCD1602_write_data('O');
  139.         LCD1602_write_data('N');
  140.         break;

  141.     case 2:
  142.         LCD1602_write_data('T');//星期数据为2时显示
  143.         LCD1602_write_data('U');
  144.         LCD1602_write_data('E');
  145.         break;

  146.     case 3:
  147.         LCD1602_write_data('W');//星期数据为3时显示
  148.         LCD1602_write_data('E');
  149.         LCD1602_write_data('D');
  150.         break;

  151.     case 4:
  152.         LCD1602_write_data('T');//星期数据为4是显示
  153.         LCD1602_write_data('H');
  154.         LCD1602_write_data('U');
  155.         break;

  156.     case 5:
  157.         LCD1602_write_data('F');//星期数据为5时显示
  158.         LCD1602_write_data('R');
  159.         LCD1602_write_data('I');
  160.         break;

  161.     case 6:
  162.         LCD1602_write_data('S');//星期数据为6时显示
  163.         LCD1602_write_data('A');
  164.         LCD1602_write_data('T');
  165.         break;

  166.     case 7:
  167.         LCD1602_write_data('S');//星期数据为7时显示
  168.         LCD1602_write_data('U');
  169.         LCD1602_write_data('N');
  170.         break;
  171.     }
  172.     LCD1602_write_data(' ');
  173.                
  174.     LCD1602_write_com(0x80+0x40);
  175.           LCD1602_write_data(set_shi/10 + 0x30);
  176.     LCD1602_write_data(set_shi%10 + 0x30);
  177.           LCD1602_write_data(':');
  178.     LCD1602_write_data(set_fen/10 + 0x30);
  179.           LCD1602_write_data(set_fen%10 + 0x30);
  180.           LCD1602_write_data(':');
  181.     LCD1602_write_data(set_miao/10 + 0x30);
  182.           LCD1602_write_data(set_miao%10 + 0x30);
  183.                 LCD1602_write_data(' ');
  184. }


  185. void keyscan()
  186. {
  187.                 if(KEY1 == 0)
  188.                 {
  189.                                 delay_ms(20);
  190.                           if(KEY1 == 0)
  191.                                 {
  192.                                           BEEP = 1;
  193.                                                 delay_ms(200);
  194.                                                 BEEP = 0;
  195.                                                 while(KEY1 == 0);
  196.                                           
  197.                                           set_shi = SysDate.hour;
  198.                                           set_fen = SysDate.min;
  199.                                           set_miao = SysDate.sec;
  200.                                           set_nian = SysDate.year;
  201.                                           set_yue = SysDate.mon;
  202.                                           set_ri = SysDate.day;
  203.                                           set_week = SysDate.week;
  204.                                           if(see_NZ == 0)
  205.                                                 {
  206.                                                                 setn++;
  207.                                                                 if(setn > 7)
  208.                                                                 {
  209.                                                                                 setn = 0;
  210.                                                                                 LCD1602_write_com(0x0C);
  211.                                                                 }
  212.                                                                 if(setn == 1)
  213.                                                                 {
  214.                                                                                 Display_setTime();
  215.                                                                                 LCD1602_write_com(0x80+3);
  216.                                                                                 LCD1602_write_com(0x0F);
  217.                                                                 }
  218.                                                                 if(setn == 2)
  219.                                                                 {
  220.                                                                                 LCD1602_write_com(0x80+6);
  221.                                                                                 LCD1602_write_com(0x0F);
  222.                                                                 }
  223.                                                                 if(setn == 3)
  224.                                                                 {
  225.                                                                                 LCD1602_write_com(0x80+9);
  226.                                                                                 LCD1602_write_com(0x0F);
  227.                                                                 }
  228.                                                                 if(setn == 4)
  229.                                                                 {
  230.                                                                         
  231.                                                                                 LCD1602_write_com(0x80+13);
  232.                                                                                 LCD1602_write_com(0x0F);
  233.                                                                 }
  234.                                                                 if(setn == 5)
  235.                                                                 {
  236.                                                                                 LCD1602_write_com(0x80+0x40+1);
  237.                                                                                 LCD1602_write_com(0x0F);
  238.                                                                 }
  239.                                                                 if(setn == 6)
  240.                                                                 {                                                        
  241.                                                                                 LCD1602_write_com(0x80+0x40+4);
  242.                                                                                 LCD1602_write_com(0x0F);
  243.                                                                 }
  244.                                                                 if(setn == 7)
  245.                                                                 {                                                        
  246.                                                                                 LCD1602_write_com(0x80+0x40+7);
  247.                                                                                 LCD1602_write_com(0x0F);
  248.                                                                 }
  249.                                                 }else
  250.                                                 {
  251.                                                                 setn++;
  252.                                                                 if(setn > 3)
  253.                                                                 {
  254.                                                                                 setn = 0;
  255.                                                                                 LCD1602_write_com(0x0C);
  256.                                                                 }
  257.                                                                 if(setn == 1)
  258.                                                                 {
  259.                                                                                 LCD1602_write_com(0x80+0x40+5);
  260.                                                                                 LCD1602_write_com(0x0F);
  261.                                                                 }
  262.                                                                 if(setn == 2)
  263.                                                                 {
  264.                                                                                 LCD1602_write_com(0x80+0x40+8);
  265.                                                                                 LCD1602_write_com(0x0F);
  266.                                                                 }
  267.                                                                 if(setn == 3)
  268.                                                                 {
  269.                                                                                 LCD1602_write_com(0x80+0x40+11);
  270.                                                                                 LCD1602_write_com(0x0F);
  271.                                                                 }
  272.                                                 }
  273.                                 }
  274.                 }
  275.                 if(KEY2 == 0)
  276.                 {
  277.                                 delay_ms(20);
  278.                           if(KEY2 == 0)
  279.                                 {
  280.                                           BEEP = 1;
  281.                                                 delay_ms(200);
  282.                                                 BEEP = 0;
  283.                                                 while(KEY2 == 0);
  284.                                        
  285.                                           if(see_NZ == 0)
  286.                                                 {
  287.                                                                 if(setn == 1)
  288.                                                                 {
  289.                                                                                 set_nian ++;
  290.                                                                                 if(set_nian == 100)
  291.                                                                                 {
  292.                                                                                                 set_nian = 0;
  293.                                                                                 }
  294.                                                                                 SysDate.year = set_nian;
  295.                                                                                 Display_setTime();
  296.                                                                                 DS1302_DateSet(&SysDate);
  297.                                                                                 
  298.                                                                                 LCD1602_write_com(0x80+3);
  299.                                                                                 LCD1602_write_com(0x0F);
  300.                                                                 }
  301.                                                                 if(setn == 2)
  302.                                                                 {
  303.                                                                                 set_yue ++;
  304.                                                                                 if(set_yue == 13)
  305.                                                                                 {
  306.                                                                                                 set_yue = 1;
  307.                                                                                 }
  308.                                                                                 if((set_yue==4)||(set_yue==6)||(set_yue==9)||(set_yue==11))
  309.                                                                                 {
  310.                                                                                                 if(set_ri>30)
  311.                                                                                                                 set_ri=1;
  312.                                                                                 }
  313.                                                                                 else
  314.                                                                                 {
  315.                                                                                                 if(set_yue==2)
  316.                                                                                                 {
  317.                                                                                                                 if(p_r==1)
  318.                                                                                                                 {
  319.                                                                                                                                 if(set_ri>29)
  320.                                                                                                                                                 set_ri=1;
  321.                                                                                                                 }
  322.                                                                                                                 else
  323.                                                                                                                 {
  324.                                                                                                                                 if(set_ri>28)
  325.                                                                                                                                                 set_ri=1;
  326.                                                                                                                 }
  327.                                                                                                 }
  328.                                                                                 }
  329.                                                                                 SysDate.mon = set_yue;
  330.                                                                                 SysDate.day = set_ri;
  331.                                                                                 Display_setTime();
  332.                                                                                 DS1302_DateSet(&SysDate);
  333.                                                                                 
  334.                                                                                 LCD1602_write_com(0x80+6);
  335.                                                                                 LCD1602_write_com(0x0F);
  336.                                                                 }
  337.                                                                 if(setn == 3)
  338.                                                                 {
  339.                                                                                 set_ri ++;
  340.                                                                                 if((set_yue==1)||(set_yue==3)||(set_yue==5)||(set_yue==7)||(set_yue==8)||(set_yue==10)||(set_yue==12))
  341.                                                                                 {
  342.                                                                                                 if(set_ri==32)
  343.                                                                                                                 set_ri=1;
  344.                                                                                 }
  345.                                                                                 else
  346.                                                                                 {
  347.                                                                                                 if(set_yue==2)
  348.                                                                                                 {
  349.                                                                                                                 if(p_r==1)
  350.                                                                                                                 {
  351.                                                                                                                                 if(set_ri==30)
  352.                                                                                                                                                 set_ri=1;
  353.                                                                                                                 }
  354.                                                                                                                 else
  355.                                                                                                                 {
  356.                                                                                                                                 if(set_ri==29)
  357.                                                                                                                                                 set_ri=1;
  358.                                                                                                                 }
  359.                                                                                                 }
  360.                                                                                                 else
  361.                                                                                                 {
  362.                                                                                                                 if(set_ri==31)
  363.                                                                                                                                 set_ri=1;
  364.                                                                                                 }
  365.                                                                                 }
  366.                                                                                 SysDate.day = set_ri;
  367.                                                                                 Display_setTime();
  368.                                                                                 DS1302_DateSet(&SysDate);
  369.                                                                                 
  370.                                                                                 LCD1602_write_com(0x80+9);
  371.                                                                                 LCD1602_write_com(0x0F);
  372.                                                                 }
  373.                                                                 if(setn == 4)
  374.                                                                 {
  375.                                                                                 set_week ++;
  376.                                                                                 if(set_week == 8)
  377.                                                                                 {
  378.                                                                                                 set_week = 1;
  379.                                                                                 }
  380.                                                                                 SysDate.week = set_week;
  381.                                                                                 Display_setTime();
  382.                                                                                 DS1302_DateSet(&SysDate);
  383.                                                                                 
  384.                                                                                 LCD1602_write_com(0x80+13);
  385.                                                                                 LCD1602_write_com(0x0F);
  386.                                                                 }
  387.                                                                 if(setn == 5)
  388.                                                                 {
  389.                                                                                 set_shi ++;
  390.                                                                                 if(set_shi == 24)
  391.                                                                                 {
  392.                                                                                                 set_shi = 0;
  393.                                                                                 }
  394.                                                                                 SysDate.hour = set_shi;
  395.                                                                                 Display_setTime();
  396.                                                                                 DS1302_DateSet(&SysDate);
  397.                                                                                 
  398.                                                                                 LCD1602_write_com(0x80+0x40+1);
  399.                                                                                 LCD1602_write_com(0x0F);
  400.                                                                 }
  401.                                                                 if(setn == 6)
  402.                                                                 {
  403.                                                                                 set_fen ++;
  404.                                                                                 if(set_fen == 60)
  405.                                                                                 {
  406.                                                                                                 set_fen = 0;
  407.                                                                                 }
  408.                                                                                 SysDate.min = set_fen;
  409.                                                                                 Display_setTime();
  410.                                                                                 DS1302_DateSet(&SysDate);
  411.                                                                                 
  412.                                                                                 LCD1602_write_com(0x80+0x40+4);
  413.                                                                                 LCD1602_write_com(0x0F);
  414.                                                                 }
  415.                                                                 if(setn == 7)
  416.                                                                 {
  417.                                                                                 set_miao ++;
  418.                                                                                 if(set_miao == 60)
  419.                                                                                 {
  420.                                                                                                 set_miao = 0;
  421.                                                                                 }
  422.                                                                                 SysDate.sec = set_miao;
  423.                                                                                 Display_setTime();
  424.                                                                                 DS1302_DateSet(&SysDate);
  425.                                                                                 
  426.                                                                                 LCD1602_write_com(0x80+0x40+7);
  427.                                                                                 LCD1602_write_com(0x0F);
  428.                                                                 }
  429.                                                 }else
  430.                                                 {
  431.                                                                 if(setn == 1)
  432.                                                                 {
  433.                                                                                 nz_shi ++;
  434.                                                                                 if(nz_shi == 24)
  435.                                                                                 {
  436.                                                                                                 nz_shi = 0;
  437.                                                                                 }
  438.                                                                                 Display_alarm_clock();
  439.                                                                                 LCD1602_write_com(0x80+0x40+5);
  440.                                                                                 LCD1602_write_com(0x0F);
  441.                                                                 }
  442.                                                                 if(setn == 2)
  443.                                                                 {
  444.                                                                                 nz_fen ++;
  445.                                                                                 if(nz_fen == 60)
  446.                                                                                 {
  447.                                                                                                 nz_fen = 0;
  448.                                                                                 }
  449.                                                                                 Display_alarm_clock();
  450.                                                                                 LCD1602_write_com(0x80+0x40+8);
  451.                                                                                 LCD1602_write_com(0x0F);
  452.                                                                 }
  453.                                                                 if(setn == 3)
  454.                                                                 {
  455.                                                                                 nz_miao ++;
  456.                                                                                 if(nz_miao == 60)
  457.                                                                                 {
  458.                                                                                                 nz_miao = 0;
  459.                                                                                 }
  460.                                                                                 Display_alarm_clock();
  461.                                                                                 LCD1602_write_com(0x80+0x40+11);
  462.                                                                                 LCD1602_write_com(0x0F);
  463.                                                                 }
  464.                                                 }
  465.                                 }
  466.                 }
  467.                 if(KEY3 == 0)
  468.                 {
  469.                                 delay_ms(20);
  470.                           if(KEY3 == 0)
  471.                                 {
  472.                                           BEEP = 1;
  473.                                                 delay_ms(200);
  474.                                                 BEEP = 0;
  475.                                                 while(KEY3 == 0);
  476.                                        
  477.                                           if(see_NZ == 0)
  478.                                                 {
  479.                                                                 if(setn == 1)
  480.                                                                 {
  481.                                                                                 if(set_nian == 0)
  482.                                                                                 {
  483.                                                                                                 set_nian = 100;
  484.                                                                                 }
  485.                                                                                 set_nian --;
  486.                                                                                 SysDate.year = set_nian;
  487.                                                                                 Display_setTime();
  488.                                                                                 DS1302_DateSet(&SysDate);
  489.                                                                                 
  490.                                                                                 LCD1602_write_com(0x80+3);
  491.                                                                                 LCD1602_write_com(0x0F);
  492.                                                                 }
  493.                                                                 if(setn == 2)
  494.                                                                 {
  495.                                                                                 if(set_yue == 1)
  496.                                                                                 {
  497.                                                                                                 set_yue = 13;
  498.                                                                                 }
  499.                                                                                 set_yue --;
  500.                                                                                 if((set_yue==4)||(set_yue==6)||(set_yue==9)||(set_yue==11))
  501.                                                                                 {
  502.                                                                                                 if(set_ri>30)
  503.                                                                                                                 set_ri=1;
  504.                                                                                 }
  505.                                                                                 else
  506.                                                                                 {
  507.                                                                                                 if(set_yue==2)
  508.                                                                                                 {
  509.                                                                                                                 if(p_r==1)
  510.                                                                                                                 {
  511.                                                                                                                                 if(set_ri>29)
  512.                                                                                                                                                 set_ri=1;
  513.                                                                                                                 }
  514.                                                                                                                 else
  515.                                                                                                                 {
  516.                                                                                                                                 if(set_ri>28)
  517.                                                                                                                                                 set_ri=1;
  518.                                                                                                                 }
  519.                                                                                                 }
  520.                                                                                 }
  521.                                                                                 SysDate.mon = set_yue;
  522.                                                                                 SysDate.day = set_ri;
  523.                                                                                 Display_setTime();
  524.                                                                                 DS1302_DateSet(&SysDate);
  525.                                                                                 
  526.                                                                                 LCD1602_write_com(0x80+6);
  527.                                                                                 LCD1602_write_com(0x0F);
  528.                                                                 }
  529.                                                                 if(setn == 3)
  530.                                                                 {
  531.                                                                                 set_ri --;
  532.                                                                                 if((set_yue==1)||(set_yue==3)||(set_yue==5)||(set_yue==7)||(set_yue==8)||(set_yue==10)||(set_yue==12))
  533.                                                                                 {
  534.                                                                                                 if(set_ri==0)
  535.                                                                                                                 set_ri=31;
  536.                                                                                 }
  537.                                                                                 else
  538.                                                                                 {
  539.                                                                                                 if(set_yue==2)
  540.                                                                                                 {
  541.                                                                                                                 if(p_r==1)
  542.                                                                                                                 {
  543.                                                                                                                                 if(set_ri==0)
  544.                                                                                                                                                 set_ri=29;
  545.                                                                                                                 }
  546.                                                                                                                 else
  547.                                                                                                                 {
  548.                                                                                                                                 if(set_ri==0)
  549.                                                                                                                                                 set_ri=28;
  550.                                                                                                                 }
  551.                                                                                                 }
  552.                                                                                                 else
  553.                                                                                                 {
  554.                                                                                                                 if(set_ri==0)
  555.                                                                                                                                 set_ri=30;
  556.                                                                                                 }
  557.                                                                                 }
  558.                                                                                 SysDate.day = set_ri;
  559.                                                                                 Display_setTime();
  560.                                                                                 DS1302_DateSet(&SysDate);
  561.                                                                                 
  562.                                                                                 LCD1602_write_com(0x80+9);
  563.                                                                                 LCD1602_write_com(0x0F);
  564.                                                                 }
  565.                                                                 if(setn == 4)
  566.                                                                 {
  567.                                                                                 if(set_week == 1)
  568.                                                                                 {
  569.                                                                                                 set_week = 8;
  570.                                                                                 }
  571.                                                                                 set_week --;
  572.                                                                                 SysDate.week = set_week;
  573.                                                                                 Display_setTime();
  574.                                                                                 DS1302_DateSet(&SysDate);
  575.                                                                                 
  576.                                                                                 LCD1602_write_com(0x80+13);
  577.                                                                                 LCD1602_write_com(0x0F);
  578.                                                                 }
  579.                                                                 if(setn == 5)
  580.                                                                 {
  581.                                                                                 if(set_shi == 0)
  582.                                                                                 {
  583.                                                                                                 set_shi = 24;
  584.                                                                                 }
  585.                                                                                 set_shi --;
  586.                                                                                 SysDate.hour = set_shi;
  587.                                                                                 Display_setTime();
  588.                                                                                 DS1302_DateSet(&SysDate);
  589.                                                                                 
  590.                                                                                 LCD1602_write_com(0x80+0x40+1);
  591.                                                                                 LCD1602_write_com(0x0F);
  592.                                                                 }
  593.                                                                 if(setn == 6)
  594.                                                                 {
  595.                                                                                 if(set_fen == 0)
  596.                                                                                 {
  597.                                                                                                 set_fen = 60;
  598.                                                                                 }
  599.                                                                                 set_fen --;
  600.                                                                                 SysDate.min = set_fen;
  601.                                                                                 Display_setTime();
  602.                                                                                 DS1302_DateSet(&SysDate);
  603.                                                                                 
  604.                                                                                 LCD1602_write_com(0x80+0x40+4);
  605.                                                                                 LCD1602_write_com(0x0F);
  606.                                                                 }
  607.                                                                 if(setn == 7)
  608.                                                                 {
  609.                                                                                 if(set_miao == 0)
  610.                                                                                 {
  611.                                                                                                 set_miao = 60;
  612.                                                                                 }
  613.                                                                                 set_miao --;
  614.                                                                                 SysDate.sec = set_miao;
  615.                                                                                 Display_setTime();
  616.                                                                                 DS1302_DateSet(&SysDate);
  617.                                                                                 
  618.                                                                                 LCD1602_write_com(0x80+0x40+7);
  619.                                                                                 LCD1602_write_com(0x0F);
  620.                                                                 }
  621.                                                 }else
  622.                                                 {
  623.                                                                 if(setn == 1)
  624.                                                                 {
  625.                                                                                 if(nz_shi == 0)
  626.                                                                                 {
  627.                                                                                                 nz_shi = 24;
  628.                                                                                 }
  629.                                                                                 nz_shi--;
  630.                                                                                 Display_alarm_clock();
  631.                                                                                 LCD1602_write_com(0x80+0x40+5);
  632.                                                                                 LCD1602_write_com(0x0F);
  633.                                                                 }
  634.                                                                 if(setn == 2)
  635.                                                                 {
  636.                                                                                 if(nz_fen == 0)
  637.                                                                                 {
  638.                                                                                                 nz_fen = 60;
  639.                                                                                 }
  640.                                                                                 nz_fen--;
  641.                                                                                 Display_alarm_clock();
  642.                                                                                 LCD1602_write_com(0x80+0x40+8);
  643.                                                                                 LCD1602_write_com(0x0F);
  644.                                                                 }
  645.                                                                 if(setn == 3)
  646.                                                                 {
  647.                                                                                 if(nz_miao == 0)
  648.                                                                                 {
  649.                                                                                                 nz_miao = 60;
  650.                                                                                 }
  651.                                                                                 nz_miao--;
  652.                                                                                 Display_alarm_clock();
  653.                                                                                 LCD1602_write_com(0x80+0x40+11);
  654.                                                                                 LCD1602_write_com(0x0F);
  655.                                                                 }
  656.                                                 }
  657.                                 }
  658.                 }
  659.                 if(KEY4 == 0 &&setn==0)
  660.                 {
  661.                                 delay_ms(20);
  662.                           if(KEY4 == 0 && setn==0)
  663.                                 {
  664.                                           BEEP = 1;
  665.                                                 delay_ms(200);
  666.                                                 BEEP = 0;
  667.                                                 while(KEY4 == 0);
  668.                                           see_NZ = !see_NZ;
  669.                                           LCD1602_write_com(0x80);                                                //指针设置
  670.                                                 LCD1602_write_word("                ");
  671.                                                 LCD1602_write_com(0x80+0x40);                                                //指针设置
  672.                                                 LCD1602_write_word("                ");
  673.                                           if(see_NZ == 1)
  674.                                                 {
  675.                                                                 LCD1602_write_com(0x80);                                                //指针设置
  676.                                                                 LCD1602_write_word(" Set Alarm Clock");
  677.                                                           Display_alarm_clock();
  678.                                                 }
  679.                                 }
  680.                 }
  681. }        

  682. int main(void)
  683. {        
  684.         u8 test_interval = 0;
  685.   u8 flag = 0;        
  686.          
  687.         delay_init();            //延时函数初始化         
  688.         KEY_GPIO_Init();    //按键初始化
  689.         DS1302_Init(&SysDate);
  690.         delay_ms(100);
  691.         DS1302_DateRead(&SysDate);
  692.         delay_ms(500);       //上电瞬间加入一定延时在初始化
  693.         LCD_Init();         //屏幕初始化
  694.   delay_ms(100);        
  695.         LCD1602_write_com(0x80);                                                //指针设置
  696.         LCD1602_write_word("                ");
  697.   LCD1602_write_com(0x80+0x40);                                                //指针设置
  698.         LCD1602_write_word("                ");
  699.         while(1)
  700.         {     
  701.         if (test_interval ++ > 10 && setn==0)
  702.         {
  703.             test_interval = 0;
  704.                                           DS1302_DateRead(&SysDate);//读取时间
  705.                                           DHT11_Read_Data(&temperature,&humidity);//读取温湿度
  706.                                           if(see_NZ == 0)
  707.                                                 {
  708.                                                         Display_Time();
  709.                                                 }
  710.                                                 if(SysDate.hour==nz_shi && SysDate.min==nz_fen && SysDate.sec==nz_miao)
  711.                                                 {
  712.                                                                 flag = 1;
  713.                                                 }
  714.                                                 if(flag == 1)
  715.                                                 {
  716.                                                                 if(SysDate.hour==nz_shi && SysDate.min==nz_fen)
  717.                                                                 {
  718.                                                                                 BEEP = ~BEEP;
  719.                                                                           delay_ms(80);
  720.                                                                 }else
  721.                                                                 {
  722.                                                                                 BEEP = 0;
  723.                                                                           flag = 0;
  724.                                                                 }
  725.                                                 }
  726.         }
  727.                                 keyscan();//按键扫描
  728.         delay_ms(1);
  729.     }
  730.                
  731.         }
复制代码

回复

使用道具 举报

ID:1047884 发表于 2022-10-20 12:23 | 显示全部楼层
也是第一次用Proteus
1666239717921.png
回复

使用道具 举报

ID:123289 发表于 2022-10-20 17:00 | 显示全部楼层
1、先证明你能下载到DHT11数据。
2、再证明你会将一个变量MM中取出,并在屏上显示出来。
而后做一件事,就成了,就是将DHT11数据,放到MM中。
回复

使用道具 举报

ID:1047884 发表于 2022-10-20 18:51 | 显示全部楼层
yzwzfyz 发表于 2022-10-20 17:00
1、先证明你能下载到DHT11数据。
2、再证明你会将一个变量MM中取出,并在屏上显示出来。
而后做一件事, ...

不是特别懂
1、DHT11数据 是程序下载进去 还是 Proteus仿真时读取DHT11的数据
2、是基于1、做是吗
回复

使用道具 举报

ID:1047884 发表于 2022-10-20 18:56 | 显示全部楼层
yzwzfyz 发表于 2022-10-20 17:00
1、先证明你能下载到DHT11数据。
2、再证明你会将一个变量MM中取出,并在屏上显示出来。
而后做一件事, ...

如果是程序下载进去,现在的情况就是DHT11数据可调,LCD显示屏无法显示出结果数值
回复

使用道具 举报

ID:88256 发表于 2022-10-20 19:31 | 显示全部楼层
DHT11的数据肯定不可能是靠程序下载进去的,既然仿真上DHT11有数据可以调节但显示没有,那就是程序的问题了
回复

使用道具 举报

ID:88256 发表于 2022-10-20 19:37 | 显示全部楼层
先撇去那些逻辑,主程序里直接读取DHT11数据并送显示,看看是读取程序问题还是主程序出错
回复

使用道具 举报

ID:1047884 发表于 2022-10-20 22:27 | 显示全部楼层
hhdsdy 发表于 2022-10-20 19:37
先撇去那些逻辑,主程序里直接读取DHT11数据并送显示,看看是读取程序问题还是主程序出错

好的 谢谢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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