一个很简单的单片机问题

************************************************

名称:定时器0中断实验
功能:定时器0中断,LED左移1位
网址:www.weijay.com

***************************************************/
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
uchar Status=0xFE; //初始状态
uchar num=5;
//定时器0中断程序
void Time0Int() interrupt 1{
TH0=0x00;//重载初值
TL0=0x00;
num--;
if(num==0){
Status=_crol_(Status,1); //循环左移1位
num=5;
}
}
//主程序
main(){
TMOD=0x01;//定时器方式1
EA=1;//开总中断
ET0=1;//允许T0中断
TH0=0x00;//定时器初值
TL0=0x00;
TR0=1;//启动T0
while(1){
P0=Status;
}
}
/**************************************************

名称:蜂鸣器报警实验
功能:蜂鸣器发出报警声
网址:www.weijay.com

***************************************************/
#include <reg52.h>
#define uchar unsigned char
uchar frq;
sbit SPK=P3^7;//蜂鸣器连在P3.7
//延时程序
void DelayMs(uchar ms){
uchar i;
while(ms--){
for(i=0;i<125;i++);
}
}
//定时器0中断程序
void TimeInt() interrupt 1{
TH0=0xFE;
TL0=frq;
SPK=~SPK;
}
//主函数
main(){
TMOD=0x01;
TH0=0x00;
TL0=0xFF;
TR0=1;
ET0=1;
EA=1;
while(1){
frq++;
DelayMs(1);
}
}
这两个实验的THO和TLO对定时器设定时初始值是根据什么设定的,都是蜂鸣器为什么设定的值会不同,回答的好的奖励100分

第一个定时器是基于准确延迟使用的
他把定时器设置成16位计数器(定时器方式1)
即TH0和TL0联合成1个16位的定时器来计数
每个时钟周期加1
同时开启了定时器中断
即定时器计数计到65535时会对系统产生中断(这个时间可以根据需要更改)
中断服务函数内容是把LED显示方式左移一位(这是我猜的)具体还要看_crol_函数的源码

而第二个程序解释可能有点难接受
先说说蜂鸣器工作原理,对一个蜂鸣输入不同的频率的脉冲信号,蜂鸣器就会发出不同的声音
使用定时器的目的是为了产生一个均匀的脉冲,
使用方法同样是定时器溢出的方法
这个定时器的初值要根据你想输出一个什么频率的脉冲而定
因为是16位计数器,当计数到0xffff时系统会产生中断,在中断中会对时钟的输出口作出反转
而楼主这个例就是要输出一个0xff00*2为周期的脉冲(0xffff-0xff,反转两次,形成一组高低电平)
蜂鸣器就会根据这个频率信号发声
有些问题很难说的清楚,如果搂住还是不明白可以给我信息或者查阅有关利用51制作蜂鸣器电子琴的资料

哈哈,楼下的无所谓夺标不夺标,纯粹是学术性的交流,作为学者不应该有太多想法的
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-02-01
帮楼上补充一点。
你这里的蜂鸣器为无源(相对有源)蜂鸣器,什么是无源呢,就是你直接加电的时候,它是不会叫的,就像我们的音箱一样,不给它输入MP3灯音频信号,它是静音的,但是有源的就不用,只要上电,它就叫。
对于无源的蜂鸣器,要鸣起来,必须加振荡的交变电压,这里的SPK=~SPK;程序段,就是产生交变的电压,1 0 1 0...不就是交互变化吗?声音的音调,就是需要特定的交变频率来确定,频率高,音调就高,反之低,而这个交变的频率?就是中断的时间频率,设定的中断时间很短,那就是频率很高,音调就高;中断的时间,看下面:
TH0=0x00;
TL0=0xFF;
是16位的定时/计数器的初始值,是16进制形式的,化为二进制为0000 0000 1111 1111,前面8个0是高8位,后面8个1是低8位,当16位全是1时,十进制就是65535,在这里就是255了(用电脑的计算机很容易转化),意思就是从255开始计时,一直加到65535(实际上就是65535-255这么多累加的次数),加到尽头后,就中断了,中断后转到中断程序。
而这里用TL0=frq;,即这个TL0是变化的,是从0到255,中断的时间也是变化的,是从65535------(65535-255),楼上已经说了,单位时间就是us。

哎~~~......I 太过...受教了...
第2个回答  2009-01-26
如果是无源的蜂鸣器,直接加电就会响,
而有源的蜂鸣器则要加一个交变的电压才会响,
相似回答