微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于51单片机C语言电平触发,跪求答案

关于51单片机C语言电平触发,跪求答案

时间:10-02 整理:3721RD 点击:
程序很简单就是P0口控制数码管从0到F,加了一个中断控制LED灯,这是一个电平触发
我想问的是当我用指拨开关使P3.2置低电平,那么这个程序应该只在中断程序运行数码管应该不会在改变,可实际上数码管却在缓慢从0到F变化,这是问什么?

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={//0到F的列表
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e,
};
sbit d1=P2^0;// 控制LED
void delay(uint);
uchar num;
void main()
{  EA=1;// 中断总开关
   EX0=1;//开启外部中断0
   IT0=0;//外部中断0 电平触发
   while(1)
   {  
       for(num=0;num<16;num++)
       { P1=table[num];
           delay(1000);//一秒的延时
            d1=1;
           }
   }
}
void delay(uint z)//延时程序
{  uint x,y;
   for(x=z;x>0;x--)
     for(y=123;y>0;y--);
}
void it0() interrupt 0//中断程序
{ d1=0;
}



首先你的LED是P1^0,不是P2^0!
程序是先从主函数开始执行的,所以一直在执行while(1)这个死循环。
就算你后来在下拨码开关也没用的。

程序中擅用死循环!一般要要加上条件。

当程序进入中断后,执行完毕中断服务程序后,又从中断返回,继续执行数码管显示的功能,如果你一直按着按钮,就会频繁进入中断,数码管显示的速率会变慢,但是还会执行!

也就说这个程序没有一直在中断,是在中断一直进进出出是吗?
这个是不是和中断在第几个机器周期扫描有关,就是单片机机器周期不是分12个还是几个状态,在某个状态扫描后中断判断后有中断就进入中断然后运行,中断运行完如果是在这个机器周期内完成,继续回主程序运行,直到下一个机器周期扫描到中断入口,。
。我想是因为一开始中断程序太短在一个机器内就可以完成,机器到下一次扫描中断入口还有时间回主程序运行主程序,如果这个中断程序够长,在下一次扫描中断入口时还在运行中断程序,那么他就不会跳回主程序也就是数码管就不会改变了。
为了验证是不是这样,我在中断加了一个20ms的延时后,数码管就没有变过了。
因为我是初学者,理解不够好,你看我想的对不对,谢谢啦。

void exter0()interrupt 0
{  d1=1;
delay(10);
}
这是加了一个延时的中断程序。

恩恩,因为我是初学者,想进一步理解单片机,谢谢啦。

首先我想说的是你的程序问题不大,上边所说的while(1)循环,我指向说这个循环,请你去看看数码管的显示原理,数码管简单地说就是让单片机不停的扫描数码管段选位,再送到显示,如果没有你这个while(1)你看看你的程序还能运行么,再有就是想说中断,一般它有好几种,什么电平触发,跳变触发的,只要你的中断触发了那么单片机必定处理中断,你说的数码管停止操作应该是电平触发,跳变触发会同时处理中断(人眼感觉其实MCU内部不是的)和数码管显示。对于你的问题(图片不清晰)我想说的首先显示你的LED口不对,其次你的P3。2不明白为什么接有上拉电阻,单片机一上电除过P0(高阻态)口外其它都是高电平5V,上拉取了试试问题可能就不大了。

对不起那个电路图不和程序相匹配,。

对不起那个电路图和程序不匹配。

应该是这个图片,我做的不是很严谨,是为了帮助我理解程序用的,谢谢啦。


我也把while(1)给去了试了试可以运行。
你说的段选位,应该是位选位,就是每个数码管的公共端吧,因位我给的图有错其实位选位我是直接接高电平了
我新给的图,外部中断没接电阻还是不行
理论上我选电平触发后应该只在中断程序运行的,可实际上我用指拨开关拨到低电平时,数码管应该不在变化的可实际上数码管却还在变化只是变得慢了一点,这一点我不是很理解。

如果一直按着开关,可能数字就不会变化,只按一下的话,就会在执行完中断程序后再去执行主函数

我用的指拨开关,拨过去后,一直是低电平,Button那个开关是我用来理解跳压触发用的。

我特意在发烧友论坛下载一个Proteus为你做了数码管的中断工程,相信你这次能看懂。有程序(keil编译的)和Proteus编写的数码管工程,我相信这次你肯定能看懂了。

http://bbs.elecfans.com/jishu_311315_1_1.html这个帖子是我针对你的问题专门写了一个帖子真心你好心的看看,我相信这次你肯定能看懂。哦,补充一点就是你不是用的直拨开关接地么,我的那个按键一直鼠标按着跟你呢个直拨开关接地是一样的。

在你把开关置于低电平的时候,响应中断,点亮LED等,执行完中断服务程序后,系统返回while循环,执行响应中断前的任务,因为是电平触发,又一次进入中断、中断服务程序、返回,重复这个顺序。这种中断叫做咬尾中断,中断来临压栈、中断服务程序执行完出栈返回主循环,连续两个中断处理之间有时间间隔,这个间隔时间主程序在运行,因为主程序每次只执行很短的时间,所以你看到的现象就是缓慢变化。、
这是我觉得比较满意的答案。

有这样的资料学习起来太方便了

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top