找回密码
 立即注册

QQ登录

只需一步,快速开始

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

ds1302+ds18b20+lcd1602红外遥控调整时间单片机程序问题

[复制链接]
跳转到指定楼层
楼主
ID:473748 发表于 2019-3-3 20:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
求大神指导一下我这个初学者
就红外遥控调整时间,我按一下键,时间就一直走,停不下来,我的程序在附件里
  1. /*******************************************************************************
  2. * 实验名                           : 万年历实验
  3. * 使用的IO             :
  4. * 实验效果       :1602显示时钟,按K3进入时钟设置,按K1选择设置的时分秒日月,按K2选择
  5. *选择设置加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. * 函数名         : main
  28. * 函数功能                   : 主函数
  29. * 输入           : 无
  30. * 输出                  : 无
  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)                //检测按键K1是否按下
  50.                         {
  51.                                 delay(1000);        //消除抖动
  52.                                 if(K1==0)
  53.                                 {
  54.                                         SetPlace++;
  55.                                         if(SetPlace>=7)
  56.                                                 SetPlace=0;                                       
  57.                                 }

  58.                                 while((i<50)&&(K1==0))         //检测按键是否松开
  59.                                 {
  60.                                         delay(1000);
  61.                                         i++;
  62.                                 }
  63.                                 i=0;
  64.                         }
  65.                         if(K2==0)                //检测按键K2是否按下
  66.                         {
  67.                                 delay(1000);        //消除抖动
  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))                //小时只能到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))         //检测按键是否松开
  102.                                 {
  103.                                         delay(1000);
  104.                                         i++;
  105.                                 }
  106.                                 i=0;
  107.                                 
  108.                         }
  109.                         if(K4==0)                //检测按键K2是否按下
  110.                         {
  111.                                 delay(1000);        //消除抖动
  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))                //小时只能到23
  124.                                         {
  125.                                                 TIME[SetPlace]=9;
  126.                                         }
  127.                                         if((TIME[SetPlace]<=0x00)&&(SetPlace==2))                //小时只能到23
  128.                                         {
  129.                                                 TIME[SetPlace]=9;
  130.                                         }
  131.                                         if((TIME[SetPlace]<=0x00)&&(SetPlace==2))                //小时只能到23
  132.                                         {
  133.                                                 TIME[SetPlace]=9;
  134.                                         }
  135.                                         if((TIME[SetPlace]<=0x00)&&(SetPlace==2))                //小时只能到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))         //检测按键是否松开
  146.                                 {
  147.                                         delay(1000);
  148.                                         i++;
  149.                                 }
  150.                                 i=0;
  151.                                                                                 
  152.                         }
  153.         
  154.                 }
  155.                 LcdDisplay();
  156.         }        
  157. }


  158. /*******************************************************************************
  159. * 函数名         : LcdDisplay()
  160. * 函数功能                   : 显示函数
  161. * 输入           : 无
  162. * 输出                  : 无
  163. *******************************************************************************/

  164. void LcdDisplay()
  165. {

  166.         LcdWriteCom(0x80+0X40);
  167.         LcdWriteData('0'+TIME[2]/16);                                //时
  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. * 函数名         : Int0Configuration()
  193. * 函数功能                   : 配置外部中断0
  194. * 输入           : 无
  195. * 输出                  : 无
  196. *******************************************************************************/

  197. void Int0Configuration()
  198. {
  199.         //设置INT0
  200.         IT1=1;//跳变沿出发方式(下降沿)
  201.         EX1=1;//打开INT0的中断允许。
  202.         EA=1;//打开总中断        
  203. }
  204. /*******************************************************************************
  205. * 函数名         : Int0()
  206. * 函数功能                   : 外部中断0 中断函数
  207. * 输入           : 无
  208. * 输出                  : 无
  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. * 函数名         : Delay10ms
  222. * 函数功能                   : 延时函数,延时10ms
  223. * 输入           : 无
  224. * 输出                  : 无
  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;//下降沿触发
  260.         EX0=1;//打开中断0允许
  261.         EA=1;        //打开总中断

  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)                //确认是否真的接收到正确的信号
  272.         {         
  273.                
  274.                 err=1000;                                //1000*10us=10ms,超过说明接收到错误的信号
  275.                 /*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时
  276.                 侯,程序死在这里*/        
  277.                 while((IRIN==0)&&(err>0))        //等待前面9ms的低电平过去                  
  278.                 {                        
  279.                         delay(1);
  280.                         err--;
  281.                 }
  282.                 if(IRIN==1)                        //如果正确等到9ms低电平
  283.                 {
  284.                         err=500;
  285.                         while((IRIN==1)&&(err>0))                 //等待4.5ms的起始高电平过去
  286.                         {
  287.                                 delay(1);
  288.                                 err--;
  289.                         }
  290.                         for(k=0;k<4;k++)                //共有4组数据
  291.                         {                                
  292.                                 for(j=0;j<8;j++)        //接收一组数据
  293.                                 {

  294.                                         err=60;               
  295.                                         while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去
  296.                                         {
  297.                                                 delay(1);
  298.                                                 err--;
  299.                                         }
  300.                                         err=500;
  301.                                         while((IRIN==1)&&(err>0))         //计算高电平的时间长度。
  302.                                         {
  303.                                                 delay(10);         //0.1ms
  304.                                                 Time++;
  305.                                                 err--;
  306.                                                 if(Time>30)
  307.                                                 {
  308.                                                         return;
  309.                                                 }
  310.                                         }
  311.                                         IrValue[k]>>=1;         //k表示第几组数据
  312.                                         if(Time>=8)                        //如果高电平出现大于565us,那么是1
  313.                                         {
  314.                                                 IrValue[k]|=0x80;
  315.                                         }
  316.                                         Time=0;                //用完时间要重新赋值                                                        
  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))                //小时只能到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. }        
复制代码

lcd1602.rar

75.21 KB, 下载次数: 18

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

使用道具 举报

沙发
ID:158375 发表于 2019-3-4 09:06 | 只看该作者
描述不清,高手们无法帮你哦。
放一堆程序有啥用?
回复

使用道具 举报

板凳
ID:473748 发表于 2019-3-4 12:34 | 只看该作者
笨笨兔 发表于 2019-3-4 09:06
描述不清,高手们无法帮你哦。
放一堆程序有啥用?

抱歉,是我的错,我其他模块正常,就是用红外遥控调整时间只要按下那个键,我设的SetPlace 这个变量就一直加,除非你按别的键才会停下来,我要的是按一下它就加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;
                        }                               
}
                                       

        }
}       
回复

使用道具 举报

地板
ID:449525 发表于 2019-3-4 13:34 | 只看该作者
变量清0了么
回复

使用道具 举报

5#
ID:473748 发表于 2019-3-4 16:59 | 只看该作者

SetPlace 作用是选择秒,分,时,日,月,年的,麻烦您能说的具体一点,新手 比较笨
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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