| 
 
| 做的是让蜂鸣器间隔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的语句
 }
 }
 | 
 
×本帖子中包含更多资源您需要 登录 才可以下载或查看,没有账号?注册 
  |