1 引言
在现代通信、电子测量、教学科研等领域中,经常需要频率信号源,而且一般要求可以数字控制,可用频率信号发生器实现。一般要求信号建立时间短,输出频率的稳定。本题利用89S51/52单片机定时器/计数器的功能产生连续的低频方波信号、结构简单、外围元器件较少、程序可以反复下载和随时改变频率大小定时量.在教学实验中得到广泛的应用。
2 硬件设计
信号发生器由三部分电路组成复位电路、时钟电路、由指拨开关和排阻组成存储器设置电路。
指拨开关的状态由单片机的P2端口输入,利用指拨开关S1~S8设定输出的频率。若S1开关on的话,不管其他开关是什么状态,OUTPUT端输出100 KHZ;若S1开关off,S2开关on的话,不管其他开关是什么状态,OUTPUT端输出50 KHZ;若S1开关off,S2开关off,S3开关on的话,不管其他开关是什么状态,OUTPUT端输出10 KHZ;若S1开关off,S2开关off,S3开关off,S4开关on的话,不管其他开关是什么状态,OUTPUT端输出5 KHZ;若S1开关off,S2开关off,S3开关off,S4开关off,S5开关on的话,不管其他开关是什么状态,OUTPUT端输出1 KHZ;若S1开关off,S2开关off,S3开关off,S4开关off,S5开关off的话,S6开关on的话,不管其他开关是什么状态,OUTPUT端输出500 KHZ;若S1开关off,S2开关off,S3开关off,S4开关off,S5开关off的话,S6开关off的话,S7开关on的话,不管其他开关是什么状态,OUTPUT端输出100 KHZ;;若S1开关off,S2开关off,S3开关off,S4开关off,S5开关off的话,S6开关off的话,S7开关off的话,S8开关on的话,不管其他开关是什么状态,OUTPUT端输出50 KHZ;开关on为0,off为1。如表1:
若f=100khz,则T=10us,输出脉冲每5us变化一次。如图1:
对所要产生的信号整理如表2。
设计89S51/52单片机P2端口为输入口,P0.0为输出端口在经过非门输出,原理图如图2。
3 软件设计
在此编写一个定时中断子程序FG_timer,而其定时量将随指拨开关的设定而定时,假如S1接通,FG_timer的定时量为5,每次5us中断一次,而中断时就将反相输出可得到100KHZ的频率,主程序流程图如图3。
89s51/52单片机定时器/计数器有两种应用方式:一种是中断方式,第二种查询方式;若采用中断方式,须五个步骤 即定时器/计数器中断的设定 计数量的设定启动定时器/计数器以及中断子程序;若采用查询方式,则不需要中断设定,也不需要中断子程序,只要设定计数量及启动定时器/计数器,然后就判断定时器/计数器的标志位(TFx)是否动作,已决定程序的流程。本文采用的查询方式
软件程序如下:
#include <reg51.h> //定义8051寄存器的头文件
#define TH_M1(65536-count)/256 // T0(MODE1) 计数高8位
#define TL_M1(65536-count)%256 // T0(MODE1) 计数低8位
unsigned int count=0; //T0(MODE1) 的计数值
Sbit output=P0^0; //声明输出端口
Sbit s1=P2^0; //声明指拨开关s1~s8位置
Sbit s2=P2^1;
Sbit s3=P2^2;
Sbit s4=P2^3;
Sbit s5=P2^4;
Sbit s6=P2^5;
Sbit s7=P2^6;
Sbit s8=P2^7;
void mian( ) //主程序开始
{
IE=0x82; //启用TF0中断
TMOD=0x01; //T0采用mode 1
output=1; //输出端口初值为1
P2=0xff; //设计P2输入口
While(1)
{
if(s1= =0)count=5; //按下s1,输出100KHZ
else if(s1= =0)count=10; //按下s2,输出50KHZ
else if(s1= =0)count=50; //按下s3,输出10KHZ
else if(s1= =0)count=100; //按下s4,输出5KHZ
else if(s1= =0)count=500; //按下s5,输出1KHZ
else if(s1= =0)count=1000;//按下s6,输出500HZ
else if(s1= =0)count=5000;//按下s7,输出100 HZ
else if(s1= =0)count=10000; //按下s8,输出50HZ
TH0=TH_M1; //设置T0计数量高8位
TL0=TL_M1; //设置T0计数量低8位
TR0=1; //启动T0
While(TF0= =0); //等待中断(TF0= =1)
TF0=0; //中断后,清除TF0,关闭T0
output=~output; //输出反相
}
}
根据功能的需求与电路结构编写程序,然后将该程序编译与链接,以生成*.HEX文件。
在Keil C里进行软件的调试与仿真,看看其功能正常与否?其在仿真正常,将软件程序烧录到89s51/52单片机上,再把该89s51/52单片机放入设计好的电路里.以取代刚才的在线仿真器。
4 结束语
经过硬、软件的设计、制作与调试, 本装置实现了性能优良的波形发生器,具有线路简单、易于操作、价格低廉、性能优越、便于维护等优点,在单片机应用领域中值得推广,信号源在各种领域必定有着广阔的应用前景。
参考文献:
[1] 张毅刚.新编MCS-51单片机应用设计[M].哈尔滨:哈尔滨工业大学出版社,2003.
[2] 张义和,王敏男,许宏昌.例说51单片机(C语言版)[M].北京:人民邮电出版社,2008.
[3] 郭天祥.51单片机C语言教程[M].北京:电子工业出版社,2009.
[4] 刘玉利.基于单片机DDS多波形发生器设计[J]:自动化技术与应用.2011,(8):56-59.
[5] 求是科技.8051系列单片机C程序设计完全手册[M].北京:人民邮电出版社,2006.
作者简介:徐坚(1968-),男,助理工程师,研究方向:单片机相关产品开发与设计。