51单片机 中断程序问题

51单片机 中断程序问题,第1张

#include<reg52.h>袜禅

#include<intrins.h>

#define uint unsigned int

#define uchar unsigned char

uchar tt

void main()

{

uchar b, temp = 0xfe

TMOD = 0x10 //定时器1工作方式设定 16位定时器

TH1 = (65535 - 46082) / 256 //高8位赋初值

TL1 = (65535 - 46082) % 256 //低8位赋初值

EA = 1 //总中断允许

ET1 = 1 //定时器1中断允许

TR1 = 1 //定时器1启乱核动

while(1) {

if(tt >3) {

tt = 0

b++

if(b == 10) {

b = 0

temp = _crol_(temp, 1)

}

}

if(tt <哗好掘 2) P1 = temp

elseP1 = 0xff

}

}

void ones() interrupt 3 //中断程序

{

TH1 = (65535 - 46082) / 256

TL1 = (65535 - 46082) % 256

tt++

}

回答你的问题:

计数溢出时,执行中断程序,这里是系统跑了45872个机器周期后,开始执行中断程序,而不是你说的1S后执行中断程序,注意,这是你的错误.

不管num等于多少,TR0一直都开着,因备枝为你程序其它地方根本没有关闭,也就是说此时定时器还在计数,

所以,即使在执行if语句的时候定时器还在计数,

如果你的if语句过长的话,大于中断的延时时间45872个机器周期了,那么if语句内容根本还没有执行完,又开始下一次中断了,执行过程就是这样子的.

不过,对于你的程序,你完全没有必要担心,因为:

while(1)

{

if(num==20)

{

led1=~led1

num=0

}

}

这句话,远远的小于45872个机器周期,也就是说,你上面那几个语句执行了好几次,中断还没发生一次.

不过,一个良好宏滚誉的电子工程师,尤其是做工业控制的,他的定时器应该这样写:

void TO_time()interrupt 1

{

TH0=0x4C///(65536-45872)/256

TL0=0xD0/蔽段//(65536-45872)%256//执行了20次中断程序后才会执行IF语句

num++

}

即,直接把数值赋值给TH0和TL0,这样避免在中断中运算,节省时间,因为,对于所有的中断,时间越短越好.

if(vol) //判断是否达到最小音量

{

vol+=0X0101 //音量减

sendvol(vol)//音量输出

应该是vol-=0X0101 //音量减

这是修改以后的程序

#include <reg52.h>//包括一个52标准内核的头文件

#define uchar unsigned char //定义一下方便使用

#define uint unsigned int

#define ulong unsigned long

sbit cs=P2^0 //片选

sbit volbit=P2^1//音量位数据

sbit clk=P2^2 //时钟

sbit war=P2^3 //极限警告输出

unsigned int vol

void warn()

void sendvol(uint vol)

void delay(uint t)

void voldown()

void volup()

void volup() //音量让凳加

{

if (vol==0Xffff) //判断是否达到最大音量

{

warn() //警报

}

if(vol <0Xffff)

{

vol+=0X0101//增加音量

sendvol(vol)//输出音量

}

}

void voldown() //音量减

{

if(vol >0x0000) //判断是否达到最小音量

{

vol-=0X0101 //音量减

sendvol(vol)//音量输出

}

else

warn()//警报

}

void sendvol(uint vol) //输出音量

{

uchar i

cs=0//片选

for(i=16i>0i--) //发送16bit音量数据

{

clk=0

if(vol&0X0001==0x0001)

{

volbit=1

}

else

{

volbit=0

}

clk=1

vol>>=1//右移一位

}

cs=1

volbit=1

}

void warn() //警报

{

war=0

delay(100)

war=1

delay(100)

war=0

}

void main() // 主程旦亩序

{

vol=0X0f0f

EX0=1//开外中断

IT0=0//外中断低电平变产生中断

EX1=1

IT1=0

EA=1//打开总中断

sendvol(0xffff)

while(1) //主程序循环

{

}

}

//外中断0

void int0() interrupt 0

{

EA=0

volup()//声音加

delay(500)

EA=1

}

//外中断模滑森1

void int1() interrupt 2

{

EA=0

voldown()//声音减

delay(500)

EA=1

}

//延时

void delay(uint t)

{

uchar i

for (tt>0t--)

{

for (i=200i>0i--)

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12504591.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存