標題:
單片機鬧鐘源程序
[打印本頁]
作者:
sans
時間:
2015-4-7 01:02
標題:
單片機鬧鐘源程序
下圖led2波形密集處即開始進行鬧鐘的地方。
4個按鍵進行調(diào)整,+,—,定時或者定鬧鐘用;
寫了一下午寫好了,但還需要完善。
時鐘精度很高,一小時0.1s
鬧鐘源程序
/******************************************************************************/
/* */
/* RTX_EX2.C: A RTX-51 Application */
/* */
/******************************************************************************/
#include <rtx51tny.h> /* RTX-51 tiny functions & defines */
#include"reg51.h"
#include"display.h"
/******************************************************************************/
/* Task 2 'job2': RTX-51 tiny starts this task with os_create_task (2) */
/******************************************************************************/
job0 () _task_ 0 {
inint();
os_create_task (1); /* start task 1 */
os_create_task (2); /* start task 2 */
os_create_task (3); /* start task 3 */
while (1) { /* endless loop */
led2=0;
readkey();
locktime();
}
}
/******************************************************************************/
/* Task 0 'job0': RTX-51 tiny starts execution with task 0 */
/******************************************************************************/
job1 () _task_ 1 {
while (1) { /* endless loop */
led0=~led0;
os_wait (K_TMO, 100, 0); /* wait for timeout: 5 ticks */
isr_send_signal(2);
}
}
/******************************************************************************/
/* Task 1 'job1': RTX-51 tiny starts this task with os_create_task (1) */
/******************************************************************************/
job2 () _task_ 2 {
char event;
while (1) { /* endless loop */
event = os_wait (K_SIG | K_TMO, 1, 0);
switch (event)
{
default: /* this never happens */
break;
case TMO_EVENT: /* time-out; 50 tick time-out */
break;
case SIG_EVENT: /* signal received */
led1=~led1;
timechange();
display1();
break;
}
lights();
}
}
/******************************************************************************/
/* Task 3 'job3': RTX-51 tiny starts this task with os_create_task (3) */
/******************************************************************************/
job3 () _task_ 3 {
while (1) { /* endless loop */
led3=~led3;
os_wait (K_TMO, 17, 0);
}
}
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define LED8 P3
//4????????P10~P13
#define KeyPort P0 //??????P10~P13
//???????,?BRCLK=CPU_F???????????,?????????????
#define baud 9600 //????????
#define baud_setting (uint)((ulong)CPU_F/((ulong)baud)) //???????
#define baud_h (uchar)(baud_setting>>8) //????
#define baud_l (uchar)(baud_setting) //??
//RS485????,CTR????RS485????????
#define RS485_CTR1 P1|= BIT2; //?????,RS485????
#define RS485_CTR0 P1&= ~BIT2; //?????,RS485????
//2.8?TFT????????????
#define RS_CLR P1 &= ~0x20 //RS??
#define RS_SET P1|= 0x20 //RS??
#define RW_CLR P1 &= ~0x40 //RW??
#define RW_SET P1 |= 0x40 //RW??
#define RD_CLR P1 &= ~0x80 //E??
#define RD_SET P1 |= 0x80 //E??
#define CS_CLR P1 &= ~BIT0 //CS??
#define CS_SET P1 |= BIT0 //CS??
#define RST_CLR P1 &= ~BIT3 //RST??
#define RST_SET P1|= BIT3 //RST??
#define LE_CLR P1 &= ~BIT1 //LE??
#define LE_SET P1|= BIT1 //LE??
//2.8?TFT?????????????
#define PEN_CLR P2 &= ~BIT0 //PEN??,??????,Penirq????????????????
#define PEN_SET P2|= BIT0 //PEN??
#define PEN (P2 & 0x01) //P2.0????
#define TPDO_CLR P2 &= ~BIT1 //TPDO??
#define TPDO_SET P2 |= BIT1 //TPDO??
#define TPDOUT ((P2IN>>1)&0x01) //P2.1????
#define BUSY_CLR P2 &= ~BIT3 //BUSY??
#define BUSY_SET P2 |= BIT3 //BUSY??
#define TPDI_CLR P2 &= ~BIT4 //TPDI??
#define TPDI_SET P2 |= BIT4 //TPDI??
#define TPCS_CLR P2 &= ~BIT5 //TPCS??
#define TPCS_SET P2 |= BIT5 //TPCS??
#define TPCLK_CLR P2 &= ~BIT6 //TPCLK??
#define TPCLK_SET P2 |= BIT6 //TPCLK??
//??/12864??/1602??????,?????
#define DataPort P0 //P4?????
//12864/1602??????
//#define RS_CLR P2 &= ~BIT5 //RS??
//#define RS_SET P2 |= BIT5 //RS??
//#define RW_CLR P2 &= ~BIT6 //RW??
//#define RW_SET P2 |= BIT6 //RW??
#define EN_CLR P2 &= ~0x80 //E??
#define EN_SET P2 |= 0x80 //E??
#define PSB_CLR P2 &= ~BIT0 //PSB??,????
#define PSB_SET P2 |= BIT0 //PSB??,????
//#define RST_CLR P5OUT &= ~BIT1 //RST??
//#define RST_SET P5OUT |= BIT1 //RST??
//12864?????
#define CLEAR_SCREEN 0x01 //????:???AC??00H
#define AC_INIT 0x02 //?AC???00H??????????
#define CURSE_ADD 0x06 //?????????????????(??????,??????)
#define FUN_MODE 0x30 //????:8??????
#define DISPLAY_ON 0x0c //???,????,???????
#define DISPLAY_OFF 0x08 //???
#define CURSE_DIR 0x14 //??????:AC=AC+1
#define SET_CG_AC 0x40 //??AC,???:00H~3FH
#define SET_DD_AC 0x80 //??DDRAM AC
#define FUN_MODEK 0x36 //????:8??????
//????,TFT???
#define White 0xFFFF //??????
#define Black 0x0000
#define Blue 0x001F
#define Blue2 0x051F
#define Red 0xF800
#define Magenta 0xF81F
#define Green 0x07E0
#define Cyan 0x7FFF
#define Yellow 0xFFE0
//NRF2401?????
#define RF24L01_CE_0 P1 &=~BIT5 //CE?P15
#define RF24L01_CE_1 P1 |= BIT5
#define RF24L01_CSN_0 P2 &=~BIT7 //CS?P27
#define RF24L01_CSN_1 P2 |= BIT7
#define RF24L01_SCK_0 P3 &=~BIT3 //SCK?P33
#define RF24L01_SCK_1 P3 |= BIT3
#define RF24L01_MISO_0 P3 &=~BIT2 //MISO?P32
#define RF24L01_MISO_1 P3 |= BIT2
#define RF24L01_MOSI_0 P3 &=~BIT1 //MOSI?P31
#define RF24L01_MOSI_1 P3 |= BIT1
#define RF24L01_IRQ_0 P1 &=~BIT4 //IRQ?P14
#define RF24L01_IRQ_1 P1 |= BIT4
//?????H1838???,????
#define RED_L P1 &= ~BIT6 //????
#define RED_H P1 |= BIT6 //????
void delay_ms(uint x)
{
uchar i;
for(i=10;i--;i>0);
x--;
}
//***********************************************************************
// ?????????
//***********************************************************************
void LCD_write_com(unsigned char com)
{
RS_CLR;
RW_CLR;
EN_SET;
DataPort = com; //??????
delay_ms(5);
EN_CLR;
}
//***********************************************************************
// ?????????
//***********************************************************************
void LCD_write_data(unsigned char date )
{
RS_SET;
RW_CLR;
EN_SET;
DataPort = date; //??????
delay_ms(5);
EN_CLR;
}
//***********************************************************************
// ???????
//***********************************************************************
void LCD_clear(void)
{
LCD_write_com(0x01); //?????
delay_ms(5);
}
//***********************************************************************
// ??????????
//***********************************************************************
void LCD_write_str(unsigned char x,unsigned char y,unsigned char *s)
{
if (y == 0)
{
LCD_write_com(0x80 + x); //?????
}
else
{
LCD_write_com(0xC0 + x); //?????
}
while (*s)
{
LCD_write_data( *s);
s ++;
}
}
//***********************************************************************
// ??????????
//***********************************************************************
void LCD_write_char(unsigned char x,unsigned char y,unsigned char date)
{
if (y == 0)
{
LCD_write_com(0x80 + x); //?????
}
else
{
LCD_write_com(0xC0 + x); //?????
}
LCD_write_data( date);
}
//***********************************************************************
// ????????
//***********************************************************************
void LCD_init(void)
{
LCD_write_com(0x38); //??????
delay_ms(5);
LCD_write_com(0x08); //????
delay_ms(5);
LCD_write_com(0x01); //????
delay_ms(5);
LCD_write_com(0x06); //????????
delay_ms(5);
LCD_write_com(0x0C); //????????
delay_ms(5);
}
//***********************************************************************
// ?????????
//***********************************************************************
void LCD_Desk(void)
{
LCD_clear();
LCD_write_str(0,0,"A:");
LCD_write_str(0,1,"B:");
delay_ms(25);
}
#include"config.h"
#include"1602.h"
#include"time.h"
extern void LCD_init(); //?????????
extern void LCD_clear(); //??
extern void LCD_Desk();
extern void delay_ms(uint x);
extern void LCD_write_com(unsigned char com);
extern void LCD_write_data(unsigned char date );
extern void LCD_clear(void);
extern void LCD_write_str(unsigned char x,unsigned char y,unsigned char *s);
extern void LCD_write_char(unsigned char x,unsigned char y,unsigned char date);
extern void timechange();
extern void setadd();
extern void timeadd();
extern void timedel();
extern void lights(void);
extern void readkey(void);
extern void display1(void);
void inint()
{ void LCD_init(); //?????????
void LCD_clear(); //??
void LCD_Desk();
}
uchar fre=0;
bit flag=0,flag1=0;
uint nian=2015;
char time[6]={0,0,0,1,1,0},set=0;
uchar yue[12]={31,28,31,30,31,30,31,31,30,30,31};
uint locknian=2015;
char lock[6]={0,10,0,1,1,0},lockset=0;
sbit led0 =P0^0;
sbit led1 =P0^1;
sbit led2 =P0^2;
sbit led3 =P0^3;
void timechange(void)
{
if(++time[0]==60)
{time[0]=0;
if(++time[1]==60)
{time[1]=0;
if(++time[2]==24)
{time[2]=0;
if(++time[3]==yue[time[4]-1]+1)
{time[3]=1;
if(++time[4]==13)
{time[4]=1;
nian++;
}
}
{//½øDDÄêÔÂèÕÅD¶Ï
if(nian%4 !=0) time[5]=0;
else if(nian%400==0) time[5]=0;
else if(nian%4==0) time[5]=1;
if(time[5]==1)yue[1]=29;
if(time[5]==0)yue[1]=28;}
}
}
}
}
void setadd(void)
{ if(flag=1)
if(P1&0X0F==0X0F)
{
{if(++set==7)
set=1;
flag=0;
}
}
}
void timeadd(void)
{
if(flag=1)
{if(flag1==0)
{switch(set-1)
{
default:break;
case 0|1:if(++time[set-1]==60) time[set-1]=0;break;
case 2: if(++time[2]==24) time[2]=0;break;
case 3: if(++time[3]==yue[time[4]-1]+1) time[3]=1;break;
case 4: if(++time[4]==13)time[4]=1;break;
case 5: ++nian; break;
}
}
if(flag1==1)
{switch(set-1)
{
default:break;
case 0|1:if(++lock[set-1]==60) lock[set-1]=0;break;
case 2: if(++lock[2]==24) lock[2]=0;break;
case 3: if(++lock[3]==yue[lock[4]-1]+1) lock[3]=1;break;
case 4: if(++lock[4]==13)lock[4]=1;break;
case 5: ++locknian; break;
}
}
flag=0;
}
}
void timedel(void)
{
if(flag=1)
{if(flag1==0)
{switch(set-1)
{
default:break;
case 0|1:if(--time[set-1]==-1) time[set-1]=59;break;
case 2: if(--time[2]==-1) time[2]=23;break;
case 3: if(--time[3]==0) time[3]=yue[time[4]-1];break;
case 4: if(--time[4]==0) time[4]=12;break;
case 5: --nian; break;
}
}
if(flag1==1)
{switch(set-1)
{
default:break;
case 0|1:if(--lock[set-1]==-1) lock[set-1]=59;break;
case 2: if(--lock[2]==-1) lock[2]=23;break;
case 3: if(--lock[3]==0) lock[3]=yue[lock[4]-1];break;
case 4: if(--lock[4]==0)lock[4]=12;break;
case 5: --locknian; break;
}
}
flag=0;
}
}
void lights(void)
{ if(flag==1)
{void display();
switch(set-1)
{
case 5:
LCD_write_char(0x02,0,' ');
LCD_write_char(0x03,0,' ');
LCD_write_char(0x04,0,' ');
LCD_write_char(0x05,0,' ');break;
case 4:
LCD_write_char(0x07,0,' ');
LCD_write_char(0x08,0,' ');break;
case 3:
LCD_write_char(0x0A,0,' ');
LCD_write_char(0x0B,0,' ');break;
case 2:
LCD_write_char(0x02,1,' ');
LCD_write_char(0x03,1,' ');break;
case 1:
LCD_write_char(0x05,1,' ');
LCD_write_char(0x06,1,' ');break;
case 0:
LCD_write_char(0x08,1,' ');
LCD_write_char(0x09,1,' ');break;
default:break;
}
os_wait (K_TMO, 20, 0);
if(++fre==25)
{ set=0;
fre=0;
flag=0;
}
}
}
void readkey(void)
{uchar keycode;
P1=0XbF;
keycode=P1&0X0F;
if(keycode!=0x0f)
{
os_wait (K_TMO, 1, 0);
keycode=P1&0X0F;
if(keycode!=0x0f)
{
os_wait (K_TMO, 200, 0);
os_wait (K_TMO, 200, 0);
os_wait (K_TMO, 200, 0);
os_wait (K_TMO, 200, 0);
if(P1&0X0F==0X0F)
{ fre=0;
flag=1;
switch(keycode)
{
default:break;
case ~0xf1:setadd();break;
case ~0xf2:timeadd();break;
case ~0xf4: timedel();break;
case ~0xf8: flag1=~flag1;break;
}
}
}
}
}
void beep(uchar x)
{ led2=0;
os_wait (K_TMO, 10, 0);
led2=1;
os_wait (K_TMO, x, 0);
led2=0;
}
void locktime()
{ led2=0;
if(nian==locknian)
{
if(time[4]==lock[4])
{
if(time[3]==lock[3])
{
if(time[2]==lock[2])
{
if(time[1]==lock[1])
beep(30);
}
}
}
}
}
void display1(void)
{
LCD_write_char(0x00,0,0x30+time[5]);
LCD_write_char(0x02,0,0x30+nian/1000);
LCD_write_char(0x03,0,0x30+nian/100%10);
LCD_write_char(0x04,0,0x30+nian%100/10);
LCD_write_char(0x05,0,0X30+nian%10);
LCD_write_char(0x07,0,0x30+time[4]/10);
LCD_write_char(0x08,0,0x30+time[4]%10);
LCD_write_char(0x09,0,':');
LCD_write_char(0x0A,0,0X30+time[3]/10);
LCD_write_char(0x0B,0,0x30+time[3]%10);
LCD_write_char(0x02,1,0x30+time[2]/10);
LCD_write_char(0x03,1,0x30+time[2]%10);
LCD_write_char(0x04,1,':');
LCD_write_char(0x05,1,0X30+time[1]/10);
LCD_write_char(0x06,1,0x30+time[1]%10);
LCD_write_char(0x07,1,':');
LCD_write_char(0x08,1,0x30+time[0]/10);
LCD_write_char(0x09,1,0x30+time[0]%10);
}
復制代碼
作者:
ludaijin
時間:
2015-10-18 15:44
看不懂,先頂一下
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1