找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机红外通信显示万年历不行是怎么回事

[复制链接]
跳转到指定楼层
楼主
  我在LCD1602显示数字的基础上,加了DS1302制作一个万年历,让它能实时显示时间,并且把DS18B20的程序也附加上,使之能够同时显示温度和时间,做出来是如下效果。然后,我想在此基础上添加其它功能,用红外遥控控制,按电源键显示万年历,按其它键显示其它功能,但是我仅仅是编写了电源键的功能,1602就是一片空白,请各位大神指导一下。初学51,请多指教!下面是红外通信+万年历主文件的代码:
  1. /*******************************************************************************
  2. * 实验名                           : 万年历实验
  3. * 使用的IO             :
  4. * 实验效果       :1602显示时钟,按K3进入时钟设置,按K1选择设置的时分秒日月,按K2选择
  5. *选择设置加1。
  6. *        注意                                         :
  7. *******************************************************************************/

  8. #include<reg52.h>
  9. #include"lcd.h"
  10. #include"ds1302.h"
  11. #include"temp.h"
  12. #include"HWTX.h"  //红外通信


  13. sbit K1=P3^1;
  14. sbit K2=P3^0;
  15. sbit K3=P3^2;
  16. sbit K4=P3^3;



  17. void Int0Configuration();
  18. void LcdDisplay();
  19. unsigned char SetState,SetPlace;
  20. void Delay10ms(void);   //误差 0us
  21. void datapros(int temp);
  22. /*******************************************************************************
  23. * 函数名         : main
  24. * 函数功能                   : 主函数
  25. * 输入           : 无
  26. * 输出                  : 无
  27. *******************************************************************************/

  28. void main()
  29. {
  30.         unsigned char i;
  31.         Int0Configuration();
  32.         LcdInit();
  33.         Ds1302Init();
  34.         IrInit();       //初始化红外线接收
  35.         if(IrValue[2]==45)                         //45是电源键的编码值
  36.         {
  37.         while(1)
  38.         {      
  39.                 if(SetState==0)
  40.                 {
  41.                         Ds1302ReadTime();
  42.                 }
  43.                 else
  44.                 {
  45.                         if(K1==0)                //检测按键K1是否按下
  46.                         {
  47.                                 Delay10ms();        //消除抖动
  48.                                 if(K1==0)
  49.                                 {
  50.                                         SetPlace++;
  51.                                         if(SetPlace>=7)
  52.                                                 SetPlace=0;                                       
  53.                                 }

  54.                                 while((i<50)&&(K1==0))         //检测按键是否松开
  55.                                 {
  56.                                         Delay10ms();
  57.                                         i++;
  58.                                 }
  59.                                 i=0;
  60.                         }
  61.                         if(K2==0)                //检测按键K2是否按下
  62.                         {
  63.                                 Delay10ms();        //消除抖动
  64.                                 if(K2==0)
  65.                                 {
  66.                                         TIME[SetPlace]++;
  67.                                         if((TIME[SetPlace]&0x0f)>9)                                         //换成BCD码。
  68.                                         {
  69.                                                 TIME[SetPlace]=TIME[SetPlace]+6;
  70.                                         }
  71.                                         if((TIME[SetPlace]>=0x60)&&(SetPlace<2))                //分秒只能到59
  72.                                         {
  73.                                                 TIME[SetPlace]=0;
  74.                                         }
  75.                                         if((TIME[SetPlace]>=0x24)&&(SetPlace==2))                //小时只能到23
  76.                                         {
  77.                                                 TIME[SetPlace]=0;
  78.                                         }
  79.                                         if((TIME[SetPlace]>=0x32)&&(SetPlace==3))                //日只能到31
  80.                                         {
  81.                                                 TIME[SetPlace]=0;      
  82.                                         }
  83.                                         if((TIME[SetPlace]>=0x13)&&(SetPlace==4))                //月只能到12
  84.                                         {
  85.                                                 TIME[SetPlace]=0;
  86.                                         }      
  87.                                         if((TIME[SetPlace]>=0x7)&&(SetPlace==5))                //周只能到7
  88.                                         {
  89.                                                 TIME[SetPlace]=1;
  90.                                         }               
  91. //                                        if(SetPlace==5)                //月只能到12
  92. //                                        {
  93. //                                                TIME[SetPlace]=;
  94. //                                        }      
  95.                                 }
  96.                               
  97.                                 while((i<50)&&(K2==0))         //检测按键是否松开
  98.                                 {
  99.                                         Delay10ms();
  100.                                         i++;
  101.                                 }
  102.                                 i=0;
  103.                               
  104.                         }                                               
  105.                 }
  106.                 LcdDisplay();      
  107.         }
  108.         }
  109. }


  110. void datapros(int temp)
  111. {
  112.         float tp;
  113.         if(temp<0)
  114.         {
  115.                 temp-=1;
  116.                 temp=~temp;
  117.                 tp=temp;
  118.                 temp=tp*0.0625*100+0.5;
  119.                 LcdWriteCom(0x49+0x80);
  120.                 LcdWriteData('-');                       
  121.         }
  122.         else
  123.         {
  124.                 tp=temp;
  125.                 temp=tp*0.0625*100+0.5;
  126.                 LcdWriteCom(0x49+0x80);      
  127.                 LcdWriteData('+');               
  128.         }
  129.         LcdWriteCom(0x4a+0x80);
  130.         LcdWriteData('0'+temp%10000/1000);
  131.         LcdWriteCom(0x4b+0x80);
  132.         LcdWriteData('0'+temp%10000%1000/100);
  133.         LcdWriteCom(0x4c+0x80);
  134.         LcdWriteData('.');
  135.         LcdWriteCom(0x4d+0x80);
  136.         LcdWriteData('0'+temp%100/10);
  137.         LcdWriteCom(0x4e+0x80);
  138.         LcdWriteData('0'+temp%100%10);
  139. }
  140. /*******************************************************************************
  141. * 函数名         : LcdDisplay()
  142. * 函数功能                   : 显示函数
  143. * 输入           : 无
  144. * 输出                  : 无
  145. *******************************************************************************/

  146. void LcdDisplay()
  147. {
  148.         LcdWriteCom(0x40+0x80);
  149.         LcdWriteData('0'+TIME[2]/16);                                //时
  150.         LcdWriteData('0'+(TIME[2]&0x0f));                                 
  151.         LcdWriteData(':');
  152.         LcdWriteData('0'+TIME[1]/16);                                //分
  153.         LcdWriteData('0'+(TIME[1]&0x0f));      
  154.         LcdWriteData(':');
  155.         LcdWriteData('0'+TIME[0]/16);                                //秒
  156.         LcdWriteData('0'+(TIME[0]&0x0f));
  157.         datapros(ds18b20readtemp());

  158.         LcdWriteCom(0x80);
  159.         LcdWriteData('2');
  160.         LcdWriteData('0');
  161.         LcdWriteData('0'+TIME[6]/16);                        //年
  162.         LcdWriteData('0'+(TIME[6]&0x0f));
  163.         LcdWriteData('-');
  164.         LcdWriteData('0'+TIME[4]/16);                        //月
  165.         LcdWriteData('0'+(TIME[4]&0x0f));
  166.         LcdWriteData('-');
  167.         LcdWriteData('0'+TIME[3]/16);                        //日
  168.         LcdWriteData('0'+(TIME[3]&0x0f));
  169.         LcdWriteCom(0x8D);
  170.         LcdWriteData('0'+(TIME[5]&0x07));        //星期                        
  171. }
  172. /*******************************************************************************
  173. * 函数名         : Int0Configuration()
  174. * 函数功能                   : 配置外部中断0
  175. * 输入           : 无
  176. * 输出                  : 无
  177. *******************************************************************************/

  178. void Int0Configuration()
  179. {
  180.         //设置INT0
  181.         IT0=1;//跳变沿出发方式(下降沿)
  182.         EX0=1;//打开INT0的中断允许。
  183.         EA=1;//打开总中断      
  184. }
  185. /*******************************************************************************
  186. * 函数名         : Int0()
  187. * 函数功能                   : 外部中断0 中断函数
  188. * 输入           : 无
  189. * 输出                  : 无
  190. *******************************************************************************/

  191. void Int0() interrupt 0                 
  192. {
  193.         Delay10ms();
  194.         if(K3==0)
  195.         {
  196.                 SetState=~SetState;
  197.                 SetPlace=0;
  198.                 Ds1302Init();      
  199.         }
  200. }
  201. /*******************************************************************************
  202. * 函数名         : Delay10ms
  203. * 函数功能                   : 延时函数,延时10ms
  204. * 输入           : 无
  205. * 输出                  : 无
  206. *******************************************************************************/
  207. void Delay10ms(void)   //误差 0us
  208. {
  209.     unsigned char a,b,c;
  210.     for(c=1;c>0;c--)
  211.         for(b=38;b>0;b--)
  212.             for(a=130;a>0;a--);
  213. }
复制代码





IMG_20190218_155018.jpg (3.66 MB, 下载次数: 95)

这是万年历加温度

这是万年历加温度
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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