可以帮我看看这个程序有什么问题吗?1602显示不了,还有按键都控制不了

2019-07-18 09:48发布

  1. //宏定义
  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. //包含头文件
  5. #include <reg52.h>
  6. #include <18b20.h>
  7. #include <stdlib.h>
  8. #include <intrins.h>
  9. #include <eeprom52.h>
  10. #include <lcd1602.h>
  11. #define Imax 14000    //此处为晶振为11.0592时的取值,
  12. #define Imin 8000    //如用其它频率的晶振时,
  13. #define Inum1 1450    //要改变相应的取值。
  14. #define Inum2 700
  15. #define Inum3 3000
  16. sbit K1=P1^0;
  17. sbit K2=P1^1;
  18. sbit K3=P1^2;                  //按键定义
  19. sbit BUZZ=P1^4;
  20. sbit PWM=P2^0;                  //PWM输出

  21. unsigned char Im[4]={0x00,0x00,0x00,0x00};//红外编码
  22. //uchar displaydata[4]; //显示暂存数组
  23. //全局变量
  24. char f,dang,count,count1,a_a;  //档位
  25. unsigned long m,Tc;
  26. unsigned char IrOK;          //定义红外工作变量
  27. void   jisuan();          //声明计算函数
  28. uchar mode;
  29. char sec_b=0;
  30. bit flag_b=0;
  31. uint TH,TL;                          //上下限变量
  32. uchar baif,suiji;
  33. uchar code zhuanhuan[4]={0,3,5,10};//转换数组

  34. /*ascii码*/
  35. unsigned char mun_char_table[]={"0123456789abcdef- "};
  36. unsigned char temp_table[] ={"L:00.0C  H:00.0C"};
  37. unsigned char temp_set_table[]={"D:0  T:00.0C"};

  38. void write_eeprom()                           //内部eeprom写函数
  39. {

  40.         SectorErase(0x2000);                   //清空
  41.         SectorErase(0x2c00);
  42.         SectorErase(0x2e00);
  43.         byte_write(0x2c00,TH/256);       
  44.         byte_write(0x2c01,TH%256);
  45.         byte_write(0x2c02,TL/256);
  46.         byte_write(0x2c03,TL%256);           //将上下限数据保存到eeprom
  47.         byte_write(0x2c04,dang);       
  48.         byte_write(0x2c05,mode);               
  49.         byte_write(0x2060,0x01);

  50. }

  51. /******************把数据从单片机内部eeprom中读出来*****************/
  52. void read_eeprom()                                                                                                                                  
  53. {

  54.   mode = byte_read(0x2c05);
  55.         dang = byte_read(0x2c04);
  56.         TH = byte_read(0x2c00)*256+byte_read(0x2c01);
  57.         TL = byte_read(0x2c02)*256+byte_read(0x2c03);
  58.         a_a = byte_read(0x2060);
  59.          
  60. }

  61. /**************开机自检eeprom初始化*****************/
  62. void init_eeprom()
  63. {
  64.         a_a = byte_read(0x2060);
  65.         if(a_a != 1)                //新的单片机初始单片机内问eeprom
  66.         {
  67.        
  68.                 a_a = 1;
  69.                 write_eeprom();           //保存数据
  70.         }       
  71. }

  72. /*********************************************************/
  73. //毫秒级的延时函数,time是要延时的毫秒数
  74. /*********************************************************/
  75. void delay(uint time)
  76. {
  77.         uint i,j;
  78.         for(i=0;i<time;i++)
  79.                 for(j=0;j<110;j++);
  80. }



  81. void display()                          //显示函数
  82. {
  83.                 lcd_char_write(7,1,mun_char_table[disdata[1]]);
  84.                 lcd_char_write(8,1,mun_char_table[disdata[2]]);
  85.                 lcd_char_write(10,1,mun_char_table[disdata[3]]);
  86.                 lcd_char_write(2,1,mun_char_table[dang]);
  87.                 lcd_char_write(2,0,mun_char_table[TL%1000/100]);
  88.                 lcd_char_write(3,0,mun_char_table[TL%100/10]);
  89.                 lcd_char_write(5,0,mun_char_table[TL%10]);
  90.                 lcd_char_write(11,0,mun_char_table[TH%1000/100]);
  91.                 lcd_char_write(12,0,mun_char_table[TH%100/10]);
  92.                 lcd_char_write(14,0,mun_char_table[TH%10]);
  93. }

  94. void key()                                                          //按键函数
  95. {
  96.   if(K1==0)          //按键1按下或者遥控器上的按键按下
  97.   {
  98.                  delay(5);                                                  //延时去抖

  99.                         if(K1==0) //再次判断按键按下
  100.                 {
  101.                         BUZZ=0;
  102.                         delay(20);
  103.                         BUZZ=1;                                                  //按键音
  104.                  mode++;                                                  //模式加
  105.                  if(mode>4)                                                  //模式加到大于4
  106.                  mode=0;                                                  //模式清零
  107.         //         Im[2]=0;
  108.                  IrOK=0;                                                  //变量清零
  109.                  write_eeprom();                                  //写入eeprom数据
  110.                  while(!K1);                                          //按键释放
  111.                 }
  112.   }
  113.   if(K2==0)
  114.   {
  115.    delay(5);

  116.     if(K2==0)
  117.         {
  118.                 BUZZ=0;
  119.                 delay(20);
  120.                 BUZZ=1;
  121.          if(mode==0)                                        //模式等于1时
  122.          {
  123.           TH++;                                                        //上限加
  124.           if(TH>999)                                        //上限加到大于99.9度
  125.                  
  126.           TH=TL+1;                                                //上限等于下限加一
  127.          }
  128.          else if(mode==1)                                //模式等于2时
  129.          {
  130.           TL++;                                                        //下限加
  131.           if(TL>=TH)                                        //下限加到大于等于上限
  132.           TL=TH-1;                                                //下限等于上限减一
  133.          }
  134.           else if(mode==3)                                //模式等于3时
  135.          {
  136.           dang++;                                                //档位加一
  137.           if(dang>3)                                        //档位大于3时
  138.           dang=0;                                                //档位清零
  139.          }
  140.          //Im[2]=0;
  141.          //IrOK=0;                                                //红外变量清零
  142.           write_eeprom();                                //写入eeprom数据
  143.          while(!K2);                                        //按键释放
  144.         }

  145.   }

  146.   if(K3==0)
  147.   {
  148.                  delay(5);

  149.                         if(K3==0)
  150.                 {
  151.                         BUZZ=0;
  152.                         delay(20);
  153.                         BUZZ=1;
  154.                  if(mode==0)
  155.                  {
  156.                         TH--;
  157.                         if(TH<=TL)
  158.                         TH=TL+1;
  159.                  }
  160.                  else if(mode==1)
  161.                  {
  162.                         TL--;
  163.                         if(TL>=TH)
  164.                         TL=TH-1;
  165.                  }
  166.                 else if(mode==3)
  167.                  {
  168.                          dang++;
  169.                         if(dang>3)
  170.                         dang=0;
  171.                  }
  172.                  //Im[2]=0;
  173.                  //IrOK=0;
  174.                  write_eeprom();
  175.                  while(!K3);
  176.                 }
  177.   }
  178. }
  179. void jisuan()                                                          //计算函数
  180. {
  181.   if(mode==0||mode==1||mode==2) //模式0、1、2
  182.   {
  183.     if(tvalue<=TL)                                                 //温度小于下限时
  184.         PWM=1;                                                                 //关闭输出,占空比0%
  185.         else if(tvalue>=TH)                                         //温度大于等于上限
  186.         PWM=0;                                                                 //打开输出,占空比100%
  187.         else                                                                  //其他状态时
  188.         {
  189.                 if(tvalue<(TL+(TH-TL)/2))       
  190.                 {
  191.                 baif=15;   //占空比控制变量
  192.           if(count1>baif) //根据变量判断占空比大小pwm=0.3
  193.           PWM=1;                  //关闭风扇
  194.           else
  195.           PWM=0;                  //打开风扇*/
  196.          }
  197.                 else
  198.                 {
  199.                         baif=25;   //占空比控制变量
  200.                         if(count1>baif) //根据变量判断占空比大小pwm=0.3
  201.                         PWM=1;                  //关闭风扇
  202.                         else
  203.                         PWM=0;                  //打开风扇*/       
  204.                 }
  205.         }
  206.   }
  207.   else if(mode==3)                                           //模式3时
  208.   {
  209.     if(count1>(zhuanhuan[dang]*5))           //根据档位计算出占空比
  210.         PWM=1;
  211.         else
  212.         PWM=0;
  213.   }

  214. }


  215. void main()                                                  //主函数
  216. {
  217.   /*uint count;                                          //定义变量
  218.   unsigned int i=0,j=0;
  219.   EA=1;                                                          //打开中断总开关
  220.   EX1=1;                                                  //打开外部中断1
  221.   IT1=1;                                                  //下降沿有效
  222.   TMOD=0x11;                                          //定时器工作方式

  223.   TR0=0;                                                  //关闭T0
  224.   TH0=0;
  225.   TL0=0;                                                  //初值0
  226.   ET1=1;                                                  //T1允许中断

  227.   TR1=1;                                                  //T1打开中断
  228.   TH1=0xfc;
  229.   TL1=0x18;                                                  //T1初值1ms
  230.   mode=0;                                                  //初始模式0
  231.   TH=300;
  232.   TL=200;                                                  //上下限初始值
  233.   init_eeprom();                                  //初始化eeprom
  234.   read_eeprom();                                  //读取eeprom数据
  235.           
  236.         lcd_system_reset(); //LCD1602 初始化
  237.         for (i=0;i<16;i++) lcd_char_write(i,0,temp_table[i]);  
  238.     for (j=0;j<12;j++) lcd_char_write(j,1,temp_set_table[j]);
  239. while(1)                                                  //进入循环
  240.         {            
  241.                 jisuan();                                  //计算函数
  242.                 count++;                                  //变量加
  243.                 if(count>200)                          //加到大于200
  244.                 {
  245.                         count=0;                          //清零
  246.                         TR1=0;                                  //关闭定时器T1
  247.                         read_wendu();                  //读取温度
  248.                         TR1=1;                                  //打开定时器T1
  249.                 }
  250.                 jisuan();                                  //计算函数
  251.                 display();                                  //显示函数  */
  252.         while(1)        key();                                          //按键函数
  253.                 //jisuan();                                  //计算函数
  254.                 //        }
  255. }
  256. void timer1() interrupt 3                  //定时器T1工作函数
  257. {
  258. TH1=0xfc;
  259. TL1=0x18;                                                  //重新赋初值

  260.   count1++;                                                  //加
  261.   if(count1>50)
  262.   {
  263.           count1=0;
  264.        
  265.   }
  266. }

  267. void intersvr1(void) interrupt 2                 //红外工作函数
  268. {
  269. TR0=1;
  270. Tc=TH0*256+TL0;//提取中断时间间隔时长
  271. TH0=0;
  272. TL0=0;         //定时中断重新置零
  273. if((Tc>Imin)&&(Tc<Imax))
  274. {
  275.         m=0;
  276.         f=1;

  277.         return;
  278. }       //找到启始码
  279. if(f==1)
  280. {
  281.     if(Tc>Inum1&&Tc<Inum3)
  282.     {
  283.            Im[m/8]=Im[m/8]>>1|0x80; m++;
  284.     }
  285.     if(Tc>Inum2&&Tc<Inum1)
  286.     {
  287.       Im[m/8]=Im[m/8]>>1; m++; //取码
  288.            }
  289.            if(m==32)
  290.     {
  291.       m=0;  
  292.       f=0;
  293.        
  294.       if(Im[2]==~Im[3])
  295.       {
  296.            IrOK=1;
  297.                           TR0=0;
  298.            }
  299.       else
  300.           {
  301.            IrOK=0;   //取码完成后判断读码是否正确

  302.            }
  303.     }
  304.                //准备读下一码
  305. }


  306. }
复制代码

仿真6.jpg
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
scccx8106
1楼-- · 2019-07-18 10:24
下来看看,多谢
scccx8106
2楼-- · 2019-07-18 16:14
下来看看,多谢
JQ_Lin
3楼-- · 2019-07-18 20:30
仅看电路图,电机不能正常转动,蜂鸣器也不会正常发声。因为它们的驱动电路是错误的。


一周热门 更多>