#include<reg51.h>
#define uchar unsigned char
uchar a;
void dd() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
a++;
}
void main()
{
P1=0;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
if(a==200)
{
P1=0xff;
a=0;
}
单片机中断程序不运行 求解 不中断 问题在那里????
答案:3 悬赏:20
解决时间 2021-02-18 09:51
- 提问者网友:风华是一指流沙
- 2021-02-17 11:41
最佳答案
- 二级知识专家网友:努力只為明天
- 2021-02-17 12:10
程序跑飞了,你把if()放在while(1)这个空的无限循环里面就可以了。单片机在运行的过程中要不停的执行程序,你写的这个程序开启中断之后,定时器刚开始计时、还没有来得急申请中断就就执行完了。他没有事干,就又从头开始。如此反复,永远不可能到中断。
#include<reg51.h>
#define uchar unsigned char
uchar a;
void dd() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
a++;
}
void main()
{
P1=0;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
if(a==10)
{
P1=0xff;
// a=0;
}
if(a==20){P1=0x00;a=0;}
}
}
帮你加了个while(1)后可以中断,a=200时间太长了,观察不方便,为了让你方便看出来。就帮里在while里面改了几句,你用的话改回来就行了。
至于上面为什么跑飞了,你如果想深入可以再问我。
#include<reg51.h>
#define uchar unsigned char
uchar a;
void dd() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
a++;
}
void main()
{
P1=0;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
if(a==10)
{
P1=0xff;
// a=0;
}
if(a==20){P1=0x00;a=0;}
}
}
帮你加了个while(1)后可以中断,a=200时间太长了,观察不方便,为了让你方便看出来。就帮里在while里面改了几句,你用的话改回来就行了。
至于上面为什么跑飞了,你如果想深入可以再问我。
全部回答
- 1楼网友:萌萌哒小可爱
- 2021-02-17 14:26
一般而言,计时器的值是一个字,也就是双字节,最大值是65535. 计数器在每一个周期增加1.这个周期和芯片的晶振有关,你查一下单片机的及晶振资料就知道是多少了。假设一个周期是2微妙。那么每隔2微妙计数器增加1.如果你设置计数器的初始值是55535,那么第一个周期过后,也就是2微妙后计数器的值变为55536.当过10000个周期后,计数器的值从55535增加到65535,再增加一个数,计数器就会产生中断。这时时间过了10000*2微秒,也就是20毫秒。那么你就产生了一个精确的时间20毫秒。循环50次就是20微秒*50=1秒。
- 2楼网友:许你一世温柔
- 2021-02-17 13:03
你这个语句中少了while所以程序一开始执行的时候就执行了一遍就结束了。
以后写的时候最好要加while,如果什么都不执行也要加
while(1){//这里是你想要执行的语句}
这样程序才会一直检测执行
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯