基于C8051F410的任意波形发生器_第1页
基于C8051F410的任意波形发生器_第2页
基于C8051F410的任意波形发生器_第3页
基于C8051F410的任意波形发生器_第4页
基于C8051F410的任意波形发生器_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

1、基于C8051F410的任意波形发生器一. 硬件电路1. C8051F410单片机开发板一块从上两图可以清楚的看到单片机置于板底层,而且是由品诺电子出品的。2. 波形调理电路下图是波形调理电路,采用了两级同相比例放大电路,第一级在P0.0/IDAC0输入端对地接一330电阻,目的是将电流信号转换成电压信号在对其进行放大,中间一级是电压跟随器,其目的是将两级放大电路相互隔离开,最后一级是压倍可变同相比例放大电路,其放大倍数在110之间可变,从而可实现模拟幅度调制。问题:为什么I/V转换电阻选330而不直接选1K呢?解答:在毕设起初调试阶段也采用过1K电阻,其目的是直接想将2mA电压直接转换成2V

2、电压,但调试许久仞未见到波形产生,最后才发现更换小电阻后就有波形了,于是才知道单片机的驱动能力有限,I/V转换电阻不宜过大,否则就实现不了想达到的效果。几级电路间当时还采用了双插针隔离,图中P1,P3,P4均是双插针,这样设计的目的是为了调试方便,易查出问题所在。当然也可以放上单插针建立测试点测试即可,使用双插针在对各级测试好后可采用短路帽短接级联,从而实现整体电路功能。下面做个简单估算:想必大家也都熟知同相比例放大电路放大倍数:Au=1+Rf RN那么第一级放大倍数就为3倍,输入电压VP-P为:330*2mA=660mV,即输入的电压信号峰值为330mV,经过第一级放大转换出的信号幅值约为9

3、90mV(约1V)。第二级放大倍数在110之间,也就是说输出电压幅值可在1V10V之间变化。当然LM741运放采用的是12V供的电,理论上输出波形幅值也可以达到12V,但是受开环增益影响,幅度在达到10V左右及以上的时候波形会有明显失真(当时我看到了正弦波有削顶失真)。3.LCD12864显示电路上图为显示电路,12864接法其实很简单,除了VSS,VDD,VO,BLA,BLK接电源外,还有两个空脚(Pin16和 Pin18),8位并行数据口DB0DB7(Pin7 Pin15),其他5位则是逻辑控制口,可通过单片机控制命令对其编程。本次设计采用了串行数据传输模式,即用到了RS(CS),R/W(

4、SID),E(SCLK),PSB,/RST,其中CS为串行传输片选端,SID为串行数据传输口,SCLK为串行数据传输时钟(通过置0写1完成),PSB为串行并行方式选择端(其中PSB=0为串行工作方式,PSB=1为并行工作方式)。在设计的时候预留了并行数据口,其目的是为了拓展使用。注意:LCM12864M-3.3 Ver 20在焊接时需要将背面电阻R7上有一个三段焊盘全部断路,出厂时该显示屏这个三段焊盘靠外侧的两个焊盘是短接在一起的,所以一定要拿吸锡纸将焊锡拿掉。二. 软件程序程序调试环境:Silicon Laboratories IDE程序:/- / Includes /- #include

5、/ SFR declarations/- /- / 16-bit SFR Definitions for F41x /- sfr16 TMR3RL = 0x92; / Timer3 reload valuesfr16 TMR3 = 0x94; / Timer3 counter sfr16 IDA0 = 0x96; / IDA0 high and low bytes/- /-/ Global Constants /- #define SYSCLK 24500000 / Internal oscillator frequency in Hz #define SAMPLE_RATE_DAC 1000

6、00L / DAC sampling rate in Hz #define PHASE_PRECISION 65536 / range of phase accumulator / is the change in phase between DAC samples; It is used in / the set_DACs routine./EDIT by lineterunsigned char m;unsigned char n; sbit Change_waveform=P17;sbit Change_frequency=P16;static unsigned int FREQUENC

7、Y=1000; /Frequency output in Hzstatic unsigned int FREQUENCY1=1; static unsigned int FREQUENCY2=1; /Frequency output in KHzunsigned int DATA;/ static unsigned int PHASE_ADD = FREQUENCY * PHASE_PRECISION / SAMPLE_RATE_DAC;/EDIT OVER unsigned int code SINE_TABLE128 = 0x0000, 0x0324, 0x0647, 0x096a, 0x

8、0c8b, 0x0fab, 0x12c8, 0x15e2, 0x18f8, 0x1c0b, 0x1f19, 0x2223, 0x2528, 0x2826, 0x2b1f, 0x2e11, 0x30fb, 0x33de, 0x36ba, 0x398c, 0x3c56, 0x3f17, 0x41ce, 0x447a, 0x471c, 0x49b4, 0x4c3f, 0x4ebf, 0x5133, 0x539b, 0x55f5, 0x5842, 0x5a82, 0x5cb4, 0x5ed7, 0x60ec, 0x62f2, 0x64e8, 0x66cf, 0x68a6, 0x6a6d, 0x6c24

9、, 0x6dca, 0x6f5f, 0x70e2, 0x7255, 0x73b5, 0x7504, 0x7641, 0x776c, 0x7884, 0x798a, 0x7a7d, 0x7b5d, 0x7c29, 0x7ce3, 0x7d8a, 0x7e1d, 0x7e9d, 0x7f09, 0x7f62, 0x7fa7, 0x7fd8, 0x7ff6, ; /-/- / Function Prototypes /- void delay_num_10us(unsigned int);void main(void); void OSCILLATOR_Init (void); void PORT_

10、Init (void); void DAC0_Init (void); void TIMER3_Init (int counts);void Frequency_conversion(void); void Set_DACs (void); /-/LCD12864显示/-/ LCD12864 Display Global Constants /-sbit LCD12864_SCLK=P22; /Esbit LCD12864_SID=P21; /RWsbit LCD12864_RST=P24;/lowactive可以不用,也就是说,只用两条线和LCD通信sbit LCD12864_PSB=P23

11、;sbit LCD12864_CS =P20;unsigned char code s1=波形发生器;unsigned char code s2=波形: ;unsigned char code s21=Sine ;unsigned char code s22=Square ;unsigned char code s23=Triangular;unsigned char code s3=频率: ;unsigned char code s31=500Hz ;unsigned char code s32=1kHz ;unsigned char code s33=2kHz ;unsigned char

12、 code s34=2.5kHz;unsigned char code s4=幅度:请调滑变!;unsigned char code se=警告:错误;unsigned char code AC_TABLE=0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,/第一行汉字位置0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,/第二行汉字位置0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,/第三行汉字位置0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,/第四行汉字位置;/-

13、/* * 名称 : LCD12864_Delay() * 功能 : 延时 * 输入 : z * 输出 : 无 */ void LCD12864_Delay(unsigned int z) unsigned int a,b; for(a=0; az; a+) for(b=0; b120; b+); /* * 名称 : LCD12864_sendbyte * 功能 : 按照液晶的串口通信协议,发送数据 * 输入 : zdata * 输出 : 无 */ void LCD12864_SendByte(unsigned char zdata) unsigned char i; for(i = 0;i 8

14、;i +) if(zdatai) & 0x80) LCD12864_SID = 1; else LCD12864_SID = 0; LCD12864_SCLK = 0; LCD12864_SCLK = 1; /* * 名称 : LCD12864_write_com() * 功能 : 写串口指令,分三字节写完 * 输入 : com * 输出 : 无 */ void LCD12864_WriteCom(unsigned char com) LCD12864_CS = 1;/打开片选,高电平有效 LCD12864_SendByte(0xf8); /第一字节 LCD12864_SendByte(com

15、 & 0xf0); /第二字节 LCD12864_SendByte(com 4) & 0xf0);/第三字节 /* * 名称 : LCD12864_write_date() * 功能 : 写串口指令 * 输入 : date * 输出 : 无 */ void LCD12864_WriteDate(unsigned char date) LCD12864_CS = 1; /打开片选 LCD12864_SendByte(0xfa);/第一字节 LCD12864_SendByte(date & 0xf0); /第二字节 LCD12864_SendByte(date 4) & 0xf0);/第三字节 /

16、* * 名称 : LCD12864_init() * 功能 : 12864初始化函数 * 输入 : com * 输出 : 无 */ void LCD12864_Init() LCD12864_PSB=0; LCD12864_RST = 0; LCD12864_Delay(100); LCD12864_RST = 1; LCD12864_Delay(100); LCD12864_WriteCom(0x34);/扩充指令集动作 ,绘图不显示 LCD12864_WriteCom(0x30);/基本指令集动作, 绘图不显示 LCD12864_WriteCom(0x0c);/开显示,不显示游标和游标位置

17、 LCD12864_WriteCom(0x01);/清屏 LCD12864_Delay(100); /* * 名称 :LCD_clean_scans() * 功能 : 清屏 * 输入 : 无 * 输出 : 无 */ void LCD12864_CleanScans() LCD12864_WriteCom(0x01);/清屏 /* * 名称 : LCD12864_pos() * 功能 : 设定显示位置 * 输入 : x,y * 输出 : 无 */ void LCD12864_SetPos(unsigned char x,unsigned char y) unsigned char pos; if

18、(x = 0) x = 0x80; else if(x = 1) x = 0x90; else if(x = 2) x = 0x88; else if(x = 3) x = 0x98; pos = x + y; LCD12864_WriteCom(pos);/显示地址 /* * 名称 : LCD12864_dishz() * 功能 : 显示字符串 * 输入 : *s * 输出 : 无 */ void LCD12864_DisplayString(unsigned char *s) unsigned char i = 0; while(si != 0) LCD12864_WriteDate(si

19、); i+; LCD12864_Delay(5); void LCD_Back()LCD12864_Init();LCD12864_CleanScans();LCD12864_Delay(10000);LCD12864_SetPos(0,0);LCD12864_DisplayString(s1);LCD12864_Delay(1000);LCD12864_SetPos(1,0);LCD12864_DisplayString(s2);LCD12864_Delay(1000);LCD12864_SetPos(2,0);LCD12864_DisplayString(s3);LCD12864_Dela

20、y(1000);LCD12864_SetPos(3,0);LCD12864_DisplayString(s4);LCD12864_Delay(1000);/-/-void refresh_waveform()LCD12864_SetPos(1,3);switch(m)case(0):LCD12864_DisplayString(s21);break;case(1):LCD12864_DisplayString(s22);break;case(2):LCD12864_DisplayString(s23);break;default:LCD12864_DisplayString(se);/-/-v

21、oid refresh_frequency()LCD12864_SetPos(2,3);switch(n)case(0):LCD12864_DisplayString(s31);break;case(1):LCD12864_DisplayString(s32);break;case(2):LCD12864_DisplayString(s33);break;case(3):LCD12864_DisplayString(s34);break;default:LCD12864_DisplayString(se);/ LCD12864显示结束/-void main (void) PCA0MD &= 0

22、x40; / Disable Watchdog timer OSCILLATOR_Init (); / Initialize oscillator PORT_Init (); / Initialize crossbar and ports DAC0_Init (); / Initialize DAC0 LCD_Back(); TIMER3_Init(SYSCLK/SAMPLE_RATE_DAC);/ Initialize Timer3 to overflow at times per secondEA = 1; / Enable global interrupts m=0; n=0; whil

23、e(1) while(Change_waveform!=1)|(Change_frequency!=1) if(Change_waveform!=1) m+; m%=3;refresh_waveform();if(Change_frequency!=1) n+; n%=4;refresh_frequency(); delay_num_10us(20); while(Change_waveform!=1)|(Change_frequency!=1); / Wait for interrupt /-/-void delay_num_10us(unsigned int num)unsigned in

24、t i,j;for(i=num;i0;i-)for(j=245;j0;j-);/-/-void TIMER3_ISR (void) interrupt 14 TMR3CN &= 0x80; / Clear Timer3 overflow flag Set_DACs(); /-/-void OSCILLATOR_Init (void) OSCICN = 0x87; / Set clock to 24.5 MHz RSTSRC = 0x04; / Enable missing clock detector /-/-void PORT_Init (void) P0MDIN &= 0x01; / Co

25、nfigure P0.0 and P0.1 to analog P0SKIP |= 0x03; / Skip P0.0 and P0.1 on the crossbar P1MDOUT &= 0x30; P2MDOUT =0xff; XBR1 = 0x40; / Enable Crossbar /-/-void DAC0_Init(void) REF0CN = 0x0A; / Enable VDD as VREF IDA0CN = 0xB3; / Enable IDA0 for 2.0 mA output,left-justified,updated on Timer3 overflows /

26、-/-void TIMER3_Init (int counts) TMR3CN = 0x00; / Resets Timer3, / Sets to 16 bit mode CKCON |= 0x40; / Use system clock TMR3RL = -counts; / Initial reload value TMR3 = 0xffff; / Sets timer to reload automatically EIE1 |= 0x80; / Enable Timer3 interrupts TMR3CN = 0x04; / Start Timer3 /-/-void Freque

27、ncy_conversion(void)unsigned char state=n;switch(state)case(0):FREQUENCY=2000;FREQUENCY1=1;DATA=200;break;case(1):FREQUENCY=4000;FREQUENCY1=2;DATA=100;break;case(2):FREQUENCY=8000;FREQUENCY1=4;DATA=50;break;case(3):FREQUENCY=10000;FREQUENCY1=5;DATA=40;break;default:; FREQUENCY2=FREQUENCY1/2; /-/-void Set_DACs(void) Frequency_conversion(); if (0=m) unsigned int PHASE_ADD =FREQUENCY * PHASE_PRECISION / SAMPLE_RATE_DAC; static unsigned phase_acc = 0;

温馨提示

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

评论

0/150

提交评论