单片机波形发生器Word格式文档下载.docx
《单片机波形发生器Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《单片机波形发生器Word格式文档下载.docx(14页珍藏版)》请在冰豆网上搜索。
波形选择按键模块:
通过外部中断0计数来选择波形的种类。
频率选择按键模块:
通过外部中断1计数来选择波形的延时时间来实现。
数码管显示模块:
采用共阴极数码管,段码高电平有效,位码低电平有效。
D/A转换模块:
将查表的到的数字信号转换为模拟信号输出,再将模拟信号通过运算放大器,转换为电压输出。
波形输出模块:
将D/A转换完后的结果接上示波器观察波形,还可以通过改变频率来观测不同频率的波形。
单片机模块:
存放本实验用到的各种波形子程序、外部中断子程序、主程序、段码表、波形转换数表。
单片机频率选择按键数码管显示波形选择按键波形输出D/A转换图3-1系统结构框图3.2STC89C52单片机介绍图3-2STC89C52引脚图其工作频率范围:
040MHz,相当于普通8051的080MHz,实际工作频率可达48MHz。
用户应用程序空间4KROM。
片上集成512字节RAM。
它利用ISP技术写入程序,开发方便。
内部RSM用以存放可以读写的数据,如运算的中间结果、最终结果以及欲显示的数据;
ROM用以存放程序、一些原始数据和表格;
I/O口为四个8位并行I/O口,既可以做输入,也可以做输出。
总共40个引脚,电源用2个(VCC和GND),晶振用2个,复位1个,EA/Vpp用1个,29引脚PSEN和30引脚ALE位外扩数据/程序存储器时才有特定用处,还有四个P端口,每个端口各有8个引脚。
其引脚如图3-2所示。
3.3数码管显示电路数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示数字,因此根据数码管的驱动方式的不同,可以分为静态式和动态式两类。
在本次设计中使用的是动态显示驱动,采用共阴极数码管,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,哪个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,由于此次设计只选择一个数码管点亮,给定位码一个固定值,将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮,再选通段码使其显示代表波形的数字。
数码管显示电路图如图3-3所示。
图3-3数码管显示电路3.4D/A转换及I/V转换电路D/A转换器将数字信息转换成与数值成正比的电压/电流。
本设计采用T型解码网络D/A转换。
选用DAC0832作为单元器件。
使用DAC0832的单缓冲方式。
DAC0832是电流输出型的转换器,要通过示波器来显示波形,必须接入运算放大电路。
D/A转换及I/V转换电路如图3-4所示。
3-4D/A转换及I/V转换电路3.5系统电路原理图元件选择:
5V电源,主单片机芯片STC89C52,DAC0832一片,锁存器74HC753两个,八位数码管六个,按键两个,运算放大器三个,反相器及电阻若干。
系统电路原理图如图3-6所示。
3-5系统电路原理图四、程序流程图设计4.1主程序流程图主程序流程图如图4-1所示。
图4-1主程序流程图通过独立按键产生下降沿,使外部中断INT0,INT1有效。
INT0控制波形的种类,INT1控制频率的选择。
波形种类的显示通过LED灯显示,因为只使用一位二极管,则只需将位码赋固定值,通过查表显示段码值。
本实验开始就使LED灯显示0,调用波形子程序,通过示波器显示方波的波形。
通过对波形种类按键的计数,即中断子程序中size计数,来实现在主程序中对波形种类的选择,从而调用相应的波形产生程序,通过示波器显示波形,波形的频率可以通过频率改变按键改变,来实现不同频率波形的产生。
4.2波形产生及频率变化流程图波形产生及频率变化流程图如图4-2所示。
图4-2波形产生及频率变化流程图本框图实现了显示不同频率波形和波形种类的数码管显示。
数码管和不同波形的显示,通过外部中断0计数来实现,数码管的显示,将位码赋一固定值,段码通过调用段码表的值来实现。
波形的显示,通过查表,将表的内容赋给8032转换器的地址,进行数模转换得到模拟值,再进行延时、循环,从而的到几个周期的波形。
波形的频率,通过外部中断1计数来实现,通过改变波形的显示时间,从而达到了改变频率的目的。
五、程序设计#includereg52.h#defineucharunsignedchar#defineuintunsignedint#defineLEDLen6xdataunsignedcharOUTBIT_at_0x8002;
/位控制口xdataunsignedcharOUTSEG_at_0x8004;
/段控制口xdataunsignedcharCS0832_at_0xa000;
ucharcodedofly=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;
/显示段码值01234567ucharsize=0;
/波形选择ucharff1=0;
/频率uintff=1;
uintcodesintab64=0x80,0x8c,0x98,0xa5,0xb0,0xbc,0xc7,0xd1,0xda,0xe2,0xea,0xf0,0xf6,0xfa,0xfd,0xff,0xff,0xff,0xfd,0xfa,0xf6,0xf0,0xea,0xe3,0xda,0xd1,0xc7,0xbc,0xb1,0xa5,0x99,0x8c,0x80,0x73,0x67,0x5b,0x4f,0x43,0x39,0x2e,0x25,0x1d,0x15,0xf,0x9,0x5,0x2,0x0,0x0,0x0,0x2,0x5,0x9,0xe,0x15,0x1c,0x25,0x2e,0x38,0x43,0x4e,0x5a,0x66,0x73;
uintcodetri64=0x80,0x88,0x90,0x98,0xA0,0xA8,0xB0,0xB8,0xC0,0xC8,0xD0,0xD8,0xE0,0xE8,0xF0,0xF8,0xFF,0xF8,0xF0,0xE8,0xE0,0xD8,0xD0,0xC8,0xC0,0xB8,0xB0,0xA8,0xA0,0x98,0x90,0x88,0x80,0x78,0x70,0x68,0x60,0x58,0x50,0x48,0x40,0x38,0x30,0x28,0x20,0x18,0x10,0x08,0x00,0x08,0x10,0x18,0x20,0x28,0x30,0x38,0x40,0x48,0x50,0x58,0x60,0x68,0x70,0x78;
uintcodefang64=0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00;
uintcodesaw64=0x04,0x08,0x0B,0x10,0x14,0x18,0x1B,0x20,0x24,0x28,0x2B,0x30,0x34,0x38,0x3B,0x40,0x44,0x48,0x4B,0x50,0x54,0x58,0x5B,0x60,0x64,0x68,0x6B,0x70,0x74,0x78,0x7B,0x80,0x84,0x88,0x8B,0x90,0x94,0x98,0x9B,0xA0,0xA4,0xA8,0xAB,0xB0,0xB4,0xB8,0xBB,0xC0,0xC4,0xC8,0xCB,0xD0,0xD4,0xD8,0xDB,0xE0,0xE4,0xE8,0xEB,0xF0,0xF4,0xF8,0xFB,0xFF;
uintcodeti64=0x80,0x88,0x90,0x98,0xA0,0xA8,0xB0,0xB8,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xB8,0xB0,0xA8,0xA0,0x98,0x90,0x88,0x80,0x78,0x70,0x68,0x60,0x58,0x50,0x48,0x40,0x38,0x30,0x28,0x20,0x18,0x10,0x08,0x00,0x08,0x10,0x18,0x20,0x28,0x30,0x38,0x40,0x48,0x50,0x58,0x60,0x68,0x70,0x78;
/延时函数/voiddelay(uchart)uinti;
for(i=t;
i0;
i-);
/正弦波/voidsin()uchara;
for(a=0;
a64;
a+)CS0832=sintaba;
delay(ff);
/三角波/voidsanjiao()uchara;
a+)CS0832=tria;
/方波/voidfangbo()uchara;
a+)CS0832=fanga;
/锯齿波/voidjuchibo()uchara;
a+)CS0832=sawa;
/梯形波/voidtixing()uchara;
a=5)size=0;
/外部中断1子函数int1()interrupt2ff1+;
/中断一次加1if(ff12)ff1=0;
voidinint()IT0=1;
/下降沿触发EX0=1;
/开中断0IT1=1;
/下降沿触发EX1=1;
/开中断1EA=1;
/开总中断voidmain(void)inint();
while
(1)switch(size)case0:
OUTBIT=0x20;
OUTSEG=dofly0;
fangbo();
break;
/方波case1:
OUTSEG=dofly1;
sanjiao();
/三角波case2:
OUTSEG=dofly2;
sin();
/正弦波case3:
OUTSEG=dofly3;
juchibo();
/锯齿波case4:
OUTSEG=dofly4;
tixing();
/梯形波default:
switch(ff1)case0:
ff=1;
case1:
ff=3;
case2:
ff=5;
case3:
case4:
default:
6、设计总结通过程序执行,得到仿真结果如图6-1、6-2、6-3、6-4、6-5所示。
不按键时,数码管显示0,产生方波。
数码管显示与波形如图6-1所示。
图6-1方波当按键次数为1时,数码管显示1,产生三角波。
数码管显示与波形如图6-2所示。
图6-2三角波当按键次数为2时,数码管显示2,产生正弦波。
数码管显示与波形如图6-3所示。
图6-3正弦波当按键次数为3时,数码管显示3,产生锯齿波。
数码管显示与波形如图6-4所示。
图6-4锯齿波当按键次数为4时,数码管显示4,产生梯形波。
数码管显示与波形如图6-5所示。
图6-5梯形波通过本次试验设计,实现了波形发生器的基本功能,波形的显示调用通过事先设定好的数表,将数表中的值通过循环程序逐一通过DAC0832转换器,转换为电流值输出,再经过运算放大器转换为电压,接入示波器显示波形。
波形的频率通过改变调用数表中的一个值之后的延时时间来实现。
数码管显示的段码通过查表得到,位码设为一固定值来实现。
以前的实验设计多采用汇编语言来实现,但本次设计要求采用C语言来实现波形发生器,因此遇到了不少问题,但是通过老师和同学的帮助和自己的努力,这些问题都解决了,顺利的完成了本次课程的设计,在此谢谢老师和同学们的帮助。
七、参考文献1高峰.单片微型计算机原理与接口技术.科学出版社,2007.2潘永雄,沙河,刘向阳.电子线路CAD实用教程M.西安:
西安电子科技大学社,2001.13-118.3朱定华,戴汝平等,单片微机原理与应用M.北京交通大学出版社,清华大学出版社.4彭介华.电子技术课程设计指导J.北京:
高等教育出版社,1997.