久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標(biāo)題: ds1302+ds18b20+lcd1602紅外遙控調(diào)整時(shí)間單片機(jī)程序問(wèn)題 [打印本頁(yè)]

作者: lhblhb    時(shí)間: 2019-3-3 20:44
標(biāo)題: ds1302+ds18b20+lcd1602紅外遙控調(diào)整時(shí)間單片機(jī)程序問(wèn)題
求大神指導(dǎo)一下我這個(gè)初學(xué)者
就紅外遙控調(diào)整時(shí)間,我按一下鍵,時(shí)間就一直走,停不下來(lái),我的程序在附件里
  1. /*******************************************************************************
  2. * 實(shí)驗(yàn)名                           : 萬(wàn)年歷實(shí)驗(yàn)
  3. * 使用的IO             :
  4. * 實(shí)驗(yàn)效果       :1602顯示時(shí)鐘,按K3進(jìn)入時(shí)鐘設(shè)置,按K1選擇設(shè)置的時(shí)分秒日月,按K2選擇
  5. *選擇設(shè)置加1。
  6. *        注意                                         :
  7. *******************************************************************************/

  8. #include<reg51.h>
  9. #include"lcd.h"
  10. #include"ds1302.h"
  11. #include"ds18b20.h"

  12. sbit IRIN=P3^2;
  13. sbit K1=P3^1;
  14. sbit K2=P3^0;
  15. sbit K3=P3^3;
  16. sbit K4=P3^4;
  17. void datapros(int temp);         
  18. void Int0Configuration();
  19. void LcdDisplay();
  20. void delay(uint i);
  21. void IrInit();
  22. void hongweiyaokong();
  23. unsigned char SetState,SetPlace,SetStat;

  24. unsigned char IrValue[6];

  25.    //誤差 0us


  26. /*******************************************************************************
  27. * 函數(shù)名         : main
  28. * 函數(shù)功能                   : 主函數(shù)
  29. * 輸入           : 無(wú)
  30. * 輸出                  : 無(wú)
  31. *******************************************************************************/

  32. void main()
  33. {
  34.         unsigned char i;
  35.         Int0Configuration();
  36.         LcdInit();
  37.         IrInit();
  38.         Ds1302Init();        
  39.         while(1)
  40.         {        
  41.                 datapros(Ds18b20ReadTemp());
  42.                 hongweiyaokong();
  43.                 if(SetState==0)
  44.                 {
  45.                         Ds1302ReadTime();
  46.                 }
  47.                 else
  48.                 {
  49.                         if(K1==0)                //檢測(cè)按鍵K1是否按下
  50.                         {
  51.                                 delay(1000);        //消除抖動(dòng)
  52.                                 if(K1==0)
  53.                                 {
  54.                                         SetPlace++;
  55.                                         if(SetPlace>=7)
  56.                                                 SetPlace=0;                                       
  57.                                 }

  58.                                 while((i<50)&&(K1==0))         //檢測(cè)按鍵是否松開(kāi)
  59.                                 {
  60.                                         delay(1000);
  61.                                         i++;
  62.                                 }
  63.                                 i=0;
  64.                         }
  65.                         if(K2==0)                //檢測(cè)按鍵K2是否按下
  66.                         {
  67.                                 delay(1000);        //消除抖動(dòng)
  68.                                 if(K2==0)
  69.                                 {
  70.                                         TIME[SetPlace]++;
  71.                                         if((TIME[SetPlace]&0x0f)>9)                                         //換成BCD碼。
  72.                                         {
  73.                                                 TIME[SetPlace]=TIME[SetPlace]+6;
  74.                                         }
  75.                                         if((TIME[SetPlace]>=0x60)&&(SetPlace<2))                //分秒只能到59
  76.                                         {
  77.                                                 TIME[SetPlace]=0;
  78.                                         }
  79.                                         if((TIME[SetPlace]>=0x24)&&(SetPlace==2))                //小時(shí)只能到23
  80.                                         {
  81.                                                 TIME[SetPlace]=0;
  82.                                         }
  83.                                         if((TIME[SetPlace]>=0x32)&&(SetPlace==3))                //日只能到31
  84.                                         {
  85.                                                 TIME[SetPlace]=0;        
  86.                                         }
  87.                                         if((TIME[SetPlace]>=0x13)&&(SetPlace==4))                //月只能到12
  88.                                         {
  89.                                                 TIME[SetPlace]=0;
  90.                                         }        
  91.                                         if((TIME[SetPlace]>=0x7)&&(SetPlace==5))                //周只能到7
  92.                                         {
  93.                                                 TIME[SetPlace]=1;
  94.                                         }               
  95. //                                        if(SetPlace==5)                //月只能到12
  96. //                                        {
  97. //                                                TIME[SetPlace]=;
  98. //                                        }        
  99.                                 }
  100.                                 
  101.                                 while((i<50)&&(K2==0))         //檢測(cè)按鍵是否松開(kāi)
  102.                                 {
  103.                                         delay(1000);
  104.                                         i++;
  105.                                 }
  106.                                 i=0;
  107.                                 
  108.                         }
  109.                         if(K4==0)                //檢測(cè)按鍵K2是否按下
  110.                         {
  111.                                 delay(1000);        //消除抖動(dòng)
  112.                                 if(K4==0)
  113.                                 {
  114.                                         TIME[SetPlace]--;
  115.                                         if((TIME[SetPlace]&0x0f)==0)                                         //換成BCD碼。
  116.                                         {
  117.                                                 TIME[SetPlace]=9;
  118.                                         }
  119.                                         if((TIME[SetPlace]<=0x00)&&(SetPlace<2))                //分秒只能到59
  120.                                         {
  121.                                                 TIME[SetPlace]=9;
  122.                                         }
  123.                                         if((TIME[SetPlace]<=0x00)&&(SetPlace==2))                //小時(shí)只能到23
  124.                                         {
  125.                                                 TIME[SetPlace]=9;
  126.                                         }
  127.                                         if((TIME[SetPlace]<=0x00)&&(SetPlace==2))                //小時(shí)只能到23
  128.                                         {
  129.                                                 TIME[SetPlace]=9;
  130.                                         }
  131.                                         if((TIME[SetPlace]<=0x00)&&(SetPlace==2))                //小時(shí)只能到23
  132.                                         {
  133.                                                 TIME[SetPlace]=9;
  134.                                         }
  135.                                         if((TIME[SetPlace]<=0x00)&&(SetPlace==2))                //小時(shí)只能到23
  136.                                         {
  137.                                                 TIME[SetPlace]=9;
  138.                                         }
  139. //                                        if(SetPlace==5)                //月只能到12
  140. //                                        {
  141. //                                                TIME[SetPlace]=;
  142. //                                        }        
  143.                                 }
  144.                                 
  145.                                 while((i<50)&&(K4==0))         //檢測(cè)按鍵是否松開(kāi)
  146.                                 {
  147.                                         delay(1000);
  148.                                         i++;
  149.                                 }
  150.                                 i=0;
  151.                                                                                 
  152.                         }
  153.         
  154.                 }
  155.                 LcdDisplay();
  156.         }        
  157. }


  158. /*******************************************************************************
  159. * 函數(shù)名         : LcdDisplay()
  160. * 函數(shù)功能                   : 顯示函數(shù)
  161. * 輸入           : 無(wú)
  162. * 輸出                  : 無(wú)
  163. *******************************************************************************/

  164. void LcdDisplay()
  165. {

  166.         LcdWriteCom(0x80+0X40);
  167.         LcdWriteData('0'+TIME[2]/16);                                //時(shí)
  168.         LcdWriteData('0'+(TIME[2]&0x0f));                                 
  169.         LcdWriteData('-');
  170.         LcdWriteData('0'+TIME[1]/16);                                //分
  171.         LcdWriteData('0'+(TIME[1]&0x0f));        
  172.         LcdWriteData('-');
  173.         LcdWriteData('0'+TIME[0]/16);                                //秒
  174.         LcdWriteData('0'+(TIME[0]&0x0f));

  175.         LcdWriteCom(0x80);
  176.         LcdWriteData('2');
  177.         LcdWriteData('0');
  178.         LcdWriteData('0'+TIME[6]/16);                        //年
  179.         LcdWriteData('0'+(TIME[6]&0x0f));
  180.         LcdWriteData('-');
  181.         LcdWriteData('0'+TIME[4]/16);                        //月
  182.         LcdWriteData('0'+(TIME[4]&0x0f));
  183.         LcdWriteData('-');
  184.         LcdWriteData('0'+TIME[3]/16);                        //日
  185.         LcdWriteData('0'+(TIME[3]&0x0f));
  186.         LcdWriteCom(0x8D);
  187.         LcdWriteData('0'+(TIME[5]&0x07));        //星期
  188.         
  189.                         
  190. }
  191. /*******************************************************************************
  192. * 函數(shù)名         : Int0Configuration()
  193. * 函數(shù)功能                   : 配置外部中斷0
  194. * 輸入           : 無(wú)
  195. * 輸出                  : 無(wú)
  196. *******************************************************************************/

  197. void Int0Configuration()
  198. {
  199.         //設(shè)置INT0
  200.         IT1=1;//跳變沿出發(fā)方式(下降沿)
  201.         EX1=1;//打開(kāi)INT0的中斷允許。
  202.         EA=1;//打開(kāi)總中斷        
  203. }
  204. /*******************************************************************************
  205. * 函數(shù)名         : Int0()
  206. * 函數(shù)功能                   : 外部中斷0 中斷函數(shù)
  207. * 輸入           : 無(wú)
  208. * 輸出                  : 無(wú)
  209. *******************************************************************************/

  210. void Int0() interrupt 2                 
  211. {
  212.         delay(1000);
  213.         if(K3==0)
  214.         {
  215.                 SetState=~SetState;
  216.                 SetPlace=0;
  217.                 Ds1302Init();        
  218.         }
  219. }
  220. /*******************************************************************************
  221. * 函數(shù)名         : Delay10ms
  222. * 函數(shù)功能                   : 延時(shí)函數(shù),延時(shí)10ms
  223. * 輸入           : 無(wú)
  224. * 輸出                  : 無(wú)
  225. *******************************************************************************/

  226. void delay(uint i)
  227. {
  228.         while(i--);
  229. }
  230. void datapros(int temp)         
  231. {
  232.         float tp;
  233.         if(temp<0)
  234.         {
  235.                 LcdWriteCom(0x80+0X4a);
  236.                  LcdWriteData('-');
  237.                 temp=temp-1;
  238.                 temp=~temp;
  239.                 tp=temp;
  240.                 temp=tp*0.0625*100+0.5;
  241.         }
  242.         else
  243.         {
  244.                 LcdWriteCom(0x80+0X4a);
  245.                 LcdWriteData('+');
  246.                 tp=temp;
  247.                 temp=tp*0.0625*100+0.5;
  248.         }
  249.         LcdWriteCom(0x80+0X4b);
  250.         LcdWriteData('0'+temp/10000/1000);
  251.         LcdWriteData('0'+temp%10000/1000);
  252.         LcdWriteData('0'+temp%1000/100);
  253.         LcdWriteData('.');
  254.         LcdWriteData('0'+temp%100/10);
  255.         LcdWriteData('0'+temp%10);
  256. }
  257. void IrInit()
  258. {
  259.         IT0=1;//下降沿觸發(fā)
  260.         EX0=1;//打開(kāi)中斷0允許
  261.         EA=1;        //打開(kāi)總中斷

  262.         IRIN=1;//初始化端口
  263. }
  264. void ReadIr() interrupt 0
  265. {
  266.         uchar Time;
  267.         uchar j,k;
  268.         uint err;
  269.         Time=0;                                         
  270.         delay(700);        //7ms
  271.         if(IRIN==0)                //確認(rèn)是否真的接收到正確的信號(hào)
  272.         {         
  273.                
  274.                 err=1000;                                //1000*10us=10ms,超過(guò)說(shuō)明接收到錯(cuò)誤的信號(hào)
  275.                 /*當(dāng)兩個(gè)條件都為真是循環(huán),如果有一個(gè)條件為假的時(shí)候跳出循環(huán),免得程序出錯(cuò)的時(shí)
  276.                 侯,程序死在這里*/        
  277.                 while((IRIN==0)&&(err>0))        //等待前面9ms的低電平過(guò)去                  
  278.                 {                        
  279.                         delay(1);
  280.                         err--;
  281.                 }
  282.                 if(IRIN==1)                        //如果正確等到9ms低電平
  283.                 {
  284.                         err=500;
  285.                         while((IRIN==1)&&(err>0))                 //等待4.5ms的起始高電平過(guò)去
  286.                         {
  287.                                 delay(1);
  288.                                 err--;
  289.                         }
  290.                         for(k=0;k<4;k++)                //共有4組數(shù)據(jù)
  291.                         {                                
  292.                                 for(j=0;j<8;j++)        //接收一組數(shù)據(jù)
  293.                                 {

  294.                                         err=60;               
  295.                                         while((IRIN==0)&&(err>0))//等待信號(hào)前面的560us低電平過(guò)去
  296.                                         {
  297.                                                 delay(1);
  298.                                                 err--;
  299.                                         }
  300.                                         err=500;
  301.                                         while((IRIN==1)&&(err>0))         //計(jì)算高電平的時(shí)間長(zhǎng)度。
  302.                                         {
  303.                                                 delay(10);         //0.1ms
  304.                                                 Time++;
  305.                                                 err--;
  306.                                                 if(Time>30)
  307.                                                 {
  308.                                                         return;
  309.                                                 }
  310.                                         }
  311.                                         IrValue[k]>>=1;         //k表示第幾組數(shù)據(jù)
  312.                                         if(Time>=8)                        //如果高電平出現(xiàn)大于565us,那么是1
  313.                                         {
  314.                                                 IrValue[k]|=0x80;
  315.                                         }
  316.                                         Time=0;                //用完時(shí)間要重新賦值                                                        
  317.                                 }
  318.                         }
  319.                 }
  320.                 if(IrValue[2]!=~IrValue[3])
  321.                 {
  322.                         return;
  323.                 }
  324.         }
  325.         if(IrValue[2]==0x45)
  326.         {
  327.                 SetState=~SetState;
  328.                 SetPlace=0;
  329.                 Ds1302Init();        
  330.         }                        
  331. }

  332. void hongweiyaokong()    //紅外遙控
  333. {
  334.         if(SetState==0)
  335.         {
  336.                 Ds1302ReadTime();        
  337.         }
  338.         else
  339.         {
  340.                 if(IrValue[2]==0x43)
  341.                 {
  342.                         SetPlace++;
  343.                         if(SetPlace>=7)
  344.                         {
  345.                                 SetPlace=0;
  346.                         }
  347.                         if(IrValue[2]==0x43)
  348.                         {
  349.                                 IrValue[2]!=~IrValue[3];        
  350.                         }        
  351.                 }
  352.         
  353.                 if(IrValue[2]==0x09)
  354.                 {
  355.                         TIME[SetPlace]++;
  356.                         if((TIME[SetPlace]&0x0f)>9)                                         //換成BCD碼。
  357.                         {
  358.                                 TIME[SetPlace]=TIME[SetPlace]+6;
  359.                         }
  360.                         if((TIME[SetPlace]>=0x60)&&(SetPlace<2))                //分秒只能到59
  361.                         {
  362.                                 TIME[SetPlace]=0;
  363.                         }
  364.                         if((TIME[SetPlace]>=0x24)&&(SetPlace==2))                //小時(shí)只能到23
  365.                         {
  366.                                 TIME[SetPlace]=0;
  367.                         }
  368.                         if((TIME[SetPlace]>=0x32)&&(SetPlace==3))                //日只能到31
  369.                         {
  370.                                 TIME[SetPlace]=0;        
  371.                         }
  372.                         if((TIME[SetPlace]>=0x13)&&(SetPlace==4))                //月只能到12
  373.                         {
  374.                                 TIME[SetPlace]=0;
  375.                         }        
  376.                         if((TIME[SetPlace]>=0x7)&&(SetPlace==5))                //周只能到7
  377.                         {
  378.                                 TIME[SetPlace]=1;
  379.                         }               
  380.                         if(IrValue[2]==0x09)
  381.                         {
  382.                                 IrValue[2]!=~IrValue[3];        
  383.                         }        
  384.                 }
  385.                                        

  386.         }
  387. }        
復(fù)制代碼

lcd1602.rar

75.21 KB, 下載次數(shù): 18


作者: 笨笨兔    時(shí)間: 2019-3-4 09:06
描述不清,高手們無(wú)法幫你哦。
放一堆程序有啥用?
作者: lhblhb    時(shí)間: 2019-3-4 12:34
笨笨兔 發(fā)表于 2019-3-4 09:06
描述不清,高手們無(wú)法幫你哦。
放一堆程序有啥用?

抱歉,是我的錯(cuò),我其他模塊正常,就是用紅外遙控調(diào)整時(shí)間只要按下那個(gè)鍵,我設(shè)的SetPlace 這個(gè)變量就一直加,除非你按別的鍵才會(huì)停下來(lái),我要的是按一下它就加1;
void hongweiyaokong()    //???????
{
        if(SetState==0)
        {
                Ds1302ReadTime();                //??????
        }
        else
        {
                if(IrValue[2]==0x43)          //???????????????£??????
                {
                        SetPlace++;
                        if(SetPlace>=7)
                        {
                                SetPlace=0;
                        }
               
                }
       
                if(IrValue[2]==0x09)                //????
                {
                        TIME[SetPlace]++;
                        if((TIME[SetPlace]&0x0f)>9)                                         //????BCD??
                        {
                                TIME[SetPlace]=TIME[SetPlace]+6;
                        }
                        if((TIME[SetPlace]>=0x60)&&(SetPlace<2))                //????????59
                        {
                                TIME[SetPlace]=0;
                        }
                        if((TIME[SetPlace]>=0x24)&&(SetPlace==2))                //С?????23
                        {
                                TIME[SetPlace]=0;
                        }
                        if((TIME[SetPlace]>=0x32)&&(SetPlace==3))                //??????31
                        {
                                TIME[SetPlace]=0;       
                        }
                        if((TIME[SetPlace]>=0x13)&&(SetPlace==4))                //??????12
                        {
                                TIME[SetPlace]=0;
                        }       
                        if((TIME[SetPlace]>=0x7)&&(SetPlace==5))                //??????7
                        {
                                TIME[SetPlace]=1;
                        }                               
}
                                       

        }
}       
作者: 周超然    時(shí)間: 2019-3-4 13:34
變量清0了么
作者: lhblhb    時(shí)間: 2019-3-4 16:59
周超然 發(fā)表于 2019-3-4 13:34
變量清0了么

SetPlace 作用是選擇秒,分,時(shí),日,月,年的,麻煩您能說(shuō)的具體一點(diǎn),新手 比較笨




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 99精品久久| 91av大全| 高清久久久 | 欧美一区二区三区免费在线观看 | 午夜视频一区二区 | 亚洲精品无人区 | 成年人在线电影 | 视频一区二区三区中文字幕 | 欧美性生活一区二区三区 | 四虎在线视频 | 毛片韩国 | 91久久精品国产 | 黄网站免费在线观看 | 欧美国产91 | 国产激情视频在线观看 | 精品少妇一区二区三区在线播放 | av在线三级| 国产a级毛片 | 亚洲成人精品 | 亚洲第一av | 日本午夜一区二区三区 | 亚洲九九色 | 精品亚洲一区二区三区 | 欧美成人免费在线视频 | 国产成人一区二区 | 毛片片| 亚洲午夜精品久久久久久app | 一区二区三区国产好的精 | 成人av免费网站 | 91精品国产综合久久久动漫日韩 | 色综合久久88色综合天天 | av一二三四 | 久久精品国产免费 | 伊人伊人伊人 | 成人综合视频在线 | 国产精品亚洲二区 | 国产一区不卡 | 四虎免费视频 | 久久亚洲欧美日韩精品专区 | 九九伦理片 | 国产精品小视频在线观看 |