/*******************************/
/*同时用两个定时器控制蜂鸣器发声,
T0控制频率,T1控制同个频率持续的
时间,间隔两秒依次输出1,10,50,100,
200,400,800?1000的方波,设晶振频率为12MHZ*/
/****************************************/
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit beep=P2^3;
uchar tt;
uint fre,flag;
void main()
{
fre=50000;
beep=0;
TMOD=0x11;
TH0=(65536-fre)/256;
TL0=(65536-fre)/256;
TH1=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
ET1=1;
TR1=1;
while(1);
}
void T0_timer() interrupt 1
{
TR0=0;
TH0=(65536-fre)/256;
TL0=(65536-fre)/256;
tt++;
if(flag<40) 这里的40怎么算出来的
{
if(tt==10)
{
tt=0;
fre=50000;以及这里为什么是50000
beep=~beep;
}
}
if(flag>=40&&flag<80)这里的40 ,80怎么算出来的
{
tt=0;
fre=50000;
beep=~beep;
}
if(flag>=80&&flag<120)
{
tt=0;
fre=10000;这里的10000怎么算出来
beep=~beep;
}
if(flag>=120&&flag<160)这里的120 160怎么算出来
{
tt=0;
fre=5000;这里的5000怎么算出来
beep=~beep;
}
if(flag>=160&&flag<200)
{
tt=0;
fre=2500;这里的2500怎么算出来的
beep=~beep;
}
if(flag>=200&&flag<240)这里的200 240怎么算出来
{
tt=0;
fre=1250;这里的1250怎么算出来的
beep=~beep;
}
if(flag>=240&&flag<280)这里的240 280 怎么算出来的
{
tt=0;
fre=625;这里的625怎么算出来的
beep=~beep;
}
if(flag>=280&&flag<320)这里的280 320怎么算出来
{
tt=0;
fre=312;这里的312怎么算出来的
beep=~beep;
}
if(flag>=320&&flag<360)这里的320 360 怎么算出来的
{
tt=0;
fre=156;这里的156怎么算出来的
beep=~beep;
}
TR0=1;
}
void T1_timer() interrupt 3
{
TH1=(65536-50000)/256;
TL0=(65536-50000)%256;
flag++;
if(flag==360)
{
flag=0;
fre=50000;
}
}
哪位大神帮我讲解一下这个程序
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
我就是在用郭的那本书 这是课后的一道题 重新看了定时器T1的初值计算,但还不是很透彻
可以这样通俗了讲 65536减多少就是定义后面那个数的小数点往前移两位毫秒如(65536-50000)就是定义50ms /这个符号是取整 %这个符号是取余
老大 我知道这个初值计算 只是不明白那个360怎么算出来的
还有就是为什么在小于40时是fre=50000;
在(flag>=320&&flag<360)时为什么fre=156;
以及在判断标志位前为啥
TR=0
开头不是产生方波的频率以次扩大二倍(从第三个开始)那不就是在它fre值上除以二吗
一周热门 更多>