#循循渐进学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;
	}
	}
相关推荐
断剑zou天涯12 小时前
【算法笔记】二叉树的Morris遍历
数据结构·笔记·算法
永远都不秃头的程序员(互关)12 小时前
人工智能中的深度学习:基础与实战应用
人工智能·笔记·学习
思成不止于此12 小时前
【MySQL 零基础入门】DCL 核心语法全解析:用户管理与权限控制篇
数据库·笔记·sql·学习·mysql
熬了夜的程序员12 小时前
【Rust学习之路】序
开发语言·后端·学习·rust
代码游侠12 小时前
学习笔记——进程
linux·运维·笔记·学习·算法
云山工作室13 小时前
基于STM32的视力保护台灯设计与实现(论文+源码)
stm32·单片机·嵌入式硬件·毕业设计·音视频
雅欣鱼子酱13 小时前
【应用】单极高侧-电流检测芯片FP130A助力精密热电偶数据采集,输出非线性误差为±0.01%
单片机·嵌入式硬件
喵了meme13 小时前
Linux学习日记18:线程的分离
linux·运维·c语言·学习
SXSBJS_XYT13 小时前
MCU的FLASH与SRAM中存了什么?
单片机·嵌入式硬件
m0_5532100413 小时前
stm32f407移植modbus协议
stm32·单片机·嵌入式硬件