找回密码
 立即注册

QQ登录

只需一步,快速开始

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

12864+DS1302+红外遥控+温度显示+农历时钟程序 51单片机设计

[复制链接]
跳转到指定楼层
楼主
12864+DS1302+红外遥控+温度显示+农历时钟程序


单片机源程序如下:
  1. #include "STC12C5A60S2.H"
  2. #include "Delay.h"
  3. #include "LCD12864.h"
  4. #include "Display.h"
  5. #include "DS1302.h"
  6. #include "UART.h"
  7. #define uint  unsigned  int
  8. #define uchar unsigned char

  9. //sfr IAP_CONTR   = 0xC7; //STC12C5A60S2复位寄存器
  10. bit ReadTimeFlag;//定义读时间标志
  11. sbit backlight=P1^4; //控制液晶的继电器
  12. sbit IRIN = P3^2;         //红外接收器数据线
  13. uchar IRCOM[7];
  14. uchar Key; //红外遥控器键值

  15. void Init_Timer0()         //定时器0初始化
  16. {
  17.         TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
  18.         EA=1;            //总中断打开
  19.         ET0=1;           //定时器中断打开
  20.         TR0=1;           //定时器开关打开
  21. }

  22. void Init_Int0() // 外部中断0初始化
  23. {
  24.         IT0 = 1;   //指定外部中断0下降沿触发,INT0 (P3.2)
  25.         EX0 = 1;   //使能外部中断
  26.         EA = 1;    //开总中断
  27. }

  28. void main()
  29. {
  30.         uchar i=0; //
  31.         lcm_init(); //液晶初始化
  32.         welcome();  //调用欢迎信息
  33.         Ds1302_Init(); //初始化DS1302
  34.         UART_Init(); //串口初始化
  35.         Init_Timer0();         //定时器0初始化
  36.         Init_Int0(); // 外部中断0初始化
  37.         delay(1000);
  38.         lcm_clr(); //清屏
  39.         Clean_12864_GDRAM(); //清屏
  40.         while(1)
  41.         {
  42.                 if(SetFlag)     //如果接收到串口信息则更新时钟
  43.                 {
  44.                         for(i=0;i<8;i++)
  45.                         {
  46.                                 time_buf1[i]=time_buf2[2*i]*10+time_buf2[2*i+1];//数据整合,如2个数 1和5整合成15
  47.                         }
  48.                         Ds1302_Write_Time();//接收更新的时间然后写入ds1302
  49.                         SetFlag=0;          //时钟信息更新后标志位清零
  50.                 }
  51.                 if(ReadTimeFlag)
  52.                 {
  53.                         ReadTimeFlag=0;
  54.                         //lcd_display(); //LCD12864显示

  55.                         displaydate();         //显示日期
  56.                         displayxq();     //显示星期
  57.                         displaytime();         //显示时间
  58.                         disptemp();      //显示温度
  59.                         displaynl();         //显示农历

  60.                         Ds1302_Read_Time(); //DS1302读取时间
  61.                 }       
  62.         }
  63. }

  64. void Timer0_isr() interrupt 1
  65. {
  66.         static unsigned int num;
  67.         TH0=(65536-2000)/256;                  //重新赋值 2ms
  68.         TL0=(65536-2000)%256;

  69.         num++;
  70.         if(num==50)        //大致100ms
  71.         {
  72.                 num=0;
  73.                 ReadTimeFlag=1; //读标志位置1
  74.         }
  75. }

  76. void Red_Ray(uchar a) //红外遥控处理函数
  77. {
  78.         switch(a)
  79.         {
  80.                 case(0x64)://开关背光
  81.                         backlight=!backlight;                       
  82.                         break;
  83.                 case(0x90)://系统软复位
  84.                         IAP_CONTR=0x60;                       
  85.                         break;
  86.                 case(0x44)://年+
  87.                         if(backlight) //如果LCD12864背光开启
  88.                         {
  89.                                 time_buf1[1]++;
  90.                                 if(time_buf1[1]==100)
  91.                                 {
  92.                                         time_buf1[1]=0;
  93.                                 }   
  94.                                 Ds1302_Write_Time();
  95.                         }                       
  96.                         break;
  97.                 case(0x04)://年-
  98.                         if(backlight) //如果LCD12864背光开启
  99.                         {
  100.                                 time_buf1[1]--;
  101.                                 if(time_buf1[1]==255)
  102.                                 {
  103.                                         time_buf1[1]=99;
  104.                                 }  
  105.                                 Ds1302_Write_Time();
  106.                         }                       
  107.                         break;
  108.                 case(0x70)://月+
  109.                         if(backlight) //如果LCD12864背光开启
  110.                         {
  111.                                 time_buf1[2]++;
  112.                                 if(time_buf1[2]==13)
  113.                                 {
  114.                                         time_buf1[2]=1;
  115.                                 }   
  116.                                 Ds1302_Write_Time();
  117.                         }                       
  118.                         break;
  119.                 case(0x51)://月-
  120.                         if(backlight) //如果LCD12864背光开启
  121.                         {
  122.                                 time_buf1[2]--;
  123.                                 if(time_buf1[2]==0)
  124.                                 {
  125.                                         time_buf1[2]=12;
  126.                                 }  
  127.                                 Ds1302_Write_Time();
  128.                         }                       
  129.                         break;
  130.                 case(0x61)://日+
  131.                         if(backlight) //如果LCD12864背光开启
  132.                         {
  133.                                 time_buf1[3]++;
  134.                                 if(time_buf1[3]==32)
  135.                                 {
  136.                                         time_buf1[3]=1;
  137.                                 }   
  138.                                 Ds1302_Write_Time();
  139.                         }                       
  140.                         break;
  141.                 case(0x91)://日-
  142.                         if(backlight) //如果LCD12864背光开启
  143.                         {
  144.                                 time_buf1[3]--;
  145.                                 if(time_buf1[3]==0)
  146.                                 {
  147.                                         time_buf1[3]=31;
  148.                                 }  
  149.                                 Ds1302_Write_Time();
  150.                         }                       
  151.                         break;
  152.                 case(0x30)://小时+
  153.                         if(backlight) //如果LCD12864背光开启
  154.                         {
  155.                                 time_buf1[4]++;
  156.                                 if(time_buf1[4]==24)
  157.                                 {
  158.                                         time_buf1[4]=0;
  159.                                 }   
  160.                                 Ds1302_Write_Time();
  161.                         }                       
  162.                         break;
  163.                 case(0x81)://小时-
  164.                         if(backlight) //如果LCD12864背光开启
  165.                         {
  166.                                 time_buf1[4]--;
  167.                                 if(time_buf1[4]==255)
  168.                                 {
  169.                                         time_buf1[4]=23;
  170.                                 }  
  171.                                 Ds1302_Write_Time();
  172.                         }                       
  173.                         break;
  174.                 case(0x80)://分钟+
  175.                         if(backlight) //如果LCD12864背光开启
  176.                         {
  177.                                 time_buf1[5]++;
  178.                                 if(time_buf1[5]==60)
  179.                                 {
  180.                                         time_buf1[5]=0;
  181.                                 }     
  182.                                 Ds1302_Write_Time();
  183.                         }                       
  184.                         break;
  185.                 case(0x31)://分钟-
  186.                         if(backlight) //如果LCD12864背光开启
  187.                         {
  188.                                 time_buf1[5]--;
  189.                                 if(time_buf1[5]==255)
  190.                                 {
  191.                                         time_buf1[5]=59;
  192.                                 }
  193.                                 Ds1302_Write_Time();
  194.                         }                       
  195.                         break;
  196.                 case(0x24)://秒+
  197.                         if(backlight) //如果LCD12864背光开启
  198.                         {
  199.                                 time_buf1[6]++;
  200.                                 if(time_buf1[6]==60)
  201.                                 {
  202.                                         time_buf1[6]=0;
  203.                                 }     
  204.                                 Ds1302_Write_Time();
  205.                         }                       
  206.                         break;
  207.                 case(0x25)://秒-
  208.                         if(backlight) //如果LCD12864背光开启
  209.                         {
  210.                                 time_buf1[6]--;
  211.                                 if(time_buf1[6]==255)
  212.                                 {
  213.                                         time_buf1[6]=59;
  214.                                 }
  215.                                 Ds1302_Write_Time();
  216.                         }                       
  217.                         break;                       
  218.         }
  219. }

  220. void delay1(uchar x)    //x*0.14MS 红外接收专用延时函数
  221. {
  222.         uchar i;
  223.         while(x--)
  224.         {
  225.                 //for (i = 0; i<13; i++); //12T
  226.                 for (i = 0; i<70; i++);           //1T
  227.         }
  228. }

  229. void Int0_isr() interrupt 0 //外部中断0服务函数
  230. {
  231.         uchar j,k,N=0;
  232.         EX0 = 0;   
  233.         delay1(15);
  234.         if (IRIN==1)
  235.         {
  236.                 EX0 =1;
  237.                 return;
  238.         }                           //确认IR信号出现
  239.         while(!IRIN)            //等IR变为高电平,跳过9ms的前导低电平信号。
  240.         {
  241.                 delay1(1);
  242.         }
  243.         for(j=0;j<4;j++)         //收集四组数据
  244.         {
  245.                 for (k=0;k<8;k++)        //每组数据有8位
  246.                 {
  247.                         while(IRIN)            //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
  248.                         {
  249.                                 delay1(1);
  250.                         }
  251.                         while(!IRIN)          //等 IR 变为高电平
  252.                         {
  253.                                 delay1(1);
  254.                         }
  255.                         while(IRIN)           //计算IR高电平时长
  256.                         {
  257.                                 delay1(1);
  258.                                 N++;           
  259.                                 if (N>=30)
  260.                                 {
  261.                                         EX0=1;
  262.                                         return;
  263.                                 }                  //0.14ms计数过长自动离开。
  264.                         }                        //高电平计数完毕               
  265.                         IRCOM[j]=IRCOM[j] >> 1;                  //数据最高位补“0”
  266.                         if(N>=8)
  267.                         {
  268.                                 IRCOM[j] = IRCOM[j] | 0x80;
  269.                         }  //数据最高位补"1"
  270.                         N=0;
  271.                 }
  272.         }   
  273.         if(IRCOM[2]!=~IRCOM[3])
  274.         {
  275.                 EX0=1;
  276.                 return;
  277.         }
  278.         IRCOM[5]=IRCOM[2] & 0x0F;     //取键码的低四位
  279. ……………………

  280. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
12864 DS1302 红外遥控 温度显示 农历时钟程序.rar (250.92 KB, 下载次数: 72)


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

使用道具 举报

沙发
ID:1 发表于 2017-5-31 03:11 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

板凳
ID:412696 发表于 2019-2-17 21:53 | 只看该作者

好资料,51黑有你更精彩!!!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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