基于STC89C51单片机的多波形信号发生器设计与Proteus仿真
基于STC89C51单片机的多波形信号发生器设计与Proteus仿真摘 要随着电子技术和集成电路的飞速发展信号发生器作为电子测量领域的基础设备其性能和智能化水平不断提升。本设计以STC89C51单片机为控制核心设计了一款多波形信号发生器。系统通过单片机控制DA转换模块产生多种波形信号结合LCD液晶显示模块实现信号频率、幅值及波形类型的实时显示并通过按键模块完成参数设置与波形切换。硬件电路部分包括DA转换电路、LCD显示接口电路及按键控制电路软件部分采用C语言编写实现波形生成算法、数据处理及人机交互等功能。同时本设计利用Proteus仿真软件对整个系统进行了电路仿真与功能验证仿真结果表明系统能够稳定输出正弦波、方波、三角波等多种波形频率和幅度调节范围满足设计要求波形质量良好LCD显示准确按键响应灵敏。该设计具有结构简单、成本低廉、操作方便、可靠性高等优点为信号发生器的教学实验和工程应用提供了有效的参考方案。关键词信号发生器STC89C51单片机DA转换Proteus仿真LCD显示AbstractWith the rapid development of electronic technology and integrated circuits, signal generators, as fundamental equipment in the field of electronic measurement, have continuously improved in performance and intelligence. This design adopts the STC89C51 microcontroller as the control core to design a multi-waveform signal generator. The system generates various waveform signals through the microcontroller-controlled DA conversion module, combines an LCD display module to achieve real-time display of signal frequency, amplitude, and waveform type, and uses a keypad module for parameter setting and waveform switching. The hardware circuit includes a DA conversion circuit, an LCD display interface circuit, and a keypad control circuit. The software is programmed in C language to implement waveform generation algorithms, data processing, and human-machine interaction functions. Meanwhile, the Proteus simulation software is used to simulate and verify the entire system. The simulation results show that the system can stably output multiple waveforms such as sine waves, square waves, and triangular waves. The frequency and amplitude adjustment ranges meet the design requirements, with good waveform quality, accurate LCD display, and sensitive keypad response. This design features a simple structure, low cost, convenient operation, and high reliability, providing an effective reference solution for teaching experiments and engineering applications of signal generators.Keywords: Signal Generator; STC89C51 Microcontroller; DA Conversion; Proteus Simulation; LCD Display目录摘 要 1Abstract 1实验一 信号发生器 3一、 实验目的 3二、实验原理 31 系统概述 41.1 设计任务 41.2 总体方案 42 信号发生器的Proteus软件仿真电路设计 52.1 LCD液晶设计 52.2 DA模块 62.3 按键模块 63 数字电压表的软件程序设计 6三实验设备 6四、实验内容 7#include reg52.h //头文件#include intrins.h#include stdio.h#include math.h#define uint unsigned int#define uchar unsigned char#define ulong unsigned longuchar s1num,shape,num,a,b,c,d,e,f,h,boxing;ulong Freq,g;uint Config_Data[8];uchar code table1[]波形选择 : SIN ;uchar code table2[]波形频率 : ;uchar code table3[]0 0 0 0 0 0 0 HZ;uchar code table4[]DDS 信号发生器 ;sbitrsP2^7;//12864液晶端口的定义 sbitrwP2^6;sbitepP2^5;sbitlcd_psbP2^4;sbitFSYNCP1^4;//AD9833端口的定义 sbit SCLKP1^3;sbitSDATAP1^2;sbits1P2^0;//光标键 sbits2P2^1;//上调键 sbits3P2^2;//下调键 void Wave_Generate(ulong,uchar);//波形的频率和波形的选择 void AD9833_Send_Word(uint);//AD9833的数据接收函数 void delay(uint);//延时函数 void delay(uint xms){uint i,j;for(ixms;i0;i--)for(j110;j0;j--);}void lcd_cmd(uchar cmd)//12864写入的指令{rs0;rw0;ep0;P0cmd;delay(5);ep1;delay(5);ep0;}void lcd_dat(uchar dat)//12864写入的数据{rs1;rw0;ep0;P0dat;delay(5);ep1;delay(5);ep0;}void lcd_init()//12864液晶的初始化{lcd_psb1;delay(5);lcd_cmd(0x34);delay(5);lcd_cmd(0x30);delay(5);lcd_cmd(0x0c);delay(5);lcd_cmd(0x01);delay(5);}voiddisplay(){uint i;lcd_cmd(0x80);//第一行显示 while(table1[i]!\0){lcd_dat(table1[i]);i;}i0;lcd_cmd(0x90);//第二行显示 while(table2[i]!\0){lcd_dat(table2[i]);i;}i0;lcd_cmd(0x88);//第三行显示 while(table3[i]!\0){lcd_dat(table3[i]);i;}i0;lcd_cmd(0x98);//第四行显示 while(table4[i]!\0){lcd_dat(table4[i]);i;}}void input_freq()//矩形键盘扫描函数{if(s10)//光标键{delay(5);if(s10){s1num;while(!s1);lcd_cmd(0x0f);if(s1num1){lcd_cmd(0x807);}if(s1num2){lcd_cmd(0x886);}if(s1num3){lcd_cmd(0x885);}if(s1num4){lcd_cmd(0x884);}if(s1num5){lcd_cmd(0x883);}if(s1num6){lcd_cmd(0x882);}if(s1num7){lcd_cmd(0x881);}if(s1num8){lcd_cmd(0x880);}if(s1num9){s1num0;lcd_cmd(0x0c);ga10*b100*c1000*d10000*e100000*f1000000*h;Freqg;boxingshape;Wave_Generate(Freq,boxing);}}}if(s1num!0)//上调键{if(s20){delay(5);if(s20){while(!s2);if(s1num1){shape;if(shape3)shape0;lcd_cmd(0x806);switch(shape){case0: lcd_dat(S);//按0为正弦波 delay(5);lcd_dat(I);delay(5);lcd_dat(N);delay(5);break;case1: lcd_dat(T);//按1为三角波 delay(5);lcd_dat(R);delay(5);lcd_dat(I);delay(5);break;case2: lcd_dat(D);//按2为方波 delay(5);lcd_dat(A);delay(5);lcd_dat(C);delay(5);break;}}if(s1num2){a;if(a10)a0;lcd_cmd(0x886);lcd_dat(0x30a);}if(s1num3){b;if(b10)b0;lcd_cmd(0x885);lcd_dat(0x30b);}if(s1num4){c;if(c10)c0;lcd_cmd(0x884);lcd_dat(0x30c);}if(s1num5){d;if(d10)d0;lcd_cmd(0x883);lcd_dat(0x30d);}if(s1num6){e;if(e10)e0;lcd_cmd(0x882);lcd_dat(0x30e);}if(s1num7){f;if(f10)f0;lcd_cmd(0x881);lcd_dat(0x30f);}if(s1num8){h;if(h10)h0;lcd_cmd(0x880);lcd_dat(0x30h);}}}}if(s1num!0){if(s30){delay(5);if(s30){while(!s3);if(s1num1){shape--;if(shape-1)shape2;lcd_cmd(0x806);switch(shape){case0: lcd_dat(S);//按0为正弦波 delay(5);lcd_dat(I);delay(5);lcd_dat(N);delay(5);break;case1: lcd_dat(T);//按1为三角波 delay(5);lcd_dat(R);delay(5);lcd_dat(I);delay(5);break;case2: lcd_dat(D);//按2为方波 delay(5);lcd_dat(A);delay(5);lcd_dat(C);delay(5);break;}}if(s1num2){a--;if(a-1)a9;lcd_cmd(0x886);lcd_dat(0x30a);}if(s1num3){b--;if(b-1)b9;lcd_cmd(0x885);lcd_dat(0x30b);}if(s1num4){c--;if(c-1)c9;lcd_cmd(0x884);lcd_dat(0x30c);}if(s1num5){d--;if(d-1)d9;lcd_cmd(0x883);lcd_dat(0x30d);}if(s1num6){e--;if(e-1)e9;lcd_cmd(0x882);lcd_dat(0x30e);}if(s1num7){f--;if(f-1)f9;lcd_cmd(0x881);lcd_dat(0x30f);}if(s1num8){h--;if(h-1)h9;lcd_cmd(0x880);lcd_dat(0x30h);}}}}}voidmain(){P00xff;P10xff;P20xff;P30xff;//delay(10000);lcd_init();display();FSYNC1;SCLK0;delay(5);Wave_Generate(1000,0);while(1){input_freq();}}void AD9833_Send_Word(uint Data_In){uchar i;SCLK1;FSYNC0;for(i0;i16;i){SCLK1;SDATA(bit)((Data_In0x8000)15);SCLK0;Data_InData_In1;}FSYNC1;SCLK0;}void Wave_Generate(ulong Freq,uchar shape){ulong temp;uchar k;if(Freq12000000)Freq12000000;switch(shape){case0: Config_Data[0]0x2108;//按0为正弦波 Config_Data[7]0x2008;break;case1: Config_Data[0]0x210A;//按1为三角波 Config_Data[7]0x200A;break;case2: Config_Data[0]0x2128;//按2为方波 Config_Data[7]0x2028;break;default: Config_Data[0]0x2108;Config_Data[7]0x2008;}tempFreq*10.73;//tempFreq*(0x10000000/20000000);Config_Data[1]temp0x00003fff;Config_Data[3]Config_Data[1];Config_Data[2](temp0x0fffc000)14;Config_Data[4]Config_Data[2];Config_Data[1]Config_Data[1]|0x4000;Config_Data[2]Config_Data[2]|0x4000;Config_Data[3]Config_Data[3]|0x8000;Config_Data[4]Config_Data[4]|0x8000;Config_Data[5]0xC000;Config_Data[6]0xE000;for(k0;k8;k){AD9833_Send_Word(Config_Data[k]);}}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2608882.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!