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)頻率范圍0~10MHz; 2、步進(jìn)值有七種選擇:1HZ,10Hz、100Hz、1000Hz、10KHz、100KHz、1000KHz 3、采用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

2、/******本段為硬件I/O口定義********/ sbit LCD_E = P2^7;//定義1602液晶的使能管腳; sbit LCD_RW = P2^6;//定義1602液晶的讀寫管腳; sbit LCD_RS = P2^5;//定義1602液晶的選通管腳; sbit reset = P2^0; //ad9850的復(fù)位引腳; sbit w_clk = P2^1; //ad9850的時鐘引腳; sbit fqud = P2^2; //ad9850的輸出更新引腳; sbit bit_data= P3^0; #define LCD_DA

3、TA P0 //向1602液晶傳送數(shù)據(jù)的端口,這里用的是P1口; #define LCD_BUSY 0x80 // 用于檢測LCD的忙標(biāo)識(本程序中用的是延時,未檢測) //LCD顯示內(nèi)容,定義到代碼段; unsigned char code LcdBuf1[]= "FRQ: Hz"; unsigned char code LcdBuf2[]= "SETP:"; //unsigned char code LcdBuf3[]="wei wen bo "; //unsigned cha

4、r 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_Out;//設(shè)置的頻率值; uchar a,b,c,d,e,f,g,h; //為了向1602寫入頻率值,首先將頻率值拆分存于這8個變量中; sbit Light = P3^2; //程序狀態(tài)指示燈,它與單片機(jī)對9

5、850控制無關(guān),只是調(diào)試程序的時候使用! /*定義按鍵;2X3矩陣鍵盤; sbit P1_0 = P1^0; sbit P1_1 = P1^1; sbit P1_2 = P1^2; sbit P1_3 = P1^3; sbit P1_4 = P1^4; sbit P1_5 = P1^5; sbit P1_6 = P1^6; sbit P1_7 = P1^7;*/ uchar dat = 0;//鍵盤子程序處理過程中使用的中間變量; uchar keyzhi = 0x00;//鍵值;鍵盤掃描子程序的返回值存于該變量中; //函數(shù)聲明 void

6、 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 *******************

7、*********************************/ void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=111;y>0;y--); } /************************************************** ** 函數(shù)名稱: WriteDataLcd ** 入口參數(shù):wdata(unsigned char型) ** 出口參數(shù):無 ** 功能描述: 寫數(shù)據(jù)到LCD *********************************************

8、*******/ 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型) ** 出口

9、參數(shù):無 ** 功能描述: 寫命令到LCD ****************************************************/ void WriteCommandLcd(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) {

10、 LCD_DATA = 0; delay(10); WriteCommandLcd(0x38); delay(5); WriteCommandLcd(0x38); //顯示模式設(shè)置 delay(5); WriteCommandLcd(0x38); //顯示模式設(shè)置 delay(5); WriteCommandLcd(0x01); //關(guān)閉顯示 WriteCommandLcd(0x08); //顯示清屏 WriteCommandLcd(0x0c); //光標(biāo)不顯示 WriteC

11、ommandLcd(0x06); //顯示開及光標(biāo)移動設(shè)置 //WriteCommandLcd(0x1c); //屏幕左移 } /************************************************** ** 函數(shù)名稱: display_xy ** 入口參數(shù):x(unsigned char型),y(unsigned char型) ** 出口參數(shù):無 ** 功能描述: 設(shè)置光標(biāo)位置, x是行號,y是列號 ****************************************************/ void

12、display_xy(unsigned char x,unsigned char y) { if(y==0x01) { x = x + 0x40 + 0x80; } else { x = x+0x80; } WriteCommandLcd(x); } /********************************************************************* ** 函數(shù)名稱: display_string ** 入口參數(shù):x(unsigned char型),y(unsig

13、ned 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

14、_Chu_Shu_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_Ou

15、t % 10000000)/1000000; h = (Frequency_Out % 100000000)/10000000; } 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)的方式 Wr

16、iteDataLcd(0x30+g);//以下都是送顯示數(shù)據(jù); WriteDataLcd(0x30+f); WriteDataLcd(0x30+e); WriteDataLcd(0x30+d); WriteDataLcd(0x30+c); WriteDataLcd(0x30+b); WriteDataLcd(0x30+a); } scan_KEY(void) //鍵值處理子程序 { uchar key; key=P1; switch(key) { case 0xee: keyzhi=1;break;

17、 // 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 1101 case 0xdd: keyzhi=6;break; // 1101 1101 case 0xbd: keyzhi=7;

18、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 cas

19、e 0xe7: keyzhi=13;break; // 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

20、; P1=0xf0; if((P1&0xf0)!=0xf0) //判斷有無按下 { delay(10); if((P1&0xf0)!=0xf0) //再次判斷 { row=0xfe; //得到行 dat = scan_KEY(); while((row&0x10)!=0) //用來判斷是否移位過頭 { P1=row; if((P1&0xf0)!=0xf0)

21、 { col=(P1&0xf0)|0x0f; //得到列 dat = scan_KEY(); return(row&col); //得出列(高四位)+行(低四位) } else { row=row<<1|0x01; //移位用于判斷在哪行 } } } else

22、 return 0; } } void ad9850_reset_serial() //復(fù)位AD9850 { w_clk=0; fqud=0; //reset信號 reset=0; reset=1; reset=0; //w_clk信號 w_clk=0; w_clk=1; w_clk=0; //f_qud信號 fqud=0; fqud=1; fqud=0; } Calculate_control_word(long uint Frequency_Out) { Con_Word_1 = Frequency_Out * 3

23、4; //125M FSW=fo*2^32/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;//小數(shù)部分四舍五入; Con_Word_1 = Con_Word_1 + Con_Word_2; //根據(jù)設(shè)定的頻率以浮點(diǎn)形

24、式計算控制字 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<40;i++) { w_clk = 0; delay(10); if(control_word & 0x01) bit_data=1; else bit_data=0; _

25、nop_(); w_clk = 1; control_word = control_word >> 1; } fqud = 1; w_clk = 0; delay(20); fqud = 0; } main() { uchar i = 0x00; uint Step_Bian_Liang = 0;//步進(jìn)變量; long uint Step_Data = 100;//默認(rèn)為100Hz; long unsigned int Step_Data_Xian_Shi = 0x00;

26、 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送出頻率控制字; display_data(); //顯示數(shù)據(jù);

27、 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ù); disp

28、lay_string(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; di

29、splay_data(); ad9850_reset_serial(); //復(fù)位AD9850; delay(5); //使AD9850進(jìn)入正常的工作狀態(tài); Calculate_control_word(Frequency_Out);//根據(jù)設(shè)置的頻率換算成將要送入AD9850中的整數(shù)值; write_control_word(control_word); //向AD9850送出頻率控制字; } if(dat == 4)//鍵值為4;步進(jìn)減 { dat =

30、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); Calculate_control_word(Frequency_Out);//根據(jù)設(shè)置的頻率換算成將要送入AD9850中的整數(shù)值; write_control

31、_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) { S

32、tep_Data = 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; }

33、if(Step_Bian_Liang == 6) { Step_Data = 10000; } if(Step_Data<=1000) { WriteCommandLcd(0xc5);//參考上面類似的部分 WriteDataLcd(0x30+(Step_Data/1000)); WriteDataLcd(0x30+(Step_Data/100)%10); WriteDataLcd(0x30+(Step_Data/10)%10); WriteDataLcd(0x30+(Step_Data%10));

34、 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),我們立即給予刪除!