单片机的延时与中断问题及解决方法
26、我用51单片机定时/计数器1计数为什么不计数?想让它记数产生中断让蜂鸣器响。
sbit fengming=P1^6;
void main()
{
TMOD=0x50;
EA=1;
ET1=1;
TH1=0xff;//来一次中断记一次数
TL1=0xff;
TR1=1;
}
void time1(void) interrupt 3
{
fengming=0;
}
答:
不知道是你在网页上打错了,还是怎么回事。
void time1(void) interrupt 3-------》void timer1(void) interrupt 3
主程序最后,要加个死循环:while(1){};
还有,你在这用了方式1,这个方式在你进中断后,TH1和TL1会变成0000H。你不对他重新赋值,你要等FFFFH次计数,才会进中断。
27\MCS-51 单片机定时器/计数器1的中断入口地址是: 一共有四个A. 0003H B. 000BH C. 0013H D. 001BH,到底是是哪一个?
\答:答案是D.1BH
因为:
外中断0——03h
定时器0——0bh
外中断1——13h
定时器1——1bh
串口———23h
请背熟
28、我看很多程序都是主程序进入while(1),就死在while(1)里了,然后等待外中断。那么现在的问题是我想让它进入外中断完事后,跳过while(1),执行下边的程序,该怎么办?
while里边用break吗?不知道好使不好使,还有标志位我看是硬件自动清零,查询标志应该不能用吧,那该怎么办呢?
答:
结束while(1)语句最好的方法就是使用break来跳出死循环,关键就是选择合适的flag(标志位),如果说中断标志位是硬件自动清零的话,那么楼主不妨在中断服务子程序中自己加入一个标志位:如果用汇编语言的话,PSW中的F0位就可以很好的使用;如果用C的话,就可以随便定义一个位变量,如bit a=0;。也就是说,楼主需要在程序中定义一个位变量a,在中断服务子程序中将a置1,退出中断后查询a是否为1,例如:if(a) {a=0;break;}这样就跳出了while语句了。
比方说,如果楼主想写一个等待按键按下中断的程序,就可以用while(!a);而不用while(1)语句了。
29、我用外部中断1,中断一次显示下一个数,数码管显示没问题。但是我用P3-3口用导线连接,接触一次地线,松开一次,这时候数码管显示会乱跳,有时候加两次数,有时候加好多次数,反正就是不稳定。假如p3-3口通过按键接地的话,按一次按键一般情况会加一次数,但有时候也是不稳定,可能中断好几次。
程序如下:
#include
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar times;
uchar i=0;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=112;y>0;y--);
}
void main()
{
EA=1;
EX1=1;
IT1=1;
while(1)
{
P1=table[i];
P2=0x00;
}
}
void into() interrupt 2
{ delay(1000);
i++;
if(i==10) i=1;
}
答:
是抖动的问题。
应该采取消抖措施,硬件、软件方法皆可。
----
楼主在中断函数中,延时,时间看来很是不短!
但是延时后,并没有检测按键是否还在按下,这就不能算是软件消抖。
30、 (1) 为什么单片机有两个外部中断0允许位?有什么作用?
(2)在51内核单片机中,当允许响应外部中断0的中断请求时,其特殊功能寄存器ie中的位必须为1 es exo ea et0?
答:
(1)两个中断是因为一般的单片机有两个中断源,可以实现两级中断嵌套,在实现复杂功能上两级中断嵌套很有用。
(2)
EA--总中断允许位,必须为1
ES--串行中断允许位,不必开,为0
EX0--外部中断0允许位,应为1
ET0--定时计数溢出中断允许位,不必开,为0
单片机延时中断问 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)