本帖最后由 格格巫0 于 2021-3-16 15:02 编辑
1、 能够产生方波、锯齿波、三角波、正弦波信号的波形发生器 2、 按键选择波形。按键控制单片机输出方波、锯齿波、三角波或者正弦波信号。按键K1,K2,K3,K4改变波形类型,K5,K6控制频率的加减。 3、 波形参数显示。通过液晶屏显示单片机当前输出波形的频率、幅度。 4、 频率调节。通过外部按键,调节单片机输出波形信号的频率。
功能简介:利用89C51单片机和数模转换器件DAC0832产生所需不同信号的低频信号源,其信号幅度和频率都是可以按要求控制的。设计思路:采用51单片机作为控制器;波形选择通过四个按键来选择,通过四个按钮可选择对应波形,波形通过DAC0832。单片机作为数据处理及控制核心,由单片机完成人机界面、系统控制、信号的采集分析以及信号的处理和变换,采用按键输入,利用虚拟示波器显示波形的方案。D/A转换器简介:DAC0832是双列直插式8位D/A转换器。能完成数字量输入到模拟量(电流)输出的转换。其主要参数如下:分辨率为8位,转换时间为1μs,满量程误差为±1LSB,参考电压(+10/span>-10)V,供电电源为(+5~+15)V,逻辑电平输入与TTL兼容。在DAC0832中有两级锁存器,第一级锁存器称为输入寄存器,它的允许锁存信号为ILE,第二级锁存器称为DAC寄存器,它的锁存信号也称为通道控制信.
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载) 1.电路图 2.液晶显示电路 3.按钮 4.数模转换电路 5.单片机
6.仿真示例
部分单片机源程序如下:- #include "reg51.h"
- #include <data.h>
- #include <LCD1602.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define key P1
- #define dataout P3
- uchar fre[5] ="001Hz"; //初始显示
- uint data THHL=65536-3906;
- uchar data keyword,n=0;
- uchar data Signal_chose = 0;
- uchar data div = 1;
- void keyscan() //键盘扫描函数
- {
- keyword=key&0x3f;
- if(keyword!=0x3f)
- {
- while((key&0x3f)!=0x3f); //等待按键松开
- switch(keyword)
- {
- case 62: {
- if(div>=100) THHL=65536-39; else {div++;THHL=65536-3906/div;}//频率up
- fre[0]=div/100 + '0';fre[1]=div/10%10 + '0';fre[2]=div%10 + '0';
- TR1=0;LCD_send(2,11,fre,5);TR1=1; break;
- }
- case 61: {
- if(div<=1) THHL=65536-3906; else {div--;THHL=65536-3906/div;}//频率down
- fre[0]=div/100 + '0';fre[1]=div/10%10 + '0';fre[2]=div%10 + '0';
- TR1=0;LCD_send(2,11,fre,5);TR1=1; break;
- }
-
- case 59: {Signal_chose=0;TR1=0;LCD_send(1,5,"Sin ",10);TR1=1; break;} //正弦波
- case 55: {Signal_chose=1;TR1=0;LCD_send(1,5,"Triangular",10);TR1=1; break;} //三角波
- case 47: {Signal_chose=2;TR1=0;LCD_send(1,5,"Square ",10);TR1=1; break;} //方波
- case 31: {Signal_chose=3;TR1=0;LCD_send(1,5,"Sawtooth ",10);TR1=1; break;} //锯齿波
- default:{break;}
- }
- }
- }
-
- void init() //初始化
- {
- key=0x3f;P2=0x00;dataout=0x00;THHL=65536-3906; ///初始频率为1Hz
- TH1=THHL/256;TL1=THHL%256;
- TMOD=0x11;ET1=1;TR1=1;EA=1;
- }
-
- void main()
- {
- LCD_init();
- LCD_send(1,0,"Type:Sin",8);
- LCD_send(2,0,"frequency:",10);
- LCD_send(2,11,fre,5);
- init();
- while(1)
- {
- keyscan();
- switch(Signal_chose)
- {
- case 0: {dataout=sin_tab[n]; break;} //正弦波
- case 1: {dataout=thr_tab[n]; break;} //三角波
- case 2: {dataout=squ_tab[n]; break;} //方波
- case 3: {dataout=255-n;break;} //锯齿波
- default:{break;}
- }
- }
- }
-
- void time_intt1(void) interrupt 3
- {
- TL1=THHL%256;TH1=THHL/256;
- // if(n>=255) {n=0;} else {n++;}
- n++;
- }
- sbit RS = P2^6;
- sbit RW = P2^5;
- sbit EN = P2^7;
-
- void LCD_send(unsigned char i,unsigned char j,unsigned char str[],unsigned char n)
- {
- //输入:显示行数i,列数j,输出字符,输出字符长度n
- unsigned char x=0;
- if(i==1)
- {write_com(0x80+j);}
- else
- {write_com(0x80+0x40+j);}
- for(x=0;x<n;x++)
- {
- write_date(str[x]);
- delay(150);
- }
- }
-
- int LCD_init()//初始化函数体
- {
- EN = 0;
- write_com(0X38);//设置16*2显示,5*7点阵,8位数据接口
- write_com(0X0C);//设置开显示,不显示光标
- write_com(0X06);//写一个字符时,整屏右移
- write_com(0X01);//显示清零
- return 0;
- }
- int write_com(unsigned char com)//写命令的函数体
- {
- RS = 0;
- RW = 0;
- P0 = com;
- delay(5);
- EN = 1;
- delay(5);
- EN = 0;
- return 0;
- }
复制代码
以上资料51hei下载地址:
51黑论坛-波形发生器.rar
(95.07 KB, 下载次数: 412)
|