📄 lpc935.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 + -