自己写的程序,已经验证过有实物
单片机源程序如下:
- #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(系统时钟) 12M
- TMOD=0x1A; //****8位自动重装定时器,溢出时将TH0的值自动装入TL0
- TR0=1; //*****定时器1的开始计数
- 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;//存储每个电平的持续时间,用于以后判断是0还是1
- ied++;
- if(ied>=33)
- {
- irok=1;
- ied=0;
- jsok=0;
- }
- }
- }
- ////////////////////////////////////////////////定时中断
- void time_int(void) interrupt 1
- {
- irtime++; //用于计数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)//红外码值处理函数
- {
- uchar i, j, k,value;
- uchar cord;
- k=1;
- for(i=0;i<4;i++) //处理4个字节
- {
- for(j=1;j<=8;j++) //处理1个字节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) //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等
- {
- 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) //如果处理好后进行工作处理,如按对应的按键后显示对应的数字等
- {
- irpro_ok=0;
- Ir_work();
- }
- led_display(keydata);
- led=irok;
- }
- else
- {
- ledoff_display();
- keydata=0;
- led=0;
- }
- }
- }
复制代码
所有程序51hei提供下载:
四位74hc595.rar
(2.58 KB, 下载次数: 19)
|