利用T1的中断控制P1.7引脚输出频率为1kHz方波音频信号,驱动蜂鸣器发声。系统时钟为12MHz。方波音频信号周期1ms,因此T1的定时中断时间为0.5 ms,进入中断服务程序后,对P1.7求反。电路见图7-18。
先计算T1初值,系统时钟为12MHz,则机器周期为1μs。1kHz音频信号周期为1ms,要定时计数的脉冲数为a。则T1初值:
TH1=(65 536 −a) /256;
TL1=(65 536 −a) %256
单片机源程序如下:
- #include<reg51.h> //包含头文件
- sbit sound=P1^7; //将sound位定义为P1.7脚
- #define f1(a) (65536-a)/256 //定义装入定时器高8位时间常数
- #define f2(a) (65536-a)%256 //定义装入定时器低8位时间常数
- unsigned int i=500;
- unsigned int j=0;
- void main(void)
- {
- EA=1; //开总中断.
- ET1=1; //允许定时器T1中断 .
- TMOD=0x10; //TMOD=0001 000B,使用T1的方式1定时 TH1=f1(i); //给T1高8位赋初值.
- TL1=f2(i); //给T1低8位赋初值.
- TR1=1; //启动T1
- while(1)
- { //循环等待
- i=460;
- while(j<2000);
- j=0;
- i=360;
- while(j<2000);
- j=0;
- }
- }
- void T1(void) interrupt 3 using 0 //定时器T1中断函数
- {
- TR1= 0; //关闭T1
- sound=~sound; //P1.7输出求反
- TH1=f1(i); //T1的高8位重新赋初值.
- TL1=f2(i); //T1的低8位重新赋初值.
- j++;
- TR1=1; //启动定时器T1
- }
复制代码
Keil代码与Proteus8.13仿真下载(注意只能用Proteus8.13打开):
利用T1控制发出1KHz音频.zip
(54.22 KB, 下载次数: 12)
|