蓝桥杯之单片机设计与开发(2)——流水灯、数码管之单片机设计与开发

目录

0、工程建立

1、流水灯

2、数码管


2019.01.22最新更新

0、工程建立

昨天写了一会程序,感觉之前说的那种建立工程的方法虽然有序,但是很麻烦,每个头文件都需要在设置里设置包含文件夹,经过考虑,现在将其改为整个工程就只使用一个头文件 sys.h ,单独存放在INC文件夹中

然后再设置

包含头文件所在的文件夹就好了,这样的话,每个C文件都包含同一个H文件。

1、流水灯

流水灯很好实现,相信每个人入门单片机写的第一个程序都是流水灯,之前我们写流水灯大多使用delay程序,但是在这里我建议所有的延时均使用定时器实现,尽可能不使用delay。

我们使用定时器0作为定时器,初始化定时器0

//定时器0初始化
void Time0_Init(void)
{
	AUXR |= 0x80;	//定时器时钟1T模式
	TMOD &= 0xF0;	//设置定时器模式
	TL0 = 0x00;	//设置定时初值5ms
	TH0 = 0x28;	//设置定时初值5ms
	TF0 = 0;	//清除TF0标志
	ET0 = 1;	//允许定时器0中断
	TR0 = 1;	//定时器0开始计时
	EA = 1;		//开总中断
}

流水灯实现使用 intrins.h 中的循环移位函数实现

//main.c

uchar Led_dat;

void main(void)
{
	All_Init();
	Time0_Init();
	Led_dat = 0xfe;
	while(1)
	{
		Led_illume(Led_dat);
	}
}

//led.c

//点亮LED
void Led_illume(uchar dat)
{
	P2 = (P2 & 0x1f) | 0x80;	//打开Y4C(LED)
	P0 = dat;			//点亮LED
}

//sys.c

//定时器0中断程序
void Time0(void) interrupt 1
{
	static uint t0 = 0;

	t0 ++;
	if(t0 == 200)
	{
		Led_dat = _cror_(Led_dat,1);
		t0 = 0;
	}
}

以上就是最简单的流水灯实现。

2、数码管

开发板所使用的数码管为共阳数码管,所以数码管的码字一定要知道,不知道也要会推。

uchar code Nixie[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
                      0x88,0x83,0xc6,0xa1,0x86,0x8e};	//共阳数码管码字

共阳数码管0~F的码字如上代码所示。

比如我现在使用定时器写一个时钟,用数码管显示的程序。

//Nixie.c
uchar code Nixie[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
                        0x88,0x83,0xc6,0xa1,0x86,0x8e};	//共阳数码管码字
uchar NixieBuff[] = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};	//数码管显示缓冲区,初值0xff确保启动时都不亮
uchar code Symbol[] = {0xff,0xbf};	//全灭,-

uchar smg1,smg2,smg3,smg4,smg5,smg6,smg7,smg8;

//数码管显示
void Nixie_Scan(void)
{
	static uchar index = 0;
	P2 = (P2 & 0x1f) | 0xe0;	//数码管消隐
	P0 =0xff;
	
	P2 = (P2 & 0x1f) | 0xc0;	//数码管片选
	P0 = 0x01 << index;
	
	P2 = (P2 & 0x1f) | 0xe0;	//数码管段选
	P0 = NixieBuff[index];
	P2 &= 0x1f;
	index ++;
	index &= 0x07;
}

//数码管显示
void Nixie_Show(void)
{
	NixieBuff[0] = Nixie[smg1];
	NixieBuff[1] = Nixie[smg2];
	NixieBuff[2] = Symbol[smg3];
	NixieBuff[3] = Nixie[smg4];
	NixieBuff[4] = Nixie[smg5];
	NixieBuff[5] = Symbol[smg6];
	NixieBuff[6] = Nixie[smg7];
	NixieBuff[7] = Nixie[smg8];
}


//时钟处理
void Deal_time(void)
{
	if(sec == 60)
	{
		min ++;
		sec = 0;
		if(min == 60)
		{
			hour ++;
			min = 0;
			if(hour == 24)
				hour = 0;
		}
	}
	smg1 = hour / 10;
	smg2 = hour % 10;
	smg4 = min / 10;
	smg5 = min % 10;
	smg7 = sec / 10;
	smg8 = sec % 10;
	if(smg8 % 2 == 0)
	{
		smg3 = 1;
		smg6 = 1;
	}
	else
	{
		smg3 = 0;
		smg6 = 0;
	}
}


//sys.c
//定时器0初始化
void Time0_Init(void)
{
	AUXR |= 0x80;	//定时器时钟1T模式
	TMOD &= 0xF0;	//设置定时器模式
	TL0 = 0xcd;	//设置定时初值1ms
	TH0 = 0xd4;	//设置定时初值1ms
	TF0 = 0;	//清除TF0标志
	ET0 = 1;	//允许定时器0中断
	TR0 = 1;	//定时器0开始计时
	EA = 1;		//开总中断
}

//定时器0中断程序
void Time0(void) interrupt 1
{
	static uint t0 = 0;

	t0 ++;
	if(t0 == 1000)
	{
		Led_dat = _cror_(Led_dat,1);
		t0 = 0;
		sec ++;
	}
	Deal_time();
	Nixie_Show();
	Nixie_Scan();
}


 

 

 

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值