成都理工大学《电子系统设计》课程设计2一、总体设计1.1方案的设计与选择实现方波发生器的方法很多,但主要有三个方案:采用单片函数发生器8038,采用锁相式频率合成器,采用单片机编程。其对比如下表:方案优点缺点单片函数发生器8038简单易行,可实现数控调整频率信号频率稳定度不高锁相式频率合成器性能良好难以达到输出频率覆盖系数的要求,电路复杂。单片机编程信号精度较高需求软硬件结合表1–方案对比通过对比,决定采用单片机编程的方法来实现。该方法可以通过编程的方法来控制信号波形的频率和幅度,而且在硬件电路不变的情况下,通过改编程序来实现频率的变换。此外,由于通过编程方法产生的是数字信号,所以信号的精度可以做得很高。本设计用到一个AT89C51微处理器,4个按键,一个四与门。AT89C51用到两个定时器,定时器0和定时器1。其中定时器0工作在定时方式1下,决定方波频率;定时器1工作在定时方式1下,用来设定占空比。按键1与2控制方波信号频率。按下按键1或2时,进行频率的调节,占空比不变。1键按下时,频率增加100Hz,若2键按下时,频率增加10Hz。频率最大值为500Hz,当频率大于最大值时,重新赋值为50Hz。另外两个按键控制方波信号占空比。当按键3和4按下时,进行占空比调节,频率不变。3键按下时,占空比进行增加10%,4键按下时,占空比增加1%。占空比最大值为100%,当占空比大于100%时,重新赋值为0%。1.2设计原理AT89C51单片机具有组成微型计算机的各部分部件:CPU、RAM、I/O定时器/计数器以及串行通讯接口等。只要将AT89C51的ROM,接口电路,再配置键盘及其接口,显示器及成都理工大学《电子系统设计》课程设计3其接口,数模转换及波形输出,指示灯及其接口等四部分,即可构成所需波形发生器。其信号发生器构成原理框图如图1所示。图1–方波信号发生器设计原理框图在信号发生器中,只用到片内中断请求,即是在AT89C51输出一个波形采样点信号后,接着启动定时器,在定时器未产生中断之前,AT89C51等待,直到定时器计时结束,产生中断请求,AT89C51响应中断,接着输出下一个信号波形,如此循环。当有按键按下时,产生外部中断请求信号,CPU暂停当前工作,处理中断请求,重新装入定时初值,开始定时。根据计算定时器初值的公式:TC=2L−fOSC×t12计算出定时器0与定时器1所要装入的初值。定时器0初值:C1=(65536-fosc/(12.0*freq))定时器0初值:C1=(65536-(fosc*zkb)/(12.0*100*freq))其中freq表示输出方波频率,zkb表示方波占空比。成都理工大学《电子系统设计》课程设计4二、系统的硬件设计2.1系统硬件原理系统硬件原理图如图2。本次设计中,采用内部时钟方式。AT89C51单片机的P1.0、P1.1、P1.2、P1.3口分别连接四个按键,对输出方波的频率、占空比进行控制。P2.0口作为方波输出口,可以通过示波器来观察波形。四个键盘口连接一个四与门,与INT0口连接,将键盘中断请求信号送入CPU。图2–系统硬件原理图2.2芯片端口资源分配表表274LS21芯片端口资源分配表芯片端口作用说明1连接按键1,判断按键1是否按下2连接按键2,判断按键2是否按下4连接按键3,判断按键3是否按下5连接按键4,判断按键4是否按下6发送键盘中断请求信号成都理工大学《电子系统设计》课程设计5表3AT89C51芯片端口资源分配表芯片端口作用说明P1.0连接按键1,控制输出方波频率P1.1连接按键2,控制输出方波频率P1.2连接按键3,控制输出方波占空比P1.3连接按键4,控制输出方波占空比P2.0输出方波波形P3.2接收键盘中断请求信号三、软件设计方波发生器的软件设计包括主程序、延时子程序、系统初始化程序、键盘中断子程序、定时器中断子程序。3.1主程序主程序包括系统初始化,和一个死循环系统。当有中断请求信号产生时,跳出循环,执行中断程序。流程图如图3所示。开始系统初始化空循环图3–主程序流程图成都理工大学《电子系统设计》课程设计63.2系统初始化子程序在此程序中,给所有变量赋初值:键盘扫描口、初始频率与占空比及定时、开中断、定时器0与定时器1的工作方式等。初始化时启动了定时器0和定时器1.其中初始频率为50Hz,占空比为50%。键盘中断处理子程序流程图如图4所示3.3键盘中断子程序键盘用外中断0实现。当有键按下时,产生低电平送入INT0口,形成中断请求信号,CUP转去执行键盘中断子程序,进行频率调节或占空比调节。(1)频率调节按下按键1或2时,进行频率的调节,占空比不变。1键按下时,频率增加100Hz,若2键按下时,频率增加10Hz。频率最大值为500Hz,当频率大于最大值时,重新赋值为50Hz。(2)占空比调节当按键3和4按下时,进行占空比调节,频率不变。3键按下时,占空比进行增加10%,4键按下时,占空比增加1%。占空比最大值为99%,当占空比大于99%时,重新赋值为1%。成都理工大学《电子系统设计》课程设计7开始关中断延时消抖是否有键按下判断按键号键处理频率和占空比范围是否超界赋初值计算定时初值键盘口初始化关中断结束NYYN图4–键盘中断处理子程序流程图3.4定时器中断子程序定时器中断子程序中有定时器0与定时器1中断,频率定时器0中断流程图与占空比定时器1流程图分别如图5、图6所示。①定时器0中断执行的操作有:复位,启动自身进行频率定时,同时启动定时器1,进行占空比定时,输出高电平。②定时器1中断,停止自身的计时,输出低电平。成都理工大学《电子系统设计》课程设计8定时器0中断入口TR1=1重装定时初值输出高电平结束定时器1中断入口TR1=0重装定时初值输出低电平结束图5–频率定时器0中断流程图6–频率定时器1中断流程四、系统调试在本次课程设计中,使用Proteus软件进行仿真调试。调试内容主要为软硬件的协同,观察波形输出结果是否能够与设计方案所设计的那样达到要求。调试结果如下:1)在Proteus软件中运行仿真,示波器窗口中出现方波波形,显然波形频率与占空比分别为50Hz和50%,符合程序初始化的结果。图7–Proteus仿真–初始状态成都理工大学《电子系统设计》课程设计92)分别按下按键1、2调节方波频率。可以看到方波波形频率不断增加,一快一慢,而占空比依然为50%未变。图8–Proteus仿真–调节方波频率3)重新在初始状态下进行仿真。分别按下按键3、4调节方波占空比,可以看到方波波形的占空比发生变化,而频率未变。图9–Proteus仿真–调节方波占空比1)系统运行的初始状态如下图,与仿真结果一致。将HEX文件加载后,用示波器观察单片机的P2.0口,得到输出结果,如下图。五、成都理工大学《电子系统设计》课程设计10图10–系统运行–初始状态2)按下1、2键调节方波频率,可见方波频率增加,占空比依然保持50%。图11–系统运行–调节方波频率3)使方波重新达到初始状态,分别按下3、4键,可见方波占空比发生相应变化,而频率依然为50Hz未变。图12–系统运行–初始状态成都理工大学《电子系统设计》课程设计114)同时调节频率及占空比,示波器图像变化结果符合预期。图13–系统运行–初始状态在本次设计中,方波信号发生器的频率和占空比都独立可调。输出方波信号的占空比范围为0%—100%,调节精度为1%;频率范围为50Hz—500Hz,调节精度为10Hz。频率和占空比之间的调节彼此独立。进行频率调节时,每次可以增加100Hz或10Hz,超过500Hz时输出为50Hz的方波;进行占空比调节时,每次可增加1%或10%,超出100%时输出占空比为0%方波。总体看来,设计成果达到了设计要求。输出方波的波形稳定,调节也较为简单。六、成都理工大学《电子系统设计》课程设计12七、源程序#includereg51.h#defineucharunsignedchar#defineuintunsignedintfloatfosc=12000000;//系统时钟频率sbitKEY1=P1^0;//控制频率百位;sbitKEY2=P1^1;//控制频率十位;sbitKEY3=P1^2;//控制占空比十位;sbitKEY4=P1^3;//控制占空比个位;sbitOUTPUT=P2^0;//方波输出端口;ucharzkb;uintfreq;ucharTIMER0_L,TIMER0_H,TIMER1_L,TIMER1_H;//定时器0和1的定时初值;/****************************延时子程序****************************/voiddelay(ucharn)//延时{uchari;while(n--){for(i=255;i0;i--){}}}成都理工大学《电子系统设计》课程设计13/*******************系统初始化*******************/voidchushihua(void){P1=0x0f;freq=50;zkb=50;TIMER0_L=0xe0;TIMER0_H=0xb1;TIMER1_L=0xf0;TIMER1_H=0xd8;TL0=0xe0;//初始频率50Hz定时20msTH0=0xb1;TL1=0xf0;//初始占空比50%定时10msTH1=0xd8;TMOD=0x11;//定时器1和定时器0工作在方式1IT0=1;//选择INT0为下降沿触发方式EX0=1;//外部中断0允许ET0=1;//定时器1和定时器0中断允许ET1=1;EA=1;//系统中断允许TR0=1;//定时器1和定时器0开始定时TR1=1;}/*********************主函数成都理工大学《电子系统设计》课程设计14*********************/voidmain(void){chushihua();//系统初始化while(1){}}/************************定时器中断子程序************************/voidTimer0_freq()interrupt1//频率定时器0中断{TR1=1;//启动定时器1,占空比定时TL0=TIMER0_L;TH0=TIMER0_H;OUTPUT=1;//输出高电平}voidTimer1_zkb()interrupt3//占空比定时器1中断{TR1=0;//定时器1停止TL1=TIMER1_L;TH1=TIMER1_H;OUTPUT=0;//输出低电平}/***********************键盘扫描子程序成都理工大学《电子系统设计》课程设计15***********************/voidkeyscan()interrupt0using1//外部中断0{floatTF0,TZ1;EX0=0;//关中断delay(10);//延时消抖if(P1!=0x0f)//判断是否有键按下{if(KEY1==0)freq+=100;//按键为1号,频率加100if(KEY2==0)freq+=10;//按键为2号,频率加10if(freq500)freq=50;//频率大于500Hz,重新赋值为50if(KEY3==0)zkb+=10;//按键为3号,占空比加10if(KEY4==0)zkb++;//按键为4号,占空比加1if(zkb100)zkb=1;//占空比大于100,重新赋值为0TF0=(65536-fosc/(12.0*freq));//频率定时初值TZ1=(65536-(fosc*zkb)/(12.0*100*freq));//占空比定时初值TIMER0_H=(uint)TF0/256;TIMER0_L=(uint)TF0%256;TIMER1_H=(uint)TZ1/256;TIMER1_L=(uint)TZ1%256;}P1=0x0f;//给键盘扫描口赋初值EX0=1;//开中断TR0=1;//定时器1和定时器0