📄 lpc935.c
字号:
#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 + -