📄 c_isr.c
字号:
#include <c8051F320.h> //c8051F320SFR的C51格式头文件
//C51采用中断实现
//-----------------------------------------------------------------------------
// 全局常量
//-----------------------------------------------------------------------------
#define uchar unsigned char
#define T2L_VAL 0xc0 //定时器2计时为4MS
#define T2H_VAL 0xe0
#define T3L_VAL 0xc0 //定时器3计时为20MS
#define T3H_VAL 0x63
//uchar seg[] = {0x81,0xcf,0x92,0x86,0xcc,0xa4,0xa0,0x8f,0x80,0x8c};
//uchar un_dig[] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb};
uchar code seg[] = {0x81,0xcf,0x92,0x86,0xcc,0xa4,0xa0,0x8f,0x80,0x8c};
uchar code un_dig[] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb};
//-----------------------------------------------------------------------------
// 全局变量
//-----------------------------------------------------------------------------
uchar dd,second_count,ring_tmr,second,minute,hour,tmr3_done;
uchar disbuf[6];
bit tmr2_done;
sbit RED_LED = P0^7;
sbit GREEN_LED = P1^0;
sbit RING = P1^1;
//-----------------------------------------------------------------------------
// 函数原型
//-----------------------------------------------------------------------------
extern void lock (void);
void SYSCLK_Init (void);
void PORT_Init (void);
void Timer2_Init (void);
void Timer2_ISR (void);
void Timer3_Init (void);
void Timer3_ISR (void);
uchar da_adjust(uchar da);
//-----------------------------------------------------------------------------
// MAIN Routine
//-----------------------------------------------------------------------------
void main (void)
{
PCA0MD &= ~0x40;
lock ();
SYSCLK_Init ();
PORT_Init ();
Timer2_Init ();
Timer3_Init();
dd=0;
second_count=50;
second = 0;
minute = 0;
hour = 0;
EA = 1;
PCA0CPH4 = 0;
while (1)
{
if (tmr2_done == 1&tmr3_done != 8)
{
PCA0CPH4 = 0;
tmr2_done = 0;
tmr3_done++;
}
}
}
//-----------------------------------------------------------------------------
// SYSCLK_Init
//-----------------------------------------------------------------------------
void SYSCLK_Init (void)
{
PCA0MD &= 0xb1;
PCA0CPL4 = 255;
PCA0MD |= 0x40;
CLKMUL |= 0x80;
CLKMUL |= 0xc0;
CLKSEL |= 0x02;
}
//-----------------------------------------------------------------------------
// PORT_Init
//-----------------------------------------------------------------------------
void PORT_Init (void)
{
XBR1 = 0xc0;
P0MDOUT |= 0x80;
P1MDOUT |= 0x01;
P2MDOUT |= 0x00;
RED_LED = 1;
GREEN_LED = 0;
RING = 1;
}
//-----------------------------------------------------------------------------
// Timer2_Init
//-----------------------------------------------------------------------------
void Timer2_Init ()
{
TMR2L = T2L_VAL;
TMR2H = T2H_VAL;
TMR2RLL = T2L_VAL;
TMR2RLH = T2H_VAL;
ET2 = 1;
TR2 = 1;
}
//-----------------------------------------------------------------------------
// Timer3_Init
//-----------------------------------------------------------------------------
void Timer3_Init ()
{
TMR3L = T3L_VAL;
TMR3H = T3H_VAL;
TMR3RLL = T3L_VAL;
TMR3RLH = T3H_VAL;
EIE1 |= 0x80;
TMR3CN = 0x04;
}
//-----------------------------------------------------------------------------
// da_adjust
//-----------------------------------------------------------------------------
uchar da_adjust(uchar da)
{
if((da&0x0f)>9) da+=0x06;
if((da&0xf0)>0x90) da+=0x60;
return (da);
}
//-----------------------------------------------------------------------------
// Interrupt Service Routines
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Timer2_ISR
//-----------------------------------------------------------------------------
void Timer2_ISR (void) interrupt 5
{
TF2H = 0;
P1 |= 0xfc;
P2=seg[disbuf[dd]];
P1&=un_dig[dd];
if(dd == 5) dd=0;
else dd++;
tmr2_done = 1;
}
//-----------------------------------------------------------------------------
// Timer3_ISR
//-----------------------------------------------------------------------------
void Timer3_ISR (void) interrupt 14
{
TMR3CN &= 0x7F;
if(second_count != 0) second_count--;
else
{
second_count = 50;
RING = 0;
GREEN_LED =~ GREEN_LED;
RED_LED =~ RED_LED;
if(second < 0x59)
{
second++;second = da_adjust(second);
ring_tmr = 5;
}
else
{
second = 0;
if(minute < 0x59)
{
minute++;minute = da_adjust(minute);
ring_tmr = 25;
}
else
{
minute = 0;
ring_tmr = 50;
if(hour < 0x23)
{
hour++;
hour = da_adjust(hour);
}
else hour = 0;
}
}
disbuf[0]=(hour&0xf0)>>4;
disbuf[1]=hour&0x0f;
disbuf[2]=(minute&0xf0)>>4;
disbuf[3]=minute&0x0f;
disbuf[4]=(second&0xf0)>>4;
disbuf[5]=second&0x0f;
}
if(ring_tmr != 0)
{
ring_tmr--;
if(ring_tmr == 0) RING = 1;
}
tmr3_done = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -