#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--)
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)