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

📄 ex5.c

📁 C51定时器应用-实时时钟
💻 C
字号:

#include "upsd.h"			//引入关于upsd的特殊功能寄存器的声明的头文件

xdata unsigned char	CONTROL_B _at_ 0x803;
xdata unsigned char	DATAOUT_B _at_ 0x805;
xdata unsigned char	DIRECTION_B	_at_ 0x807;
unsigned char position;			// LED的位码存储单元
unsigned char a[8];				// 8字节长显示缓冲区
unsigned char *disp_ptr;		// 显示缓冲区的指针

unsigned char code led_code[11] = {0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0xff};	
//数字码表0-9,LED无显示时对应码值为0xff

#define TIMER0_COUNT 0xf8CD		// TH0=0xf8,TL0=0xcd,在11.0592MHz的晶振频率下,可实现2ms的计数
bit timer0int;				// timer0int是定时器0的中断标志位

unsigned char second,minute,hour;	// 时钟的时分秒计时单元

/**********初始化定时器0**********/
void timer0_init(void)		
{
	TMOD &= 0xf0;
	TMOD |= 0x01;			// 定时器0,工作方式为方式1
	TL0 = (TIMER0_COUNT & 0x00ff);	// 设置低8位计数值
	TH0 = (TIMER0_COUNT >> 8);		// 设置高8位计数值
	PT0 = 0;				// 低优先级
	ET0 = 1;				// 使能定时器0中断源	
	EA = 1;					// 允许所有中断源
	TR0 = 1;				// 启动定时器0
	timer0int = 0;			// 初始化定时器0的中断标志timer0int为0
}
/*定时器0的中断服务程序,每次中断置中断标志位*/
void timer0isr(void) interrupt 1						
{	
	TL0 = TL0 + (TIMER0_COUNT & 0x00FF);	// 重载低8位计数值
	TH0 = TH0 + (TIMER0_COUNT >> 8);		// 重载高8位计数值
 	timer0int = 1;			// 置中断标志
}
/****24小时制的时钟的秒加1更新****/
void clockinc(void)
{
	if(++second == 60)		// 秒计数值加1
	{	
		second = 0;			// 计时满1分钟,秒计时单元清零
		if(++minute == 60)	// 分钟计数值加1
		{	
			minute = 0;		// 计时满1小时,分计时单元清零
			if(++hour == 24) hour = 0;		// 小时计数值加1,加至24时清零										
		}					
	}
}
/********LED显示的初始化********/
void led_init(void)			
{
	CONTROL_B = 0;			// 初始化PB口为MCU模式
	DATAOUT_B = 0;			// 将PB口的输出数据寄存器清零
	DIRECTION_B = 0xff;		// PB口数据传输方向为输出
	position = 0x80;		// 初始化位码为0x80
	disp_ptr = &a;			// 初始化显示缓冲区指针disp_ptr指向a[0]
}
/*将时分秒以非压缩BCD码的形式装载到显示缓冲区*/
void load_buff(void)
{
	a[0] = hour/10;		a[1] = hour%10;		// 将小时的高位送到a[0],低位到a[1]
	a[2] = minute/10;	a[3] = minute%10;	
	a[4] = second/10;	a[5] = second%10;	
	a[6] = 10;			a[7] = 10;			// a[6],a[7]赋值10,LED无显示内容
}
/*1位LED显示,并更新位码和显示缓冲指针*/	
void display(void)			
{	
	P4 = 0xff;				// 熄影
	DATAOUT_B = position;			// 输出位码
	position = position>>1;			// 更新位码
	if(position == 0) position = 0x80;
	P4 = led_code[*disp_ptr++];		// 输出段码
	if(position == 0x80) disp_ptr = &a;		// 更新显示缓冲指针
}

main()
{	
	unsigned int i = 0;	
	WDKEY = 0x55;			// 关看门狗定时器
	second = 0;	minute = 59; hour = 23;			// 初始化时钟
	timer0_init();
	led_init();	
	load_buff();

 	for(;;)
    {	
    	if(timer0int)	
      	{	
      		timer0int=0;		// 2ms到,清中断标志	
			display();			// LED显示								
			if(++i == 500)				
	   	  	{	
	   	  		i = 0;	    	// 1秒到,i清零 	   	
	  		    clockinc();		// 24小时制的时钟进行秒加1更新
				load_buff();	// 更新显示缓冲区
		 	}
		}		 		   		
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -