AD9850 基于51單片機(jī) 1602液晶
《AD9850 基于51單片機(jī) 1602液晶》由會(huì)員分享,可在線閱讀,更多相關(guān)《AD9850 基于51單片機(jī) 1602液晶(11頁珍藏版)》請(qǐng)?jiān)谘b配圖網(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í)時(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的時(shí)鐘引腳; 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)識(shí)(本程序中用的是延時(shí),未檢測) //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;//定義了一個(gè)浮點(diǎn)變量,用于計(jì)算控制字; double Con_Word_2 = 0x00;//定義了一個(gè)浮點(diǎn)變量,用于計(jì)算控制字; long uint control_word = 0x00;//用來存儲(chǔ)控制字的數(shù)值; long uint Frequency_Out;//設(shè)置的頻率值; uchar a,b,c,d,e,f,g,h; //為了向1602寫入頻率值,首先將頻率值拆分存于這8個(gè)變量中; sbit Light = P3^2; //程序狀態(tài)指示燈,它與單片機(jī)對(duì)9
5、850控制無關(guān),只是調(diào)試程序的時(shí)候使用! /*定義按鍵;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ù)起第幾個(gè)字符:y:是第一行還是第二行; /************************************************** ** 函數(shù)名稱: delay ** 入口參數(shù):z(int型) ** 出口參數(shù):無 ** 功能描述: 延時(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); //短暫延時(shí),代替檢測忙狀態(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); //短暫延時(shí),代替檢測忙狀態(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)移動(dòng)設(shè)置 //WriteCommandLcd(0x1c); //屏幕左移 } /************************************************** ** 函數(shù)名稱: display_xy ** 入口參數(shù):x(unsigned char型),y(unsigned char型) ** 出口參數(shù):無 ** 功能描述: 設(shè)置光標(biāo)位置, x是行號(hào),y是列號(hào) ****************************************************/ 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是列號(hào),y是行號(hào) **********************************************************************/ 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個(gè)位置開始 WriteCommandLcd(0x85);//顯示數(shù)值的話,用其真實(shí)的地址,如0x83等, WriteDataLcd(0x30+h); //如果要顯示字符的話,暫時(shí)用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信號(hào) reset=0; reset=1; reset=0; //w_clk信號(hào) w_clk=0; w_clk=1; w_clk=0; //f_qud信號(hào) 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、式計(jì)算控制字 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個(gè)位置開始; WriteCommandLcd(0xc5);//從第二行第六個(gè)開始顯示數(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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025《增值稅法》高質(zhì)量發(fā)展的增值稅制度規(guī)范增值稅的征收和繳納
- 深入學(xué)習(xí)《中華人民共和國科學(xué)技術(shù)普及法》推進(jìn)實(shí)現(xiàn)高水平科技自立自強(qiáng)推動(dòng)經(jīng)濟(jì)發(fā)展和社會(huì)進(jìn)步
- 激揚(yáng)正氣淬煉本色踐行使命廉潔從政黨課
- 加強(qiáng)廉潔文化建設(shè)夯實(shí)廉政思想根基培育風(fēng)清氣正的政治生態(tài)
- 深入學(xué)習(xí)2024《突發(fā)事件應(yīng)對(duì)法》全文提高突發(fā)事件預(yù)防和應(yīng)對(duì)能力規(guī)范突發(fā)事件應(yīng)對(duì)活動(dòng)保護(hù)人民生命財(cái)產(chǎn)安全
- 2023年四年級(jí)數(shù)學(xué)上冊第一輪單元滾動(dòng)復(fù)習(xí)第10天平行四邊形和梯形作業(yè)課件新人教版
- 2023年四年級(jí)數(shù)學(xué)上冊第14單元階段性綜合復(fù)習(xí)作業(yè)課件新人教版
- 2023年四年級(jí)數(shù)學(xué)上冊易錯(cuò)清單十五課件新人教版
- 2023年四年級(jí)數(shù)學(xué)上冊易錯(cuò)清單七課件西師大版
- 2023年五年級(jí)數(shù)學(xué)下冊易錯(cuò)清單六作業(yè)課件北師大版
- 2023年五年級(jí)數(shù)學(xué)下冊易錯(cuò)清單二作業(yè)課件北師大版
- 2023年五年級(jí)數(shù)學(xué)下冊四分?jǐn)?shù)的意義和性質(zhì)第10課時(shí)異分母分?jǐn)?shù)的大小比較作業(yè)課件蘇教版
- 2023年五年級(jí)數(shù)學(xué)下冊周周練四作業(yè)課件北師大版
- 2023年五年級(jí)數(shù)學(xué)下冊六折線統(tǒng)計(jì)圖單元復(fù)習(xí)卡作業(yè)課件西師大版
- 2023年四年級(jí)數(shù)學(xué)上冊6除數(shù)是兩位數(shù)的除法單元易錯(cuò)集錦一作業(yè)課件新人教版