当前位置:文档之家› STC单片机串口1、2代码

STC单片机串口1、2代码

#include "STC12C5A60S2.h"
#include "IO_Configure.h"
#include "intrins.h"

#include "MACRO_DEFINITION.h"
#include "VARIABLE.h"

//#include "AT24CXX.h"
#include "STC_ADC_MODULE.h"

//#include "CRC16.h"

/*******************************************************************
主函数
函数原型: void Main(void);

功 能:
********************************************************************/
void main(void)
{
uint adc_data[3];

P1M1 = 0x70;
P1M0 = 0x00;

TMOD = 0x21; //定时器1工作方式2,定时器0工作方式1 TCON 88H name: GATE C/T M1 M0 GATE C/T M1 M0 (高4位定时器1,低4位定时器0)
// 0 0 1 0 0 0 0 1 = 0x21
TH0 = 0xdc; //定时器0产生10ms定时中断
TL0 = 0x00;
ET0 = 1; //允许T0中断

TH1 = 0xfa; //波特率9600
TL1 = 0xfa;
PCON = 0x80; //SMOD = 1,波特率加倍 PCON 87H name: SMOD SMOD0 LVDF POF GF1 GF0 PD IDL
// 1 0 0 0 0 0 0 0 = 0x80
SCON = 0x50; //串口1工作方式3(9位UART),允许接收 S2CON 9AH name: SM0/FE SM1 SM2 REN TB8 RB8 TI RI
// 1 1 1 1 0 0 0 0 = 0xf0
ES = 1; //串口1中断允许

BRT = 0xfa; //独立波特率发生器重装时间常数 波特率9600
S2CON = 0x50; //串口2工作方式1(8位UART),允许接收 S2CON 9AH name: S2SM0 S2SM1 S2SM2 S2REN S2TB8 S2RB8 S2TI S2RI
// 0 1 0 1 0 0 0 0 = 0x50
AUXR = 0x18;
IE2 = 0x01;

TR0 = 1; //启动定时器0
TR1 = 1; //启动定时器1

EA = 1;

ADM2483_RD1 = 0;
ADM2483_RD2 = 0;

//ANGEL_VOLTAGE_1 = 0;
//ANGEL_VOLTAGE_2 = 0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
P2 = 0x00;

STC_ADC_Init();

/*if(AT24CXX_Random_Read(0xa0,0x00) != 0x68)
{
AT24CXX_Byte_Write(0xa0,0x00,0x68);
write_e2_time = 0;
finish_write_e2 = 0;
start_write_e2 = 1;
while(!finish_write_e2);


AT24CXX_Page_Write(0xa0,0x10,Test_Write_Data,16);
write_e2_time = 0;
finish_write_e2 = 0;
start_write_e2 = 1;
while(!finish_write_e2);
}*/

while(1)
{
if(send_1_byte)
{
send_1_byte = 0;

//s1_send_data[0] = AT24CXX_Random_Read(0xa0,0x00);
s1_send_number = 1;
s1_current_send_number = 0;

TI = 1;
}
else if(send_16_byte)
{
send_16_byte = 0;

//AT24CXX_Sequential_Read(0xa0,0x20,s1_send_data,16);
s1_send_number = 16;
s1_current_send_number = 0;

TI = 1;
}
else if(send_byte)
{
send_byte = 0;

//s1_send_data[0] = AT24CXX_Current_Address_Read(0xa0);
s1_send_number = 1;
s1_current_send_number = 0;

TI = 1;
}
el

se if(send_adc_data)
{
send_adc_data = 0;

adc_data[0] = Get_STC_ADC_Result(4);
adc_data[1] = Get_STC_ADC_Result(5);
adc_data[2] = Get_STC_ADC_Result(6);

s1_send_data[0] = adc_data[0] /256;
s1_send_data[1] = adc_data[0] %256;
s1_send_data[2] = adc_data[1] /256;
s1_send_data[3] = adc_data[1] %256;
s1_send_data[4] = adc_data[2] /256;
s1_send_data[5] = adc_data[2] %256;
s1_send_number = 6;
s1_current_send_number = 0;

TI = 1;
}
else if(s2_send_1_byte)
{
s2_send_1_byte = 0;

ADM2483_RD1 = 1;

s2_send_data[0] = 1;
s2_send_data[1] = 9;
s2_send_number = 2;
s2_current_send_number = 0;

S2CON = S2CON | 0x02;
}

}
}


/*******************************************************************
定时器0中断子程序
函数原型: void Timer0_Routine(void) interrupt 1;

功 能:
********************************************************************/
void Timer0_Routine(void) interrupt 1
{
TH0 = 0xdc; //重置计数初值
TL0 = 0x00;

watch_dog_interval++; //喂狗间隔变量加1
if(watch_dog_interval >=WATCH_DOG_INTERVAL) //喂狗间隔变量大于喂狗间隔,则喂狗
{
watch_dog_interval = 0;
ST = ~ST;
}

if(start_write_e2)
{
write_e2_time ++;
if(write_e2_time >=2)
{
write_e2_time = 0;
start_write_e2 = 0;
finish_write_e2 = 1;
}
}
}


/*******************************************************************
串口1中断子程序
函数原型: void Uart1_Routine(void) interrupt 4;

功 能:
********************************************************************/
void Uart1_Routine(void) interrupt 4
{
ES = 0; //关串口1中断

if(RI)
{
RI = 0;

switch(s1_receive_number) //判断接收数据个数
{
case 0: {
if(SBUF == 0x01)
{
send_1_byte = 1;
}
else if(SBUF == 0x02)
{
send_16_byte = 1;
}
else if(SBUF == 0x03)
{
send_byte = 1;
}
else if(SBUF == 0x04)
{
send_adc_data = 1;
}
break;
}
}
}
else if(TI) //若为发送中断
{
TI = 0; //清发送标志位

if(s1_current_send_number {
SBUF = s1_send_data[s1_current_send_number]; //发送缓存数据
s1_current_send_number ++;
}
else
{
ADM2483_RD1 = 0;
}
}

ES = 1;
}


/*******************************************************************
串口2中断子程序
函数原型: void Uart2_Routine(void) interrupt 8;

功 能:
*******************************

*************************************/
void Uart2_Routine(void) interrupt 8
{
IE2 = 0x00; //关串口2中断

if(S2CON & 0x01) //若为接收中断
{
S2CON = S2CON & 0xfe; //清接收标志位

switch(s2_receive_number) //判断接收数据个数
{
case 0: {
if(S2BUF == 0x01)
{
s2_send_1_byte = 1;
}
break;
}
}
}
else if(S2CON & 0x02) //若为发送中断
{
S2CON = S2CON & 0xfd; //清发送标志位

if(s2_current_send_number {
S2BUF = s2_send_data[s2_current_send_number]; //发送缓存数据
s2_current_send_number ++;
}
else
{
ADM2483_RD1 = 0;
}
}

IE2 = 0x01; //开串口2中断
}





















































相关主题
文本预览
相关文档 最新文档