⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c_isr.c

📁 Cygnal C8051f系列单片机的flash存储器加密程序
💻 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 + -