BH1415F调频台控制C程序

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

BH1415F调频台控制C程序/*********************************************************************///BH1415F调频台控制C程序/*********************************************************************///使用AT89C52单片机,12MHZ晶振,用共阳四位LED数码管//P0口输出段码,P2口扫描//三个按键分别控制:模式选择、频率步进(兼立体声开关),频率步退(兼音频静音)//复位默认:频率是95MHZ,立体声,设置模式。设置时按频率加减键,短按步进都是0.1MHz,长按步进1MHz//频率调节范围:70MHZ--110MHZ,BH1415必须用7.6MHz晶振!!!//硬件连接:(单片机晶振12M)//MUTE-----P1^0//DI-------P1^1//CLK------P1^2//CE-------P1^3//按键模式选择:------------P3^6正常显示模式/设置模式//按键频率步进:-----------P3^5(设置模式)/立体声开关(正常显示模式)//按键频率步退:-----------P3^6(设置模式)/静音开关(正常显示模式)//designerbyTSJ//2013-08-17//***************************************************************#includereg51.h#defineucharunsignedchar#defineuintunsignedint#defineDataPortP0//段码输出口#defineScanPortP2//位码扫描口sbitMUTE=P1^0;//静音控制sbitDI=P1^1;sbitCLK=P1^2;sbitCE=P1^3;sbitADD=P3^4;sbitSUB=P3^5;sbitKey_Mode=P3^6;sbitmonolamp=P3^3;//立体声指示灯voidDelayUs2x(uchart);//函数声明voidDelayMs(uchart);voidSend_data(uintui_Data,ucharuc_MONO,ucharuc_PD);//发送数据函数,16进制voidKey_Scan_Mode(void);//控制静音voidKey_Scan_Add(void);//频率步进精度0.1MHZvoidKey_Scan_Sub(void);//频率步退精度0.1MHZvoidKey_Scan_Stereo(void);//立体声控制voidKey_Scan_Mute(void);voidTurn_BCD(uintnum);voiddisplay();voidInit_Timer0(void);bitMODE;//模式标志bitSTRO;//立体声标志ucharpress_num;uintui_Freq=950;//保存频率数据uintui_Steo;//保存立体声数据//扫描段码表,这是个奇葩硬件的段码。一般都是用通用的的,需要各位注意!ucharcodedisp_smg[12]={0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09,0xff,0x00};/*共阳LED段码表0123456789不亮数码管测试*/ucharcodescan_con[4]={0x7f,0xbf,0xdf,0xef};//列扫描控制字//uintdatafreq;//频率数据,数据运算时暂存用uchardatadispbuffer[4]={0x00,0x00,0x00,0x00};//显示单元数据,共4个数据//主函数voidmain(void){uchars,h;MODE=0;//默认设置模式MUTE=0;//默认不静音STRO=1;//默认开立体声monolamp=0;//立体声指示Init_Timer0();for(h=0;h4;h++){dispbuffer[h]=11;}for(s=0;s200;s++){display();//开机显示}DelayMs(1000);Send_data(0x3b6,0x01,0x00);//初始化,开立体声,默认95MHzwhile(1){Key_Scan_Mode();Key_Scan_Stereo();Key_Scan_Mute();Turn_BCD(ui_Freq);for(s=0;s50;s++){display();//拿显示替代DelayMs(10);,防止在那两秒内数码管全黑Key_Scan_Mode();Key_Scan_Stereo();Key_Scan_Mute();}if(!MODE){DelayMs(500);//设置模式闪烁Key_Scan_Mode();}}}voidDelayUs2x(uchart){while(--t);}voidDelayMs(uchart)//大致延时1mS{while(t--){DelayUs2x(245);DelayUs2x(245);}}///***********频率数据转换为显示用BCD码函数**********/voidTurn_BCD(uintnum){dispbuffer[3]=num/1000;if(dispbuffer[3]==0)dispbuffer[3]=10;//最高位为0时不显示dispbuffer[2]=num%1000/100;//求显示十位数dispbuffer[1]=num%100/10;//求显示个位数dispbuffer[0]=num%10;//求显示小数位}/***********LED显示动态扫描函数**********/voiddisplay(){uchark;for(k=0;k4;k++)//四位LED扫描控制{DataPort=disp_smg[dispbuffer[k]];if(k==1)DataPort=DataPort&0xfe;ScanPort=scan_con[k];DelayMs(2);//2msScanPort=0xff;}}////频率步进voidKey_Scan_Add(void){uchart;if((!ADD)&&(!MODE))//设置模式下,如果检测到低电平,说明按键按下{//DelayMs(10);//延时去抖,一般10-20msif(!ADD)//再次确认按键是否按下,没有按下则退出{while(!ADD){press_num++;Turn_BCD(ui_Freq);for(t=0;t8;t++){display();//拿显示替代10ms延时,防止在那两秒内数码管全黑}//DelayMs(10);//10x200=2000ms=2sif(press_num==20)//大约2s{//press_num=0;//如果达到长按键标准,达到则进入长按键动作while(!ADD)//识别是否按键还在按下,如果按下执行相关动作,{if(ui_Freq1100)//即时把显示数据处理,如果去掉下面两句处理信息//实际上看不到渐变效果,而是看到跳变效果//你可以自行屏蔽测试ui_Freq+=10;//加10操作if(ui_Freq1100)ui_Freq=700;Turn_BCD(ui_Freq);for(t=0;t20;t++){display();}}}}if((ui_Freq1100)&&(press_num!=20))//加操作ui_Freq++;if(ui_Freq1100)ui_Freq=700;press_num=0;//防止累加造成错误识别}}}//频率步退voidKey_Scan_Sub(void){uchart;if((!SUB)&&(!MODE))//设置模式下,如果检测到低电平,说明按键按下{//DelayMs(10);//延时去抖,一般10-20msif(!SUB)//再次确认按键是否按下,没有按下则退出{while(!SUB){press_num++;Turn_BCD(ui_Freq);for(t=0;t8;t++){display();//显示替代延时}//DelayMs(10);//10x200=2000ms=2sif(press_num==20)//大约2s{//press_num=0;//如果达到长按键标准,达到则进入长按键动作while(!SUB)//识别是否按键还在按下,如果按下执行相关动作,{if(ui_Freq700)ui_Freq-=10;//加10操作,即步进1MHzif(ui_Freq700)ui_Freq=1100;Turn_BCD(ui_Freq);for(t=0;t20;t++){display();//DelayMs(30);//设置模式下闪烁}//用于调节长按循环操作的速度,//可以自行调整此值以便达到最佳效?}}}if((ui_Freq700)&&(press_num!=20))//加操作ui_Freq--;if(ui_Freq700)ui_Freq=1100;press_num=0;//防止累加造成错误识别}}}//模式选择voidKey_Scan_Mode(void){if(Key_Mode==0){DelayMs(10);if(Key_Mode==0){MODE=~MODE;if(MODE)//松开确认写入{if(STRO)//高电平为立体声{Send_data(ui_Freq,0x01,0x00);monolamp=0;//立体声指示灯亮}else{Send_data(ui_Freq,0x00,0x00);monolamp=1;}}while(!Key_Mode){Turn_BCD(ui_Freq);display();//拿显示替代DelayMs(10);,防止在那两秒内数码管全黑}}}}//立体声控制voidKey_Scan_Stereo(void){if((!ADD)&&MODE)//正常显示模式下ADD键用于控制立体声{DelayMs(10);if(!ADD){STRO=~STRO;if(STRO)//高电平为立体声{Send_data(ui_Freq,0x01,0x00);monolamp=0;}else{Send_data(ui_Freq,0x00,0x00);monolamp=1;}while(!ADD){Turn_BCD(ui_Freq);display();//拿显示替代DelayMs(10);,防止在那两秒内数码管全黑}}}}//控制静音voidKey_Scan_Mute(void){if((!SUB)&&MODE){DelayMs(10);if(!SUB){MUTE=~MUTE;//高电平静音while(!SUB){Turn_BCD(ui_Freq);display();//拿显示替代DelayMs(10);,防止在那两秒内数码管全黑}}}}//发送数据函数voidSend_data(uintui_Data,ucharuc_MONO,ucharuc_PD){uchari;ui_Freq=ui_Data;CLK=0;CE=0;CE=1;for(i=11;i;--i){DI=ui_Data&0x01;ui_Data=1;CLK=1;CLK=0;}DI=uc_MONO&0x01;CLK=1;CLK=0;DI=uc_PD&0x20;CLK=1;CLK=0;uc_PD=1;DI=uc_PD&0x20;CLK=1;CLK=0;DI=1;CLK=1;CLK=0;DI=0;CLK=1;CLK=0;CE=0;}voidInit_Timer0(void){TMOD|=0x01;//使用模式1,16位定时器,使用|符号可以在使用多个定时器时不受影响TH0=(65536-2000)/256;//赋值2msT

1 / 14
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功