基于单片机的多功能波形发生器设计讲义.docx
- 文档编号:10508449
- 上传时间:2023-02-17
- 格式:DOCX
- 页数:27
- 大小:79.84KB
基于单片机的多功能波形发生器设计讲义.docx
《基于单片机的多功能波形发生器设计讲义.docx》由会员分享,可在线阅读,更多相关《基于单片机的多功能波形发生器设计讲义.docx(27页珍藏版)》请在冰豆网上搜索。
基于单片机的多功能波形发生器设计讲义
基于MSP430单片机的多功能波形发生器设计
1.设计目的与任务
本次设计旨在利用msp430单片机设计一个多功能波形发生器,并且利用lcd12864液晶屏进行当前波形的特征值的测量及显示,例如频率。
2.设计指标与技术要求
(1)借助现有的单片机系统;
(2)能产生正弦波、方波、三角波、锯齿波等波形;
(3)各种波形频率可调,频率范围为100-3000Hz;
(4)正弦波输出电压为5V峰峰值,方波、三角波、锯齿波输出电压为5V
(5)采用8位D/A转换器;
(6)进行硬件平滑滤波;
(7)编写程序并调试;
(8)提供程序清单;
(9)能实物演示。
3.总体设计
图1.1所示是基于单片机的多波形发生器的总体设计流程图。
图1.1总体设计流程图
3.1总体设计功能说明:
根据设计要求,分析得本次设计需要硬件和软件两部分。
硬件上,如图。
键盘输入部分主要用于选择波形。
键盘共设4个键,用于选择三角波、矩形波、锯齿波、正弦波4种不同的波形,。
msp430单片机用来执行某一波形发生程序,向D/A转换器的输入端发送数据,将其转化成模拟量,并通过运算放大器调节波形的幅值,经过滤波器的滤波,从而在输出端得到所需的波形。
软件上,如图。
可由硬件设计好后,再根据要求进行具体编写。
程序的主要功能是:
首先程序在开始后,先判断P0.0,P0.1,P0.2相应的波形,然后根据选择的波形输出相应的波形.程序将根据要求进行调节波形.再下一步程序再判断用户继续从键盘输入要输出的波形,可以进行必要的延迟。
3.2总体电路图3.2如下所示:
图1.2总体电路图
3.3总体程序流程图3.2如下所示:
图1.3总体程序流程图
4.总体设计
4.1msp430单片机
∙MSP430单片机称之为混合信号处理器,是由于其针对实际应用需求,将多个不同功能的模拟电路、数字电路模块和微处理器集成在一个芯片上,处理能力强、运算速度快,功能强大
4.2DAC0832芯片
图2.2DAC0832芯片图
DAC0832是采样频率为八位的D/A转换芯片,集成电路内有两级输入寄存器。
DAC0832输出的是电流,一般要求输出是电压,所以还必须经过一个外接的运算放大器转换成电压。
DAC0832芯片具备双缓冲、单缓冲和直通三种输入方式,以便适于各种电路的需要(如要求多路D/A异步输入、同步转换等)。
所以这个芯片的应用很广泛,关于DAC0832的引脚功能如下:
D0~D7:
数字信号输入端。
ILE:
输入寄存器允许,高电平有效。
CS:
片选信号,低电平有效。
WR1:
写信号1,低电平有效。
XFER:
传送控制信号,低电平有效。
WR2:
写信号2,低电平有效。
IOUT1、IOUT2:
DAC电流输出端。
RfB:
是集成在片内的外接运放的反馈电阻。
VREF:
基准电压(-10~10V)。
Vcc:
是源电压(+5~+15V)。
AGND:
模拟地NGND:
数字地,可与AGND接在一起使用。
4.3硬件滤波电路
图2.3滤波电路图
由图知,截止频率w0=w=1/RC,即f=1/2pRC,再根据公式Q=Rf/(2Rf-R2)及Rf∥R2=2R可算出Rf及R2的值。
5.调试
实验调试过程需要使用到装有CCS的电脑、DP-51PRO单片机综合仿真实验仪以及示波器。
附:
程序代码:
msp430控制的液晶、键盘、AD转换程序
此程序未加CD4051,只能实现对单通道AD的转换
1.MAIN函数部分
//这一部分为主程序i,LCD,7289,程序详见附件
#include
#include"ZLG7289.h"
#include"LCD12864.h"
#defineucharunsignedchar
#defineuintunsignedint
uchardis1[]={"电压值:
"};
uchardis2[]={"上限电压:
"};
uchardis3[]={"0"};
ucharnumber[];
uintcolumn_num=0;
#defineNum_of_Results8
unsignedcharindex=0;
doubleaver=0.0;
unsignedchartext[40];
doublenum=0.0;
unsignedintresults[Num_of_Results];
voidmain(void){
WDTCTL=WDTPW+WDTHOLD;//Stopwatchdogtimer
P6SEL=0x00;
P8DIR|=BIT1+BIT2;
_enable_interrupts();
ZLG7289_initial();
LCD_Init();
LCD_Set_XY(0,0,dis1);//使能总中断
LCD_Set_XY(1,2,dis2);
P6SEL|=0x01;//EnableA/DchannelA0
ADC12CTL0=ADC12ON+ADC12SHT0_8+ADC12MSC;//TurnonADC12,setsamplingtime
//setmultiplesampleconversion
ADC12CTL1=ADC12SHP+ADC12CONSEQ_2;//Usesamplingtimer,setmode
ADC12IE=0x01;//EnableADC12IFG.0
ADC12CTL0|=ADC12ENC;//Enableconversions
ADC12CTL0|=ADC12SC;//Startconversion
_bis_SR_register(LPM4_bits+GIE);
__no_operation();//Fordebugger
}
#pragmavector=PORT2_VECTOR
__interruptvoidPORT2_ISR(void)
{
ucharkey_data;
key_data=ZLG7289_Key();
switch(key_data)
{
case0x00:
dis3[0]=0+48;number[column_num]=dis3[0];LCD_Set_XY(column_num,3,dis3);column_num++;break;
case0x01:
dis3[0]=1+48;number[column_num]=dis3[0];LCD_Set_XY(column_num,3,dis3);column_num++;break;
case0x02:
dis3[0]=2+48;number[column_num]=dis3[0];LCD_Set_XY(column_num,3,dis3);column_num++;break;
case0x03:
dis3[0]=3+48;number[column_num]=dis3[0];LCD_Set_XY(column_num,3,dis3);column_num++;break;
case0x08:
dis3[0]=4+48;number[column_num]=dis3[0];LCD_Set_XY(column_num,3,dis3);column_num++;break;
case0x09:
dis3[0]=5+48;number[column_num]=dis3[0];LCD_Set_XY(column_num,3,dis3);column_num++;break;
case0x0a:
dis3[0]=6+48;number[column_num]=dis3[0];LCD_Set_XY(column_num,3,dis3);column_num++;break;
case0x0b:
dis3[0]=7+48;number[column_num]=dis3[0];LCD_Set_XY(column_num,3,dis3);column_num++;break;
case0x10:
dis3[0]=8+48;number[column_num]=dis3[0];LCD_Set_XY(column_num,3,dis3);column_num++;break;
case0x11:
dis3[0]=9+48;number[column_num]=dis3[0];LCD_Set_XY(column_num,3,dis3);column_num++;break;
case0x12:
P8OUT^=BIT1;break;
case0x13:
P8OUT^=BIT2;break;
case0x18:
dis3[0]=46;number[column_num]=dis3[0];LCD_Set_XY(column_num,3,dis3);column_num++;break;
case0x19:
if(dis3[0]==(9+48))dis3[0]=0+48;
else
if(dis3[0]==46||dis3[0]==95);
elsedis3[0]++;column_num--;LCD_Set_XY(column_num,3,dis3);column_num++;break;
case0x1a:
if(dis3[0]==(0+48))dis3[0]=9+48;
else
if(dis3[0]==46||dis3[0]==95);
elsedis3[0]--;column_num--;LCD_Set_XY(column_num,3,dis3);column_num++;break;
case0x1b:
if(column_num!
=0)column_num--;dis3[0]=32;LCD_Set_XY(column_num,3,dis3);break;
}
P2IFG=0;//退出中断前必须手动清除IO口中断标志
}
#pragmavector=ADC12_VECTOR
__interruptvoidADC12ISR(void)
{
uchari=0;
intj;
switch(__even_in_range(ADC12IV,34))
{
case0:
break;//Vector0:
Nointerrupt
case2:
break;//Vector2:
ADCoverflow
case4:
break;//Vector4:
ADCtimingoverflow
case6:
//Vector6:
ADC12IFG0
results[index]=ADC12MEM0;//Moveresults
index++;
if(index==8)
{
index=0;
num=0;
for(i=0;i<8;i++)num+=results[i]/8;
aver=num/4096/10*33;
j=aver*100;
LCD_Set_XY_NUM(0,1,j/100);
LCD_Set_XY_LETTERL(2,1,46);
LCD_Set_XY_NUM(3,1,j%100/10);
LCD_Set_XY_NUM(5,1,j%10);
LCD_Set_XY_LETTERL(7,1,86);
LCD_delayms(500);
}
case8:
break;//Vector8:
ADC12IFG1
case10:
break;//Vector10:
ADC12IFG2
case12:
break;//Vector12:
ADC12IFG3
case14:
break;//Vector14:
ADC12IFG4
case16:
break;//Vector16:
ADC12IFG5
case18:
break;//Vector18:
ADC12IFG6
case20:
break;//Vector20:
ADC12IFG7
case22:
break;//Vector22:
ADC12IFG8
case24:
break;//Vector24:
ADC12IFG9
case26:
break;//Vector26:
ADC12IFG10
case28:
break;//Vector28:
ADC12IFG11
case30:
break;//Vector30:
ADC12IFG12
case32:
break;//Vector32:
ADC12IFG13
case34:
break;//Vector34:
ADC12IFG14
default:
break;
}
}
2.LCD函数部分
voidLCD_DelaymS(uintms)
{
uinti;
while(ms--)
{
for(i=150;i>0;i--)
_NOP();
}
}
voidLCD_delayms(uintms)
{
uinti;
while(ms--)
{
for(i=150;i>0;i--)
_NOP();
}
}
voidLCD_Write_8bits(uintW_bits)
{
uinti,Temp_data;
Clr_SCLK();
for(i=0;i<8;i++)
{
Temp_data=W_bits;
Temp_data<<=i;
if((Temp_data&0x80)==0)
{
Clr_SID();
}
else
{
Set_SID();
}
Set_SCLK();
Clr_SCLK();
}
}
voidW_1byte(uintRW,uintRS,uintW_data)
{
uintH_data,L_data,S_ID=0xf8;//11111RWRS0
if(RW==0)
{
S_ID&=~0x04;
}
else//if(RW==1)
{
S_ID|=0X04;
}
if(RS==0)
{
S_ID&=~0x02;
}
else//if(RS==1)
{
S_ID|=0X02;
}
H_data=W_data;
H_data&=0xf0;//屏蔽低4位的数据
L_data=W_data;//xxxx0000格式
L_data&=0x0f;//屏蔽高4位的数据
L_data<<=4;//xxxx0000格式
Set_CS();
LCD_Write_8bits(S_ID);//发送S_ID
LCD_Write_8bits(H_data);//发送H_data
LCD_Write_8bits(L_data);//发送L_data
Clr_CS();
}
voidLCD_Set_XY(ucharx,uchary,uchar*p)
{
//W_1byte(0,0,0x02);
if(y==0)
{
W_1byte(0,0,(0x80+x));//在开始显示字符
}
if(y==1)
{
W_1byte(0,0,(0x90+x));
}
if(y==2)
{
W_1byte(0,0,(0x88+x));
}
if(y==3)
{
W_1byte(0,0,(0x98+x));
}
while(*p!
=0)
{
W_1byte(0,1,*p++);
}
}
voidLCD_Set_XY_LETTERL(ucharx,uchary,ucharp)//等号0x3D加号0x2B
{
if(y==0)
{
W_1byte(0,0,(0x80+x));
}
if(y==1)
{
W_1byte(0,0,(0x90+x));
}
if(y==2)
{
W_1byte(0,0,(0x88+x));
}
if(y==3)
{
W_1byte(0,0,(0x98+x));
}
W_1byte(0,1,p);
}
voidLCD_Set_XY_NUM(ucharx,uchary,intp)
{
uchara=0;
ucharb=0;
a=p/10;
b=p%10;
if(y==0)
{
W_1byte(0,0,(0x80+x));
}
if(y==1)
{
W_1byte(0,0,(0x90+x));
}
if(y==2)
{
W_1byte(0,0,(0x88+x));
}
if(y==3)
{
W_1byte(0,0,(0x98+x));
}
//W_1byte(0,1,a+0x30);
if(y==0)
{
W_1byte(0,0,(0x81+x));
}
if(y==1)
{
W_1byte(0,0,(0x91+x));
}
if(y==2)
{
W_1byte(0,0,(0x89+x));
}
if(y==3)
{
W_1byte(0,0,(0x99+x));
}
W_1byte(0,1,b+0x30);
}
//===================================================================*/
voidLCD_Init(void)
{
ucharcmd;
P8DIR|=(CS+SID+SCLK);
//P6DIR=BIT1+BIT2+BIT3;
P8OUT|=BIT3;
cmd=0x30;//功能设置8位数据,基本指令
W_1byte(0,0,cmd);
LCD_DelaymS
(2);
cmd=0x0C;//显示状态ON,游标OFF,反白OFF
W_1byte(0,0,cmd);//写指令
LCD_DelaymS
(2);
cmd=0x01;//清除显示
W_1byte(0,0,cmd);//写指令
LCD_DelaymS
(2);
cmd=0x02;//地址归位
W_1byte(0,0,cmd);//写指令
LCD_DelaymS
(2);
cmd=0x80;//设置DDRAM地址
W_1byte(0,0,cmd);//写指令
LCD_DelaymS
(2);//延时
}
3.ZLG7289函数部分
voidDelay(unsignedintt)//延时tus
{
unsignedinti;
for(i=0;i DELAY_1US; } /* 函数: ZLG7289_SPI_Write() 功能: 向SPI总线写入1个字节的数据 参数: dat: 要写入的数据 */ voidZLG7289_SPI_Write(chardat)//5 { unsignedchart=8; ZLG7289_OperateIO&=~ZLG7289_CLK;//clk=0 do { if(dat&0x80) ZLG7289_OperateIO|=ZLG7289_DAT;//输入为1 else ZLG7289_OperateIO&=~ZLG7289_DAT; ZLG7289_OperateIO|=ZLG7289_CLK;//clk=1 dat<<=1; Delay(4); ZLG7289_OperateIO&=~ZLG7289_CLK;//clk=0 Delay(4); }while(--t! =0); } /* 函数: ZLG7289_SPI_Read() 功能: 从SPI总线读取1个字节的数据 返回: 读取到的数据 */ unsignedcharZLG7289_SPI_Read() { unsignedchardat=0x00; unsignedchart=8; ZLG7289_OperateIO&=~ZLG7289_CLK;//clk=0 //ZLG7289_DAT=1;//读取数据之前DIO引脚要置1以切换到输入状态 do { ZLG7289_OperateIO|=ZLG7289_CLK;//clk=1 Delay(4); dat<<=1; if((ZLG7289_OperateIO_IN&ZLG7289_DAT)) dat++; ZLG7289_OperateIO&=~ZLG7289_CLK;//clk=0 Delay(4); }while(--t! =0); returndat; } /* 函数: ZLG7289_cmd() 功能: 执行ZLG7289纯指令 参数: cmd: 命令字 *///6 voidZLG7289_cmd(charcmd) { ZLG7289_OperateIO_DIR|=ZLG7289_DAT;//output ZLG7289_OperateIO&=~ZLG7289_CS;//CS=0 Delay(24); ZLG7289_SPI_Write(cmd); ZLG7289_OperateIO|=ZLG7289_CS;//CS=1 ZLG7289_OperateIO_DIR&=~ZLG7289_DAT;//input将这一位转化为输入 } /* 函数: ZLG7289_cmd_dat() 功能: 执行ZLG7289带数据指令 参数: cmd: 命令字 dat: 数据 */ voidZLG7289_cmd_dat(charcmd,chardat) { ZLG7289_OperateIO_DIR|=ZLG7289_DAT;//output ZLG7289_OperateIO&=~ZLG7289_CS;//CS=0 Delay(24); ZLG7289_SPI_Write(cmd); Delay(14); ZLG7289_SPI_Write(dat); ZLG728
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 多功能 波形 发生器 设计 讲义