新人求教,s51按键操作没反应是哪里错了?

2019-07-15 14:44发布

还有温度低于0的时候显示不正确是为什么呢。
  1.   #include<reg51.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define LCD1602_DATA P2
  6. uchar code tab1[]={"TEMP:    "};

  7. uchar code tab2[]={"Lv:  "} ;

  8. //端口定义
  9. sbit rs=P1^5;
  10. sbit rw=P1^6;
  11. sbit e=P1^7;
  12. sbit DQ=P1^4;
  13. sbit k1=P3^1;
  14. sbit k2=P3^2;
  15. sbit k3=P3^3;

  16. char TH=10,TL=-10;                  //设置限制最高值、最低值
  17. uchar flag1=0;
  18. uchar k1num=0;                   //键盘计数
  19. uchar wendu;
  20. //********1ms延时函数 **********
  21. void Delay(uint n)
  22. {
  23.         uint i,j;
  24.         for(i=n;i>0;i--)
  25.         for(j=110;j>0;j--);
  26. }

  27. void Delay1(uint a)
  28. {
  29.         while(--a);
  30. }
  31. //**********LCD1602********

  32. //写指令
  33. void Write_comd(uchar comd)
  34. {
  35.         rs=0;
  36.         rw=0;
  37.         P2=comd;
  38.         Delay(5);
  39.         e=1;
  40.         Delay(5);
  41.         e=0;
  42. }

  43. //写数据
  44. void Write_data(uchar Data)
  45. {
  46.         rs=1;
  47.         rw=0;
  48.         P2=Data;
  49.         Delay(5);
  50.         e=1;
  51.         Delay(5);
  52.         e=0;
  53. }
  54. //写字符串
  55. void Write_str(uchar add,uchar *dat)
  56. {
  57.         Write_comd(add);
  58.         while(*dat != '')
  59.         {
  60.                 Write_data(*dat++);
  61.         }       
  62. }
  63. //写温度
  64. void Write_wendu(uchar add,uchar date)
  65. {
  66.         uchar shi,ge;
  67.         shi=date/10;
  68.         ge=date%10;
  69.         Write_comd(add);
  70.         Write_data(shi+'0');
  71.         Write_data(ge+'0');
  72. }
  73. //初始化函数
  74. void LCD1602_init()
  75. {
  76.         e=0; //上电时高电平
  77.         rs=0;
  78.         rw=0;
  79.         Delay(5);
  80.         Write_comd(0x01);  //清屏
  81.         Delay(5);
  82.         Write_comd(0x38);         //设置16*2显示,5*7点阵,8位数据接口
  83.         Delay(5);
  84.         Write_comd(0x0c);  //设置光标。无
  85.         Delay(5);
  86.         Write_comd(0x06);  //文字不动,光标右移。
  87. }

  88. //******************DS18B20***********


  89. uchar temp;
  90. void DS18B20_init()         //复位,判断好坏。 a=0                a=1坏掉
  91. {
  92. //        uchar a=0;
  93.         DQ=1;
  94.         Delay1(8);//10us
  95.         DQ=0;
  96.         Delay1(90);// 480us ~ 960us                 750
  97.         DQ=1;//释放总线            15us~60us
  98.         _nop_();//机器周期
  99.         _nop_();  
  100.        
  101. //        a=DQ;
  102.         Delay1(100);//         480us++          560跳出复位
  103.         DQ=1; //拉高
  104. //        return a;  // 或者可以直接认为18b20好用,
  105. }


  106. //读DS18B20
  107. uchar Read_18b20()
  108. {                                                  
  109.         uchar i;
  110.         uchar dat=0;
  111.         DQ=1;
  112.         _nop_();
  113.         for (i=0;i<8;i++) //拉低读数据
  114.         {
  115.                 DQ=0;
  116.                 _nop_(); //6ms
  117.                 _nop_();                        
  118.                 dat>>=1;//右移一位 0000 0001 /  1000 0000 / 0100 0000
  119.                 DQ=1;
  120.                 _nop_();
  121.                 _nop_();
  122.                 if(DQ)
  123.                 dat|=0x80;  //1000 0000 或 传递过来第一位是1就是1,0就是0
  124.                 Delay1(30);         //40us
  125.                 DQ=1; //准备下一位

  126.         }

  127.   return (dat);

  128. }
  129. //写18b20
  130. void Write_18b20(uchar dat)  //15us,释放拉高,
  131. {
  132.         uchar i;                //        延时确认时间15us 写八位
  133.         for(i=0;i<8;i++)
  134.         {
  135.                 DQ=0;
  136.                 DQ=dat&0x01;//0000 0001 发送一个1
  137.                 Delay1(5);//延迟45ms
  138.                 DQ=1;
  139.                 dat>>=1;   //发送第二位        000 0010
  140.         }

  141. }


  142. //  DS18B20温度转换
  143. void Change_Temp()          
  144. {

  145.         DS18B20_init(); //复位
  146.         Write_18b20(0xcc);//跳过id地址,序列号
  147.         Write_18b20(0x44);//启动温度转换
  148. }

  149. //DS18B20 读取温度
  150. uchar Read_Temp()
  151. {
  152.         int temp;
  153.         uchar date[2];
  154. //        Delay(380)         ; ///////////////**************85
  155.         DS18B20_init();//再次复位
  156.         Write_18b20(0xcc);
  157.         Write_18b20(0xbe);        //读内部RAM中9字节的内容;
  158.         date[0]=Read_18b20();//底字节          LSB
  159.         date[1]=Read_18b20();//        高字节 MSB
  160.         temp=date[1];          
  161.         temp<<=8;
  162.         temp |= date[0];
  163.         temp>>=4;

  164.         return (temp);         
  165.                         
  166. }

  167. //********键盘******
  168. void key_scan()
  169. {
  170.         if(k1==0)
  171.         {
  172.                 Delay(2);
  173.                 if(k1==0)
  174.                 {
  175.                         while(!k1);                          //松手检测
  176.                         k1num++;
  177.                         if(k1num==1)
  178.                         {
  179.                                 flag1=1;        //发送限制最高温度标志
  180.                         }
  181.                         if(k1num==2)
  182.                         {
  183.                                 flag1=2;        //发送限制最低温度标志
  184.                         }
  185.                         if(k1num==3)
  186.                         {
  187.                                 flag1=0;
  188.                                 k1num=0;       
  189.                         }
  190.                 }
  191.         }
  192.         if(k1num!=0)
  193.         {
  194.                 switch(k1num)
  195.                 {
  196.                         case 1:                                                          //调节最高限温值
  197.                                 {
  198.                                         if(k2==0)
  199.                                         {
  200.                                                 Delay(2);
  201.                                                 if(k2==0)
  202.                                                 {
  203.                                                         while(!k2);
  204.                                                         TH++;
  205.                                                         if(TH>=30)
  206.                                                                 TH=30;       
  207.                                                 }
  208.                                         }
  209.                                         if(k3==0)
  210.                                         {
  211.                                                 Delay(2);
  212.                                                 if(k3==0)
  213.                                                 {
  214.                                                         while(!k3);
  215.                                                         TH--;
  216.                                                         if(TH<0)
  217.                                                                 TH=0;       
  218.                                                 }
  219.                                         }

  220.                                 }break;
  221.                         case 2:                                                                //调节最低限温值
  222.                                 {
  223.                                         if(k2==0)
  224.                                         {
  225.                                                 Delay(2);
  226.                                                 if(k2==0)
  227.                                                 {
  228.                                                         while(!k2);
  229.                                                         TL++;
  230.                                                         if(TL>0)
  231.                                                                 TL=0;       
  232.                                                 }
  233.                                         }
  234.                                         if(k3==0)
  235.                                         {
  236.                                                 Delay(2);
  237.                                                 if(k3==0)
  238.                                                 {
  239.                                                         while(!k3);
  240.                                                         TL--;
  241.                                                         if(TL<-30)
  242.                                                                 TL=-30;       
  243.                                                 }
  244.                                         }

  245.                                 }break;
  246.                 }       
  247.         }
  248. }

  249. //********主函数********
  250. void main()
  251. {

  252.         int ans;
  253.         uchar flag;
  254.         uchar flag1=0;
  255.         LCD1602_init();
  256.        
  257.         Write_str(0x80,tab1);
  258.         Write_str(0xc0,tab2);       
  259.           
  260.         while (1)
  261.         {               
  262.                     
  263.                         Change_Temp();
  264.                         Delay(1000);                       
  265.                         ans=Read_Temp();
  266.                         if(ans<0)                 /******判断是否为负温度********/
  267.                 {
  268.                         ans=-ans;
  269.                         flag=1;
  270.                 }
  271.                         else
  272.                         flag=0;                                                                       
  273.                         if(flag==1)                         //负温度,发送‘-’
  274.                         {       
  275.                                 Write_comd(0x80+6);
  276.                                 Write_data('-');
  277.                                 Write_wendu(0x87,ans);
  278.                         }
  279.                         if(flag==0)
  280.                         {
  281.                                 Write_wendu(0x86,ans);
  282.                                 Write_comd(0x80+8);
  283.                                 Write_data(' ');
  284.                         }

  285.         }
  286.                                         key_scan();
  287.                                         if(k1num==1)
  288.                         {
  289.                                         LCD1602_init();                  
  290.                                         Write_str(0x80,"PSE SET HIGHEST TEMP");
  291.                                         Write_str(0xC0,"Temperatuer:   C");
  292.                                         while(flag1==1)
  293.                                         {
  294.                                         Write_wendu(0xcc,ans);       
  295.                                         }
  296.                         }
  297.                                         if(k1num==2)       
  298.                         {
  299.                                         LCD1602_init();
  300.                                         Write_str(0x80,"PSE SET LOWEST TEMP");
  301.                                         Write_str(0xC0,"Temperatuer:-   C");
  302.                                         while(flag1==2)
  303.                                         {
  304.                                                 Write_comd(0xc5);
  305.                                                 Write_data('-');
  306.                                                 Write_wendu(0xcd,-ans);       
  307.                                         }
  308.                         }                            

  309. }
复制代码
按键。 按键。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。