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

📄 lpc935.c

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

#define TH0_DATA      0xFE				// On Chip Oscillator (7.3728MHz ± 2.51001us
#define TL0_DATA      0x8F 


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

#define On		1
#define Off		0

// values passed to the comparator functions
#define COMP_1             0      // comparator 1
#define COMP_2             1      // comparator 2
#define COMP_INPUTA        0x00   // comparator input CINnA
#define COMP_INPUTB        0x10   // comparator input CINnB
#define COMP_INPUTREF      0x00   // reference voltage input CMPREF
#define COMP_INTERNALREF   0x08   // internal reference voltage Vref
#define COMP_OUTPUTDISABLE 0x00   // disable comparator output pin
#define COMP_OUTPUTENABLE  0x04   // enable comparator output pin


//*************************************
//定义通讯协议
#define RELAX_COMMAND 	0xA0
#define LED_COMMAND 	0xA1
#define PWM_COMMAND 	0xA2
#define ADSMPL_COMMAND 	0xA3
#define SOFT_RESET		0xA5
#define GET_COUNT		0xA6

//******** Time constant **************
#define _100us		1
#define _MS			10
#define _10MS   	100
#define _20MS           200
#define _30MS           300
#define _50MS       	500
#define _100MS          1000
#define _200MS		2000
#define _250MS      	2500
#define _300MS          3000
#define _500MS		5000
#define _800MS		8000
#define _1S		10000
#define _2S		20000
#define _3S		30000
#define _4S		40000
#define _5S		50000
#define _6S		60000
#define _7S     70000
#define _8S		80000
#define _10S            100000
#define _20S            200000
#define _900S           900000 

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


typedef struct COMMAND_D{
	byte Command;
	word Param1;
	word Param2;
}MyCommand;


//******************************************
//引脚定义
sbit RELAX1=P2^1;
sbit RELAX2=P2^2;
sbit RELAX3=P2^3;
sbit RELAX4=P2^4;
sbit LED7=P2^5;
sbit LED8=P2^6;
sbit LED9=P2^7;
sbit PDA=P0^4;
sbit test_pin=P1^6;

//******************************************
//变量定义
bit Flag_100us=false;
bit Flag_10ms=false;
bit Flag_COM_Rec=false;
bit Flag_Second=false;
bit Flag_AD=false;
bit Flag_GetCounter=false;
bit Send_Counter=true;
//byte State=State_Start;
//byte COM_Rec_Buf[5];
byte data Rec_Idx=0;
word data RecWord=0;
word data RecTmp=0;
word data Temp_Word=0;
word data Send_Ms_Cnt=20000;
byte data Temp_Byte;
word data Cnt_100us=0;
word data Cnt_MS=0;
word data Snd_Time_Cnt=0;   //MS

byte data Temp=0;
byte data Temp_TH=0;
/*
byte data ADC_Time=0;
byte data ADC_BAT0=0;
byte data ADC_BAT1=0;
byte data ADC_BAT2=0;
byte data ADC_BAT3=0;
*/
byte data AD_Channel=0;

byte data Minute_Cnt=0;
byte data Second_Cnt=0;
byte data AD_Load=0;
byte data AD_Battery=0;
byte data AD_Current=0;

MyCommand  xdata CMD;
MyCommand  xdata tempCMD;
//******************************************
//函数定义
void 	Init_IO();
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	Counter_init();
void	Counter_int();
void 	Counter_start(void);
void 	Counter_stop(void);
void 	ADC_init();
void 	delayms(word ms);
void 	SIO_Out_Str(byte *pstr);
void 	SIO_Out_Hex(byte b);
void 	Do_ADConvert();
void 	delayus(word us);
void 	SIO_Out_Byte(byte b);
byte	Check_Start(byte channel);
void	Do_Start(byte channel);
void	Send_AD_Result(void);
void	Get_Count();
void comparators_init();
void comparators_disable
  (
  bit compnum                     // comparator number:     COMP_1 or COMP_2
  );
bit comparators_getoutput
  (
  bit compnum                     // comparator number:     COMP_1 or COMP_2
  );
void comparators_selectposinput
  (
  bit compnum,                    // comparator number:     COMP_1 or COMP_2
  unsigned char posinput          // positive input A or B: COMP_INPUTA or COMP_INPUTB
  );

void main()
{
	
//	byte Temp_Byte;
	EA=0;
	Init_IO();
	timer0_init();
	Clear_Timer();
	UART_init();
	ADC_init();
	CMD.Command=0x00;
	CMD.Param1=0x0000;
	CMD.Param2=0x0000;
	EA=1;
	/*while(1) //For Test
	{
		RELAX1=High;
		RELAX2=High;
		RELAX3=High;
		RELAX4=High;
		LED7=On;
		LED8=On;
		LED9=On;
		delayms(2000);
		RELAX1=Low;
		RELAX2=Low;
		RELAX3=Low;
		RELAX4=Low;
		LED7=Off;
		LED8=Off;
		LED9=Off;
		delayms(2000);
	}
	*/
	
//	SIO_Out_Str("Welcom to Battery test world!\r\n");

    /*while (1)
    {
		SBUF=0xAA;
		while(!TI);
		TI=0;
    }*/

				Second_Cnt=0;
				RELAX1=High;
				RELAX2=High;
				RELAX3=High;
				RELAX4=High;
				LED7=On;
				LED8=On;
				LED9=On;
				while(Second_Cnt<1);
				Second_Cnt=0;
				RELAX1=Low;
				RELAX2=Low;
				RELAX3=Low;
				RELAX4=Low;
				LED7=Off;
				LED8=Off;
				LED9=Off;
				
   	while (1)
 	{ 
			/*if(Flag_COM_Rec)// FOR TEST
			{
				Second_Cnt=0;
				Flag_COM_Rec=false;
				LED7=Off; 
				SIO_Out_Byte(CMD.Command);
				SIO_Out_Byte((byte)(CMD.Param1>>8));
				SIO_Out_Byte((byte)CMD.Param1);
				SIO_Out_Byte((byte)(CMD.Param2>>8));
				SIO_Out_Byte((byte)CMD.Param2);
				
			}*/
			//Do_ADConvert();
			if(Snd_Time_Cnt>=Send_Ms_Cnt&&Flag_AD)
			{
				Send_AD_Result();
				/*SIO_Out_Byte((byte)(Send_Ms_Cnt>>8));
				SIO_Out_Byte((byte)Send_Ms_Cnt);
				SIO_Out_Byte((byte)(CMD.Param2>>8));
				SIO_Out_Byte(0x0D);
				SIO_Out_Byte(0x0A);*/
				Snd_Time_Cnt=0;
			}
			if(Flag_GetCounter) 
			{
				Flag_GetCounter=false;
				Get_Count();
			}

			if (Flag_COM_Rec)
			{
				Flag_COM_Rec=false;
				switch(CMD.Command)
				{
					case RELAX_COMMAND:
					
					if(CMD.Param2==1)
					{
						switch(CMD.Param1)
						{
							case 1:
								RELAX1=High;
							break;
							case 2:
								RELAX2=High;
							break;
							case 3:
								RELAX3=High;
							break;
							case 4:
								RELAX4=High;
							break;
						}
					}
					else
					{
						switch(CMD.Param1)
						{
							case 1:
								RELAX1=Low;
							break;
							case 2:
								RELAX2=Low;
							break;
							case 3:
								RELAX3=Low;
							break;
							case 4:
								RELAX4=Low;
							break;
						}
					}
				break;
				case LED_COMMAND:
					
					if(CMD.Param2==1)
					{
						switch(CMD.Param1)
						{
							case 5:
								LED7=On;
							break;
							case 6:
								LED8=On;
							break;
							case 7:
								LED9=On;
							break;
						}
					}
					else
					{
						switch(CMD.Param1)
						{
							case 5:
								LED7=Off;
							break;
							case 6:
								LED8=Off;
							break;
							case 7:
								LED9=Off;
							break;
						}
					}
				break;
				case PWM_COMMAND:
					//LED7=Off;LED8=Off;LED9=On;
				break;
				case ADSMPL_COMMAND:
					AD_Channel=CMD.Param1;
					Send_Ms_Cnt=CMD.Param2;
					Flag_AD=true;	
				break;
				case SOFT_RESET:
					if(CMD.Param1==0x00A5&&CMD.Param2==0x00A5)
						AUXR1|=0x08;
				break;
				case GET_COUNT:
					if(CMD.Param2==1)Flag_GetCounter=true;
					else if(CMD.Param2==0) Flag_GetCounter=false;
				break;
				default:
				/*	Second_Cnt=0;
					RELAX1=High;
					RELAX2=High;
					RELAX3=High;
					RELAX4=High;
					LED7=On;
					LED8=On;
					LED9=On;
					while(Second_Cnt<1);
					Second_Cnt=0;
					RELAX1=Low;
					RELAX2=Low;
					RELAX3=Low;
					RELAX4=Low;
					LED7=Off;
					LED8=Off;
					LED9=Off;
					while(Second_Cnt<1);/**/
				break;		
			}
		}
		//}
	}
}	// end main()


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



void Init_IO(void)
{

	P2M1=0x00;
	P2M2=0x00;
	P3M1=0x00;
	P3M2=0x00;
	P1M1=0x80;
	P1M2=0x00;
	//P0M1=0x1F;
	P0M1=0x00;
	P0M2=0x00;
//	AUXR1&=~0x08;// Disable the software reset
//	AUXR1|=1;
	DIVM=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;

    ESR=1; 		//ESR=Enable Serial Recieve
}

void Rcv_ISR() interrupt 4
{ 
	byte temp;
	EA=0;
	//LED7=On;
	if(RI)
	{
		RI=0;
		temp=SBUF;
		//SIO_Out_Byte(temp);LED7=Off;
		switch(Rec_Idx)
		{
			case 0:
				if(temp<0xA0||temp>0xA6)
				{
					Rec_Idx=0;return;
				}
				tempCMD.Command=temp;
				//SIO_Out_Byte(temp);
				Rec_Idx++;
			break;
			case 1:
				tempCMD.Param1=temp;
				tempCMD.Param1<<=8;
				//SIO_Out_Byte(temp);
				Rec_Idx++;
			break;
			case 2:
				tempCMD.Param1+=temp;
				//SIO_Out_Byte(temp);
				Rec_Idx++;
			break;
			case 3:
				tempCMD.Param2=temp;
				tempCMD.Param2<<=8;
				//SIO_Out_Byte(temp);
				Rec_Idx++;
			break;
			case 4:
				tempCMD.Param2+=temp;
				CMD.Command=tempCMD.Command;
				CMD.Param1=tempCMD.Param1;
				CMD.Param2=tempCMD.Param2;
				//SIO_Out_Byte(temp);
				Flag_COM_Rec=true;Rec_Idx=0;

⌨️ 快捷键说明

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