找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3419|回复: 1
收起左侧

单片机闹钟源程序

[复制链接]
ID:76244 发表于 2015-4-7 01:02 | 显示全部楼层 |阅读模式


下图led2波形密集处即开始进行闹钟的地方。
4个按键进行调整,+,—,定时或者定闹钟用;



      写了一下午写好了,但还需要完善。
     时钟精度很高,一小时0.1s
  1. 闹钟源程序

  2. /******************************************************************************/

  3. /*                                                                            */

  4. /*                     RTX_EX2.C:  A RTX-51 Application                       */

  5. /*                                                                            */

  6. /******************************************************************************/



  7. #include <rtx51tny.h>                 /* RTX-51 tiny functions & defines      */

  8. #include"reg51.h"

  9. #include"display.h"







  10. /******************************************************************************/

  11. /*    Task 2 'job2':  RTX-51 tiny starts this task with os_create_task (2)    */

  12. /******************************************************************************/

  13. job0 () _task_ 0 {



  14.   inint();

  15.   os_create_task (1);                 /* start task 1                         */

  16.   os_create_task (2);                 /* start task 2                         */

  17.   os_create_task (3);                 /* start task 3                         */

  18.    while (1)  {                        /* endless loop                         */

  19.      led2=0;

  20.       readkey();  

  21.       locktime();

  22.    }



  23.   }



  24. /******************************************************************************/

  25. /*       Task 0 'job0':  RTX-51 tiny starts execution with task 0             */

  26. /******************************************************************************/

  27. job1 () _task_ 1  {                 





  28.   while (1)  {                        /* endless loop                         */

  29.       led0=~led0;               

  30.    os_wait (K_TMO, 100, 0);            /* wait for timeout: 5 ticks            */

  31.      isr_send_signal(2);



  32.   }

  33. }



  34. /******************************************************************************/

  35. /*   Task 1 'job1':  RTX-51 tiny starts this task with os_create_task (1)     */

  36. /******************************************************************************/

  37. job2 () _task_ 2  {

  38.    char event;

  39.    while (1)  {                        /* endless loop                         */

  40.     event = os_wait (K_SIG | K_TMO, 1, 0);

  41.     switch (event)

  42.          {

  43.     default:                     /* this never happens */

  44.       break;



  45.     case TMO_EVENT:              /* time-out; 50 tick time-out */

  46.       break;



  47.     case SIG_EVENT:              /* signal received */

  48.          led1=~led1;

  49.      timechange();

  50.       display1();

  51.       break;

  52.       }      



  53.     lights();           

  54.   }

  55. }







  56. /******************************************************************************/

  57. /*    Task 3 'job3':  RTX-51 tiny starts this task with os_create_task (3)    */

  58. /******************************************************************************/

  59. job3 () _task_ 3  {



  60.    while (1)  {                        /* endless loop                         */

  61.    led3=~led3;

  62.    os_wait (K_TMO, 17, 0);

  63.      

  64.   }

  65. }

  66. #define uchar unsigned char

  67. #define uint  unsigned int

  68. #define ulong unsigned long



  69. #define LED8         P3





  70. //4????????P10~P13

  71. #define KeyPort         P0                              //??????P10~P13



  72. //???????,?BRCLK=CPU_F???????????,?????????????

  73. #define baud           9600                                //????????

  74. #define baud_setting   (uint)((ulong)CPU_F/((ulong)baud))  //???????

  75. #define baud_h         (uchar)(baud_setting>>8)            //????

  76. #define baud_l         (uchar)(baud_setting)               //??



  77. //RS485????,CTR????RS485????????

  78. #define RS485_CTR1      P1|= BIT2;          //?????,RS485????

  79. #define RS485_CTR0      P1&= ~BIT2;         //?????,RS485????



  80. //2.8?TFT????????????

  81. #define RS_CLR           P1 &= ~0x20           //RS??

  82. #define RS_SET           P1|=  0x20           //RS??



  83. #define RW_CLR           P1 &= ~0x40           //RW??

  84. #define RW_SET           P1 |=  0x40           //RW??



  85. #define RD_CLR           P1 &= ~0x80           //E??

  86. #define RD_SET           P1 |=  0x80           //E??



  87. #define CS_CLR           P1  &= ~BIT0            //CS??

  88. #define CS_SET           P1 |=  BIT0            //CS??



  89. #define RST_CLR           P1 &= ~BIT3            //RST??

  90. #define RST_SET           P1|=  BIT3            //RST??



  91. #define LE_CLR           P1 &= ~BIT1            //LE??

  92. #define LE_SET           P1|=  BIT1            //LE??



  93. //2.8?TFT?????????????

  94. #define PEN_CLR           P2 &= ~BIT0           //PEN??,??????,Penirq????????????????

  95. #define PEN_SET           P2|=  BIT0           //PEN??

  96. #define PEN             (P2 & 0x01)            //P2.0????



  97. #define TPDO_CLR   P2 &= ~BIT1           //TPDO??

  98. #define TPDO_SET   P2 |=  BIT1           //TPDO??

  99. #define TPDOUT          ((P2IN>>1)&0x01)         //P2.1????



  100. #define BUSY_CLR   P2 &= ~BIT3           //BUSY??

  101. #define BUSY_SET   P2 |=  BIT3           //BUSY??



  102. #define TPDI_CLR   P2 &= ~BIT4            //TPDI??

  103. #define TPDI_SET   P2 |=  BIT4            //TPDI??



  104. #define TPCS_CLR   P2 &= ~BIT5            //TPCS??

  105. #define TPCS_SET   P2 |=  BIT5            //TPCS??



  106. #define TPCLK_CLR   P2 &= ~BIT6            //TPCLK??

  107. #define TPCLK_SET   P2 |=  BIT6            //TPCLK??



  108. //??/12864??/1602??????,?????

  109. #define DataPort        P0                     //P4?????



  110. //12864/1602??????

  111. //#define RS_CLR           P2 &= ~BIT5           //RS??

  112. //#define RS_SET           P2 |=  BIT5           //RS??



  113. //#define RW_CLR           P2 &= ~BIT6           //RW??

  114. //#define RW_SET           P2 |=  BIT6           //RW??



  115. #define EN_CLR           P2 &= ~0x80           //E??

  116. #define EN_SET           P2 |=  0x80           //E??



  117. #define PSB_CLR           P2 &= ~BIT0            //PSB??,????

  118. #define PSB_SET           P2 |=  BIT0            //PSB??,????



  119. //#define RST_CLR           P5OUT &= ~BIT1            //RST??

  120. //#define RST_SET           P5OUT |= BIT1             //RST??



  121. //12864?????

  122. #define CLEAR_SCREEN   0x01                //????:???AC??00H

  123. #define AC_INIT      0x02                //?AC???00H??????????

  124. #define CURSE_ADD   0x06                //?????????????????(??????,??????)

  125. #define FUN_MODE   0x30                //????:8??????

  126. #define DISPLAY_ON   0x0c                //???,????,???????

  127. #define DISPLAY_OFF   0x08                //???

  128. #define CURSE_DIR   0x14                //??????:AC=AC+1

  129. #define SET_CG_AC   0x40                //??AC,???:00H~3FH

  130. #define SET_DD_AC   0x80                      //??DDRAM AC

  131. #define FUN_MODEK   0x36                //????:8??????



  132. //????,TFT???

  133. #define White          0xFFFF                                                  //??????

  134. #define Black          0x0000

  135. #define Blue           0x001F

  136. #define Blue2          0x051F

  137. #define Red            0xF800

  138. #define Magenta        0xF81F

  139. #define Green          0x07E0

  140. #define Cyan           0x7FFF

  141. #define Yellow         0xFFE0



  142. //NRF2401?????

  143. #define  RF24L01_CE_0        P1 &=~BIT5         //CE?P15        

  144. #define  RF24L01_CE_1        P1 |= BIT5      



  145. #define  RF24L01_CSN_0       P2 &=~BIT7         //CS?P27

  146. #define  RF24L01_CSN_1       P2 |= BIT7   



  147. #define  RF24L01_SCK_0       P3 &=~BIT3         //SCK?P33

  148. #define  RF24L01_SCK_1       P3 |= BIT3  



  149. #define  RF24L01_MISO_0      P3 &=~BIT2         //MISO?P32

  150. #define  RF24L01_MISO_1      P3 |= BIT2



  151. #define  RF24L01_MOSI_0      P3 &=~BIT1         //MOSI?P31

  152. #define  RF24L01_MOSI_1      P3 |= BIT1



  153. #define  RF24L01_IRQ_0       P1 &=~BIT4         //IRQ?P14   

  154. #define  RF24L01_IRQ_1       P1 |= BIT4







  155. //?????H1838???,????



  156. #define RED_L           P1 &= ~BIT6             //????

  157. #define RED_H           P1 |= BIT6             //????





  158. void delay_ms(uint x)

  159. {

  160. uchar i;

  161.    for(i=10;i--;i>0);

  162.    x--;

  163. }



  164. //***********************************************************************

  165. //   ?????????

  166. //***********************************************************************

  167. void LCD_write_com(unsigned char com)

  168. {  

  169.    RS_CLR;

  170.    RW_CLR;

  171.    EN_SET;

  172.    DataPort = com;                 //??????

  173.    delay_ms(5);

  174.    EN_CLR;

  175. }



  176. //***********************************************************************

  177. //   ?????????

  178. //***********************************************************************

  179. void LCD_write_data(unsigned char date )

  180. {

  181.    RS_SET;

  182.    RW_CLR;

  183.    EN_SET;

  184.    DataPort = date;                //??????

  185.    delay_ms(5);

  186.    EN_CLR;

  187. }



  188. //***********************************************************************

  189. //   ???????

  190. //***********************************************************************

  191. void LCD_clear(void)

  192. {

  193.    LCD_write_com(0x01);            //?????

  194.    delay_ms(5);

  195. }



  196. //***********************************************************************

  197. //   ??????????

  198. //***********************************************************************

  199. void LCD_write_str(unsigned char x,unsigned char y,unsigned char *s)

  200. {

  201.   

  202.     if (y == 0)

  203.     {

  204.        LCD_write_com(0x80 + x);        //?????

  205.     }

  206.     else

  207.     {

  208.        LCD_write_com(0xC0 + x);        //?????

  209.     }

  210.    

  211.     while (*s)

  212.     {

  213.        LCD_write_data( *s);

  214.        s ++;

  215.     }

  216. }



  217. //***********************************************************************

  218. //   ??????????

  219. //***********************************************************************

  220. void LCD_write_char(unsigned char x,unsigned char y,unsigned char date)

  221. {

  222.   

  223.     if (y == 0)

  224.     {

  225.        LCD_write_com(0x80 + x);        //?????

  226.     }

  227.     else

  228.     {

  229.        LCD_write_com(0xC0 + x);        //?????

  230.     }

  231.    

  232.     LCD_write_data( date);

  233. }



  234. //***********************************************************************

  235. //   ????????

  236. //***********************************************************************

  237. void LCD_init(void)

  238. {

  239.     LCD_write_com(0x38);      //??????

  240.     delay_ms(5);

  241.     LCD_write_com(0x08);      //????

  242.     delay_ms(5);

  243.     LCD_write_com(0x01);      //????

  244.     delay_ms(5);

  245.     LCD_write_com(0x06);      //????????

  246.     delay_ms(5);

  247.     LCD_write_com(0x0C);      //????????

  248.     delay_ms(5);

  249. }



  250. //***********************************************************************

  251. //      ?????????

  252. //***********************************************************************

  253. void LCD_Desk(void)

  254. {   

  255.   LCD_clear();

  256.   LCD_write_str(0,0,"A:");

  257.   LCD_write_str(0,1,"B:");

  258.   delay_ms(25);

  259. }



  260. #include"config.h"

  261. #include"1602.h"

  262. #include"time.h"

  263. extern void LCD_init();                         //?????????

  264. extern void LCD_clear();                        //??

  265. extern void LCD_Desk();

  266. extern void delay_ms(uint x);

  267. extern void LCD_write_com(unsigned char com);

  268. extern void LCD_write_data(unsigned char date );

  269. extern void LCD_clear(void);

  270. extern void LCD_write_str(unsigned char x,unsigned char y,unsigned char *s);

  271. extern void LCD_write_char(unsigned char x,unsigned char y,unsigned char date);

  272. extern void timechange();

  273. extern void setadd();

  274. extern void timeadd();

  275. extern void timedel();

  276. extern void lights(void);

  277. extern void readkey(void);

  278. extern void display1(void);

  279. void inint()

  280. { void LCD_init();                         //?????????

  281. void LCD_clear();                        //??

  282. void LCD_Desk();

  283. }



  284. uchar fre=0;

  285. bit flag=0,flag1=0;

  286. uint nian=2015;

  287. char time[6]={0,0,0,1,1,0},set=0;

  288. uchar yue[12]={31,28,31,30,31,30,31,31,30,30,31};

  289. uint locknian=2015;

  290. char lock[6]={0,10,0,1,1,0},lockset=0;

  291. sbit led0 =P0^0;

  292. sbit led1 =P0^1;

  293. sbit led2 =P0^2;

  294. sbit led3 =P0^3;

  295. void timechange(void)

  296. {

  297.    if(++time[0]==60)

  298.    {time[0]=0;

  299.       if(++time[1]==60)

  300.       {time[1]=0;

  301.          if(++time[2]==24)

  302.          {time[2]=0;

  303.             if(++time[3]==yue[time[4]-1]+1)

  304.             {time[3]=1;

  305.                if(++time[4]==13)

  306.                {time[4]=1;

  307.                nian++;

  308.                        

  309.                }

  310.             }

  311.                   {//½øDDÄêÔÂèÕÅD¶Ï

  312.       if(nian%4 !=0)  time[5]=0;  

  313.          else if(nian%400==0)  time[5]=0;

  314.             else if(nian%4==0)  time[5]=1;

  315.          if(time[5]==1)yue[1]=29;

  316.          if(time[5]==0)yue[1]=28;}

  317.                  

  318.          }

  319.       }

  320.    }



  321. }





  322. void setadd(void)

  323. { if(flag=1)

  324.    if(P1&0X0F==0X0F)

  325.    {

  326.    {if(++set==7)

  327.       set=1;

  328.       flag=0;

  329.    }

  330.   }

  331. }

  332. void timeadd(void)

  333. {

  334.    if(flag=1)

  335.    {if(flag1==0)

  336.    {switch(set-1)

  337.       {

  338.       default:break;

  339.      case 0|1:if(++time[set-1]==60) time[set-1]=0;break;

  340.       case 2:  if(++time[2]==24)    time[2]=0;break;

  341.       case 3:  if(++time[3]==yue[time[4]-1]+1) time[3]=1;break;

  342.       case 4:  if(++time[4]==13)time[4]=1;break;

  343.       case 5:  ++nian; break;

  344.       }

  345.    }

  346.    if(flag1==1)

  347.    {switch(set-1)

  348.       {

  349.       default:break;

  350.      case 0|1:if(++lock[set-1]==60) lock[set-1]=0;break;

  351.       case 2:  if(++lock[2]==24)    lock[2]=0;break;

  352.       case 3:  if(++lock[3]==yue[lock[4]-1]+1) lock[3]=1;break;

  353.       case 4:  if(++lock[4]==13)lock[4]=1;break;

  354.       case 5:  ++locknian; break;

  355.       }

  356.    }

  357.    flag=0;

  358. }  

  359. }



  360. void timedel(void)

  361. {

  362.    if(flag=1)

  363.    {if(flag1==0)

  364.    {switch(set-1)

  365.       {

  366.       default:break;

  367.      case 0|1:if(--time[set-1]==-1) time[set-1]=59;break;

  368.       case 2:  if(--time[2]==-1)    time[2]=23;break;

  369.       case 3:  if(--time[3]==0) time[3]=yue[time[4]-1];break;

  370.       case 4:  if(--time[4]==0) time[4]=12;break;

  371.       case 5:  --nian; break;

  372.       }

  373.    }

  374.    if(flag1==1)

  375.    {switch(set-1)

  376.       {

  377.       default:break;

  378.      case 0|1:if(--lock[set-1]==-1) lock[set-1]=59;break;

  379.       case 2:  if(--lock[2]==-1)    lock[2]=23;break;

  380.       case 3:  if(--lock[3]==0) lock[3]=yue[lock[4]-1];break;

  381.       case 4:  if(--lock[4]==0)lock[4]=12;break;

  382.       case 5:  --locknian; break;

  383.       }

  384.    }

  385.   flag=0;  

  386. }  

  387. }



  388. void lights(void)

  389. { if(flag==1)

  390.    {void display();

  391.    switch(set-1)

  392.    {

  393.    case 5:

  394.    LCD_write_char(0x02,0,' ');

  395.   LCD_write_char(0x03,0,' ');

  396.   LCD_write_char(0x04,0,' ');

  397.   LCD_write_char(0x05,0,' ');break;

  398.      

  399.   case 4:

  400.   LCD_write_char(0x07,0,' ');

  401.   LCD_write_char(0x08,0,' ');break;

  402.   

  403.   case 3:

  404.   LCD_write_char(0x0A,0,' ');

  405.   LCD_write_char(0x0B,0,' ');break;

  406.   

  407.    case 2:

  408.    LCD_write_char(0x02,1,' ');

  409.   LCD_write_char(0x03,1,' ');break;



  410.    case 1:

  411.   LCD_write_char(0x05,1,' ');

  412.   LCD_write_char(0x06,1,' ');break;



  413.    case 0:

  414.   LCD_write_char(0x08,1,' ');

  415.   LCD_write_char(0x09,1,' ');break;

  416.   

  417.    default:break;

  418.   }

  419.    os_wait (K_TMO, 20, 0);

  420.    if(++fre==25)

  421.       { set=0;

  422.          fre=0;

  423.          flag=0;

  424.       }

  425. }  

  426. }

  427. void readkey(void)

  428. {uchar keycode;

  429.   P1=0XbF;

  430.    keycode=P1&0X0F;

  431.    if(keycode!=0x0f)

  432.    {

  433.       os_wait (K_TMO, 1, 0);

  434.       keycode=P1&0X0F;

  435.      if(keycode!=0x0f)

  436.       {

  437.         os_wait (K_TMO, 200, 0);

  438.          os_wait (K_TMO, 200, 0);

  439.          os_wait (K_TMO, 200, 0);

  440.          os_wait (K_TMO, 200, 0);

  441.         

  442.          if(P1&0X0F==0X0F)

  443.          { fre=0;

  444.             flag=1;

  445.             switch(keycode)

  446.          {

  447.             default:break;

  448.             case  ~0xf1:setadd();break;

  449.             case ~0xf2:timeadd();break;

  450.            case ~0xf4: timedel();break;

  451.            case ~0xf8: flag1=~flag1;break;

  452.          }

  453.      

  454.       }

  455.        }

  456. }

  457. }



  458. void beep(uchar x)

  459. {  led2=0;

  460.    os_wait (K_TMO, 10, 0);

  461.    led2=1;

  462.    os_wait (K_TMO, x, 0);

  463.    led2=0;

  464. }



  465. void locktime()

  466. { led2=0;

  467.    if(nian==locknian)

  468.    {

  469.       if(time[4]==lock[4])

  470.       {

  471.          if(time[3]==lock[3])

  472.          {

  473.             if(time[2]==lock[2])

  474.             {

  475.                if(time[1]==lock[1])

  476.                beep(30);  

  477.             }

  478.               

  479.          }

  480.       }

  481.    }



  482. }



  483. void display1(void)

  484. {

  485.    LCD_write_char(0x00,0,0x30+time[5]);

  486.    LCD_write_char(0x02,0,0x30+nian/1000);

  487.   LCD_write_char(0x03,0,0x30+nian/100%10);

  488.   LCD_write_char(0x04,0,0x30+nian%100/10);

  489.   LCD_write_char(0x05,0,0X30+nian%10);



  490.   LCD_write_char(0x07,0,0x30+time[4]/10);

  491.   LCD_write_char(0x08,0,0x30+time[4]%10);

  492.   LCD_write_char(0x09,0,':');

  493.   LCD_write_char(0x0A,0,0X30+time[3]/10);

  494.   LCD_write_char(0x0B,0,0x30+time[3]%10);

  495.   

  496.    LCD_write_char(0x02,1,0x30+time[2]/10);

  497.   LCD_write_char(0x03,1,0x30+time[2]%10);

  498.   LCD_write_char(0x04,1,':');

  499.   LCD_write_char(0x05,1,0X30+time[1]/10);

  500.   LCD_write_char(0x06,1,0x30+time[1]%10);

  501.    LCD_write_char(0x07,1,':');

  502.   LCD_write_char(0x08,1,0x30+time[0]/10);

  503.   LCD_write_char(0x09,1,0x30+time[0]%10);





  504. }
复制代码


回复

使用道具 举报

ID:44267 发表于 2015-10-18 15:44 | 显示全部楼层
看不懂,先顶一下
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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