本帖最后由 fmdpj 于 2019-8-20 21:21 編輯
小白求助高手,在網(wǎng)上找到的FM發(fā)射控制程序,三個獨立按鍵分別是頻率加減鍵與立體聲開關,加減鍵是短按步進0.1MHz,長按自動加減,釋放停止加減,剛開始是一按加減鍵四位數(shù)碼管就顯示0000,按鍵也同時失效,后來把消抖延時加長到8000(原300)短按加減鍵會再顯示0000可以正常加減,但是長按還是不正常,長按可以加減10到20秒就又顯示0000按鍵同時失效,求高手指點
下面是源代碼,請高手幫忙看看程序那里有問題,應該怎樣改,謝謝!
- //使用AT89S52單片機,12MHz晶振,使用4位共陽數(shù)碼管作為頻率顯示。
- //P1口輸出段碼,P2口掃描。
- //頻率范圍87.5MHz--108.0MHz
- //***********************************************************************
- #include <reg52.h>
- #include <intrins.h> //_nop_();延時函數(shù)調(diào)用
- #define LED_DATA P1 // 數(shù)碼管段碼輸出
- #define LED_WEI P2 // 數(shù)碼管位碼輸出,掃描口
- #define uchar unsigned char
- #define uint unsigned int
- sbit key_fr_up =P2^3; //頻率增加鍵
- sbit key_fr_down =P2^2; //頻率遞減鍵
- sbit key_LTS_KZ =P2^1; //立體聲控制鍵
- sbit LTS_LED =P3^3; //立體聲顯示//INT1
- sbit CE =P3^4; //鎖存信號//CE
- sbit CLK =P3^5; //時鐘信號//CLK
- sbit DA =P3^6; //數(shù)據(jù)信號//DA
- sbit dg =P1^7; //數(shù)碼管小數(shù)點
- //sbit SDA=P3^2;//24C01 數(shù)據(jù)線
- //sbit SCL=P3^1;//24c01 時鐘線
- uint f_data; //頻率數(shù)值
- //uchar DataBye;//從24C01中讀出的暫時存儲區(qū)
- bit modo; //立體聲數(shù)據(jù)寄存器
- uchar key_temp; //鍵盤有鍵按下標志位
- uint i;
- uchar code DATA[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF};
- //數(shù)碼管顯示字0-9,不顯示
- uchar code WEI[4]={0x1f,0x2f,0x4f,0x8f}; //數(shù)碼管掃描控制
- uchar data display[4]={0x00,0x00,0x00,0x00}; //數(shù)碼管顯示數(shù)據(jù)緩沖區(qū)
- //************************延時函數(shù)1******************************
- void Delay1(void)
- {
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- ///***********************延時函數(shù)***********************************
- void delay(uint t)
- {
- for(;t>0;t--);
- }
- ///***************************顯示函數(shù)******************************
- /// 4位數(shù)碼管動態(tài)掃描
- ///*****************************************************************
- void xianshi(void)
- {
- uchar k;
- for(k=0;k<4;k++) //4位數(shù)碼管顯示
- {
- LED_DATA=DATA[display[k]];
- LED_WEI=WEI[k]; //先顯示百位
- if(k==2){ dg=0; } //顯示小數(shù)點
- delay(35);
- }
- LED_DATA=0xff; //清除顯示
- }
- ///*************************顯示數(shù)值處理函數(shù)***************************
- //*********************************************************************
- void xianshi_turn(void) //頻率數(shù)據(jù)轉(zhuǎn)換為顯示用BCD碼函數(shù)
- {
- uint fr;
- display[0]=f_data/1000; //求顯示百位數(shù)
- if(display[0]==0)
- {
- display[0]=10;
- }
- fr=f_data%1000;
- display[1]=fr/100; //求顯示十位數(shù)
- fr=fr%100;
- display[2]=fr/10; //求顯示個位數(shù)
- display[3]=fr%10; //求顯示小數(shù)位
- }
- //***********************綜合顯示函數(shù)*********************************
- //********************************************************************
- void T_Display(void)
- {
- xianshi_turn();
- xianshi();
- }
- ///*************************寫數(shù)據(jù)函數(shù)*********************************
- //將數(shù)據(jù)送入BH1415中
- //*********************************************************************
- void send_16data(uint Data,uchar MODO)
- {
- uchar i;
- CLK=0;
- CE=0;
- CE=1; //連續(xù)保存高電平,可輸入數(shù)據(jù)
- for(i=11;i>0;i--)
- {
- DA=Data & 0x01;
- //傳輸BH1415F2個字節(jié)頻率控制11位D0-D10頻率數(shù)據(jù)
- Data>>=1;
- Delay1();
- CLK=1;
- Delay1();
- CLK=0;
- }
- DA=MODO;
- Delay1();
- CLK=1; //MONO
- Delay1();
- CLK=0;
- Delay1();
- DA=0;
- Delay1(); //PD0
- CLK=1;
- Delay1();
- CLK=0;
- Delay1();
- DA=0;
- Delay1(); //PD1
- CLK=1;
- Delay1();
- CLK=0;
- Delay1();
- DA=1;
- Delay1(); //測試模式控制關閉
- CLK=1;
- Delay1();
- CLK=0;
- Delay1();
- DA=0;
- Delay1(); //測試模式控制關閉
- CLK=1;
- Delay1();
- CLK=0;
- CE=0; //輸入數(shù)據(jù)結(jié)束
- }
- //*************************鍵盤處理函數(shù)*************************//
- //
- //
- //****************************************************************
- void KEY(void)
- {
- uint ii=0,jj=0; //記錄頻率增加的個數(shù),若ii>4,f以5為增量增加
- uchar key_data; //若jj>4,f以5為增量減小
- P2=0x0F;
- P1=0x0F; //鍵盤掃描口斷碼輸出初始化//
- if((P2&0x0F)!=0x0F)
- {
- delayms(10);
- if((P2&0x0F)!=0x0F) //防抖動測試
- {
- key_temp=1; //鍵盤有鍵按下標志位//
- key_data=P2&0x0F;
- switch(key_data)
- {
- case 0x07: //頻率自動加//
- {
- f_data++;
- if(f_data>1080)
- f_data=875;
- T_Display();
- while(key_fr_up==0)
- {
- for(i=400;i>0;i--) //設置等待自動加頻率的時間
- {
- delay(50);
- if(key_fr_up==1)break;
- }
- while(key_fr_up==0) //開始自動加頻率
- {
- f_data++;
- ii++;
- if(ii>4)f_data+=5;
- if(f_data>1080)f_data=875;
- T_Display();
- for(i=110;i>0;i--) //設置長時間按鍵
- //后,自動加數(shù)字的速度//
- {
- delay(25);
- if(key_fr_up==1)break;
- }
- }
- }
- break;
- }
- case 0x0B://頻率自動減//
- {
- f_data--;
- if(f_data<875)f_data=1080;
- T_Display();
- while(key_fr_down==0)
- {
- for(i=400;i>0;i--) //設置等待自動減頻率的時間
- {
- delay(50);
- if(key_fr_down==1)break;
- }
- while(key_fr_down==0) //開始自動減頻率
- {
- f_data--;
- ii++;
- if(ii>4) f_data-=5;
- if(f_data<875) f_data=1080;
- T_Display();
- for(i=110;i>0;i--) //設置長時間按鍵后,自動減數(shù)字的速度//
- {
- delay(25);
- if(key_fr_down==1) break;
- }
- }
- }
- break;
- }
- case 0x0D: //立體聲控制
- {
- if(key_LTS_KZ==0)
- {
- modo=~modo;
- LTS_LED=~modo; //打開關閉立體聲
- //WriteIIC_24C01(0x02,modo);
- }
- while(key_LTS_KZ==0);
- break;
- }
- default:
- {
- key_temp=0;
- break;
- }
- }
- }
- else
- key_temp=0;
- }
- else
- key_temp=0;
- }
- //**************************初始化程序**********************************//
- void CSH (void)
- { uint i;
- CE=0;
- CLK=0;
- DA=0;
- P2=0x0F;
- P1=0x0FF; //鍵盤接口、掃描口、段碼輸出口初始化
- for(i=0;i<4;i++) //開機
- display[i]=8; //顯示
- for(i=0;i<500;i++) //顯示
- xianshi(); //顯示8888
- f_data=875;
- modo=1;//立體聲關閉
- key_temp=0;
- }
- //***************************主程序MAIN()*******************************
- //TMOD:定時/計數(shù)器方式控制寄存器
- //TH0 TL0:定時計數(shù)器0
- //TR0:定時計數(shù)器0工作啟停位
- //ET0:定時計數(shù)器0允許中斷位
- //EA:中斷允許/禁止位
- //***********************************************************************
- main()
- {
- CSH();//開機初始化
- delay(50);
- //modo=(bit)(DataByte);
- delay(50);
- send_16data(f_data,modo); //向1415送初始數(shù)據(jù)
- //DENGDAI();
- LTS_LED=~modo; //立體聲打開
- TMOD=0x01; //定時計數(shù)器0工作方式1,16位自動啟動方式
- TH0=0xEA;
- TL0=0xD0;
- TR0=1;
- ET0=1;
- EA=1; //開中斷
- while(1) //啟動鍵盤處理程序,同時等待中斷
- {
- KEY();
- } //啟動鍵盤處理程序,同時等待中斷
- }
- //*****************************中斷服務程序******************************
- //5.424ms中斷一次
- //***********************************************************************
- void t0(void) interrupt 1 using 0
- {
- ET0=0;
- if(key_temp==1)
- {
- send_16data(f_data,modo); //向BH1415F發(fā)送數(shù)據(jù)
- }
- key_temp=0;
- xianshi_turn(); //顯示數(shù)據(jù)轉(zhuǎn)換
- xianshi();
- key_temp=1;
- TH0=0xEA;
- TL0=0xD0;
- ET0=1;
- }
復制代碼
|