找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1092|回复: 0
收起左侧

红外遥控单片机时钟带倒计时

[复制链接]
ID:347763 发表于 2018-8-21 08:35 | 显示全部楼层 |阅读模式
红外遥控单片机时钟带倒计时,功能强大,可以参考。

单片机源程序如下:
  1. //****************************************************************//
  2.                       
  3. //MCU :STC11F60XE
  4. //去中间值6M  内部晶振5.5-6.8M
  5.   
  6. //****************************************************************//

  7. #include<STC11F60XE.H>
  8. #include<intrins.h>
  9. #include<math.h>
  10. #include<DS1302.h>
  11. //#include<RS485.h>
  12. //#include<eepram_operate.h>
  13. #define uchar unsigned char
  14. #define uint unsigned int
  15. //#define Segtime 1                                            //定义读传感器时间间隔 单位为秒


  16. /*********************************/

  17. sbit hwx=P3^2;                             //红外接收数据引脚

  18. sbit  led1=P1^4;
  19. sbit  led2=P1^0;

  20. sbit  SD=P1^5;         
  21. sbit  CK=P1^6;
  22. sbit  SK=P1^7;


  23. bit time_flag,ly_flag,meter_flag,flash_flag;                  
  24. uchar count;
  25. uchar last_sec;
  26. int second;

  27. uchar ly_lhj[4];                                        //保存NEC的四个字节数据
  28. uchar dis_data[4];

  29. uchar data disp_code[12]={0xc0,0xfa,0xa4,0xb0,0x9a,0x91,0x81,0xf8,0x80,0x90,0xff,0xbf}; //0,1,2,3,4,5,6,7,8,9,OFF,负号


  30. /*********************************************/
  31. void delay_1ms(uint ms)
  32. {
  33.    uchar i;
  34.   while(ms--)
  35.   for(i=0;i<20;i++);
  36. }
  37. /*********************************************/
  38. void delay(void)
  39. {               
  40.         uchar i=10;
  41.         while(i--);
  42. }
  43. /***************************************************************************/
  44. void  WR_595(uchar num1)  ////试用于TPIC6B595N直接拉数码管
  45. {
  46.     uchar date;  
  47.    uchar b;
  48.    date=num1;

  49.   for(b=0;b<=7;b++)
  50.     {
  51.      if((date&0x80)==0x80)   //最高位为1,则向sdata_595发送1
  52.             SD=0;            //发出数据的最高位
  53.          else  
  54.             SD=1;
  55.          
  56.          date<<=1;               //左移位
  57.          SK=0;          
  58.          _nop_();
  59.          _nop_();
  60.          SK=1;            //产生上升沿
  61.             }
  62. }
  63. /***************************************************************************/
  64. void display(void)
  65. {
  66.          CK=0;
  67.              
  68.                   WR_595(disp_code[dis_data[3]]);                                      
  69.                     WR_595(disp_code[dis_data[2]]);                                          
  70.              WR_595(disp_code[dis_data[1]]);
  71.              WR_595(disp_code[dis_data[0]]);
  72.                  
  73.                  /*
  74.                  WR_595(disp_code[3]);                                      
  75.                     WR_595(disp_code[2]);                                          
  76.              WR_595(disp_code[1]);
  77.              WR_595(disp_code[0]);
  78.                  */
  79.                  
  80.                     
  81.                
  82.      CK=1;                 
  83. }
  84. //--------------------------------------------------------------------------------------------------
  85. // 函数名称: 校验时间函数                                                                                                 
  86. // 函数功能:   
  87. //--------------------------------------------------------------------------------------------------

  88. void adjust_time(void)
  89. {  
  90.    uchar ex,wei=3;
  91.             led1=0;
  92.          led2=0;
  93.   ////////////////////////////////////

  94.    while(time_flag==1)
  95.     {
  96.         ///////////////////////////
  97.           ex=dis_data[wei];                 //设定位闪烁显示
  98.           dis_data[wei]=10;
  99.           display();
  100.           delay_1ms(1500);
  101.           dis_data[wei]=ex;
  102.       display();
  103.           delay_1ms(2200);
  104.         ///////////////////////////
  105.             if(ly_flag)
  106.        {
  107.                      ly_flag=0;       //清空标志

  108.              ///////////左移键////////////
  109.              if(ly_lhj[2]==0x08 && ly_lhj[3]==0xf7)
  110.                  { if(wei>0)
  111.                    wei--;
  112.                    else
  113.                    wei=3;
  114.                   }
  115.                  ///////////右移键////////////
  116.              if(ly_lhj[2]==0x0a && ly_lhj[3]==0xf5)
  117.                  { if(wei<3)
  118.                    wei++;
  119.                    else
  120.                    wei=0;
  121.                   }
  122.               ///////////0键////////////
  123.              if(ly_lhj[2]==0x0e && ly_lhj[3]==0xf1)
  124.                      dis_data[wei]=0;
  125.                   ///////////1键////////////
  126.              if(ly_lhj[2]==0x10 && ly_lhj[3]==0xef)
  127.                      dis_data[wei]=1;
  128.                   ///////////2键////////////
  129.              if(ly_lhj[2]==0x11 && ly_lhj[3]==0xee)
  130.                      dis_data[wei]=2;
  131.                   ///////////3键////////////
  132.              if(ly_lhj[2]==0x12 && ly_lhj[3]==0xed)
  133.                      dis_data[wei]=3;
  134.                   ///////////4键////////////
  135.              if(ly_lhj[2]==0x14 && ly_lhj[3]==0xeb)
  136.                      dis_data[wei]=4;
  137.                   ///////////5键////////////
  138.              if(ly_lhj[2]==0x15 && ly_lhj[3]==0xea)
  139.                      dis_data[wei]=5;
  140.                   ///////////6键////////////
  141.              if(ly_lhj[2]==0x16 && ly_lhj[3]==0xe9)
  142.                      dis_data[wei]=6;
  143.                   ///////////7键////////////
  144.              if(ly_lhj[2]==0x18 && ly_lhj[3]==0xe7)
  145.                      dis_data[wei]=7;
  146.                   ///////////8键////////////
  147.              if(ly_lhj[2]==0x19 && ly_lhj[3]==0xe6)
  148.                      dis_data[wei]=8;
  149.                   ///////////9键////////////
  150.              if(ly_lhj[2]==0x1a && ly_lhj[3]==0xe5)
  151.                      dis_data[wei]=9;

  152.                       ///////////时间设置返回 menu键////////////
  153.                  if(ly_lhj[2]==0x02 && ly_lhj[3]==0xfd)
  154.                     {
  155.                           hour=dis_data[0]*16 + dis_data[1];
  156.                           min=dis_data[2]*16 + dis_data[3];
  157.                           ds1302_initial();

  158.                            time_flag=0;


  159.                          //while(1);                  //基准时间设定后需要重新上电
  160.                          }
  161.             }

  162.          
  163.          }

  164. }

  165. //--------------------------------------------------------------------------------------------------
  166. // 函数名称: 校验时间函数                                                                                                 
  167. // 函数功能:   
  168. //--------------------------------------------------------------------------------------------------

  169. void meter_Init(void)
  170. {
  171.   
  172.     //////////定时器部分///////
  173.     TR0=0;       //disable timer0
  174.         TH0=0x3c;
  175.         TL0=0xb0;          //reload timer0
  176.         count=0;
  177.         ////////显示部分/////////
  178.         led1=0;  led2=0; //点亮led
  179.         second=0;
  180.         dis_data[0]=0;
  181.         dis_data[1]=0;
  182.         dis_data[2]=0;
  183.         dis_data[3]=0;
  184. }
  185. //--------------------------------------------------------------------------------------------------
  186. // 函数名称: 校验时间函数                                                                                                 
  187. // 函数功能:  10倒计时到0  开始计时
  188. //--------------------------------------------------------------------------------------------------

  189. void time_meter(void)
  190. {        
  191.         meter_Init();

  192.   while(meter_flag==1)
  193.     {  
  194.             if(count==5 || count==10 || count==15 || count==19 )                   //没200ms
  195.            {  DIS_change();
  196.                      if(last_sec!=read_sec)
  197.                      {       
  198.                      last_sec=read_sec;
  199.                         if(second==5999)
  200.                          second=second;
  201.                          else
  202.                      second++;

  203.                                                            
  204.                            dis_data[0]=second/60/10;
  205.                  dis_data[1]=second/60%10;
  206.                  dis_data[2]=second%60/10;
  207.                  dis_data[3]=second%60%10;
  208.                          
  209.                   
  210.                   }
  211.            }
  212.           delay_1ms(20);
  213.           display();

  214.            /**************遥控器操作不封*****************/
  215.              if(ly_flag)
  216.        {
  217.               ly_flag=0;       //清空标志
  218.            ///////////暂停开始  暂停键////////////
  219.           if(ly_lhj[2]==0x00 && ly_lhj[3]==0xff)
  220.             {TR0=~TR0;
  221.                  if(TR0==1)
  222.                    {DIS_change();last_sec=read_sec;}               
  223.                  }
  224.            ///////////重新开始 ok键////////////
  225.              if(ly_lhj[2]==0x09 && ly_lhj[3]==0xf6)
  226.              { meter_Init();}
  227.            ///////////返回时钟模式 返回键////////////
  228.              if(ly_lhj[2]==0x06 && ly_lhj[3]==0xf9)
  229.              { meter_flag=0;TR0=1;}


  230.                 }
  231.             /****************************************/

  232.         }
  233. }
  234. //--------------------------------------------------------------------------------------------------
  235. // 函数名称: setup(void)                                                                                                  
  236. // 函数功能: 设置
  237. //--------------------------------------------------------------------------------------------------
  238. void setup(void)   
  239. {
  240.   if(ly_flag)
  241.   {         ly_flag=0;       //清R空标志


  242.    
  243.         ///////////时间设置进入 menu键////////////
  244.         if(ly_lhj[2]==0x02 && ly_lhj[3]==0xfd)
  245.             { time_flag=1; TR0=0;ly_flag=0; adjust_time();TR0=1;}

  246.         ///////////目标清零  +////////////
  247.         //if(ly_lhj[2]==0x04 && ly_lhj[3]==0xfb)
  248.         //{target=0; data_transfer();eeprom();}
  249.         ///////////实际清零 _////////////
  250.         //if(ly_lhj[2]==0x0c && ly_lhj[3]==0xf3)
  251.         //{real=0; data_transfer();eeprom();}

  252.         ///////////segtime设置 ok键////////////
  253.         if(ly_lhj[2]==0x09 && ly_lhj[3]==0xf6)
  254.           { meter_flag=1;ly_flag=0; time_meter();}

  255.         ///////////选择segtime////////////
  256.         //if(ly_lhj[2]==0x00 && ly_lhj[3]==0xff);


  257.    }
  258. }

  259. //--------------------------------------------------------------------------------------------------
  260. // 函数名称:初始化函数
  261. // 函数功能:设定定时器工作方式,设定波特率
  262. //--------------------------------------------------------------------------------------------------
  263. /********************************/
  264. void Init(void)   
  265. {   
  266.     TMOD = 0x11;                                    //set timer0 & timer1 as mode 1 (16-bit)
  267.     ET0 = 1;                                         //enable timer0 interrupt
  268.         TH0=0x3c;
  269.         TL0=0xb0;
  270.         TR0=1;

  271.                                   //设置成下降沿触发方式


  272.         EX0=1;                                        //开启外部中断0, 红外接收头
  273.         IT0=1;                                    //设置成下降沿触发方式

  274.        
  275.     EA = 1;

  276. }
  277. /********************************/
  278. //--------------------------------------------------------------------------------------------------
  279. // 函数名称:主函数
  280. // 函数功能:
  281. //--------------------------------------------------------------------------------------------------

  282.   void main()
  283. {
  284.    
  285.          
  286.         delay_1ms(1000);
  287.         //display();                     //先点亮数码管
  288.         Init();
  289.         led1=0;
  290.         led2=0;

  291. while(1)
  292. {
  293.    delay_1ms(200);
  294.    
  295.    if(flash_flag==1) {led1=~led1;led2=~led2;flash_flag=0;}

  296.   if((count%5)==0)
  297.     { DIS_change();
  298.           
  299.           dis_data[0]=read_hour/16;
  300.           dis_data[1]=read_hour%16;
  301.           dis_data[2]=read_min/16;
  302.           dis_data[3]=read_min%16;
  303.    
  304.         }
  305.    display();
  306.    setup();       
  307.                      
  308.    

  309. }
  310. }
  311. //--------------------------------------------------------------------------------------------------
  312. // 函数名称: 外中断0入口函数,P32引脚,红外线接收IC数据脚         使用timer1 计时                                                                                         
  313. // 函数功能:   
  314. //--------------------------------------------------------------------------------------------------
  315. void hongwai(void) interrupt 0
  316. {
  317.         unsigned char i,ia;
  318.         /**************开始判断是否为NEC波形引导码的前9MS和后4.5MS******************************/
  319.         TL1=0;
  320.         TH1=0;                                //定时/计数器1初始值
  321.         TR1=1;                                //定时器以12M晶振12分频计数,(12M 1us)
  322.         while(!hwx);
  323.         TR1=0;                                //信号翻转停止计数
  324.         if(TH1<30||TH1>40)        //NEC引导码前9MS,计数约9000,TH1约等于35,给个误差值,用30-40之
  325.                 return;

  326.         TH1=0;                                //定时/计数器1初始值
  327.         TR1=1;
  328.         while(hwx){
  329.                 delay();
  330.                 if(TH1>22)                //NEC引导码引导码的后4。5MS,计数约4500,TH1约等于17
  331.                         return;               
  332.         }
  333. ……………………

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

所有资料51hei提供下载:
FW 时钟单面.rar (58.35 KB, 下载次数: 7)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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