您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > AD9833-S52单片机-主程序
#includereg52.h//调用头文件(单片机内部的寄存器定义)#defineucharunsignedchar#defineuintunsignedint/******本段为硬件I/O口定义********/sbitLCD_E=P1^1;//定义1602液晶的使能管脚;sbitLCD_RW=P1^2;//定义1602液晶的读写管脚;sbitLCD_RS=P1^3;//定义1602液晶的选通管脚;sbitddsen=P1^4;//ad9833的使能引脚;//sbitsda=P1^7;//ad9833的数据引脚;//sbitsclk=P1^6;//ad9833的时钟引脚;#defineLCD_DATAP2//向1602液晶传送数据的端口,这里用的是P2口;#defineLCD_BUSY0x80//用于检测LCD的忙标识(本程序中用的是延时,未检测)//LCD显示内容,定义到代码段;unsignedcharcodeLcdBuf1[]={FRQ:Hz};unsignedcharcodeLcdBuf2[]={Step:};doubleCon_Word_1=0x00;//定义了一个浮点变量,用于计算控制字;doubleCon_Word_2=0x00;//定义了一个浮点变量,用于计算控制字;longuintConTrol_Word=0x00;//用来存储控制字的数值;longuintFrequency_Out;//设置的频率值;uchara,b,c,d,e,f,g,h;//为了向1602写入频率值,首先将频率值拆分存于这8个变量中;sbitLight=P1^0;//程序状态指示灯,它与单片机对9833控制无关,只是调试程序的时候使用!//定义按键;2X3矩阵键盘;sbitP3_3=P3^3;sbitP3_4=P3^4;sbitP3_5=P3^5;sbitP3_6=P3^6;sbitP3_7=P3^7;uchardat=0;//键盘子程序处理过程中使用的中间变量;ucharkeyzhi=0x00;//键值;键盘扫描子程序的返回值存于该变量中;//函数声明voidlcd_init(void);//1602液晶初始化子程序;voiddisplay_string(unsignedcharx,unsignedchary,unsignedchar*s);//显示字符子程序;x、y是坐标;x:从左边数起第几个字符:y:是第一行还是第二行;/****************************************************函数名称:delay**入口参数:h(unsignedint型)**出口参数:无**功能描述:短暂延时,使用11.0592晶体,约0.01MS****************************************************/voiddelay(longunsignedinth){while(h--);//延时子程序}/****************************************************函数名称:WriteDataLcd**入口参数:wdata(unsignedchar型)**出口参数:无**功能描述:写数据到LCD****************************************************/voidWriteDataLcd(unsignedcharwdata)//向1602液晶写入数据;{LCD_RS=1;LCD_RW=0;LCD_E=0;LCD_E=1;LCD_DATA=wdata;delay(100);//短暂延时,代替检测忙状态LCD_E=0;}/****************************************************函数名称:WriteCommandLcd**入口参数:wdata(unsignedchar型)**出口参数:无**功能描述:写命令到LCD****************************************************/voidWriteCommandLcd(unsignedcharwdata)//向1602液晶写入命令;{LCD_RS=0;LCD_RW=0;LCD_E=0;LCD_E=1;LCD_DATA=wdata;delay(100);//短暂延时,代替检测忙状态LCD_E=0;}//LCD初始化voidlcd_init(void){LCD_DATA=0;delay(1000);WriteCommandLcd(0x38);delay(500);WriteCommandLcd(0x38);//显示模式设置delay(500);WriteCommandLcd(0x38);//显示模式设置delay(500);WriteCommandLcd(0x01);//关闭显示WriteCommandLcd(0x38);//显示清屏WriteCommandLcd(0x0c);//显示光标移动设置WriteCommandLcd(0x06);//显示开及光标移动设置}/****************************************************函数名称:display_xy**入口参数:x(unsignedchar型),y(unsignedchar型)**出口参数:无**功能描述:设置光标位置,x是行号,y是列号****************************************************/voiddisplay_xy(unsignedcharx,unsignedchary){if(y==0x01){x=x+0x40+0x80;}else{x=x+0x80;}WriteCommandLcd(x);}/***********************************************************************函数名称:display_string**入口参数:x(unsignedchar型),y(unsignedchar型),s(指针型)**出口参数:无**功能描述:在具体位置显示字符串,以/0结束,x是列号,y是行号**********************************************************************/voiddisplay_string(unsignedcharx,unsignedchary,unsignedchar*s){display_xy(x,y);while(*s){WriteDataLcd(*s);s++;}}Qu_Chu_Shu_Ma_Ge_Wei()//取出要显示的每一位数据;{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()//显示数据子程序{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);WriteDataLcd(0x30+b);WriteDataLcd(0x30+a);}////////////////////////////20081207scan_KEY(void)//键值处理子程序{ucharkey=0;key=P3;key=key&0xf8;switch(key){case0xb0:keyzhi=3;break;case0xa8:keyzhi=2;break;case0x98:keyzhi=1;break;case0x70:keyzhi=6;break;case0x68:keyzhi=5;break;case0x58:keyzhi=4;break;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;gotodown;//无键按下}}down:return(dat);}Calculate_Control_Word(longuintFrequency_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;//根据设定的频率以浮点形式计算控制字ConTrol_Word=Con_Word_1/1;//将控制字换算成整数形式}Send_Control_Word(longuintConTrol_Word)//向AD9833送入频率控制字;{longuintConTrol_Word_Temporary;uchardata_word;sda=0x00;//根据时序图sclk=0x00;//根据时序图//data_word=0x00;//设置AD9833相位、掉电等相关控制字data_word=0x00;//设置AD9833相位、掉电等相关控制字P2=data_word;delay(200);sclk=1;delay(200);sclk=0;ConTrol_Word_Temporary=ConTrol_Word;ConTrol_Word=ConTrol_Word24;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_Word16;data_word=ConTrol_Word%256;//取出W2,频率控制字中的次高字节;P2=data_word;delay(200);sclk=1;delay(200);sclk=0;ConTrol_Word=ConTrol_Word_Temporary;ConTrol_Word=ConTrol_Word8;data_word=ConTrol_Word%256;//取出W3,频率控制字中的第三字节;P2=data_word;delay
本文标题:AD9833-S52单片机-主程序
链接地址:https://www.777doc.com/doc-5922842 .html