做的是让蜂鸣器间隔4S分别发出不同频率的声音。
程序写完,仿真时发现这个问题,看下图
图一:运行到中断时,注意红圈里的值
图二:重新赋值
图三:当加1计数器低八位赋值后,高八位变化很大
这个是为什么?如果在进入中断时,让中断停止工作,出中断最后那让中断开始工作的话,那上面的赋值又是正常的了。
请前辈们指教!谢谢
顺便附上源程序:让蜂鸣器间隔4秒,分别发出1hz,10hz等的声音
#include<reg52.h> //头文件
#define uint unsigned int
#define uchar unsigned char
uint a,b,hz; //定义无符号整形
uchar c; //定义无符号字符型
sbit bee=P1^4; // 定义蜂鸣器管脚
void main() //主文件
{
hz=50000; //hz赋值
TMOD=0x11; //设置定时/计数器0,1的工作方式
TH0=(65536-hz)/256; //定时器0加1计数器赋值(第一次50ms)
TL0=(65536-hz)%256;
TH1=(65536-50000)/256; //定时器1加1计数器赋值(50ms)
TL1=(65536-50000)%256;
EA=1; //开总中断
ET0=1; //定时器0设为开
ET1=1; //定时器1设为开
TR0=1; //定时器0开始工作
TR1=1; //定时器1开始工作
bee=1; //蜂鸣器关闭
while(1); //主程序完(等待中断)
}
void timer0() interrupt 1 //定时器0中断程序
{
TR0=0; //定时器0停止工作,不停止的话下一步加1计数器赋值会出错(??)
TH0=(65536-hz)/256; // 加1计数器重新赋值
TL0=(65536-hz)%256;
b++; //b作为1hz定时的基准
if(a>=0&&a<80) //如果a在0到80之间,进入函数,a由定时器1决定,1a=50ms
if(b==10) //如果b=10,进入函数(暨500ms时)
{
b=0; //b归零
bee=~bee; //蜂鸣器开或关
}
if(a>=80&&a<160) //如果a在80到160之间
{
bee=~bee; //蜂鸣器开或关
}
if(a>=160&&a<240)
{
hz=10000; //hz重新赋值,10000=10ms
bee=~bee; //蜂鸣器开或关
}
if(a>=240&&a<320)
{
hz=5000;
bee=~bee;
}
if(a>=320&&a<400)
{
hz=2500;
bee=~bee;
}
if(a>=400&&a<480)
{
hz=1250;
bee=~bee;
}
if(a>=480&&a<560)
{
hz=625;
bee=~bee;
}
if(a>=560&&a<640)
{
hz=500;
bee=~bee;
}
if(a>=640&&a<720)
{
hz=250;
bee=~bee;
}
if(a>=720&&a<800)
{
hz=125;
bee=~bee;
}
TR0=1; //定时器0开始工作
}
void timer1() interrupt 3 //定时器1中断函数
{
TH1=(65536-50000)/256; //定时器1加1计数器重新赋值
TL1=(65536-50000)%256;
++a;
if(a==801) //如果a=801,暨第一个周期结束,进入以下函数
{
a=0; //a归零
hz=50000; //hz重新赋值50000
b=0; //b也归零,满足定时器0的第一条1hz的语句
}
} |