多波形发生器的设计.docx
- 文档编号:29525446
- 上传时间:2023-07-24
- 格式:DOCX
- 页数:33
- 大小:673.01KB
多波形发生器的设计.docx
《多波形发生器的设计.docx》由会员分享,可在线阅读,更多相关《多波形发生器的设计.docx(33页珍藏版)》请在冰豆网上搜索。
多波形发生器的设计
基于51单片机的多波形发生器
1.设计原理与技术方法
1.1电路工作原理分析与原理图
本次课设使用芯片PCF8591进行D/A转换,通过I2C协议(短距离通信传输协议)与单片机进行通信,当写入255时,D/A输出5V电压,因此改变写入芯片的值可以输出不同的电压值,也就可以输出不同的波形。
当改变每次数据写入PCF8591的时间间隔,也就可以实现输出不同频率的波形。
通过按键可以步进调节幅度,占空比和频率,并且可以通过数码管显示方波的频率,并可以通过按键直接设置频率的大小。
总的系统结构框图如图1所示。
图1系统框图
总的电路图见附录,下面是各部分的电路图:
(1)STC89C516使用12M的晶振,接5V电源,STC89C516的电路图如图2所示。
图2STC89C516电路图
(2)D/A转换模块,使用PCF8591的D/A转换功能,AOUT引脚接示波器显示,其电路图如图3所示。
图3DA模块电路图
(3)独立按键部分,使用的是共阴极的接法,当按键按下时,I/O口为低电平。
其电路图如图4所示。
图4独立按键电路图
(4)动态数码管采用八个共阴数码管进行动态显示,利用人眼的视觉暂留,用74LS138译码器进行位选,再输出相应的段码后进行延时,就可以观察到八位数码管同时点亮,电路图如图5所示。
图5动态数码管电路图
1.2元器件选择
1.2.1单片机的选择
因为STC89C516是一种灵活性高且廉价的芯片,所以课设选择此芯片。
并且抗干扰能力强,保密性能强悍,很难被破解,单片机时钟有防外部电磁辐射功能。
1.2.2DA芯片的选择
由于课设开发板自带的D/A模块运用的PWM调制,再通过运算放大器产生模拟信号,这种方法再改变频率和幅度时不稳定,输出波形不理想,所以使用PCF8591。
PCF8591是一个单片集成、单独供电、低功耗、8-bit CMOS数据获取器件。
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端,就使各个数码管轮流受控显示,这就是动态驱动。
在轮流显示过程中,每位数码管的点亮时间为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所示。
图6主程序流程图
2.2主程序的源程序代码
main.c
/*
74HC138A接P22B接P23C接P24
按键接P1
*/
#include"reg51.h"//
#include"iic.h"
#include"math.h"
#defineu8unsignedchar
#defineu16unsignedint
#defineGPIO_KEYP1
sbitWei_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,
0xfd,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对应5v
u8U_out=10;
u16T=5000;//一半周期5000
u16T_count=0;//周期计数
u16F=1;//频率初始1hz
u16mid_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;
u8key_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)
{
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;
bitlow_flag;
bitDIR=1;
bitset_flag;
bitclick_flag;
voidmain(void)
{
u8key_val=NO_KEY;
floata=0;
Timer0Init();//1ms
Timer1Init();//1us
while
(1)
{
if(function==1)
{
inform_display[0]=0x40;inform_display[1]=0x71;inform_display[2]=0x40;inform_display[3]=0;
inform_display[4]=0;inform_display[7]=smg_du[F%10];
if(F/100==0)
{
inform_display[5]=0;
}
else
{
inform_display[5]=smg_du[F/100];
}
if((F%100/10==0)&&(F/100==0))
{
inform_display[6]=0;
}
else
{
inform_display[6]=smg_du[F%100/10];
}
}
elseif(function==2)
{
set_display[0]=0x40;set_display[1]=0x71;set_display[2]=0x40;set_display[3]=0;set_display[4]=0;
if(click_flag)
{
if(F/100==0)
{
set_display[5]=0;
}
else
{
set_display[5]=smg_du[F/100];
}
if((F%100/10==0)&&(F/100==0))
{
set_display[6]=0;
}
else
{
set_display[6]=smg_du[F%100/10];
}
set_display[7]=smg_du[F%10];
}
else
{
set_display[4]=0;set_display[5]=0;set_display[6]=0;set_display[7]=0;
}
}
if(key_flag)//10ms
{
key_flag=0;
key_val=Key_Scan();
switch(key_val)
{
case1:
//调节幅度+
test=1;
if(AM==255)
{
AM=0;
}
AM=AM+6;
break;
case2:
//调节频率+
test=2;
if(function==0)
{
F=F+100;
T=5000.0/F;
mid_squre=T/2.0;
}
if(function==2)
{
F=F+50;
}
break;
case3:
//占空比+
test=3;
mid_squre=mid_squre+T/100;
break;
case4:
//波形选择
test=4;
Fig_choice++;
if(Fig_choice==5)
{
Fig_choice=0;
}
break;
case5:
//调节幅度-
test=5;
if(AM==0)
{
AM=255;
}
AM=AM-6;
break;
case6:
//调节频率-
test=6;
if(function==0)
{
F=F-50;
T=5000.0/F;
a=T;
mid_squre=a/2.0;
}
if(function==2)
{
F=F-50;
}
break;
case7:
test=7;
mid_squre=mid_squre-T/100;
break;
case8:
//设置
test=8;
function++;
if(function==3)
{
function=0;
T=5000.0/F;
mid_squre=T/2.0;
}
//set_flag=!
set_flag;
break;
}
}
//方波
EA=0;
if(Fig_choice==0)
{
if(high_flag)
{
DAC_write(AM);
}
if(low_flag)
{
//EA=0;
DAC_write(0);
//EA=1;
}
}
//三角波
if(Fig_choice==1)
{
if(DIR==1)
{
tri_temp++;
//EA=0;
DAC_write(tri_temp);
//EA=1;
}
if(DIR==0)
{
tri_temp--;
//EA=0;
DAC_write(tri_temp);
//EA=1;
}
if(tri_temp==AM)
{
DIR=0;
}
if(tri_temp==0)
{
DIR=1;
}
}
//锯齿波
if(Fig_choice==2)
{
tri_temp++;
//EA=0;
DAC_write(tri_temp);
//EA=1;
if(tri_temp>AM)
{
tri_temp=0;
}
}
//正弦波
if(Fig_choice==3)
{
zx_temp++;
//EA=0;
DAC_write(zhengxuan_table[zx_temp]);//通过PCF8591输出正弦波
//EA=1;
//if(zx_temp>128)zx_temp=0;
}
//梯形波
if(Fig_choice==4)
{
if((DIR==1)&&(ti_temp==0))
{
tri_temp++;
//EA=0;
DAC_write(tri_temp);
//EA=1;
}
if(DIR==0)
{
tri_temp--;
//EA=0;
DAC_write(tri_temp);
//EA=1;
}
if(tri_temp==AM)
{
ti_temp++;
//EA=0;
DAC_write(tri_temp);
//EA=1;
if(ti_temp==100)//梯形波高电平时间
{
ti_temp=0;
DIR=0;
}
}
if(tri_temp==0)
{
DIR=1;
}
}
EA=1;
}
}
voidtimer0()interrupt1using1
{
staticintkey_count=0,smg_count=0,i=0,count_1s=0;//tri_bet为每个数据的时间间隔
TL0=0x18;//设置定时初值
TH0=0xFC;//设置定时初值
key_count++;smg_count++;count_1s++;
//T_count++;
if(count_1s==1000)
{
count_1s=0;
click_flag=!
click_flag;
}
if(key_count==10)//10ms
{
key_count=0;
key_flag=1;
}
if(smg_count==1)//1ms
{
smg_count=0;
P0=0x00;//消隐
switch(i)//位选,选择点亮的数码管,
{
case(0):
Wei_A=0;Wei_B=0;Wei_C=0;break;//显示第0位
case(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 波形 发生器 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)