您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > (完整word版)多波形发生器的设计
1基于51单片机的多波形发生器1.设计原理与技术方法1.1电路工作原理分析与原理图本次课设使用芯片PCF8591进行D/A转换,通过I2C协议(短距离通信传输协议)与单片机进行通信,当写入255时,D/A输出5V电压,因此改变写入芯片的值可以输出不同的电压值,也就可以输出不同的波形。当改变每次数据写入PCF8591的时间间隔,也就可以实现输出不同频率的波形。通过按键可以步进调节幅度,占空比和频率,并且可以通过数码管显示方波的频率,并可以通过按键直接设置频率的大小。总的系统结构框图如图1所示。单片机频率显示波形显示按键图1系统框图总的电路图见附录,下面是各部分的电路图:(1)STC89C516使用12M的晶振,接5V电源,STC89C516的电路图如图2所示。图2STC89C516电路图2(2)D/A转换模块,使用PCF8591的D/A转换功能,AOUT引脚接示波器显示,其电路图如图3所示。图3DA模块电路图(3)独立按键部分,使用的是共阴极的接法,当按键按下时,I/O口为低电平。其电路图如图4所示。图4独立按键电路图(4)动态数码管采用八个共阴数码管进行动态显示,利用人眼的视觉暂留,用74LS138译码器进行位选,再输出相应的段码后进行延时,就可以观察到八位数码管同时点亮,电路图如图5所示。3图5动态数码管电路图1.2元器件选择1.2.1单片机的选择因为STC89C516是一种灵活性高且廉价的芯片,所以课设选择此芯片。并且抗干扰能力强,保密性能强悍,很难被破解,单片机时钟有防外部电磁辐射功能。1.2.2DA芯片的选择由于课设开发板自带的D/A模块运用的PWM调制,再通过运算放大器产生模拟信号,这种方法再改变频率和幅度时不稳定,输出波形不理想,所以使用PCF8591。PCF8591是一个单片集成、单独供电、低功耗、8-bitCMOS数据获取器件。PCF8591具有4个模拟输入、1个模拟输出和1个串行I2C总线接口。PCF8591的3个地址引脚A0,A1和A2可用于硬件地址编程,允许在同个I2C总线上接入8个PCF8591器件,而无需额外的硬件。在PCF8591器件上输入输出的地址、控制和数据信号都是通过双线双向I2C总线以串行的方式进行传输。1.2.3数码管采用八个共阴数码管,进行动态显示。数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划a,b,c,d,e,f,g,dp的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是哪个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱4动。在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。1.2.4译码器的选择由于使用八位数码管进行动态显示,为了减少I/O口的使用,所以采用74LS138译码器,使用3个I/O口控制数码管的八位位选。74LS138的工作原理是以下四点:①当一个选通端(E1)为高电平,另两个选通端((/E2))和(/E3))为低电平时,可将地址端(A0、A1、A2)的二进制编码在Y0至Y7对应的输出端以低电平译出。(即输出为Y0至Y7的非)比如:A2A1A0=110时,则Y6输出端输出低电平信号。②利用E1、E2和E3可级联扩展成24线译码器;若外接一个反相器还可级联扩展成32线译码器。③若将选通端中的一个作为数据输入端时,74LS138还可作数据分配器。④可用在8086的译码电路中,扩展内存。2.系统软件设计2.1主程序流程图程序采用模块化编程,分为main.c和iic.c两个文件。iic.c文件内是I2C通信协议和PCF8591写入数据函数的编程;main.c文件内是全部功能实现的程序,即显示各种波形,调整幅度、频率、占空比,显示频率等功能。程序流程图如图6所示。5开始Fig_choice=0?显示方波Fig_choice=1?显示三角波Fig_choice=2?显示锯齿波Fig_choice=3?显示正弦波Fig_choice=4?显示梯形波YYYYYNNNNNFig_choice=0按键扫描KEY1/KEY5按下幅度调节KEY2/KEY6按下KEY4按下YNKEY3/KEY6按下占空比调节频率调节YYYNNNKEY8按下显示频率YN返回图6主程序流程图62.2主程序的源程序代码main.c/*74HC138A接P22B接P23C接P24按键接P1*/#includereg51.h//#includeiic.h#includemath.h#defineu8unsignedchar#defineu16unsignedint#defineGPIO_KEYP1sbitWei_A=P2^2;sbitWei_B=P2^3;sbitWei_C=P2^4;u8codesmg_du[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00};//0-9//u8idatazhengxuan_table[128];u8codezhengxuan_table[]={0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15,0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x38,0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e,0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66,0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80,0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,0xb1,0xb4,0xb7,0xba,0xbc,0xbf,0xc2,0xc5,0xc7,0xca,0xCC,0xcf,0xd1,0xd4,0xD6,0xd8,0xda,0xdd,0xDF,0xe1,0xe3,0xe5,0xE7,0xf9,0xea,0xec,0xee,0xef,0xf1,0xf2,0xF4,0xf5,0xf6,0xf7,0xf8,0xF9,0xfa,0xfb,0xfc,0xfd,0xfD,0xfe,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xfd,70xfd,0xFC,0xfb,0xfa,0xf9,0xf8,0xF7,0xf6,0xf5,0xF4,0xf2,0xF1,0xef,0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda,0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xBF,0xbc,0xba,0xb7,0xb4,0xb1,0xae,0xab,0xA8,0xa5,0xA2,0x9F,0x9C,0x99,0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,0x80,0x7c,0x79,0x78,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51,0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2E,0x2b,0x29,0x27,0x25,0x22,0x20,0x1e,0x1c,0x1A,0x18,0x16,0x15,0x13,0x11,0x10,0x0E,0x0D,0x0B,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00};u8inform_display[8];u8set_display[8];u8AM=255;//波形幅度255对应5vu8U_out=10;u16T=5000;//一半周期5000u16T_count=0;//周期计数u16F=1;//频率初始1hzu16mid_squre=2500;u16T_temp;u16C_temp;u8Fig_choice=0;//1-方波2-三角波u8tri_temp=0;u8ti_temp=0;u8zx_temp=0;u8function=0;sbitPWM=P2^1;#defineNO_KEY0xff//无按键按下#defineKEY_STATE00//判断按键按下#defineKEY_STATE11//确认按键按下#defineKEY_STATE22//释放unsignedcharKey_Scan(){staticunsignedcharkey_state=KEY_STATE0;8u8key_value=0,key_temp;//GPIO_KEY=0xff;key_temp=GPIO_KEY;switch(key_state){caseKEY_STATE0:if(key_temp!=NO_KEY){key_state=KEY_STATE1;}break;caseKEY_STATE1:if(key_temp==NO_KEY){key_state=KEY_STATE0;}else{switch(key_temp){case0xFE:key_value=1;break;case0xFD:key_value=2;break;case0xFB:key_value=3;break;case0xF7:key_value=4;break;case0xEF:key_value=5;break;case0xDF:key_value=6;break;case0xBF:key_value=7;break;case0x7F:key_value=8;break;}key_state=KEY_STATE2;}break;caseKEY_STATE2:if(key_temp==NO_KEY)9{key_state=KEY_STATE0;}break;}returnkey_value;}voidTimer0Init(void)//1毫秒@12.000MHz{TMOD&=0xF1;//设置定时器模式TL0=0x18;//设置定时初值TH0=0xFC;//设置定时初值//TF0=0;//清除TF0标志ET0=1;EA=1;TR0=1;//定时器0开始计时}voidTimer1Init(void)//100微秒@12.000MHz{TMOD&=0x1F;//设置定时器模式TL1=0x9C;//设置定时初值TH1=0xFF;//设置定时初值//TF0=0;//清除TF0标志ET1=1;EA=1;TR1=1;//定时器1开始计时}bitkey_flag;u8key_dis=0;u8test=0;bithigh_flag;10bitlow_flag;bitDIR=1;bitset_flag;bitclick_flag;voidmain(void){u8key_val=NO_KEY;floata=0;T
本文标题:(完整word版)多波形发生器的设计
链接地址:https://www.777doc.com/doc-7119641 .html