完整版多波形發(fā)生器的設(shè)計_第1頁
完整版多波形發(fā)生器的設(shè)計_第2頁
完整版多波形發(fā)生器的設(shè)計_第3頁
完整版多波形發(fā)生器的設(shè)計_第4頁
完整版多波形發(fā)生器的設(shè)計_第5頁
免費預(yù)覽已結(jié)束,剩余22頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、基于51單片機的多波形發(fā)生器1 .設(shè)計原理與技術(shù)方法1.1 電路工作原理分析與原理圖本次課設(shè)使用芯片PCF8591進行D/A轉(zhuǎn)換,通過I2C協(xié)議(短距離通信傳 輸協(xié)議)與單片機進行通信,當(dāng)寫入 255時,D/A輸出5V電壓,因此改變寫 入芯片的值可以輸出不同的電壓值, 也就可以輸出不同的波形.當(dāng)改變每次數(shù) 據(jù)寫入PCF8591的時間問隔,也就可以實現(xiàn)輸出不同頻率的波形.通過按鍵 可以步進調(diào)節(jié)幅度,占空比和頻率,并且可以通過數(shù)碼管顯示方波的頻率,并 可以通過按鍵直接設(shè)置頻率的大小.總的系統(tǒng)結(jié)構(gòu)框圖如圖1所示.圖1系統(tǒng)框圖總的電路圖見附錄,下面是各局部的電路圖:(1) STC89C516使用12M

2、的晶振,接5V電源,STC89C516的電路圖如圖2 所示.圖2 STC89C516電路圖(2) D/A轉(zhuǎn)換模塊,使用PCF8591的D/A轉(zhuǎn)換功能,AOUT引腳接示波器顯 示,其電路圖如圖3所示.3 4 IAINO, VDD ATNIAOUT AIN2'Trel AEN3AGND AO EXT AI OSC A2 5CL VSS SDA沏GND圖3 DA模塊電路圖(3)獨立按鍵局部,使用的是共陰極的接法,當(dāng)按鍵按下時,I/O 為低電平 其電路圖如圖4所示.KEY2nKEY3.KEI454r*7.KH5KEKS63-5,LET57r-.KEYSoG而圖4獨立按鍵電路圖(4)動態(tài)數(shù)碼管采

3、用八個共陰數(shù)碼管進行動態(tài)顯示,利用人眼的視覺暫留, 用74LS138譯碼器進行位選,再輸出相應(yīng)的段碼后進行延時,就可以觀察到 八位數(shù)碼管同時點亮,電路圖如圖 5所示.圖5動態(tài)數(shù)碼管電路圖1.2 元器件選擇1.2.1 單片機的選擇由于STC89C516是一種靈活性高且廉價的芯片,所以課設(shè)選擇此芯片. 并且抗干擾水平強,保密性能強悍,很難被破解,單片機時鐘有防外部電磁輻 射功能.1.2.2 DA芯片的選擇由于課設(shè)開發(fā)板自帶的D/A模塊運用的PWM調(diào)制,再通過運算放大器產(chǎn) 生模擬信號,這種方法再改變頻率和幅度時不穩(wěn)定,輸出波形不理想,所以使 用PCF8591.PCF8591是一個單片集成、單獨供電、

4、低功耗、8-bit CMOS數(shù)據(jù)獲取器件.PCF8591具有4個模擬輸入、1個模擬輸出和1個串行I2C總 線接口.PCF8591的3個地址引腳A0, A1和A2可用于硬件地址編程,允許 在同個I2C總線上接入8個PCF8591器件,而無需額外的硬件.在 PCF8591 器件上輸入輸出的地址、限制和數(shù)據(jù)信號都是通過雙線雙向I2C總線以串行的 方式進行傳輸.1.2.3 數(shù)碼管采用八個共陰數(shù)碼管,進行動態(tài)顯示.數(shù)碼管動態(tài)顯示接口是單片機中應(yīng)用 最為廣泛的一種顯示方式之一,動態(tài)驅(qū)動是將所有數(shù)碼管的8個顯示筆劃"a,b,c,d,e,f,g,dp的同名端連在一起,另外為每個數(shù)碼管的公共極COM增

5、加位選通限制電路,位選通由各自獨立的I/O線限制,當(dāng)單片機輸出字形碼時,所 有數(shù)碼管都接收到相同的字形碼,但究竟是哪個數(shù)碼管會顯示出字形, 取決于 單片機對位選通COM端電路的限制,所以我們只要將需要顯示的數(shù)碼管的選 通限制翻開,該位就顯示出字形,沒有選通的數(shù)碼管就不會亮.通過分時輪流 限制各個數(shù)碼管的的COM端,就使各個數(shù)碼管輪流受控顯示,這就是動態(tài)驅(qū)動.在輪流顯示過程中,每位數(shù)碼管的點亮?xí)r間為12ms,由于人的視覺暫留現(xiàn)象及發(fā)光二極管的余輝效應(yīng),盡管實際上各位數(shù)碼管并非同時點亮,但只要掃描的速度足夠快,給人的印象就是一組穩(wěn)定的顯示數(shù)據(jù),不會有閃爍感, 動態(tài)顯示的效果和靜態(tài)顯示是一樣的,能夠

6、節(jié)省大量的I/O端口,而且功耗更低.1.2.4 譯碼器的選擇由于使用八位數(shù)碼管進行動態(tài)顯示,為了減少I/O 口的使用,所以采用74LS138譯碼器,使用3個I/O 口限制數(shù)碼管的八位位選.74LS138的工作原 理是以下四點:當(dāng)一個選通端E1為高電平,另兩個選通端/E2和/E3為 低電平時,可將地址端A0、A1、A2的二進制編碼在Y0至Y7對應(yīng)的輸出 端以低電平譯出.即輸出為Y0至Y7的非比方:A2A1A0=110時,那么Y6 輸出端輸出低電平信號.利用E1、E2和E3可級聯(lián)擴展成24線譯碼器;假設(shè)外接一個反相器還 可級聯(lián)擴展成32線譯碼器.假設(shè)將選通端中的一個作為數(shù)據(jù)輸入端時,74LS138

7、還可作數(shù)據(jù)分配器. 可用在8086的譯碼電路中,擴展內(nèi)存.2 .系統(tǒng)軟件設(shè)計2.1 主程序流程圖程序采用模塊化編程,分為 main.c和iic.c兩個文件.iic.c文件內(nèi)是I2C 通信協(xié)議和PCF8591寫入數(shù)據(jù)函數(shù)的編程;main.c文件內(nèi)是全部功能實現(xiàn)的 程序,即顯示各種波形,調(diào)整幅度、頻率、占空比,顯示頻率等功能.程序流 程圖如圖6所示.圖6主程序流程圖2.2 主程序的源程序代碼main.c /*74HC138 A 接 P22 B 接 P23 C 接 P24 按鍵接P1*/#include "reg51.h"/#include "iic.h"#i

8、nclude "math.h"# define u8 unsigned char# define u16 unsigned int# define GPIO_KEY P1sbit Wei_A=P2A2;sbit Wei_B=P2A3;sbit Wei_C=P2A4;u8codesmg_du=0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00; 0-9 /u8 idata zhengxuan_table128; u8 code zhengxuan_table= 0x00,0x00,0x00,0x00,0x00,0x01

9、,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, 0

10、x83,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

11、,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,0x9

12、F,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,

13、0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02, 0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00; u8 inform_display8;u8 set_display8;u8 AM=255;/波形幅度255對應(yīng)5vu8 U_out=10;u16 T=5000;/一半周期 5000 u16 T_count=0;/周期計數(shù) u16 F = 1;/頻率初始1hz u16 mid_squre=2500 ;u16 T_temp;u16 C_temp;u8 Fig_choice=0;/ 1-方波 2-三角波u8 tri_temp=0;u8 t

14、i_temp=0;u8 zx_temp=0;u8 function=0;sbit PWM = P2A1;# define NO_KEY 0xff 無按鍵按下# define KEY_STATE0 0/判斷按鍵按下# define KEY_STATE1 1 /確認按鍵按下 #define KEY_STATE2 2 /釋放 unsigned char Key_Scan()(static unsigned char key state=KEY STATE0;u8 key_value=0,key_temp;/GPIO_KEY=0xff; key_temp=GPIO_KEY;switch(key_sta

15、te)case KEY_STATE0: if(key_temp!=NO_KEY) key_state=KEY_STATE1; break;case KEY_STATE1: if(key_temp=NO_KEY) key_state=KEY_STATE0; elseswitch(key_temp)case 0xFE: key_value=1;break;case 0xFD: key_value=2;break;case 0xFB: key_value=3;break;case 0xF7: key_value=4;break;case 0xEF: key_value=5;break;case 0x

16、DF: key_value=6;break;case 0xBF: key_value=7;break;case 0x7F: key_value=8;break;key_state=KEY_STATE2; break;case KEY_STATE2: if(key temp=NO KEY)(key_state=KEY_STATE0;)break;)return key_value;)void Timer0Init(void)/1 毫秒 12.000MHz(TMOD &= 0xF1;/設(shè)置定時器模式TL0 = 0x18;/設(shè)置定時初值TH0 = 0xFC;/設(shè)置定時初值/ TF0 = 0;

17、/消除 TF0 標(biāo)志ET0=1;EA=1;TR0 = 1;/定時器0開始計時)void Timer1Init(void)/100 微秒 12.000MHz(TMOD &= 0x1F;/設(shè)置定時器模式TL1 = 0x9C;/設(shè)置定時初值TH1 = 0xFF;/設(shè)置定時初值/ TF0 = 0;/消除 TF0 標(biāo)志ET1=1;EA=1;TR1 = 1;/定時器1開始計時) bit key_flag;u8 key_dis=0;u8 test=0;bit high flag;bit low_flag;bit DIR=1;bit set_flag;bit click_flag;void main(

18、void)(u8 key_val=NO_KEY;float a=0;Timer0Init(); /1msTimer1Init();/1uswhile(1)(if(function=1)(inform_display0=0x40;inform_display1=0x71;inform_display2=0x40;inf orm_display3=0;inform_display4=0;inform_display7=smg_duF%10; if(F/100=0) (inform_display5=0;else(inform_display5=smg_duF/100;if(F%100/10=0)&

19、amp;&(F/100=0)( inform_display6=0; else ( inform_display6=smg_duF%100/10;else if(function=2)(set_display0=0x40;set_display1=0x71;set_display2=0x40;set_display3= 0;set_display4=0;if(click_flag)( if(F/100=0) (set_display5=0; else ( set_display5=smg_duF/100;if(F%100/10=0)&&(F/100=0)( set_di

20、splay6=0; else ( set_display6=smg_duF%100/10; set_display7=smg_duF%10;else(set_display4=0;set_display5=0;set_display6=0;set_display7=0;if(key_flag) /10ms(key_flag=0;key_val=Key_Scan();switch(key val)case 1:/倜節(jié)幅度+test=1;if(AM=255)(AM=0;)AM=AM+6;break;case 2:/調(diào)節(jié)頻率+test=2;if(function=0) (F=F+100;T=5000

21、.0/F;mid_squre=T/2.0;)if(function=2)(F=F+50;)break;case 3:/上空比+test=3;mid_squre=mid_squre+T/100; break;case 4:/波形選擇test=4;Fig_choice+;if(Fig_choice=5)(Fig_choice=0;) break;case 5:/倜節(jié)幅度-test=5;if(AM=0)(AM=255;)AM=AM -6;break;case 6:/倜節(jié)頻率-test=6;if(function=0)(F=F-50;T=5000.0/F;a=T;mid_squre=a/2.0;)if

22、(function=2)(F=F-50;) break; case 7:test=7;mid_squre=mid_squreT/100; break;case 8:/設(shè)置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)(

23、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(zheng

24、xuan_tablezx_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)/梯

25、形波高電平時間 (ti_temp=0;DIR=0;)if(tri_temp=0)(DIR=1;)EA=1;)void timer0() interrupt 1 using 1(static int key count=0,smg count=0,i=0,count 1s=0;/tri bet 為每個數(shù)據(jù)的時問問隔TL0 = 0x18;/設(shè)置定時初值TH0 = 0xFC;/設(shè)置定時初值key_count+;smg_count+;count_1s+; /T_count+;if(count_1s=1000) count_1s=0; click_flag=!click_flag; if(key_cou

26、nt=10)/10ms key_count=0; key_flag=1; if(smg_count=1) /1ms smg_count=0; P0=0x00;/消隱 switch(i) /位選,選擇點亮的數(shù)碼管, case(0): Wei_A=0;Wei_B=0;Wei_C=0; break;/顯示第 0 位 case(1): Wei_A=1;Wei_B=0;Wei_C=0; break;/顯示第 1 位 case(2): Wei_A=0;Wei_B=1;Wei_C=0; break;/顯示第 2 位 case(3): Wei_A=1;Wei_B=1;Wei_C=0; break;/顯示第 3

27、 位 case(4): Wei_A=0;Wei_B=0;Wei_C=1; break;/顯示第 4 位 case(5): Wei_A=1;Wei_B=0;Wei_C=1; break;/顯示第 5 位 case(6): Wei_A=0;Wei_B=1;Wei_C=1; break;/顯示第 6 位 case: WeiA=1;WeiB=1;WeiC=1; break;/顯示第 7 位)if(function=1) (P0=inform_displayi;/ 發(fā)送段碼)else if(function=2)(P0=set_displayi;) else (P0=0;)i+;if(i=8) i=0;

28、)void timer1() interrupt 3(TL1 = 0x9C;/設(shè)置定時初值TH1 = 0xFF;/設(shè)置定時初值T_count+;if(Fig_choice=0)(if(T_count<mid_squre)(high_flag=1;low_flag=0;/ DAC_write(255);)else if(T_count<T)(high_flag=0;low_flag=1;/ DAC_write(0);else (T_count=0;)2.3 I2C數(shù)據(jù)傳輸流程圖I2C通信協(xié)議的啟動信號是SDA的下降沿,終止信號是SDA的上升沿 在SCL的低電平的時候改變數(shù)據(jù),高電平的

29、時候保持數(shù)據(jù)不變.其流程圖如 圖7.圖7 I2C數(shù)據(jù)傳輸流程圖2.4 I2C數(shù)據(jù)傳輸源程序#include "reg52.h"#include "intrins.h"#define somenop _nop_();_nop_();_nop_();_nop_();_nop_();#define SlaveAddrW 0xA0#define SlaveAddrR 0xA1/總線引腳定義sbit SDA = P2A1; /* 數(shù)據(jù)線 */sbit SCL = P2A0; /* 時鐘線 */總線啟動條件 void IIC_Start(void) (SDA = 1

30、;SCL = 1;somenop;SDA = 0;somenop;SCL = 0;/總線停止條件void IIC_Stop(void) (SDA = 0;SCL = 1;somenop;SDA = 1;/應(yīng)答位限制 void IIC_Ack(bit ackbit) (if(ackbit)(SDA = 0;) else(SDA = 1;) somenop;SCL = 1; somenop;SCL = 0;SDA = 1; somenop;)/等待應(yīng)答bit IIC_WaitAck(void)(SDA = 1; somenop;SCL = 1; somenop; if(SDA) (SCL = 0;

31、IIC_Stop(); return 0;) else(SCL = 0;return 1;)/通過I2C總線發(fā)送數(shù)據(jù)void IIC_SendByte(unsigned char byt) (unsigned char i;for(i=0;i<8;i+)(if(byt&0x80)(SDA = 1; else (SDA = 0; somenop;SCL = 1;byt <<= 1;somenop; SCL = 0;/從I2C總線上接收數(shù)據(jù) unsigned char IIC_RecByte(void) (unsigned char da;unsigned char i;

32、for(i=0;i<8;i+)(SCL = 1;somenop;da <<= 1;if(SDA) da |= 0x01;SCL = 0;somenop;-return da;)void DAC_write(unsigned char dat)(IIC_Start();IIC_SendByte(0x90);IIC_WaitAck();IIC_SendByte(0x40);IIC_WaitAck();IIC_SendByte(dat);IIC_WaitAck();IIC_Stop();)3 .實驗結(jié)果與分析3.1 實驗結(jié)果將程序下載到單片機開發(fā)板上,示波器接PCF8591模塊的U

33、OUT引腳,初始狀態(tài)下,示波器顯示方波,可以通過KEY1/KEY5調(diào)節(jié)幅度,KEY2/KEY6調(diào) 節(jié)頻率,KEY3/KEY7調(diào)節(jié)占空比.按下KEY4 ,每按一下,波形變化一次,循 環(huán)顯示正弦波、三角波、鋸齒波、方波、梯形波,如下面圖片所示.第一次按 下KEY8顯示方波頻率信息,再次按下,數(shù)碼管閃爍,表示此時可以通過按鍵 KEY2/KEY6設(shè)置任意頻率,設(shè)置完成后,再次按下 KEY8,保存設(shè)置的頻率, 退出數(shù)碼管顯示界面,數(shù)碼管全部熄滅,數(shù)碼管顯示局部如以下圖13.實物連接圖如圖14.圖8方波圖9三角波圖10鋸齒波圖11正弦波Stop圖12梯形波圖13頻率顯示界面圖14實物連接圖3.2 實驗中遇

34、到的問題(1)在設(shè)計獨立按鍵局部時,出現(xiàn)一段時間按鍵有效,一段時間按鍵無效, 一直研究是不是程序出現(xiàn)問題,后來查看原理圖的時候才找到原因. 由于獨立 按鍵連接的是P1 口,而P1.7在開發(fā)板上連接著74HC165,所以把對應(yīng)的跳帽 拔掉后,就可以正常使用.(2)在設(shè)計數(shù)碼管顯示時,一開始數(shù)碼管閃爍著顯示,于是加快掃描時間, 結(jié)果不閃爍而變得暗淡,又放慢一些掃描時間,最終調(diào)整完成.(3)在設(shè)計波形時,波形的算法設(shè)計沒有問題,可是就不能顯示出正常的 波形,后來分析后找到原因:需要連續(xù)的產(chǎn)生波形,就需要在產(chǎn)生波形的時候, 不受其他中斷的影響.因此在產(chǎn)生波形的時候?qū)⑺械闹袛嚓P(guān)閉.(4)在設(shè)計步進調(diào)整頻率時,根據(jù)要求步進 100Hz調(diào)整,設(shè)計的方波初始 頻率為1HZ,步進增加100Hz后,可以正常得到大約100Hz的方波,但是再增 加100Hz后,方波的頻率還是100Hz左右,調(diào)節(jié)的范圍只能是0-100HZ左右. 分析其主要原因是定時器 T1使用的是100us計時,當(dāng)設(shè)置200

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論