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

📄 lpc935.c

📁 PHILIPS LPC935 MCU 利用其8路AD转换器,对监测对象进行数据采集,然后通过UART将采集到的数据发送到PC上位机
💻 C
字号:
#include "reg935.h"
#define byte unsigned char
#define word unsigned int
#define TH0_DATA      0x6F				// On Chip Oscillator (7.3728MHz ± 2.5%)10ms
#define TL0_DATA      0xFF 

#define true 	1
#define false 	0
#define High	1
#define Low		0

#define On		0
#define Off		1

//******** Time constant **************
#define _10MS   	1
#define _20MS           2
#define _30MS           3
#define _50MS       	5
#define _100MS          10
#define _200MS		20
#define _250MS      	25
#define _300MS          30
#define _500MS		50
#define _800MS		80
#define _1S		100
#define _2S		200
#define _3S		300
#define _4S		400
#define _5S		500
#define _6S		600
#define _7S     700
#define _8S		800
#define _10S            1000
#define _20S            2000
#define _900S           9000 

//State Machina
#define State_Start			0	
#define State_Work			1

//******************************************
//变量定义
bit Flag_100us=0;
bit Flag_10ms=0;
bit Flag_COM_Rec=0;
bit Flag_Second=0;

byte State=State_Start;
byte COM_Rec_Buf;
word RecWord=0;
word RecTmp=0;
word Temp_Word=0;

byte Temp_Byte;
byte Cnt_10ms=0;

byte Temp=0;
byte ADC_Time=0;
byte ADC_BAT0=0;
byte ADC_BAT1=0;
byte ADC_BAT2=0;
byte ADC_BAT3=0;
byte ADC_BAT4=0;
byte ADC_BAT5=0;
byte ADC_BAT6=0;
byte ADC_BAT7=0;
byte Old_Minute=0;
byte Minute_Cnt=0;
byte Second_Cnt=0;
byte Snd_Time_Cnt=0;   //SECOND

//******************************************
//脚位定义
sbit CON_PIN0=P1^6;
sbit CON_PIN1=P1^4;
sbit CON_PIN2=P3^0;
sbit CON_PIN3=P3^1;
sbit CON_PIN4=P2^2;
sbit CON_PIN5=P2^3;
sbit CON_PIN6=P2^4;
sbit CON_PIN7=P2^5;

//******************************************
//函数定义
void 	Init_hw();
void 	RecData();
void 	UART_init();
void 	Relay_Reset();
void 	Relay_On(byte Relay);
void 	Relay_Off(byte Relay);
void 	timer0_init();
void 	Clear_Timer(void);
void 	ADC_init();
void 	delayms(word ms);
void 	SIO_Out_Str(byte *pstr);
void 	SIO_Out_Hex(byte b);
void 	Do_ADC();
void 	delayus(word us);
void 	SIO_Out_Byte(byte b);
bit 	Check_Start(void);
void	Do_Start(void);
void	Send_AD_Result(void);
void main()
{
 //   word i;
//	byte Temp_Byte;
	EA=0;
	Init_hw();
	timer0_init();
	Clear_Timer();
	UART_init();
	ADC_init();
	EA=1;
	CON_PIN0=Low;
	CON_PIN1=Low;
	CON_PIN2=Low;
	CON_PIN3=Low;
	CON_PIN4=Low;
	CON_PIN5=Low;
	CON_PIN6=Low;
	CON_PIN7=Low;
	SIO_Out_Str("Welcom to Battery test world!\r\n");
/*
    while (1)
    {
		Do_Start();
    }*/
   	while (1)
 	{ 
   	    /*if (Flag_Second)
		{	
			Flag_Second=false;
			Second_Cnt++;
			Snd_Time_Cnt++;
			//Do_ADC();
		}*/
		if(Second_Cnt>=60)
		{
			Second_Cnt=0;
			Minute_Cnt++;
		}		
		switch(State)
		{
			case State_Start:
					Do_Start();
					State=State_Work;
					Minute_Cnt=0;
					Second_Cnt=0;
					Snd_Time_Cnt=0;
			break;
			case State_Work:		
				/*if(Snd_Time_Cnt>=20)
				{
					EA=0;
					SIO_Out_Byte(ADC_BAT0);
					//SIO_Out_Byte(0x20);
					SIO_Out_Byte(ADC_BAT1);
					//SIO_Out_Byte(0x20);
					SIO_Out_Byte(ADC_BAT2);
					//SIO_Out_Byte(0x20);
					SIO_Out_Byte(ADC_BAT3);
					//SIO_Out_Byte(0x20);
					SIO_Out_Byte(ADC_BAT4);
					//SIO_Out_Byte(0x20);
					SIO_Out_Byte(ADC_BAT5);
					//SIO_Out_Byte(0x20);
					SIO_Out_Byte(ADC_BAT6);
					//SIO_Out_Byte(0x20);
					SIO_Out_Byte(ADC_BAT7);
					//SIO_Out_Byte(0x20);
					SIO_Out_Byte(0x0D);
					SIO_Out_Byte(0x0A);
					Snd_Time_Cnt=0;
					EA=1;
				}*/
				if(Minute_Cnt>=80) State=State_Start;
				if(!Check_Start()) Do_Start();
			break;
		}
     	
	}


}	// end main()


//**************************************************



void Init_hw(void)
{
//	P2M1=0x00;
//	P2M2=0x00;
	P2M1=0x03;
	P2M2=0x00;
	P3M1=0x00;
	P3M2=0x00;
//	P1M1=0x0C;
//	P1M2=0x0C;
	P1M1=0x80;
	P1M2=0x00;
//	P0M1=0x00;
//	P0M2=0xFF;
	P0M1=0x1F;
	P0M2=0x00;
	AUXR1=1;
	DIVM=0;
	EA=0;
}

//**************************************************
//串口 9600BAUDRATE N 8 1
void UART_init()
{
	// configure UART
  // clear SMOD0
 	PCON &= ~0x40;
	SCON = 0x50;
  // set or clear SMOD1
	PCON &= 0x7f;
	PCON |= (0 << 8);
  	SSTAT = 0x00;

  // configure baud rate generator
  	BRGCON = 0x00;
	BRGR0 = 0xF0; 		//7.373M  baudrate=9600   (BRGR1,BTGR0)=7.373M/9600-16
  	BRGR1 = 0x02;
  	BRGCON = 0x03;
/*
  // TxD = push-pull, RxD = input
  	P1M1 &= ~0x01;
  	P1M2 |= 0x01;
  	P1M1 |= 0x02;
  	P1M2 &= ~0x02;
*/
    ESR=1; 		//ESR=Enable Serial Recieve
}

void Rcv_ISR() interrupt 4
{ //当接收完一个字节RI置1进入Recieve中
	EA=0; 		//
	if (RI)
	{	
		RI=0; 		//RI清0以等待下次发
		COM_Rec_Buf=SBUF; 	//保存所读取的数据
		Flag_COM_Rec=true;
	}
	EA=1;
}

//------------------------- //功能发送中断 //-------------------------
void Send_ISR() interrupt 13
{
	EA=0;
	EA=1;
} //--------------------------


//**************************************************
//10ms 中断函数
void timer0_int(void) interrupt 1
{
	EA=0;
	TH0=TH0_DATA;
	TL0=TL0_DATA;
	Cnt_10ms++;	
	if (Cnt_10ms>=100) 
	{
		Cnt_10ms=0;
		//Flag_Second=true;
		Second_Cnt++;
		Snd_Time_Cnt++;
		Do_ADC();
	}
	if(Snd_Time_Cnt>=20) Send_AD_Result();	
	EA=1;
}

void timer0_init(void)
{
  // configure timer 0
   TMOD = 0x01;

  // timer values
   TH0 = TH0_DATA;
   TL0 = TL0_DATA;

   // enable timer 0 interrupt
  ET0 = 1;
  // start timer 0
  TR0 = 1;
} // timers_init

void ADC_init(void)
{
/*
  P1M1 |= 0x5C;    //01011100
  P1M2 &= ~0x80;
  P2M1 |= 0x3C;    //00111100
  P2M2 &= ~0x80; 

  P0M1 |= 0x02;
  P0M2 &= ~0x02;
 */
  ADINS=0xFF;		//1111 1111, 选择 all 8 channel
  ADMODA=0x11;		//0001 0001, 选择转换工作模式:自动扫描,单次转换模式
  //ADMODA=0x44;		//0001 0001, 选择转换工作模式:自动扫描,连续转换模式
  ADMODB=0x00; 		//500Khz < ADC CLK < 3.3Mhz,,
  // disable adc interrupt
  EAD = 0;
}

void delayms(word ms)
{
	byte i;
	while (ms>0) { 
		for (i=0;i<200;i++);
		ms--;
	}
}

void SIO_Out_Hex(byte b)
{
	SBUF='0';
	while (!TI);
	TI=0;
	SBUF='x';
	while (!TI);
	TI=0;
	if ((b>>4)<0x0a)
		SBUF=0x30+(b>>4);
	else
		SBUF=0x37+(b>>4);
	while (!TI);
	TI=0;

	if ((b&0x0f)<0x0a)
		SBUF=0x30+(b&0x0f);
	else
		SBUF=0x37+(b&0x0f);
	while (!TI);
	TI=0;

	SBUF='H';
	while (!TI);
	TI=0;

}

void SIO_Out_Dec(byte b)
{
	byte temp;
	temp=b/10;
	SBUF=0x30+(temp);
	while (!TI);
	TI=0;

	SBUF=0x30+(b-temp*10);
	while (!TI);
	TI=0;
}

void SIO_Out_Str (byte *pstr)
{
	while (*pstr!=0x00)
	{
		SBUF=*pstr;
		while (!TI);
		TI=0;
		pstr++;
	}
}

void Clear_Timer(void)
{
	EA=0;
	Flag_10ms=false;
	Flag_Second=false;
	EA=1;
}

void Do_ADC()		
{			
	byte temp0,temp1,temp2,temp3,temp4,temp5,temp6,temp7;
	temp0=temp1=temp2=temp3=temp4=temp5=temp6=temp7=0x00;
	ADCON0=0x05;			//选择转换触发模式;并立即启动
	temp0=AD0DAT0;
	temp1=AD0DAT1;
	temp2=AD0DAT2;
	temp3=AD0DAT3;
	ADCON0&=0xF7;			//清除中断完成标志

	ADCON1=0x05;			//选择转换触发模式;并立即启动
	temp4=AD1DAT0;
	temp5=AD1DAT1;
	temp6=AD1DAT2;
	temp7=AD1DAT3;
	ADCON1&=0xF7;			//清除中断完成标志

	ADC_BAT0=temp0;	//将AD转换获得的数据存入
	ADC_BAT1=temp1;
	ADC_BAT2=temp2;
	ADC_BAT3=temp3;
	ADC_BAT4=temp4;
	ADC_BAT5=temp5;
	ADC_BAT6=temp6;
	ADC_BAT7=temp7;
}


void SIO_Out_Byte(byte b)
{
	SBUF=b;
	while (!TI);
	TI=0;
}

void delayus(word us)
{
	while (us--);
}

bit Check_Start(void)
{
	if(!ADC_BAT0) return false;
	if(!ADC_BAT1) return false;
	if(!ADC_BAT2) return false;
	if(!ADC_BAT3) return false;
	if(!ADC_BAT4) return false;
	if(!ADC_BAT5) return false;
	if(!ADC_BAT6) return false;
	if(!ADC_BAT7) return false;
	return true;
}

void Do_Start(void)
{
	CON_PIN0=High;
	CON_PIN1=High;
	CON_PIN2=High;
	CON_PIN3=High;
	CON_PIN4=High;
	CON_PIN5=High;
	CON_PIN6=High;
	CON_PIN7=High;
	delayus(30000);
	delayus(30000);
	delayus(30000);
	delayus(30000);
	CON_PIN0=Low;
	CON_PIN1=Low;
	CON_PIN2=Low;
	CON_PIN3=Low;
	CON_PIN4=Low;
	CON_PIN5=Low;
	CON_PIN6=Low;
	CON_PIN7=Low;
	delayus(50000);
	delayus(50000);
	delayus(50000);
	delayus(50000);
	delayus(50000);
	delayus(50000);
	delayus(50000);
}

void	Send_AD_Result(void)
{
	SIO_Out_Byte(ADC_BAT0);
	SIO_Out_Byte(ADC_BAT1);
	SIO_Out_Byte(ADC_BAT2);
	SIO_Out_Byte(ADC_BAT3);
//	SIO_Out_Byte(ADC_BAT4);
	SIO_Out_Byte(ADC_BAT5);
	SIO_Out_Byte(ADC_BAT6);
	SIO_Out_Byte(ADC_BAT7);
	SIO_Out_Byte(0x0D);
	SIO_Out_Byte(0x0A);
	Snd_Time_Cnt=0;
}

⌨️ 快捷键说明

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