【无标题】

2.13蓝桥杯练习
题目如下:
请添加图片描述
写的时候遇到一个问题,就是LED闪烁。发现L1=~L1;不会闪。然后就定义了标志位u8 flagLED=1;还是不行,改成bit flagLED=1;可以了。

#include <REG52.H>

typedef unsigned char u8;
typedef unsigned int u16;

u8 SMGtab[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; 

sfr AUXR=0x8e;		//定义特殊功能寄存器
sbit S4 = P3^3;
sbit S5 = P3^2;
sbit S6 = P3^1;
sbit L1 = P0^0;

void Delay(u16 t)
{
	while(t--);
}

void SelectChannel(u8 Channel)
{
	switch (Channel)
	{
		case 4:P2 = (P2&0x1f)|0x80;break;	//选通LED
		case 5:P2 = (P2&0x1f)|0xA0;break;	//选通蜂鸣器、继电器等
		case 6:P2 = (P2&0x1f)|0xC0;break;	//选通数码管位选
		case 7:P2 = (P2&0x1f)|0xE0;break;	//选通数码管段选
		default:P2 &= 0x1f;break;			//都不选通
	}
}

void Init()		//初始化
{
	SelectChannel(5);P0 &= 0xBF;		//关闭蜂鸣器,开启为P0 |= 0x40;
	SelectChannel(5);P0 &= 0xEF;		//关闭继电器,开启为P0 |= 0x10;
	SelectChannel(4);P0 = 0xFF;		//关闭LED
}
void Timer0Init(void)		//10毫秒@11.0592MHz
{
	AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x00;		//设置定时初始值
	TH0 = 0xDC;		//设置定时初始值
	TF0 = 0;		//清除TF0标志
	TR0 = 0;		//定时器0不计时		
}
/*********************数码管开始*********************/
void SMGbit(u8 n,u8 value)
{
	SelectChannel(6);P0 = 0x01<<n;		//位选
	SelectChannel(7);P0 = value;		//段选
	Delay(500);						//消影
}
u16 sec=0;
void SMG_Time()
{
	SMGbit(5,0xBF);	//-
	
	SMGbit(6,SMGtab[sec/10]);	//sec十位
	SMGbit(7,SMGtab[sec%10]);	//sec个位
}
/*********************数码管结束*********************/
/*********************独立按键开始*********************/
u8 flag_time=0;		//时间切换标志位

void BTN()		//独立按键
{
	if(S4==0)	//切换计时时间
	{
		Delay(100);		//延时消抖
		if(S4==0)
		{
			flag_time++;
			if(flag_time>4)
			flag_time=1;
			switch (flag_time)
			{
				case 1:sec=1;break;
				case 2:sec=5;break;
				case 3:sec=30;break;
				case 4:sec=60;break;
				default:sec=0;break;
			}
			while(S4==0);		//按下时停在这里,防止按一次键多次触发该函数
		}
	}
	if(S5==0)	//确认并开始倒计时
	{
		Delay(100);
		if(S5==0)
		{
			TR0 = 1;	//定时器0开始计时
			while(S5==0);
		}
	}
	if(S6==0)	//L1熄灭
	{
		Delay(100);
		if(S6==0)
		{
			TR0 = 0;	//定时器0停止计时
			P0=0xff;
			SelectChannel(4);
			while(S6==0);
		}
	}
}
/*********************独立按键结束*********************/
u16 count;		//定时器计数,每10ms加一,以达到预定时间
bit flagLED=1;	//LED亮灭标志位。这样更严谨,因为L1=~L1;有时候会有问题。

void Timer0()			
{
	if(TF0 == 1)		//定时器0每10ms执行一次该函数
	{
		count++;
		if(count == 100 && sec > 0)
		{
			count=0;
			sec--;
		}
		if(count == 50 && sec == 0)
		{
			count=0;
			P0=0xff;
			SelectChannel(4);
			flagLED=~flagLED;
			L1=flagLED;		
		}
		TL0 = 0x00;		//设置定时初始值	
		TH0 = 0xDC;		//设置定时初始值
		TF0 = 0;		//清除定时溢出标志
	}		
}
/***********************************************************/

void main()
{
	Init();
	Timer0Init();
	while(1)
	{
		BTN();
		SMG_Time();
		Timer0();
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值