同时用两个定时器控制蜂鸣器发声,定时器0控制频率,定时器1控制同个频率持续的时间,间隔300ms依次输出1,10,50,100,200,400,800,1k(hz)的方波。
原题上面的,
但是我写出来的是间隔1S,频率和上面反这的,而且只能输出7种频率,1HZ的没有。
改一下i或者y的值就出错,有高手帮我改改程序吗?我想了很长时间也写不出来啊
只能输出1S程序才不会乱,而且掉了一个1Hz的频率不响,只有输出7种频率,每种持续1秒。
#include<reg52.h>
sbit SPK=P2^0;
unsigned int x,y;
unsigned char i=0;
code unsigned int tab[]={20,25,50,100,200,400,2000,20000}; //频率表
void main()
{
TMOD=0x11; //选择定时器0和1工作
TH0=(65536-50)/256;
TL0=(65536-50)%256; //给定时器0赋初值 50微秒
TH1=(65535-50)/256;
TL1=(65535-50)%256; //给定时器1赋初值 50微秒
EA=1; //开总中断
ET0=1; //开定时器0中断
ET1=1; //开定时器1中断
TR0=1; //启动定时器0
TR1=1; //启动定时器1
while(1); //等待中断产生
}
time1 () interrupt 3 //定时器1控制时间 1S 一次
{
TH1=(65536-50)/256;
TL1=(65536-50)%256;
y++;
if (y==20000) // 20000为1S
{
y=0;
i++;
if (i==8) //8个频率,0-7,最后一个掉了吧
i=0;
}
}
time0 () interrupt 1 //定时器0控制频率
{
TH0=(65536-50)/256;
TL0=(65536-50)%256;
x++;
if (x==tab[i])
{
x=0;
SPK=!SPK;
}
} |