51-單片機和DAC0832輸出方波、矩形波和正弦波由液晶1602顯示的C語言程序_第1頁
51-單片機和DAC0832輸出方波、矩形波和正弦波由液晶1602顯示的C語言程序_第2頁
51-單片機和DAC0832輸出方波、矩形波和正弦波由液晶1602顯示的C語言程序_第3頁
51-單片機和DAC0832輸出方波、矩形波和正弦波由液晶1602顯示的C語言程序_第4頁
51-單片機和DAC0832輸出方波、矩形波和正弦波由液晶1602顯示的C語言程序_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、精選優(yōu)質文檔-傾情為你奉上顯示頻率,幅度可調,可產生四種波形,正弦波,方波,鋸齒波,三角波,希望你能喜歡,給你發(fā)了一張效果圖,喜歡的話別忘了采納我的回答啊#include<reg52.h>#define uchar unsigned char#define uint unsigned int#define DAdata P0/DA數(shù)據(jù)端口sbit DA_S1= P20; / 控制DAC0832的8位輸入寄存器,僅當都為0時,可以輸出數(shù)據(jù)(處于直通狀態(tài)),否則,輸出將被鎖存sbit DA_S2= P21; / 控制DAC0832的8位DAC寄存器,僅當都為0時,可以輸出數(shù)據(jù)(處于直通

2、狀態(tài)),否則,輸出將被鎖存sbit key= P32;uchar wavecount; /'抽點'計數(shù)uchar THtemp,TLtemp;/傳遞頻率的中間變量uchar judge=1; /在方波輸出函數(shù)中用于簡單判別作用uchar waveform; /當其為0、1、2時,分別代表三種波uchar code freq_unit3=10,50,200; /三種波的頻率單位uchar idata wavefreq3=1,1,1; /給每種波定義一個數(shù)組單元,用于存放單位頻率的個數(shù)uchar code lcd_hang1="Sine Wave " "

3、;Triangle Wave " "Square Wave " "Select Wave: " "press No.1 key! "uchar idata lcd_hang216="f= Hz "uchar code waveTH= 0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xec,0xf6,0xf9,0xfb,0xfc,0xfc,0xfd,0xf

4、d,0xfd,0xfe;uchar code waveTL= 0x06,0x8a,0x10,0x4e,0x78,0x93,0xa8,0xb3,0xbe,0xc6, /正弦波頻率調整中間值0xac,0xde,0x48,0x7a,0x99,0xaf,0xbb,0xc8,0xd0,0xde,/三角波頻率調整中間值0x88,0x50,0x90,0x32,0x34,0xbe,0x4a,0xa3,0xe5,0x2c; /*/uchar code triangle_tab= /每隔數(shù)字8,采取一次0x00,0x08,0x10,0x18,0x20,0x28,0x30,0x38,0x40,0x48,0x50,0

5、x58,0x60,0x68,0x70,0x78,0x80,0x88,0x90,0x98,0xa0,0xa8,0xb0,0xb8,0xc0,0xc8,0xd0,0xd8,0xe0,0xe8,0xf0,0xf8,0xff,0xf8,0xf0,0xe8,0xe0,0xd8,0xd0,0xc8,0xc0,0xb8,0xb0,0xa8,0xa0,0x98,0x90,0x88,0x80,0x78,0x70,0x68,0x60,0x58,0x50,0x48,0x40,0x38,0x30,0x28,0x20,0x18,0x10,0x08,0x00;uchar code sine_tab256=/輸出電壓從0到

6、最大值(正弦波1/4部分)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,0xe9,0xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfd,0x

7、fe,0xff,0xff,0xff,0xff,0xff,0xff,/輸出電壓從最大值到0(正弦波1/4部分)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,0

8、xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99 ,0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,/輸出電壓從0到最小值(正弦波1/4部分)0x80,0x7c,0x79,0x76,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 ,0x1

9、5,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,/輸出電壓從最小值到0(正弦波1/4部分)0x00,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,

10、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; void delay(uchar z) uint x,y;for(x=z;x>0;x-)for(y=110;y>0;y-);void triangle_out()/三角波輸出 DAdata=triangle_tabwavecount+;if(wavecount&g

11、t;64) wavecount=0;DA_S1=0; /打開8位輸入寄存器DA_S1=1; /關閉8位輸入寄存器void sine_out() /正弦波輸出 DAdata=sine_tabwavecount+;DA_S1=0; /打開8位輸入寄存器DA_S1=1; /關閉8位輸入寄存器void square_out() /方波輸出 judge=judge; if(judge=1) DAdata=0xff;else DAdata=0x00;DA_S1=0; /打開8位輸入寄存器DA_S1=1; /關閉8位輸入寄存器/*1602液晶的相關函數(shù)*/#define lcd_ports P1sbit r

12、s=P22;sbit rw=P23;sbit lcden=P24;void write_com(uchar com)rs=0;/置零,表示寫指令lcden=0;lcd_ports=com;delay(5);lcden=1;delay(5);lcden=0;void write_date(uchar date)rs=1;/置1,表示寫數(shù)據(jù)(在指令所指的地方寫數(shù)據(jù))lcden=0;lcd_ports=date;delay(5);lcden=1;delay(5);lcden=0;void disp_lcd(uchar addr,uchar *temp1)uchar num;write_com(add

13、r);delay(1); /延時一會兒?for(num=0;num<16;num+)write_date(temp1num);/或者這樣寫write_date(*(temp1+num);delay(1);void init_lcd()/uchar num;lcden=0; /可有可無?rw=0; /初始化一定要設置為零,表示寫數(shù)據(jù)write_com(0x38); /使液晶顯示點陣,為下面做準備write_com(0x0c); /初始設置write_com(0x06); /初始設置write_com(0x01); /清零write_com(0x80); /使指針指向第一行第一格 disp_

14、lcd(0x80,&lcd_hang13*16); /在第一行顯示 disp_lcd(0xc0,&lcd_hang14*16); /在第二行顯示/*1602液晶函數(shù)聲明結束*/void main() uchar i=0;DA_S2=0; /使DAC寄存器處于直通狀態(tài)DAdata=0;DA_S1=1; /關閉8位輸入寄存器init_lcd(); waveform=0;TMOD=0x01; /設置定時器0為16位工作方式IT0=1; /設置外部中斷0為下降沿觸發(fā)ET0=1; /開定時器中斷EX0=1; EA=1;while(1)/DAout(0xff); /可輸出TTL波形/DAo

15、ut(0x80);/T_temp=32; void timer0() interrupt 1TH0=THtemp;TL0=TLtemp;if(waveform=0) sine_out();else if(waveform=1) triangle_out();else if(waveform=2) square_out();void key_int0() interrupt 0 uchar keytemp;uint total_freq; /總頻率EA=0; TR0=0; /關總中斷與定時器delay(5); /延時夠嗎?if(key=0) /確實有按鍵按下而引發(fā)中斷keytemp=P3&

16、;0xf0; /獲取P3口高四位的值switch(keytemp) case 0xe0:/選擇波形 waveform+; if(waveform>2) waveform=0; break; case 0xd0: /頻率按規(guī)定單位依次增加 wavefreqwaveform+; if(wavefreqwaveform>10) wavefreqwaveform=1; / /*這邊要用“>10”,因為它比“=11”可靠 break; / 性更高,使加數(shù)有個上限,不會一直加下去*/ case 0xb0: /頻率按規(guī)定單位依次衰減 wavefreqwaveform-; if(wavefr

17、eqwaveform<1) wavefreqwaveform=10; /這邊要用“<1”,因為它比“=0”可靠性更高 break; case 0x70: /TTL輸出 DA_S2=1; /使DAC寄存器關閉 break; THtemp=waveTHwaveform*10+(wavefreqwaveform-1); /方括號中選取第幾個數(shù)后,并把該值賦給T_tempTLtemp=waveTLwaveform*10+(wavefreqwaveform-1); total_freq= wavefreqwaveform * freq_unitwaveform; /求輸出頻率(個數(shù)*單位) lcd_hang25=total_freq%10+0x30; /在液晶中顯示個位,(0x30 在液晶顯示中表示數(shù)字0) total_freq/=10; lcd_hang24=total_freq%10+0x30; /在液晶中顯示時十

溫馨提示

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

評論

0/150

提交評論