AD9833-S52单片机-主程序(共10页)_第1页
AD9833-S52单片机-主程序(共10页)_第2页
AD9833-S52单片机-主程序(共10页)_第3页
AD9833-S52单片机-主程序(共10页)_第4页
AD9833-S52单片机-主程序(共10页)_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、#include /调用头文件(单片机内部的寄存器定义)#define uchar unsigned char#define uint unsigned int/*本段为硬件I/O口定义*/sbit LCD_E = P11;/定义1602液晶的使能管脚;sbit LCD_RW = P12;/定义1602液晶的读写管脚; sbit LCD_RS = P13;/定义1602液晶的选通管脚; sbit ddsen = P14; /ad9833的使能引脚;/sbit sda = P17; /ad9833的数据引脚;/sbit sclk = P16; /ad9833的时钟引脚; #define LCD_

2、DATA P2 /向1602液晶传送数据的端口,这里用的是P2口;#define LCD_BUSY 0x80 / 用于检测LCD的忙标识(本程序中用的是延时,未检测) /LCD显示内容,定义到代码段;unsigned char code LcdBuf1= FRQ: Hz;unsigned char code LcdBuf2= Step:;double Con_Word_1 = 0x00;/定义了一个浮点变量,用于计算控制字;double Con_Word_2 = 0x00;/定义了一个浮点变量,用于计算控制字;long uint ConTrol_Word = 0x00;/用来存储控制字的数值;

3、long uint Frequency_Out;/设置的频率值;uchar a,b,c,d,e,f,g,h; /为了向1602写入频率值,首先将频率值拆分存于这8个变量中;sbit Light = P10; /程序状态指示灯,它与单片机对9833控制无关,只是调试程序的时候使用!/定义按键;2X3矩阵键盘;sbit P3_3 = P33;sbit P3_4 = P34;sbit P3_5 = P35;sbit P3_6 = P36;sbit P3_7 = P37; uchar dat = 0;/键盘子程序处理过程中使用的中间变量;uchar keyzhi = 0x00;/键值;键盘扫描子程序的

4、返回值存于该变量中;/函数声明void lcd_init(void);/1602液晶初始化子程序;void display_string(unsigned char x,unsigned char y,unsigned char *s);/显示字符子程序;x、y是坐标;x:从左边数起第几个字符:y:是第一行还是第二行; /* 函数名称: delay* 入口参数:h(unsigned int型)* 出口参数:无* 功能描述: 短暂延时,使用11.0592晶体,约0.01MS*/void delay(long unsigned int h) while(h-); /延时子程序/* 函数名称: Wr

5、iteDataLcd* 入口参数:wdata(unsigned char型)* 出口参数:无* 功能描述: 写数据到LCD*/void WriteDataLcd(unsigned char wdata)/向1602液晶写入数据; LCD_RS=1; LCD_RW=0; LCD_E=0; LCD_E=1; LCD_DATA=wdata; delay(100); /短暂延时,代替检测忙状态 LCD_E=0;/* 函数名称: WriteCommandLcd* 入口参数:wdata(unsigned char型)* 出口参数:无* 功能描述: 写命令到LCD*/void WriteCommandLcd

6、(unsigned char wdata)/向1602液晶写入命令; LCD_RS=0; LCD_RW=0; LCD_E=0; LCD_E=1; LCD_DATA=wdata; delay(100); /短暂延时,代替检测忙状态 LCD_E=0; /LCD初始化void lcd_init(void) LCD_DATA = 0; delay(1000); WriteCommandLcd(0x38); delay(500); WriteCommandLcd(0x38); /显示模式设置 delay(500); WriteCommandLcd(0x38); /显示模式设置 delay(500); W

7、riteCommandLcd(0x01); /关闭显示 WriteCommandLcd(0x38); /显示清屏 WriteCommandLcd(0x0c); /显示光标移动设置 WriteCommandLcd(0x06); /显示开及光标移动设置/* 函数名称: display_xy* 入口参数:x(unsigned char型),y(unsigned char型)* 出口参数:无* 功能描述: 设置光标位置, x是行号,y是列号*/void display_xy(unsigned char x,unsigned char y) if(y=0x01) x = x + 0x40 + 0x80;

8、 else x = x+0x80; WriteCommandLcd(x);/* 函数名称: display_string* 入口参数:x(unsigned char型),y(unsigned char型),s(指针型)* 出口参数:无* 功能描述: 在具体位置显示字符串,以/0结束,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_Shu_Ma_Ge_Wei() /取出要显

9、示的每一位数据; 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)/10000000; display_data()

10、/显示数据子程序Qu_Chu_Shu_Ma_Ge_Wei();/取出要显示的每一位数据;display_string(1,0,LcdBuf1);/显示第一行,从第2个位置开始WriteCommandLcd(0x85);/显示数值的话,用其真实的地址,如0x83等,WriteDataLcd(0x30+h); /如果要显示字符的话,暂时用x、y坐标的方式WriteDataLcd(0x30+g);/以下都是送显示数据;WriteDataLcd(0x30+f);WriteDataLcd(0x30+e);WriteDataLcd(0x30+d);WriteDataLcd(0x30+c);WriteDat

11、aLcd(0x30+b);WriteDataLcd(0x30+a); /20081207scan_KEY(void) /键值处理子程序uchar key = 0;key = P3; key = key & 0xf8; switch(key) case 0xb0: keyzhi = 3 ;break; case 0xa8: keyzhi = 2 ;break; case 0x98: keyzhi = 1 ;break; case 0x70: keyzhi = 6 ;break; case 0x68: keyzhi = 5 ;break; case 0x58: keyzhi = 4 ;break;

12、 default: keyzhi=0; return(keyzhi);keychuli()/键盘扫描子程序 P3_3 = 0x01;P3_5 = 0x01;P3_4 = 0x01;P3_6 = 0x00;P3_7 = 0x00;delay(100); if(P3_3&P3_4&P3_5) = 0x00) if(P3_3&P3_4&P3_5) = 0x00) P3_6 = 0x00;P3_7 = 0x01; dat = scan_KEY(); if(dat = 0x00) P3_6 = 0x01;P3_7 = 0x00; dat = scan_KEY(); else dat = 0x00; go

13、to down;/无键按下 down:return(dat); Calculate_Control_Word(long uint Frequency_Out) Con_Word_1 = Frequency_Out * 42; Con_Word_2 = Frequency_Out *0.94967296;/100MHz计算方法 /首先有源晶体是100MHz的,然后用2的32次方减1,再除以100MHz得到的; Con_Word_2 = Con_Word_2 + 0.5;/小数部分四舍五入; Con_Word_1 = Con_Word_1 + Con_Word_2; /根据设定的频率以浮点形式计算

14、控制字 ConTrol_Word = Con_Word_1 / 1;/将控制字换算成整数形式 Send_Control_Word(long uint ConTrol_Word)/向AD9833送入频率控制字; long uint ConTrol_Word_Temporary ; uchar data_word ; sda = 0x00;/根据时序图 sclk = 0x00; /根据时序图 /data_word = 0x00; /设置AD9833相位、掉电等相关控制字 data_word = 0x00; /设置AD9833相位、掉电等相关控制字 P2 = data_word; delay(200

15、); sclk=1; delay(200);sclk=0; ConTrol_Word_Temporary = ConTrol_Word; ConTrol_Word = ConTrol_Word 24; data_word = ConTrol_Word % 256;/取出W1,频率控制字中的最高字节; P2 = data_word; delay(200); sclk=1; delay(200); sclk=0; ConTrol_Word = ConTrol_Word_Temporary; ConTrol_Word = ConTrol_Word 16; data_word = ConTrol_Wo

16、rd % 256;/取出W2,频率控制字中的次高字节; P2 = data_word; delay(200); sclk=1; delay(200); sclk=0; ConTrol_Word = ConTrol_Word_Temporary; ConTrol_Word = ConTrol_Word 8; data_word = ConTrol_Word % 256;/取出W3,频率控制字中的第三字节; P2 = data_word; delay(200); sclk=1; delay(200); sclk=0; ConTrol_Word = ConTrol_Word_Temporary; d

17、ata_word = ConTrol_Word % 256;/取出W4,频率控制字中的最后一个字节; P2 = data_word; delay(200); sclk=1; delay(200); sclk=0; /根据时序图 sda=1; /根据时序图/*主程序*/main() unsigned char i = 0x00; uint Step_Bian_Liang = 0x00;/步进变量; long uint Step_Data = 10;/默认为10Hz; long unsigned int Step_Data_Xian_Shi = 0x00; reset = 1; /复位AD9833

18、; delay(1000); reset = 0; /使AD9833进入正常的工作状态; lcd_init(); /初始化子程序; Frequency_Out = 0;/开机默认的频率输出值为0; Calculate_Control_Word(Frequency_Out);/根据设置的频率换算成将要送入AD9833中的整数值; Send_Control_Word(ConTrol_Word); /向AD9833送出频率控制字; display_data();/显示数据; display_string(0,1,LcdBuf2); /显示第二行,从第0个位置开始; WriteCommandLcd(0

19、xc5);/从第二行第六个开始显示数据; WriteDataLcd(0x30+(Step_Data/1000);/送出显示数据; WriteDataLcd(0x30+(Step_Data/100)%10);/送出显示数据; WriteDataLcd(0x30+(Step_Data/10)%10);/送出显示数据; WriteDataLcd(0x30+(Step_Data%10);/送出显示数据; display_string(9,1,Hz);/显示Hz; while(1) keychuli();/键处理子程序 if(dat = 0x01)/键值为1;步进加 dat = 0x00;delay(5

20、000); Frequency_Out = Frequency_Out + Step_Data; if(Frequency_Out 10000000) Frequency_Out = Frequency_Out - Step_Data; Light =Light; display_data(); Calculate_Control_Word(Frequency_Out);/根据设置的频率换算成将要送入AD9833中的整数值; Send_Control_Word(ConTrol_Word); /向AD9833送出频率控制字; if(dat = 0x04)/键值为4;步进减 dat = 0x00;

21、delay(5000); if(Frequency_Out = Step_Data) Frequency_Out = Frequency_Out - Step_Data; Light =Light; display_data(); Calculate_Control_Word(Frequency_Out);/根据设置的频率换算成将要送入AD9833中的整数值; Send_Control_Word(ConTrol_Word); /向AD9833送出频率控制字; if(dat = 0x06)/步进选择;这里有六种选择 dat = 0x00;delay(10000);Light =Light; Step_Bian_Liang+; Step_Bian_Liang = Step_Bian_Liang%6; if(Step_Bian_Liang = 0x00) Step_Data = 10;/步进10;改成1 if(Step_Bian_Liang = 0x

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论