自己寫的程序,已經(jīng)驗證過有實物
單片機源程序如下:
- #include "SC92F732X_C.H"
- #define uchar unsigned char
- #define uint unsigned int
- #define ul unsigned long
- ///////////////////////////引腳
- #define mosout P00 //輸出引腳
- #define baiout P11
- #define lvout_510r P17
- #define huangout_510r P27
- #define hongout P24
- #define usbfout P12
- #define led P26
- #define on P13
- #define vin P10
- #define CLK P02
- #define DATA_1 P01
- #define CKSHX P05
- #define hwpin P16
- #define vbatt 0x41
- #define v1 0x40
- ////////////////////////////// 變量定義
- bit ON_OFF,bi;
- bit irpro_ok,irok,jsok;
- uint sleep_data;
- uchar bb,hs,h,ied;
- ul v1_add,v1_data;
- ul vb_add,vb_data;
- uchar irtime,irdet;
- uchar kehuh,kehul,keyma,keyfanma;
- uchar keydata,jsokadd;
- ///////////////////////////////////
- unsigned char IRcord[4];
- unsigned char irdata[33];
- /////////////////////////////////
- unsigned char const code shuma[] =
- {0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};// 0--9 //
- //////////////////////////////////////////////////// 上電初始化程序
- void mcu_init(void)
- {
- /* 初始化I/O口 */
- P0CON =0xff; // 0為輸入,1為輸出
- P0PH=0; // 1有效
- P0 =0;
- P1CON = 0x86;
- P1PH=0x48;
- P1 = 0x49;
- P2CON = 0xf0;
- P2PH=0;
- P2 = 0;
- /*初始化AD*/
- ADCCFG1 = 0; // AIN8通道開關 //
- ADCCFG0 = 0x3;
- ADCCON = 0;
- /////////////////打開外部中斷
- EA=1;
- EINT0=0;
- IPINT0=0;
- INT0F=0;
- INT0R=0;
- EINT1=1;
- INT1F=0x4; //INT12
- INT1R=0;
- IP1=0x8;
- /////////////////打開定時器
- ET0=1; //**** T0使能
- TMCON=0; //*****頻率來自FSYS/12(系統(tǒng)時鐘) 12M
- TMOD=0x1A; //****8位自動重裝定時器,溢出時將TH0的值自動裝入TL0
- TR0=1; //*****定時器1的開始計數(shù)
- TL0=0;
- TH0=156; //256-120
- //////////////////////AD參考電壓2.4
- OPINX=0xC2;
- OPREG=0X80;
- ////////////////// 初始化變量
-
- }
- //////////////////////////////////////////////////////////////////
- void waibu12_int(void) interrupt 2
- {
- irdet=irtime;
- irtime=0;
- if((irdet<140)&&(irdet>=130))//引導碼 TC9012的頭碼,9ms+4.5ms
- {
- ied=0;
- jsok=1;
- }
- if(irdet>160)//引導碼大于16MS
- {
- irdet=0;
- ied=0;
- jsok=0;
- }
- if(jsok)
- {
- irdata[ied]=irdet;//存儲每個電平的持續(xù)時間,用于以后判斷是0還是1
- ied++;
- if(ied>=33)
- {
- irok=1;
- ied=0;
- jsok=0;
- }
- }
- }
- ////////////////////////////////////////////////定時中斷
- void time_int(void) interrupt 1
- {
- irtime++; //用于計數(shù)2個下降沿之間的時間
- /*if(irtime>250)
- {
- irtime=0;
- } */
- //************************************
- }
- /////////////////////////////////////////////////////////////
- unsigned int ad_conver(uchar ad_pin)
- {
- uint ad_res_data,ad_h,ad_l;
- uchar as;
- ADCCON=0x80;
- ad_h=0;ad_l=0;
- ADCCON|=ad_pin; //ADCS=1; 00001000 on ad
- while(!(ADCCON&0x10)){as=0;}
- ad_l=ADCVL;
- ad_h=ADCVH;
- ad_h<<=4;
- ad_l>>=4;
- ad_res_data=ad_h|ad_l;
- ADCCON=0;
- return(ad_res_data);
- }
- ///////////////////////////////////
- void dalay_1(uint yanshi)
- {
- uint sb;
- for(sb=0;sb<yanshi;sb++){}
- }
- ////////////////////////////////////////////////
- /////////////////////////////////////////////IO口組合
- void in_74ls595(uchar p)
- {
- uchar id;
- for(id=0;id<8;id++)
- {
- if(p&0x80){DATA_1=1;}
- else{DATA_1=0;}
- CLK=0;
- CLK=1;
- p<<=1;
- }
- }
- //////////////////////////////////////////
- void led_display(uint display_data )
- {
- uchar qian,bai,shi,ge;
- qian=display_data/1000;
- bai=(display_data%1000)/100;
- shi=(display_data%100)/10;
- ge=display_data%10;
- //************************************************掃描
- if(qian==0){in_74ls595(0);}
- else{in_74ls595(shuma[qian]);}
- in_74ls595(0x10);
- CKSHX=1;
- dalay_1(5);
- CKSHX=0;
- dalay_1(100);
- in_74ls595(0);
- in_74ls595(0);
- CKSHX=1;
- dalay_1(3);
- CKSHX=0;
- dalay_1(3);
- if((qian==0)&&(bai==0)){in_74ls595(0);}
- else{in_74ls595(shuma[bai]);}
- in_74ls595(0x20);
- CKSHX=1;
- dalay_1(5);
- CKSHX=0;
- dalay_1(100);
- in_74ls595(0);
- in_74ls595(0);
- CKSHX=1;
- dalay_1(3);
- CKSHX=0;
- dalay_1(3);
- if((qian==0)&&(bai==0)&&(shi==0)){in_74ls595(0);}
- else{in_74ls595(shuma[shi]);}
- in_74ls595(0x40);
- CKSHX=1;
- dalay_1(5);
- CKSHX=0;
- dalay_1(100);
- in_74ls595(0);
- in_74ls595(0);
- CKSHX=1;
- dalay_1(3);
- CKSHX=0;
- dalay_1(3);
- in_74ls595(shuma[ge]);
- in_74ls595(0x80);
- CKSHX=1;
- dalay_1(5);
- CKSHX=0;
- dalay_1(100);
- in_74ls595(0);
- in_74ls595(0);
- CKSHX=1;
- dalay_1(3);
- CKSHX=0;
- dalay_1(3);
-
- }
- //////////////////////////////////////////
- void ledoff_display()
- {
- //************************************************掃描
- in_74ls595(0);
- in_74ls595(0);
- CKSHX=1;
- dalay_1(3);
- CKSHX=0;
- dalay_1(400);
-
- }
- ///////////////////////////////////////////////
- void key_in()
- {
- //*********************************************開關鍵
- if(!on)
- {
- bb++;
- if((bb>100)&&bi&&(!on))
- {
- bb=0;
- ON_OFF=!ON_OFF;
- bi=0;
- }
- }
- else
- {
- bi=1;
- bb=0;
- }
- //********************************************遙控功能鍵
- }
- /////////////////////////////////////////////////////////
- void vbat_in()
- {
- h++;
- vb_add+=ad_conver(vbatt);
- if(h>=200)
- {
- h=0;
- vb_data=vb_add/200;
- vb_add=0;
- }
- }
- /////////////////////////////////////////////////////////////
- void v1_in()
- {
- hs++;
- v1_add+=ad_conver(v1);
- if(hs>=200)
- {
- hs=0;
- v1_data=v1_add/200;
- v1_add=0;
- }
- }
- ////////////////////////////////////////// //紅外碼值處理
-
- void Ircordpro(void)//紅外碼值處理函數(shù)
- {
- uchar i, j, k,value;
- uchar cord;
- k=1;
- for(i=0;i<4;i++) //處理4個字節(jié)
- {
- for(j=1;j<=8;j++) //處理1個字節(jié)8位
- {
- cord=irdata[k];
- if(cord>20)////////高電平2.25MS,低電平1.125MS
- {
- value|=0x80;
- }
- if(j<8)
- {
- value>>=1;
- }
- k++;
- }
- IRcord[i]=value;
- value=0;
- }
- irpro_ok=1;//處理完畢標志位置1
- }
- //////////////////////////////////////////////////////////////////////
- void Ir_work(void)
- {
- kehuh=IRcord[0];
- kehul=IRcord[1];
- keyma=IRcord[2];
- keyfanma=IRcord[3];
- if(keyma||keyfanma==255)
- {
- keydata=keyma;
- }
- }
- //////////////////////////////////////////////////////////////////////////////////////////////////////
- void main(void)
- {
- mcu_init();
- while(1)
- {
- v1_in();
- vbat_in();
- key_in();
- //************************
- if(irok) //如果接收好了進行紅外處理
- {
- irok=0;
- Ircordpro();
- }
- if(irpro_ok) //如果處理好后進行工作處理,如按對應的按鍵后顯示對應的數(shù)字等
- {
- irpro_ok=0;
- Ir_work();
- }
- if(jsok)
- {
- jsokadd++;
- if(jsokadd>250)
- {
- jsokadd=0;
- jsok=0;
- }
- }
- else
- {
- jsokadd=0;
- }
- //*********************
- if(ON_OFF)
- {
- if(irok) //如果接收好了進行紅外處理
- {
- irok=0;
- Ircordpro();
- }
- if(irpro_ok) //如果處理好后進行工作處理,如按對應的按鍵后顯示對應的數(shù)字等
- {
- irpro_ok=0;
- Ir_work();
- }
- led_display(keydata);
- led=irok;
- }
- else
- {
- ledoff_display();
- keydata=0;
- led=0;
- }
- }
- }
復制代碼
所有程序51hei提供下載:
四位74hc595.rar
(2.58 KB, 下載次數(shù): 19)
2019-7-3 17:35 上傳
點擊文件名下載附件
用595驅(qū)動數(shù)碼管顯示來自紅外遙控的編碼數(shù)據(jù)
|