#循循渐进学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;
	}
	}
相关推荐
那年窗外下的雪.6 分钟前
AIDC 学习日志|第 22 天|All-Active/Single-Active 故障演练设计
服务器·网络·学习·算法·哈希算法
龚寿生19 分钟前
23-敏捷开发实战:从Scrum到看板的团队协作方法论
android·学习·scrum·敏捷流程
数字新视界22 分钟前
数据中心基础设施管理系统发布新版本,助力企业云化转型
嵌入式硬件·物联网·数据中心·数据中心基础设施管理·dcim管理系统
SKH.41 分钟前
单片机(1)
单片机·嵌入式硬件
cc_yy_zh1 小时前
学习使用kali抓包
服务器·学习·php
动词ing1 小时前
【学习笔记】数据结构栈与队列(栈先进后出+队列先进先出+括号匹配+消消乐模型)
数据结构·笔记·学习
llilian_161 小时前
小切口解决大问题:时序校准场景下的标准时间间隔脉冲信号发生器应用方案
功能测试·单片机·嵌入式硬件·51单片机
彧azz1 小时前
Git 入门实操实例:从安装到远程仓库全流程
大数据·笔记·git·学习·elasticsearch
三块石头1012 小时前
车载ADC避坑:为什么ADC采集值偏低?
经验分享·stm32·单片机·嵌入式硬件·mcu·硬件架构·硬件工程