⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 一个51MCU.电压0~5V输入转PWM输出控制的原代码.
💻 C
字号:
/* After is STC additional SFR or change */

/* sfr  AUXR  = 0x8e; */
/* sfr  IPH   = 0xb7; */

/* Watchdog Timer Register */
sfr  WDT_CONTR = 0xc1;//0xe1;    

/* ISP_IAP_EEPROM Register */
sfr ISP_DATA  = 0xc2;//0xe2;
sfr ISP_ADDRH = 0xc3;//0xe3;
sfr ISP_ADDRL = 0xc4;//0xe4;
sfr ISP_CMD   = 0xc5;//0xe5;
sfr ISP_TRIG  = 0xc6;//0xe6;
sfr ISP_CONTR = 0xc7;//0xe7;

/* System Clock Divider */
sfr CLK_DIV  = 0x97;//0xc7;

/* I_O Port Mode Set Register */
sfr P0M0  = 0x94;//0x93;
sfr P0M1  = 0x93;//0x94;
sfr P1M0  = 0x92;//0x91;
sfr P1M1  = 0x91;//0x92;
sfr P2M0  = 0x96;//0x95;
sfr P2M1  = 0x95;//0x96;
sfr P3M0  = 0xb2;//0xb1;
sfr P3M1  = 0xb1;//0xb2;

/* SPI Register */
sfr SPSTAT  = 0xcd;//0x84;
sfr SPCTL   = 0xce;//0x85;
sfr SPDAT   = 0xcf;//0x86;

/* ADC Register */
sfr ADC_P1ASF = 0x9d;
sfr ADC_CONTR  = 0xbc;//0xc5
sfr ADC_DATA   = 0Xbd;//0xc6   //adc_res
sfr ADC_LOW2   = 0xbe;

/* PCA SFR */
sfr CCON   = 0xD8;
sfr CMOD   = 0xD9;
sfr CCAPM0 = 0xDA;
sfr CCAPM1 = 0xDB;
sfr CCAPM2 = 0xDC;
sfr CCAPM3 = 0xDD;
sfr CCAPM4 = 0xDE;
sfr CCAPM5 = 0xDF;

sfr CL     = 0xE9;
sfr CCAP0L = 0xEA;
sfr CCAP1L = 0xEB;
sfr CCAP2L = 0xEC;
sfr CCAP3L = 0xED;
sfr CCAP4L = 0xEE;
sfr CCAP5L = 0xEF;

sfr CH     = 0xF9;
sfr CCAP0H = 0xFA;
sfr CCAP1H = 0xFB;
sfr CCAP2H = 0xFC;
sfr CCAP3H = 0xFD;
sfr CCAP4H = 0xFE;
sfr CCAP5H = 0xFF;

sfr PCA_PWM0 = 0xF2;
sfr PCA_PWM1 = 0xF3;
sfr PCA_PWM2 = 0xF4;
sfr PCA_PWM3 = 0xF5;
sfr PCA_PWM4 = 0xF6;
sfr PCA_PWM5 = 0xF7;

/*  CCON  */
sbit CF    = CCON^7;
sbit CR    = CCON^6;
sbit CCF5  = CCON^5;
sbit CCF4  = CCON^4;
sbit CCF3  = CCON^3;
sbit CCF2  = CCON^2;
sbit CCF1  = CCON^1;
sbit CCF0  = CCON^0;

/* Above is STC additional SFR or change */

/*--------------------------------------------------------------------------
REG51F.H

Header file for 8xC31/51, 80C51Fx, 80C51Rx+
Copyright (c) 1988-1999 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.

Modification according to DataSheet from April 1999
 - SFR's AUXR and AUXR1 added for 80C51Rx+ derivatives
--------------------------------------------------------------------------*/

/*  BYTE Registers  */
sfr P0   = 0x80;
sfr P1   = 0x90;
sfr P2   = 0xA0;
sfr P3   = 0xB0;
sfr PSW  = 0xD0;
sfr ACC  = 0xE0;
sfr B    = 0xF0;
sfr SP   = 0x81;
sfr DPL  = 0x82;
sfr DPH  = 0x83;
sfr PCON = 0x87;
sfr TCON = 0x88;
sfr TMOD = 0x89;
sfr TL0  = 0x8A;
sfr TL1  = 0x8B;
sfr TH0  = 0x8C;
sfr TH1  = 0x8D;
sfr IE   = 0xA8;
sfr IP   = 0xB8;
sfr SCON = 0x98;
sfr SBUF = 0x99;

/*  80C51Fx/Rx Extensions  */
sfr AUXR   = 0x8E;
/* sfr AUXR1  = 0xA2; */
sfr SADDR  = 0xA9;
sfr IPH    = 0xB7;
sfr SADEN  = 0xB9;
//sfr T2CON  = ;//0xC8;
//sfr T2MOD  = ;//0xC9;
//sfr RCAP2L = ;//0xCA;
//sfr RCAP2H = ;//0xCB;
//sfr TL2    = ;//0xCC;
//sfr TH2    = ;//0xCD;


/*  BIT Registers  */
/*  PSW   */
sbit CY   = PSW^7;
sbit AC   = PSW^6;
sbit F0   = PSW^5;
sbit RS1  = PSW^4;
sbit RS0  = PSW^3;
sbit OV   = PSW^2;
sbit P    = PSW^0;

/*  TCON  */
sbit TF1  = TCON^7;
sbit TR1  = TCON^6;
sbit TF0  = TCON^5;
sbit TR0  = TCON^4;
sbit IE1  = TCON^3;
sbit IT1  = TCON^2;
sbit IE0  = TCON^1;
sbit IT0  = TCON^0;

/*  P3  */
sbit RD   = P3^7;
sbit WR   = P3^6;
sbit T1   = P3^5;
sbit T0   = P3^4;
sbit INT1 = P3^3;
sbit INT0 = P3^2;
sbit TXD  = P3^1;
sbit RXD  = P3^0;

/*  SCON  */
sbit SM0  = SCON^7; // alternatively "FE"
sbit FE   = SCON^7;
sbit SM1  = SCON^6;
sbit SM2  = SCON^5;
sbit REN  = SCON^4;
sbit TB8  = SCON^3;
sbit RB8  = SCON^2;
sbit TI   = SCON^1;
sbit RI   = SCON^0;
             

sbit T2EX = P1^1;
sbit T2   = P1^0;

/*  T2CON  */
//sbit TF2   = T2CON^7;
//sbit EXF2  = T2CON^6;
//sbit RCLK  = T2CON^5;
//sbit TCLK  = T2CON^4;
//sbit EXEN2 = T2CON^3;
//sbit TR2   = T2CON^2;
//sbit C_T2  = T2CON^1;
//sbit CP_RL2= T2CON^0;

/* PCA Pin */

sbit CEX3 = P2^4;
sbit CEX2 = P2^0;
sbit CEX1 = P3^5;
sbit CEX0 = P3^7;
sbit ECI  = P3^4;

/*  IE   */
sbit EA   = IE^7;
sbit EPCA_LVD  = IE^6;
sbit EADC_SPI  = IE^5;
sbit ES   = IE^4;
sbit ET1  = IE^3;
sbit EX1  = IE^2;
sbit ET0  = IE^1;
sbit EX0  = IE^0;

/*  IP   */ 
sbit PPCA_LVD  = IP^6;
sbit PADC_SPI  = IP^5; 
sbit PS   = IP^4;
sbit PT1  = IP^3;
sbit PX1  = IP^2;
sbit PT0  = IP^1;
sbit PX0  = IP^0;



 ///////////////////////////////start

#define uchar unsigned char
#define uint unsigned int

/////
sbit xx_input =P1^0;
sbit adj_input = P1^1;
sbit en_input = P1^2;
sbit adb_input = P1^5;
sbit set_input = P1^6;
sbit ada_input = P1^7;	 
///
sbit led_test =P3^4;
sbit led_dirver = P3^7;
////

#define SEG_A 0X01
#define SEG_B 0X02
#define SEG_C 0X04
#define SEG_D 0X08
#define SEG_E 0X10
#define SEG_F 0X20
#define SEG_G 0X40
#define SEG_DP 0X80

#define SHOW_VOL 0
#define refh_data 196
#define refl_data 79 


xdata uchar  show_data[4];
uchar show_count;
xdata uchar adbuf[5];
bdata uchar CFLAG;
sbit adstart_m = CFLAG^0;
sbit  adstart_j = CFLAG^1;
sbit setupstatus = CFLAG^2;
sbit upkey_auto = CFLAG^3;
sbit downkey_auto = CFLAG^4;
sbit setkey_auto = CFLAG^5;
sbit maxkey_auto = CFLAG^6;

//sbit changed_flag = CFLAG^6;
//sbit show_keywait = CFLAG^7;

bdata uchar AD_CONTR;		  // 只有AD时才用.
sbit ADC_POWER = AD_CONTR^7;
sbit SPEED1 = AD_CONTR^6;
sbit SPEED0 = AD_CONTR^5;
sbit ADC_FLAG = AD_CONTR^4;
sbit ADC_START = AD_CONTR^3;
sbit CHS2 = AD_CONTR^2;
sbit CHS1 = AD_CONTR^1;
sbit CHS0 = AD_CONTR^0;
///////////////////////////
//uint adf_showcnt;
uint adfcnt;
uint ad_tmp;
uint ad_data;

/////////////////////////////////////////函数原形
uchar timerover(void);
void initsys(void);
void wait(uint tmp);
void adc_setpin(uchar pin);
/////////////////////////////////////////////////////////////////////		
void main(void)
{
uchar buf;
uint ad_dtmp,adx_tmp,ady_tmp,x,y;
led_dirver = 0;
buf=0;
ad_dtmp=0;
adx_tmp = 0;
ady_tmp = 0;
x = 0;
y = 0;
///===
  initsys();
//adc_poweron();
  WDT_CONTR = 0x3C;
  while(1)
  {
//==
  while(timerover()==0); 
  WDT_CONTR = 0x3C;

  if(adfcnt > 10)
   {	
    if(!ADC_START && !ADC_FLAG)
      {
      ADC_START = 1;
      ADC_CONTR = AD_CONTR;
	  wait(4);
      }
     adfcnt =0;
    }
  AD_CONTR = ADC_CONTR;
  if(ADC_FLAG)
    {
     ADC_FLAG = 0;
     ad_tmp = ADC_DATA;
     ADC_CONTR = AD_CONTR;
	 wait(4);
	 }
   if((buf+2<ad_tmp)||(buf-2>ad_tmp))
      { 
       buf = ad_tmp;
       ad_tmp = buf;
      }
  else
	  {
	  ad_tmp = buf;
	  }
   if(en_input)
   {
   if(ad_tmp>10)
     {
	// if(ad_tmp<255)
	// {
   x = ((ad_tmp * refl_data)-(ad_tmp * refl_data)%1000)/1000;
   y = (ad_tmp * refh_data)+x;
   ad_dtmp = ((y-(y%10))/10);
   ad_data = (ad_dtmp*6)/10;
  // ad_data = ad_data/2;
   if(en_input)
     {
      if(ad_data<100)
        {
        ad_data = 100;
        }
      adx_tmp=3200-ad_data;
      led_dirver =1;
      led_test =1;
    //  wait(ad_data);
     wait(adx_tmp);
	 }
     else
     {
      adx_tmp = 10;
     }
     led_dirver =0;
     led_test =0;
    // wait(adx_tmp);
	 wait(ad_data);
	// }else{
	// led_dirver = 0;
	// led_test = 0;
	// }
	 }else{
	 led_dirver = 1;
	 led_test = 1;
	 }
	 }
	 else
	 {
	 led_dirver = 0;
	 led_test = 0;
	 }
//if(en_input)
//{
//  wait(1000);
//  led_dirver = 0;
//  led_test = 0;
//  wait(1000);
//  led_dirver = 1;
//  led_dirver = 1;
// }
  if(ad_tmp>9999)
  {
  ad_tmp = 10;
  }
//====///////////////////////////
  }
}
////////////////////////////////////////////////
uchar timerover(void)
{
 if (TF0 == 1)
   {
    TF0=0;
	TH0 = 0XD4;
	TL0 = 0x10;//0X46;
	adfcnt++;
	return(1);
   }
}
////////////////////////////////////////////////////////系统配置
void initsys(void)
{
 AUXR = 0X80; 
 EA = 0;
 //把timer设置成1ms
 TMOD = 0X21;
 TH0 = 0XD4; //65535 - 11059
 TL0 = 0X46;
 TH1 = 0XFF;
 TR0 = 1;
 TR1 = 1;
 P1M0 = 0X0;//0x03;//0;		
 P1M1 = 0XFF;//0X03;//0;
 //P2M0 =0;
 //P2M1 = 0;
 P1 = 0x44;//P1 = 0;/
 //P2 = 0Xc0;
 P3 = 0x0f;
 SCON = 0x50;
 REN =1;
 PCON = PCON | 0X80;
 CFLAG = 0;
 led_dirver = 0;
 ADC_P1ASF = 0xa2;//0x02;//AD位
 adc_setpin(11);
}
///////////////
void adc_setpin(uchar pin)
{
  ADC_POWER = 1;
  SPEED1 = 1;
  SPEED0 = 1;
  switch(pin)
  {
  case 10:
		   CHS2 = 0;
           CHS1 = 0;
           CHS0 = 0;
           break;
  case 11:
		   CHS2 = 0;
           CHS1 = 0;
           CHS0 = 1;
           break;
  case 12:
		   CHS2 = 0;
           CHS1 = 1;
           CHS0 = 0;
           break;
  case 15:
		   CHS2 = 1;
           CHS1 = 0;
           CHS0 = 1;
           break;
  case 16:
		   CHS2 = 1;
           CHS1 = 1;
           CHS0 = 0;
           break;
  case 17:
		   CHS2 = 1;
           CHS1 = 1;
           CHS0 = 1;
           break;
  default:
           break;
    }
  ADC_CONTR = AD_CONTR;
 wait(2);
}
/////////////////

void wait(uint tmp)
{uint i;
for(i=0;i<tmp;i++);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -