c51单片机中断详解--适合初学者

代码文本在文末,文中为代码截图

工程图
c51单片机中断详解--适合初学者_第1张图片

**

第一题

**每次亮一个灯的流水灯,定义P1为led1。

c51单片机中断详解--适合初学者_第2张图片

外部中断0允许中断:EX0=1;下降沿触发:IT0=1;总开关:EA=1;

c51单片机中断详解--适合初学者_第3张图片

中断要执行的是P0引脚的4个二极管闪六次。
其实这里还有个想说的是,IE在中断请求的时候,会置位为1,然后CPU同意并执行中断程序后,IE自动清零。为什么说这个,这个可以在以后的一些情况,作为中断条件。

c51单片机中断详解--适合初学者_第4张图片

第二题

每次亮一个灯的流水灯和第一题的一样;
中断0下降沿触发也和第二题一样;
中断0程序是:P1引脚每次亮两个二极管的流水灯

讨论一下:每次亮两个二极管,如果低电平亮,那就要11111100B→11110011B。

c51单片机中断详解--适合初学者_第5张图片

个人觉得在中断中使用while造成的后果是很致命的,一般杜绝在里面用while,否则永远跳不出中断。(当然你可以在此中断里边进入另一个中断再跳回main,这样也太麻烦了)

实在不行的话,那就利用中断方式2的IE1吧,在while里边加个判断,break出while循环。(或者随便一个IO引脚,给她一个电平判断,应该也可以跳出while)

c51单片机中断详解--适合初学者_第6张图片

第三题

首先点亮所有灯0x00,然后逐个灭掉

逐个灭掉,补1?好象没有低位补1的,那就可以低位补0,然后取反得1:~(0xff→0xfe)=0x01

c51单片机中断详解--适合初学者_第7张图片
有没有注意到,其实我们总是习惯低电平亮灯,其实也可以高电平亮灯的,这样就不用取反这么麻烦,位的取反会显得复杂。高电平亮灯的话,直接p1=0xff<

中断1程序是:P1引脚每次亮两个二极管的流水灯,同时P0和P2引脚闪烁交替(这里的同时不知是什么意思,,难道有多线程?)

c51单片机中断详解--适合初学者_第8张图片
变量的名字乱起的(比如interr0或intter1),自己写代码的时候另起个好听的。
哪里写得有错的话,评论分享一下,谢谢。

补充代码

#include 
#include 
#define uchar unsigned char
#define uint unsigned int
void delay(uint); 
#define led1 P1
sbit oo=P2^7;//测试用
//延迟函数(网上抄的)
void delay(uint t)
{
	register uint bt;
	for(;t;t--)
		for(bt=0;bt<255;bt++);
}

//中断初始化
void interr0()
{
	EA = 1;//总开关
	EX0 = 1;//中断允许位\EX1代表外部中断1
	IT0 = 1;//0为电平触发,1为脉冲触发即上下沿
}
void interr1()
{
	EA = 1;//总开关
	EX1 = 1;//中断允许位\EX1代表外部中断1
	IT1 = 1;//0为电平触发,1为脉冲触发即上下沿
}

//第一二题的main函数
/*void main()
{
		unsigned char i;
		interr0();
		led1 = 0xFE;
		while(1)
		{
			//for(i=0;i<8;i++)
			//{
			//	led1=_crol_(0xfe,i);//不知为何  原理一样的代码led1 = _corl_(led1,1);为什么不可以,还在找资料
			//	delay(200);			
			//}
			//如果不想用上边的代码,可以尝试用这个
			for(i=0;i<=8;i++)
			{
				//led1>>=i;
				led1=~(0x01<

你可能感兴趣的:(物联网,单片机)