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

📄 led_time.c

📁 单片机开发资料 基于51单片机的单片机开发板 包括《实验例程
💻 C
字号:
/*******************************************************************************
*                                                                              *
*    File       : led_time.c                                                   *
*    Date       : 2007-09-10                                                   *
*    Version    : 1.0                                                          *
*    Powerd by  : shenyae86  QQ:184676957                                      *
********************************************************************************
*    Descriptoon:                                                              *
*                 LED数码管显示时钟程序                                        *
*                 操作顺序:                                                   *
*                      1.延时 启动等待 约400MS 待显示器进入工作状态            *
*                      2.LCDInit(); 显示器初始化 清屏...                       *
*                      3.延时片刻 约5MS 可不要                                 *
*                      4.写入字符 检测是否忙 继续写入                          *
*                                                                              *
* --- 管脚名 ---------- 管脚端口 ---- 变量名 ---------                         *
*     RW                   P26        LCD_RW          pin4                     *
*     RS                   P27        LCD_RS          pin5                     *
*     使能端               P25        LCD_E           pin6                     *
*     背光正               P21        LCD_light       pin15                    *
*     数据                 P0        LCD_Data        pin7-14                   *
*                                                                              *
*******************************************************************************/

//                 AN1---时调整                                                
//                 AN2---分调整                                                
//                上电时初始化显示:  12-00-00                                 
#include <reg51.h>
#include <intrins.h>

unsigned char data dis_digit;
unsigned char key_s, key_v;
unsigned int i;
unsigned char code dis_code[11]={0xc0,0xf9,0xa4,0xb0,	// 0, 1, 2, 3
				0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};// 4, 5, 6, 7, 8, 9, off 
unsigned char data dis_buf[8];
unsigned char data dis_index;
unsigned char hour,min,sec;
unsigned char sec100,bell_flag; 
sbit	AN1 = P3^4;
sbit	AN2 = P3^5;
sbit	AN3 = P3^2;
sbit	AN4 = P3^3;
sbit    led = P3^6;
sbit    bell= P3^7;
bit scan_key();
void proc_key();
void inc_sec();
void inc_min();
void inc_hour();
void display();
void delayms(unsigned char ms);

void main(void)
{
	P1 = 0xff;
	P2 = 0xff;
	TMOD = 0x11;		// 定时器0, 1工作模式1, 16位定时方式
	TH0 = 0xD8;
	TL0 = 0XEF;
    bell_flag=0;
	TH1 = 0xFC;
	TL1 = 0x17;
	hour = 12;
	min = 00;
	sec = 00;
    bell=1;
	sec100 = 0;
	dis_buf[0] = 0xbf;						// 显示"-"
	dis_buf[1] = 0xbf;						// 显示"-"
	dis_buf[2] = 0xff;	                	// 秒十位
	dis_buf[3] = dis_code[sec % 10];		// 秒个位
	dis_buf[4] = dis_code[hour / 10];		// 时十位
	dis_buf[5] = dis_code[hour % 10]& 0x7f;	// 时个位
	dis_buf[6] = dis_code[min / 10];		// 分十位
	dis_buf[7] = dis_code[min % 10];		// 分个位			
	dis_digit = 0xfe;
	dis_index = 0;
	IE = 0x8a;				// 使能timer0,1 中断	
	TR0 = 1;
	TR1 = 1;

	key_v = 0x03;//11b
	dis_digit = _crol_(dis_digit,4);	// 位选通值左移, 下次按键时左移一位
	while(1)
	{
		if(scan_key())
		{
			delayms(10);
			if(scan_key())
			{
				key_v = key_s;
				proc_key();
			}
		}
		if(AN3==0)
		{	
		delayms(200);
        if(AN3==0)
		dis_digit = _crol_(dis_digit,4);	// 位选通值左移, 下次按键时左移一位
		}
	}
}

bit scan_key()
{
	key_s = 0x00;
	key_s |= AN2;
	key_s <<= 1;
	key_s |= AN1;
	return(key_s ^ key_v);	
}

void proc_key()
{
	EA = 0;
	if((key_v & 0x01) == 0)		// AN1
	{
		inc_hour();
	}
	else if((key_v & 0x02) == 0)	// AN2
	{
		min++;
		if(min > 59)
		{
			min = 0;
		}
		dis_buf[6] = dis_code[min / 10];		// 分十位
		dis_buf[7] = dis_code[min % 10];		// 分个位
	}

	EA = 1;
}

void timer1() interrupt 3
// 定时器0中断服务程序, 用于数码管的动态扫描
// dis_index --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量
// dis_digit --- 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时,
//				选通P2.0口数码管
// dis_buf   --- 显于缓冲区基地址	
{
	TH1 = 0xFC;
	TL1 = 0x17;
	
	P2 = 0xff;							// 先关闭所有数码管
	P1 = dis_buf[dis_index];			// 显示代码传送到P0口
	P2 = dis_digit;						// 

	dis_digit = _crol_(dis_digit,1);	// 位选通值左移, 下次中断时选通下一位数码管
	dis_index++;						// 
					
	dis_index &= 0x07;			// 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描
} 

void timer0() interrupt 1
{
	TH0 = 0xd8;
	TL0 = 0xEF;	
	sec100++;
	if(hour==7)
    {
    if(min==15)
 	bell_flag=1;
	}
	else
	bell=1;
	if(sec100%50==0)
	{
	   led=~led;
	   if(bell_flag==1) 
	   {
	   bell=~bell;
       i++;
	   if(i>6000) {bell_flag=0;i=0;}//报警时间次数到,关闭状态,次数清零
    	}
    	if(dis_buf[5]>127) 
    	dis_buf[5]&=0x7f;
	    else  
    	dis_buf[5]|=0x80;
	}
	if(sec100 >= 100)
	{
		sec100 = 0;
		inc_sec();
	}
}

void inc_sec()
{
	sec++;
	if(sec > 59)
	{
		sec = 0;
		inc_min();
	}
	dis_buf[0] = dis_code[sec / 10];		// 秒十位
	dis_buf[1] = dis_code[sec % 10];		// 秒个位	
}

void inc_min()
{
	min++;
	if(min > 59)
	{
		min = 0;
		inc_hour();
	}
	dis_buf[6] = dis_code[min / 10];		// 分十位
	dis_buf[7] = dis_code[min % 10];		// 分个位
}

void inc_hour()
{
	hour++;
	if(hour > 23)
	{
		hour = 0;
	}
	if(hour > 9)
		dis_buf[4] = dis_code[hour / 10];		// 时十位
	else
		dis_buf[4] = 0xc0;					// 当小时的十位为0时不显示
	dis_buf[5] = dis_code[hour % 10]& 0x7f;		// 时个位

}

void delayms(unsigned char ms)	
// 延时子程序
{						
	unsigned char i;
	while(ms--)
	{
		for(i = 0; i < 120; i++);
	}
}

⌨️ 快捷键说明

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