#循循渐进学5单片机#中断与数码管动态显示#not.5

1、掌握C语言数组的概念、定义和应用。

1)数组是一组变量,这组变量需要满足三个条件:

具有相同的数组类型

具有相同的名字

在存储器中是连续的

2)声明和初始化

数组类型 数组名【数组长度】

数组类型 数组名【数组长度】 = {初值列表}

3)使用和赋值注意现象

区分数组下标和数组元素的个数的概念

数组元素下标可以是常量或变量或表达式,初始化必须是常量

数组整数赋值只能在初始化进行,程序只能单个元素赋值


2、掌握if语句和switch语句的用法及区别,编程的时候能够正确选择使用哪个语句。

最详细的if语句和switch语句归纳资料:https://blog.csdn.net/2301_77479336/article/details/130087491?spm=1001.2014.3001.5501


3、彻底理解中断的原理和应用方法,关闭教程自己独立把本章节程序编写完毕下载实践。

中断的介绍

比如说我正在厨房用煤气烧一壶水,这样就只能守在厨房里,苦苦等着水开--如果水溢出来浇
灭了煤气,有可能就要发生一场灾难了。门外忽然又传来了铿锵有力的歌声,我最喜欢的天龙八部要开演了,听着水壶发出“咕嘟咕嘟”的声音,我清楚:除非等到水开,否则没有我享受人生的时候。
这个场景跟中断有什么关系呢?

在这个场景中,我是唯一具有处理能力的主体,不管是烧水、还是看电视,同一个时间点上我只
能干一件事情。但是,在我专心致志干一件事情时,总有许多或紧迫或不紧迫的事情突然出现在
面前,都需要去关注,有些还需要我停下手头的工作马上去处理。只有在处理完之后,方能回头
完成先前的任务。中断机制不仅赋予了我处理意外情况的能力,如果我能充分发挥这个机制的妙用,就可以“同时”完成多个任务了。

事实上烧水需要10分钟完成,但是提下水壶和关煤气我只要几秒钟就可以完成。为了这几秒,我
需要在厨房等候10分钟。如果使用闹钟定时10分钟,10分钟一到,闹钟就会提醒我该去关煤气
了,那么我就可以去安心看电视了。实际上就是用了闹钟这样一个中断信号来提示我完成提水壶和关煤气的任务。

2)


4、尝试修改程序,让我们的数码管只显示有效位,也就是高位的0不显示。

#include <REGX52.H>
sbit addr0 = P1^0;
sbit addr1 = P1^1;
sbit addr2 = P1^2;
sbit addr3 = P1^3;
sbit ENLED = P1^4;
unsigned char code LedChar[] = {
    0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
    0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
unsigned char LedBuff[6] = { 
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};
unsigned int flag1s = 0;
unsigned int cnt = 0,i = 0;
void main()
{
 char arr;
	unsigned long sec = 0;
	unsigned int buf[6];
	EA = 1;
	ENLED = 0;
	addr3 = 1;
	TMOD = 0x01;
	TH0 = 0xfc;
	TL0 = 0x67;
	ET0 = 1;
	TR0 = 1;
  while(1) 
{
 if (flag1s == 1)  //ÅжÏ1Ã붨ʱ±êÖ¾
        {
            flag1s = 0;   
            sec++;        
            buf[0] = sec%10;
            buf[1] = sec/10%10;
            buf[2] = sec/100%10;
            buf[3] = sec/1000%10;
            buf[4] = sec/10000%10;
            buf[5] = sec/100000%10;			
			for(arr = 5;arr >=1;arr--)
				{
				if(buf[arr] == 0)			
				LedBuff[arr] = 0xff;
				else
				     break;
				}
				for(;arr >=0;arr--)
				{
				LedBuff[arr] = LedChar[buf[arr]];
				}
			}
}	
}
void InterruptTimer0() interrupt 1
{
	TH0 = 0xfc;
	TL0 = 0x67;
	cnt++;
	if(cnt >= 1000)
	{
		cnt = 0;
	flag1s = 1;
	}
	P0 = 0xff;
	switch (i)
	{
		    case 0 :addr0 = 0;addr1 = 0;addr2 = 0;P0 = LedBuff[0];i++;break;
				case 1 :addr0 = 1;addr1 = 0;addr2 = 0;P0 = LedBuff[1];i++;break;
				case 2 :addr0 = 0;addr1 = 1;addr2 = 0;P0 = LedBuff[2];i++;break;
				case 3 :addr0 = 1;addr1 = 1;addr2 = 0;P0 = LedBuff[3];i++;break;
				case 4 :addr0 = 0;addr1 = 0;addr2 = 1;P0 = LedBuff[4];i++;break;
				case 5 :addr0 = 1;addr1 = 0;addr2 = 1;P0 = LedBuff[5];i=0;break;
		default:break;
	}
	}


5、尝试写一个从999999开始倒计时的程序,并且改用定时器T1的中断来完成,通过写这个程序来掌握定时器和中断的应用。

#include <REGX52.H>
sbit addr0 = P1^0;
sbit addr1 = P1^1;
sbit addr2 = P1^2;
sbit addr3 = P1^3;
sbit ENLED = P1^4;
unsigned char code LedChar[] = {
    0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
    0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};
unsigned char LedBuff[6] = { 
    0x90, 0x90, 0x90, 0x90, 0x90, 0x90
};
unsigned int flag1s = 0;
unsigned int cnt = 0,i = 0;

void main()
{
 char arr;
	unsigned long sec = 0;
	unsigned int buf[6];
	EA = 1;
	ENLED = 0;
	addr3 = 1;
	TMOD = 0x01;
	TH0 = 0xfc;
	TL0 = 0x67;
	ET0 = 1;
	TR0 = 1;
  while(1) 
{
 if (flag1s == 1)  //ÅжÏ1Ã붨ʱ±êÖ¾
        {
            flag1s = 0;  
            sec++;        
            
            buf[0] = sec%10;
            buf[1] = sec/10%10;
            buf[2] = sec/100%10;
            buf[3] = sec/1000%10;
            buf[4] = sec/10000%10;
            buf[5] = sec/100000%10;
				
				
				for(arr = 5;arr >=0;arr--)
				{
				LedBuff[arr] = LedChar[9-buf[arr]];
				}
			}
}	
}
void InterruptTimer0() interrupt 1
{
	TH0 = 0xfc;
	TL0 = 0x67;
	cnt++;
	if(cnt >= 1000)
	{
		cnt = 0;
	flag1s = 1;
	}
	P0 = 0xff;
	switch (i)
	{
		    case 0 :addr0 = 0;addr1 = 0;addr2 = 0;P0 = LedBuff[0];i++;break;
				case 1 :addr0 = 1;addr1 = 0;addr2 = 0;P0 = LedBuff[1];i++;break;
				case 2 :addr0 = 0;addr1 = 1;addr2 = 0;P0 = LedBuff[2];i++;break;
				case 3 :addr0 = 1;addr1 = 1;addr2 = 0;P0 = LedBuff[3];i++;break;
				case 4 :addr0 = 0;addr1 = 0;addr2 = 1;P0 = LedBuff[4];i++;break;
				case 5 :addr0 = 1;addr1 = 0;addr2 = 1;P0 = LedBuff[5];i=0;break;
		default:break;
	}
	}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

19岁尚未秃 顶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值