蓝桥杯-单片机组基础19——IO编程下的省赛模板

本文介绍了使用定时器0中断实现每20*50us周期刷新数码管显示的嵌入式程序,通过SMG_flag变量控制三个显示窗口,以及独立操作继电器和LED灯的函数设计。
摘要由CSDN通过智能技术生成

该模板采用定时计数器0中断,每隔20*50us去刷新一位数码管

定义了三个窗口,通过SMG_flag变量进行切换

定义了只针对继电器的操作函数,led的操作函数,其中蜂鸣器直接关闭

#include <reg52.h>
#include <intrins.h>

sbit AUXR = 0x8e;


unsigned char code duanma[18] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
                                 0x88,0x83,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};

//锁存器通道选择函数
void select_HC573 ( unsigned char channal )
{
	switch ( channal )
	{
		case 4:
			P2 = ( P2 & 0x1f ) | 0x80;
		break;
		case 5:
			P2 = ( P2 & 0x1f ) | 0xa0;
		break;
		case 6:
			P2 = ( P2 & 0x1f ) | 0xc0;
		break;
		case 7:
			P2 = ( P2 & 0x1f ) | 0xe0;
		break;
		case 0:
			P2 = ( P2 & 0x1f ) | 0x00;
		break;
	}
}

//单位数码管显示函数
void state_SMG ( unsigned char pos_SMG , unsigned char value_SMG )
{
	select_HC573 ( 0 );
	P0 = 0x01 << pos_SMG;	
	select_HC573( 6 );
	select_HC573 ( 0 );
	P0 = value_SMG;
	select_HC573( 7 );
	select_HC573 ( 0 );
}

//全位数码管静态显示
void state_SMG_all ( unsigned char value_SMG_all )
{
	select_HC573 ( 0 );
	P0 = 0xff;	
	select_HC573( 6 );
	select_HC573 ( 0 );
	P0 = value_SMG_all;
	select_HC573( 7 );
	select_HC573 ( 0 );
}	

//继电器单独操作函数
void state_relay ( unsigned char value_relay )
{
	select_HC573 ( 0 );	
	if ( value_relay == 0 )
	{
		P0 =0x00;
	}
	else
	{
		P0 =0x10;
	}
	select_HC573 ( 5 );
	select_HC573 ( 0 );
}

//led灯光控制函数
void state_led ( unsigned char value_led )
{
	select_HC573 ( 0 );
	P0 = 0xff;
	select_HC573 ( 4 );
	P0 = value_led;
	select_HC573 ( 4 );	
	select_HC573 ( 0 );
}

//初始化系统,关闭继电器和蜂鸣器
void init_sys ()
{
	select_HC573 ( 0 );
	P0 = 0xff;	
	select_HC573 ( 4 );
	select_HC573 ( 0 );
	P0 = 0x00;
	select_HC573 ( 5 );
	select_HC573 ( 0 );

}

//定时计数器0产生50us的中断,用于进行数码管的刷新
//===================================================================================
void init_timer0 (void)		//50微秒@12.000MHz
{
	AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x02;		//设置定时器模式
	TL0 = 0xCE;		//设置定时初值
	TH0 = 0xCE;		//设置定时重载值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	
	EA = 1;
	ET0 = 1;
}

unsigned char count_50us = 0;
unsigned char flash_count = 0;//数码管刷新位
void timer0_service () interrupt 1
{
	count_50us++;
	if ( count_50us % 50 == 0 ) //根据不同的SMG_flag切换不同的显示窗口
	{
		if ( SMG_flag == 1 )//窗口1
		{
			if ( ++flash_count > 5 )//其中的数字根据该窗口显示位数决定
			{
				flash_count = 0;
			}
		}
		else if ( SMG_flag == 2 )//窗口2
		{
			if ( ++flash_count == 8 )//其中的数字根据该窗口显示位数决定
			{
				flash_count = 0;
			}
		}
		else if ( SMG_flag == 3 )//窗口3
		{
			if ( ++flash_count > 4 )//其中的数字根据该窗口显示位数决定
			{
				flash_count = 0;
			}
		}
		flash_SMG ();	//刷新数码管一位	
	}

/*用于刷新其他函数	
	if ( count_50us == 200 )
	{
		count_50us = 0;
		flash_ds1302 = 1;
		if ( SMG_flag == 1 )
		{
			flash_temperature = 1;			
		}
	}
	
	if ( count_50us % 20 == 0 )
	{
		relay_ledrunning ();
	}
**/
	
}

	
void flash_SMG ()
{
	state_SMG_all ( 0xff );
	
	if ( SMG_flag == 1 )
	{
		switch ( flash_count )
		{
			case 0 :	
				state_SMG ( 0 , duanma[] );
			break;
			case 1 :	
				state_SMG ( 1 , duanma[] );
			break;
			case 2 :	
				state_SMG ( 5 , duanma[] );
			break;
			case 3 :	
				state_SMG ( 6 , duanma[] );
			break;
			case 4 :	
				state_SMG ( 7 , duanma[] );
			break;
			case 5 :	
				state_SMG_all ( 0xff );
			break;
		}
	}
	else if ( SMG_flag == 2 )
	{
		switch ( flash_count )
		{
			case 0 :	
				state_SMG ( 0 , duanma[] );
			break;
			case 1 :	
				state_SMG ( 1 , duanma[] );
			break;
			case 2 :	
				state_SMG ( 3 , duanma[] );
			break;
			case 3 :
				state_SMG ( 4 , duanma[] );				
			break;
			case 4 :	
				state_SMG ( 5 , duanma[] );
			break;
			case 5 :
				state_SMG ( 6 , duanma[] );			
			break;
			case 6 :	
				state_SMG ( 7 , duanma[] );
			break;
			case 7 :	
				state_SMG_all ( 0xff );
			break;
		}
	}		
	else if ( SMG_flag == 3 )
	{
		switch ( flash_count )
		{
			case 0 :	
				state_SMG ( 0 , duanma[] );
			break;
			case 1 :	
				state_SMG ( 1 , duanma[] );
			break;
			case 2 :	
				state_SMG ( 6 , duanma[] );
			break;
			case 3 :	
				state_SMG ( 7 , duanma[] );
			break;
			case 5 :	
				state_SMG_all ( 0xff );
			break;
		}
	}
}





















void main ()
{
	init_sys();
	init_timer0 ();
	
	while ( 1 )
	{
		
	}
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值