基于 C51 单片机的波形发生器课程设计(C 语言实现)_第1页
基于 C51 单片机的波形发生器课程设计(C 语言实现)_第2页
基于 C51 单片机的波形发生器课程设计(C 语言实现)_第3页
基于 C51 单片机的波形发生器课程设计(C 语言实现)_第4页
基于 C51 单片机的波形发生器课程设计(C 语言实现)_第5页
已阅读5页,还剩10页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于C51单片机的波形发生器课程设计(C语言实现)课程名称:单片机原理与接口技术设计题目:基于C51的多功能波形发生器设计学生姓名:XXX学号:XXXXXX指导教师:XXX完成日期:202X年X月X日一、设计概述1.1设计目标本设计以AT89C52单片机为核心,实现一款可生成多种波形(正弦波、方波、三角波、锯齿波)的发生器,具备以下功能:波形种类:支持4种基础波形切换;参数调节:可通过按键调整输出波形的频率(100Hz-5kHz)和幅值(0-5V);状态显示:用LCD1602实时显示当前波形类型、频率及幅值;稳定输出:波形失真度低,频率误差≤5%。1.2核心方案系统通过“单片机+DAC”架构实现波形生成:C51单片机通过软件计算各波形的离散电压值,经DAC0832(数模转换器)将数字信号转为模拟电压信号输出;按键模块负责参数输入,LCD1602用于状态反馈,整体结构紧凑且成本低。二、硬件设计核心模块2.1系统结构框图![系统结构框图](注:实际设计需补充框图,此处文字描述)核心模块组成:控制核心:AT89C52单片机(负责波形计算、按键处理、显示驱动);数模转换:DAC0832(8位DAC,将数字量转为0-5V模拟量);输入模块:4个独立按键(波形切换、频率+、频率-、幅值调节);显示模块:LCD1602(显示波形类型、频率、幅值参数);辅助电路:运算放大器(LM358,增强DAC输出带载能力)、电源模块(5V供电)。2.2DAC0832与单片机连接DAC0832采用“直通方式”(简化控制),与单片机连接如下:单片机P0口(P0.0-P0.7)接DAC0832的8位数据输入端(DI0-DI7);DAC0832的CS(片选)、WR1(写信号1)接地(始终有效),ILE接高电平(允许输入锁存);DAC0832的OUT1输出端接LM358同相输入端,经放大后输出波形。三、软件设计核心代码3.1头文件与全局变量定义#include<reg52.h>#include<math.h>//用于正弦波计算//引脚定义#defineDAC_PORTP0//DAC0832数据口接P0sbitKEY_WAVE=P3^0;//波形切换按键sbitKEY_FREQ_UP=P3^1;//频率+按键sbitKEY_FREQ_DOWN=P3^2;//频率-按键sbitKEY_AMPL=P3^3;//幅值调节按键//LCD1602引脚(略,同常规连接)//全局变量unsignedcharwave_type=0;//波形类型:0-正弦波,1-方波,2-三角波,3-锯齿波unsignedintfreq=1000;//当前频率(Hz),初始1kHzunsignedcharampl=255;//幅值系数(0-255,对应0-5V),初始最大unsignedintdelay_us;//波形输出延时(us),由频率计算得到3.2系统初始化//LCD1602初始化(常规函数,略)voidLCD_Init();//延时函数(us级,用于频率控制)voidDelay_us(unsignedintt){while(t--){_nop_();_nop_();_nop_();_nop_();//1us延时(11.0592MHz晶振)}}//系统初始化:计算初始延时、初始化外设voidSystem_Init(){LCD_Init();//初始频率1kHz,波形每周期256个点,计算每个点的延时delay_us=1000000/(freq*256);//总周期=1/freq,分256步输出//LCD初始显示LCD_ShowString(0,0,"Wave:Sin");LCD_ShowString(1,0,"Freq:1000Hz");LCD_ShowString(1,10,"Amp:Max");}3.3按键扫描与参数更新//按键消抖(返回1表示按键有效)bitKey_Scan(unsignedchar*key){staticunsignedcharkey_state=1;staticunsignedintkey_cnt=0;if(*key!=key_state){key_state=*key;key_cnt=0;}else{if(key_cnt<1000)key_cnt++;elsereturn1;//稳定1000ms后确认有效}return0;}//参数更新:根据按键调整波形、频率、幅值voidParam_Update(){//波形切换按键(循环切换4种波形)if(Key_Scan(&KEY_WAVE)==1){wave_type=(wave_type+1)%4;switch(wave_type){case0:LCD_ShowString(0,5,"Sin");break;case1:LCD_ShowString(0,5,"Square");break;case2:LCD_ShowString(0,5,"Tri");break;case3:LCD_ShowString(0,5,"Saw");break;}}//频率+按键(100Hz步进,最大5kHz)if(Key_Scan(&KEY_FREQ_UP)==1&&freq<5000){freq+=100;delay_us=1000000/(freq*256);//更新延时LCD_ShowNum(1,5,freq,4);//显示新频率}//频率-按键(100Hz步进,最小100Hz)if(Key_Scan(&KEY_FREQ_DOWN)==1&&freq>100){freq-=100;delay_us=1000000/(freq*256);LCD_ShowNum(1,5,freq,4);}//幅值调节按键(循环切换3档:Max/Med/Min)if(Key_Scan(&KEY_AMPL)==1){if(ampl==255){ampl=170;LCD_ShowString(1,10,"Amp:Med");}elseif(ampl==170){ampl=85;LCD_ShowString(1,10,"Amp:Min");}else{ampl=255;LCD_ShowString(1,10,"Amp:Max");}}}3.4波形生成核心函数3.4.1正弦波生成(基于查表法)//预存正弦波离散值(0-360度,256个点,0-255)unsignedcharsin_table[256];//初始化正弦表(主函数中调用一次)voidSin_Table_Init(){unsignedinti;for(i=0;i<256;i++){//sin(θ)范围-1~1,转换为0~255:(sin(θ)+1)*127.5sin_table[i]=(sin(2*3.14159*i/256)+1)*127.5;}}//输出正弦波voidGenerate_Sin(){unsignedinti;for(i=0;i<256;i++){//乘以幅值系数(0-255),实现幅值调节DAC_PORT=(sin_table[i]*ampl)/255;Delay_us(delay_us);//按当前频率延时}}3.4.2方波生成(高低电平交替)voidGenerate_Square(){unsignedinti;//前128点输出高电平,后128点输出低电平(占空比50%)for(i=0;i<128;i++){DAC_PORT=ampl;//高电平(幅值系数决定)Delay_us(delay_us);}for(i=0;i<128;i++){DAC_PORT=0;//低电平Delay_us(delay_us);}}3.4.3三角波生成(线性升降)voidGenerate_Tri(){unsignedinti;//上升段(0→ampl,128步)for(i=0;i<128;i++){DAC_PORT=(ampl*2*i)/255;//线性递增Delay_us(delay_us);}//下降段(ampl→0,128步)for(i=0;i<128;i++){DAC_PORT=ampl-(ampl*2*i)/255;//线性递减Delay_us(delay_us);}}3.4.4锯齿波生成(单向线性上升)voidGenerate_Saw(){unsignedinti;//0→ampl,256步线性上升,到达最大值后重置for(i=0;i<256;i++){DAC_PORT=(ampl*i)/255;//均匀递增Delay_us(delay_us);}}3.5主函数(系统调度)voidmain(){System_Init();Sin_Table_Init();//初始化正弦表while(1){Param_Update();//扫描按键,更新参数//根据当前波形类型输出对应波形switch(wave_type){case0:Generate_Sin();break;case1:Generate_Square();break;case2:Generate_Tri();break;case3:Generate_Saw();break;}}}四、调试与优化说明4.1频率精度优化问题:初始delay_us计算为整数,可能导致频率误差;解决:用定时器0实现更精准延时(如频率1kHz时,每步延时3.90625us),代码示例://定时器0初始化(用于精准延时)voidTimer0_Init(unsignedintus){TMOD&=0xF0;TMOD|=0x01;//16位定时器TH0=(65536-us*11.0592/12)/256;//计算初值(11.0592MHz晶振)TL0=(65536-us*

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论