AD9850 基于51單片機(jī) 1602液晶

上傳人:小**** 文檔編號:59475137 上傳時間:2022-03-03 格式:DOCX 頁數(shù):11 大?。?1.42KB
收藏 版權(quán)申訴 舉報 下載
AD9850 基于51單片機(jī) 1602液晶_第1頁
第1頁 / 共11頁
AD9850 基于51單片機(jī) 1602液晶_第2頁
第2頁 / 共11頁
AD9850 基于51單片機(jī) 1602液晶_第3頁
第3頁 / 共11頁

下載文檔到電腦,查找使用更方便

16 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《AD9850 基于51單片機(jī) 1602液晶》由會員分享,可在線閱讀,更多相關(guān)《AD9850 基于51單片機(jī) 1602液晶(11頁珍藏版)》請在裝配圖網(wǎng)上搜索。

1、/*1 、可通過按鍵實(shí)現(xiàn)頻率輸出步進(jìn)加減;步進(jìn)頻率范圍010MHz;2、步進(jìn)值有七種選擇:1HZ,10Hz、100Hz、1000Hz、10KHz、100KHz、1000KHz3、采用1602液晶顯示屏,可以實(shí)時顯示輸出頻率值,顯示當(dāng)前步進(jìn)值,顯示頻率的單位都為Hz。*/基本功能全部實(shí)現(xiàn);2011/8/9#include reg52.h /調(diào)用頭文件(單片機(jī)內(nèi)部的寄存器定義)#include intrins.h#define uchar unsigned char#define uint unsigned int/*本段為硬件I/O口定義*/sbit LCD_E = P27;/定義1602液晶的

2、使能管腳;sbit LCD_RW = P26;/定義1602液晶的讀寫管腳; sbit LCD_RS = P25;/定義1602液晶的選通管腳; sbit reset = P20; /ad9850的復(fù)位引腳;sbit w_clk = P21; /ad9850的時鐘引腳;sbit fqud = P22; /ad9850的輸出更新引腳;sbit bit_data= P30;#define LCD_DATA P0 /向1602液晶傳送數(shù)據(jù)的端口,這里用的是P1口;#define LCD_BUSY 0x80 / 用于檢測LCD的忙標(biāo)識(本程序中用的是延時,未檢測) /LCD顯示內(nèi)容,定義到代碼段;un

3、signed char code LcdBuf1= FRQ: Hz;unsigned char code LcdBuf2= SETP:;/unsigned char code LcdBuf3=wei wen bo ;/unsigned char code LcdBuf4=15177684256;double Con_Word_1 = 0x00;/定義了一個浮點(diǎn)變量,用于計算控制字;double Con_Word_2 = 0x00;/定義了一個浮點(diǎn)變量,用于計算控制字;long uint control_word = 0x00;/用來存儲控制字的數(shù)值;long uint Frequency_Ou

4、t;/設(shè)置的頻率值;uchar a,b,c,d,e,f,g,h; /為了向1602寫入頻率值,首先將頻率值拆分存于這8個變量中;sbit Light = P32; /程序狀態(tài)指示燈,它與單片機(jī)對9850控制無關(guān),只是調(diào)試程序的時候使用!/*定義按鍵;2X3矩陣鍵盤;sbit P1_0 = P10;sbit P1_1 = P11;sbit P1_2 = P12;sbit P1_3 = P13;sbit P1_4 = P14;sbit P1_5 = P15;sbit P1_6 = P16;sbit P1_7 = P17;*/ uchar dat = 0;/鍵盤子程序處理過程中使用的中間變量;uch

5、ar keyzhi = 0x00;/鍵值;鍵盤掃描子程序的返回值存于該變量中;/函數(shù)聲明void lcd_init(void);/1602液晶初始化子程序;void display_string(unsigned char x,unsigned char y,unsigned char *s);/顯示字符子程序;x、y是坐標(biāo);x:從左邊數(shù)起第幾個字符:y:是第一行還是第二行; /* 函數(shù)名稱: delay* 入口參數(shù):z(int型)* 出口參數(shù):無* 功能描述: 延時,使用11.0592晶體,1MS*/void delay(uint z) uint x,y; for(x=z;x0;x-) fo

6、r(y=111;y0;y-);/* 函數(shù)名稱: WriteDataLcd* 入口參數(shù):wdata(unsigned char型)* 出口參數(shù):無* 功能描述: 寫數(shù)據(jù)到LCD*/void WriteDataLcd(uchar date)/向1602液晶寫入數(shù)據(jù); LCD_RS=1; LCD_RW=0; LCD_E=0; LCD_E=1; LCD_DATA=date; delay(2); /短暫延時,代替檢測忙狀態(tài) LCD_E=0;/* 函數(shù)名稱: WriteCommandLcd* 入口參數(shù):wdata(unsigned char型)* 出口參數(shù):無* 功能描述: 寫命令到LCD*/void W

7、riteCommandLcd(uchar com)/向1602液晶寫入命令; LCD_RS=0; LCD_RW=0; LCD_E=0; LCD_E=1; LCD_DATA=com; delay(2); /短暫延時,代替檢測忙狀態(tài) LCD_E=0; /LCD初始化void lcd_init(void) LCD_DATA = 0; delay(10); WriteCommandLcd(0x38); delay(5); WriteCommandLcd(0x38); /顯示模式設(shè)置 delay(5); WriteCommandLcd(0x38); /顯示模式設(shè)置 delay(5); WriteComm

8、andLcd(0x01); /關(guān)閉顯示 WriteCommandLcd(0x08); /顯示清屏 WriteCommandLcd(0x0c); /光標(biāo)不顯示 WriteCommandLcd(0x06); /顯示開及光標(biāo)移動設(shè)置 /WriteCommandLcd(0x1c); /屏幕左移 /* 函數(shù)名稱: display_xy* 入口參數(shù):x(unsigned char型),y(unsigned char型)* 出口參數(shù):無* 功能描述: 設(shè)置光標(biāo)位置, x是行號,y是列號*/void display_xy(unsigned char x,unsigned char y) if(y=0x01)

9、x = x + 0x40 + 0x80; else x = x+0x80; WriteCommandLcd(x);/* 函數(shù)名稱: display_string* 入口參數(shù):x(unsigned char型),y(unsigned char型),s(指針型)* 出口參數(shù):無* 功能描述: 在具體位置顯示字符串,以/0結(jié)束,x是列號,y是行號*/void display_string(unsigned char x,unsigned char y,unsigned char *s) display_xy(x,y); while(*s) WriteDataLcd(*s); s+; Qu_Chu_S

10、hu_Ma_Ge_Wei() /取出要顯示的每一位數(shù)據(jù); a = Frequency_Out % 10; b = (Frequency_Out % 100)/10; c = (Frequency_Out % 1000)/100; d = (Frequency_Out % 10000)/1000; e = (Frequency_Out % 100000)/10000; f = (Frequency_Out % 1000000)/100000; g = (Frequency_Out % 10000000)/1000000; h = (Frequency_Out % 100000000)/10000

11、000; display_data() /顯示數(shù)據(jù)子程序Qu_Chu_Shu_Ma_Ge_Wei();/取出要顯示的每一位數(shù)據(jù);display_string(1,0,LcdBuf1);/顯示第一行,從第2個位置開始WriteCommandLcd(0x85);/顯示數(shù)值的話,用其真實(shí)的地址,如0x83等,WriteDataLcd(0x30+h); /如果要顯示字符的話,暫時用x、y坐標(biāo)的方式WriteDataLcd(0x30+g);/以下都是送顯示數(shù)據(jù);WriteDataLcd(0x30+f);WriteDataLcd(0x30+e);WriteDataLcd(0x30+d);WriteData

12、Lcd(0x30+c);WriteDataLcd(0x30+b);WriteDataLcd(0x30+a); scan_KEY(void) /鍵值處理子程序 uchar key; key=P1; switch(key) case 0xee: keyzhi=1;break; / 1110 1110 case 0xde: keyzhi=2;break; / 1101 1110 case 0xbe: keyzhi=3;break; / 1011 1110 case 0x7e:keyzhi=4;break; / 0111 1110 case 0xed: keyzhi=5;break; / 1110 1

13、101 case 0xdd: keyzhi=6;break; / 1101 1101 case 0xbd: keyzhi=7;break; / 1011 1101 case 0x7d:keyzhi=8;break; / 0111 1101 case 0xeb: keyzhi=9;break; / 1110 1011 case 0xdb: keyzhi=10;break; / 1101 1011 case 0xbb: keyzhi=11;break; / 1011 1011 case 0x7b:keyzhi=12;break; / 0111 1011 case 0xe7: keyzhi=13;b

14、reak; / 1110 0111 case 0xd7:keyzhi=14;break; / 1101 0111 case 0xb7: keyzhi=15;break; / 1011 0111 case 0x77:keyzhi=16;break; / 0111 0111 default:keyzhi=0;break; return (keyzhi);keychuli()/鍵盤掃描子程序 uchar row,col; P1=0xf0; if(P1&0xf0)!=0xf0) /判斷有無按下 delay(10); if(P1&0xf0)!=0xf0) /再次判斷 row=0xfe; /得到行 dat

15、 = scan_KEY(); while(row&0x10)!=0) /用來判斷是否移位過頭 P1=row; if(P1&0xf0)!=0xf0) col=(P1&0xf0)|0x0f; /得到列 dat = scan_KEY(); return(row&col); /得出列(高四位)行(低四位) else row=row1|0x01; /移位用于判斷在哪行 else return 0; void ad9850_reset_serial() /復(fù)位AD9850w_clk=0;fqud=0;/reset信號reset=0;reset=1;reset=0;/w_clk信號w_clk=0;w_clk

16、=1;w_clk=0;/f_qud信號fqud=0;fqud=1;fqud=0;Calculate_control_word(long uint Frequency_Out) Con_Word_1 = Frequency_Out * 34; /125M FSW=fo*232/fc Con_Word_2 = Frequency_Out *0.35973836; /小數(shù)部分 / Con_Word_1 = Frequency_Out * 42;/100M / Con_Word_2 = Frequency_Out *0.94967296; Con_Word_2 = Con_Word_2 + 0.5;/

17、小數(shù)部分四舍五入; Con_Word_1 = Con_Word_1 + Con_Word_2; /根據(jù)設(shè)定的頻率以浮點(diǎn)形式計算控制字 control_word = Con_Word_1 / 1;/將控制字換算成整數(shù)形式 void write_control_word(long uint control_word ) uchar i; fqud = 0; w_clk = 0; for(i=0;i 1; fqud = 1; w_clk = 0; delay(20); fqud = 0; main() uchar i = 0x00; uint Step_Bian_Liang = 0;/步進(jìn)變量; l

18、ong uint Step_Data = 100;/默認(rèn)為100Hz; long unsigned int Step_Data_Xian_Shi = 0x00; ad9850_reset_serial(); /復(fù)位AD9850; delay(10); lcd_init(); /初始化子程序; Frequency_Out = 100;/開機(jī)默認(rèn)的頻率輸出值為100; Calculate_control_word(Frequency_Out);/根據(jù)設(shè)置的頻率換算成將要送入AD9850中的整數(shù)值; write_control_word(control_word); /向AD9850送出頻率控制字;

19、 display_data();/顯示數(shù)據(jù); display_string(0,1,LcdBuf2); /顯示第二行,從第0個位置開始; WriteCommandLcd(0xc5);/從第二行第六個開始顯示數(shù)據(jù); WriteDataLcd(0x30+(Step_Data/1000);/送出顯示數(shù)據(jù); WriteDataLcd(0x30+(Step_Data/100)%10);/送出顯示數(shù)據(jù); WriteDataLcd(0x30+(Step_Data/10)%10);/送出顯示數(shù)據(jù); WriteDataLcd(0x30+(Step_Data%10);/送出顯示數(shù)據(jù); display_string

20、(9,1,Hz);/顯示Hz; while(1) keychuli();/鍵處理子程序 if(dat = 1)/鍵值為1;步進(jìn)加 dat = 0;delay(50); Frequency_Out = Frequency_Out + Step_Data; if(Frequency_Out 10000000) Frequency_Out = Frequency_Out - Step_Data; Light =Light; display_data(); ad9850_reset_serial(); /復(fù)位AD9850; delay(5); /使AD9850進(jìn)入正常的工作狀態(tài); Calculate_

21、control_word(Frequency_Out);/根據(jù)設(shè)置的頻率換算成將要送入AD9850中的整數(shù)值;write_control_word(control_word); /向AD9850送出頻率控制字; if(dat = 4)/鍵值為4;步進(jìn)減 dat = 0;delay(50); if(Frequency_Out = Step_Data) Frequency_Out = Frequency_Out - Step_Data; Light =Light; display_data(); ad9850_reset_serial(); /復(fù)位AD9850; delay(10); Calcul

22、ate_control_word(Frequency_Out);/根據(jù)設(shè)置的頻率換算成將要送入AD9850中的整數(shù)值; write_control_word(control_word); /向AD9850寫入頻率控制字; if(dat = 6)/步進(jìn)選擇;這里有三種選擇 dat = 0;delay(50);Light =Light; Step_Bian_Liang+; Step_Bian_Liang = Step_Bian_Liang%7; if(Step_Bian_Liang = 0) Step_Data = 1;/步進(jìn)1; if(Step_Bian_Liang = 1) Step_Data

23、 = 10;/步進(jìn)10; if(Step_Bian_Liang = 2) Step_Data = 50; if(Step_Bian_Liang = 3) Step_Data = 100; if(Step_Bian_Liang = 4) Step_Data = 500; if(Step_Bian_Liang = 5) Step_Data = 1000; if(Step_Bian_Liang = 6) Step_Data = 10000; if(Step_Data=1000) WriteCommandLcd(0xc5);/參考上面類似的部分 WriteDataLcd(0x30+(Step_Data

24、/1000); WriteDataLcd(0x30+(Step_Data/100)%10); WriteDataLcd(0x30+(Step_Data/10)%10); WriteDataLcd(0x30+(Step_Data%10); display_string(9,1,Hz ); else Step_Data_Xian_Shi = Step_Data/1000; WriteCommandLcd(0xc5);/參考上面類似的部分 WriteDataLcd(0x30+(Step_Data_Xian_Shi/1000); WriteDataLcd(0x30+(Step_Data_Xian_Shi/100)%10); WriteDataLcd(0x30+(Step_Data_Xian_Shi/10)%10); WriteDataLcd(0x30+(Step_Data_Xian_Shi%10); display_string(9,1,kHz); delay(10); if(dat=5) dat=0;delay(50);Light=Light;break;

展開閱讀全文
溫馨提示:
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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!