……
POP PSW
POP ACC
clr IE0 ;加上这行试试
RETI
……
用按键触发INT0。
按键,会有抖动。
当进入中断程序后,还会有许多次的中断申请,但是当时不会响应。
当退出中断程序后,才会响应刚才遗落的中断申请,就会重新进入中断程序。
CLR IE0,就是在退出前,消除多余的外部中断申请标志。
#include<reg51h>
#include<intrinsh>
#define uchar unsigned char
void delay(uchar a)
{
uchar i;
while(a--)for(i=0;i<120;i++);
}
main()
{
uchar i,led;
while(1)
{
led=0xfe;
for(i=0;i<80;i++)
{
P0=led;
led=_crol_(led,1);
delay(200);
}
P0=0x00;
delay(200);
P0=0xff;
delay(200);
}
}
MOV R7, #1000
D1:MOV R6, #1000 要加逗号,错误是说语法错误
还有这是8位的寄存器,赋值最高只到 255,赋值1000是不行的。
指明地址 在前面 加个起始地址
ORG 0000H ;程序复位起始地址
LJMP LOOP
ORG 0030H ;正式的程序最好跳过前面中断矢量地址区,具体多少看芯片介绍
LOOP: CLR LED
LCALL DELAY
SETB LED
LCALL DELAY
LJMP LOOP
sfr
p0m1
=
0x93;
sfr
p0m0
=
0x94;
sfr
p1m1
=
0x91;
sfr
p1m0
=
0x92;
sfr
p2m1
=
0x95;
sfr
p2m0
=
0x96;
这一段是对通用io的设置寄存器定义为好记的变量名。具体是什么寄存器你就得结合手册查一下,估计是设置io口方向、内部上来电阻之类的,或者是配置给某些内部器件如pca计数器、定时器、计数器等。
至于下面的应该是电磁波或者超声测距之类的算法!!
看起来不是很复杂。
你要是抄板子的话就得想办法知道原来用的什么mcu!再找到它的手册!
有兴趣的话可以研究一下!
linfeighaot@sinacom
程序太乱,只用一个定时器就可以
如定时100us 中断一次 20次是2 ms 即周期是2 ms
中断一次计数变量a加一,并且与另一变量b(1到20)比较,如果a>b,则输出高电平,反之则输出低电平 a=20时清0
主程序中可不断改变b的值,先由大到 小 再由小到大,就是呼吸灯了
如延时200ms改变一次b的值 则呼吸周期大约是8秒
#include<reg51h>
void delay(unsigned int i);
main() //主函数
{
P2=0x55; //P2口:0101 0101 从左到右:第一个口低电平,第二个口高电平。。。。
delay(600); //延时600,不延时你来不及看见灯亮
P2=0xaa; /P2口输出端取反,1010 1010 高电平变低电平,低电平变高电平,(原来亮的关掉,原来不亮的亮)/
delay(600);
}
void delay(unsigned int i) //这个是延时函数
{
unsigned char j;
for(i;i>0;i--)
for(j=255;j>0;j--) ;
}
这样应该明白了吧!不过你这个程序,按一下复位(或者打开一次电源)只亮一下。加个循环就可以不停的闪啦!
以上就是关于麻烦大家帮我看下这个51单片机的程序有什么问题。功能是控制8个发光二极管循环点亮然后中断时闪烁5次全部的内容,包括:麻烦大家帮我看下这个51单片机的程序有什么问题。功能是控制8个发光二极管循环点亮然后中断时闪烁5次、51单片机流水灯执行10次 全部闪烁一次 一直循环十次闪烁一次 c语言怎么写、51单片机汇编写LED闪烁程序,编译时提示延时子程序未指明地址等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)