/*------------------------
STC12C5A08S2
del AD10部分
22.1184M
----------------------------*/
#include "stc12c5a60s2.h"
//#include "EEPROM.h"
unsigned char dat;
#define uchar unsigned char
#define uint unsigned int
#define ERROR 0
#define OK 1
#define SKIP 2 //跳过
int Key=4800;
void Delay(unsigned int i)
{
unsigned int k;
for(;i>0;i--)
for(k=0;k<100;k++);
}
void Time0_init(void)
{
// AUXR=0x91; //定时器0都为1T模式,定时器1为12T
// AUXR=0x80; //定时器0都为1T模式,定时器1为12T ,使用定时器1为串口0的波特率发生器
AUXR=0xC0; //定时器0都为1T模式,定时器1为1T ,使用定时器1为串口0的波特率发生器
TMOD=0x21; //定时器0为16位模式,定时器1为8位模式
TL0=0xE5; //D7
TH0=0xFD; //如果工作在1T模式,设置为25us 22.1184M 22.1184*25约=553 为30us左右 25us为463
TR0=1;
ET0=1;
// EA=1;
}
/*
串口1和串口2如果要不同的波特率,需要将串口1用定时器1来做,
串口2固定只能用BRT来设置。
*/
void serial_port_init(unsigned int baudrate)
{
//--------以下是UART1----//
SCON = 0x50; //0101,0000 8位可变波特率,无奇偶校验位,允许接收
TMOD=0x21; //定时器0为16位模式,定时器1为8位模式
// TH1 = 0xF4; //设置定时器1自动重装数,波特率设置为4800 22.1184 12T
// TL1 = 0xF4; //TH1=TL1=256-(FOSC/32/BAUD/12)
if(baudrate==4800)
{
TH1 = 0x70; //设置定时器1自动重装数,波特率设置为4800 22.1184 1T
TL1 = 0x70;//TH1=TL1=256-(FOSC/32/BAUD)
}
if(baudrate==38400)
{
TH1 =0xEE;
TL1 =0xEE;
}
TR1 = 1; //开定时器1
//-----以下是UART2----//
// S2CON = 0x40; //0101,0000 8位可变波特率,无奇偶校验位,不允许接收
// BRT = 0xFA; //波特率也是4800 11.0592M
// BRT = 0xee; //波特率也是4800 22.1184M
// BRTR = 1, S1BRS = 0, EXTRAM = 1 ENABLE EXTRAM
// AUXR = 0xD4; // T0x12,T1x12,UART_M0x6,BRTR,S2SMOD,BRTx12,EXTRAM,S1BRS
// 定时器0和定时器1都为1T模式
ES = 0; //允许串口中断 ,允许串口2中断 先禁能
// IE2 = 0x01; //允许串口2中断,ES2=1
// EA = 1; //开总中断
}
void Button()
{
if(Key==4800)
{
Key=38400;
serial_port_init(Key);
}
else
{
Key=4800;
serial_port_init(Key);
}
}
int main(void)
{
unsigned char kk=0,ii=0,
CLK_DIV=0x00; //设置系统时钟为外部时钟
Delay(500);
WDT_CONTR=0x3D;//看门狗,64分频
Time0_init();
serial_port_init(4800);
EA = 1; //开总中断
while(1)
{
WDT_CONTR=0x3D;//喂狗
Button();
if(RI)
{
RI=0;
dat=SBUF;
SBUF=dat;
}
}
return 0;
} |