/*************************************************************************/
/*******************************程序说明**********************************/
//1.UART0采用方式1: 即异步通信,8个数据位,1个起始位和一个停止位。
//2.UART0的时钟源选取Timer1,工作在8位自动重装载方式。
//3.Timer1的时钟源选取外部晶振22.1184MHz.
//4.UART0的波特率为9600.
//5.UART0的TXD,RXD引脚分别为P0.0和P0.1
/*************************************************************************/
#include <c8051f040.h>
#define BAUDRATE 9600
#define TIMER1_OVERFLOW_RATE BAUDRATE * 32
#define EXTERNAL_OSCILLATOR 22118400
#define TIMER1_CLK EXTERNAL_OSCILLATOR / 8
#define TIMER1_RELOAD_VALUE 256 - TIMER1_CLK / TIMER1_OVERFLOW_RATE
sbit LED2=P4^1; // LED1 ='0' means ON
sbit LED3=P4^0;
sbit S2=P4^3; // SW1 ='0' means switch pressed
sbit S3=P4^2;
void IO_Init(void)
{
unsigned char SFRPAGE_SAVE = SFRPAGE;
SFRPAGE = CONFIG_PAGE;
XBR0 = 0x04; //Eable UART0
XBR2 = 0x40; //Eable Crossbar and weak Pull-ups.
P0MDOUT |= 0x01; //Set TX0 pin to push-pull
SFRPAGE = SFRPAGE_SAVE;
}
void Oscillator_Init(void)
{
unsigned char SFRPAGE_SAVE = SFRPAGE;
int i = 0; //i for software delay
SFRPAGE = CONFIG_PAGE;
OSCICN = 0x83; //Set Internal Oscillator frequency 24.5MHz
CLKSEL = 0x00; //Select Internal Oscillator as SYSCLK
OSCXCN = 0x67; //Eable External Oscillator 22.1184MHz
for (i = 0; i < 3000; i++); //Wait 1ms for initialization
while ((OSCXCN & 0x80) == 0);
SFRPAGE = SFRPAGE_SAVE;
}
void Timer_Init(void)
{
unsigned char SFRPAGE_SAVE = SFRPAGE;
SFRPAGE = TIMER01_PAGE;
TMOD = 0x20;
CKCON = 0x03;
TH1 = 247;
TL1 = TH1;
TR1 = 1; //Start Timer1
SFRPAGE = SFRPAGE_SAVE;
}
void UART0_Init(void)
{
unsigned char SFRPAGE_SAVE = SFRPAGE;
SFRPAGE = UART0_PAGE;
SCON0 = 0x50;
TI0 = 1; //Indicate TX0 Ready.
RI0 = 0; //Indicate RX0 Ready.
SFRPAGE = SFRPAGE_SAVE;
}
void UART0_Tx_uchar8(unsigned char i)
{
unsigned char SFRPAGE_SAVE = SFRPAGE;
SFRPAGE = UART0_PAGE;
while( (TI0==0) || (RI0==1) ); //Wait until TX0 and RX0 Ready.
TI0 = 0;
SBUF0 = i;
SFRPAGE = SFRPAGE_SAVE;
}
void UART0_Tx_String(unsigned char *p_string)
{
while(*p_string)
{
UART0_Tx_uchar8(*p_string);
p_string++;
}
}
void main(void)
{
bit key2_down_flag=0;
bit key3_down_flag=0;
SFRPAGE = CONFIG_PAGE;
WDTCN = 0xde; //Disable watchdog timer
WDTCN = 0xad;
IO_Init();
Oscillator_Init();
Timer_Init();
UART0_Init();
while (1)
{
if (S2 == 0)
{
if (key2_down_flag==0)
{
UART0_Tx_uchar8('a');
UART0_Tx_uchar8('b');
UART0_Tx_uchar8('c');
key2_down_flag = 1;
LED2=0;
}
}
else
{
key2_down_flag = 0;
LED2=1;
}
if (S3 == 0)
{
if (key3_down_flag==0)
{
UART0_Tx_String("Hello World!\n\r");
key3_down_flag = 1;
LED3=0;
}
}
else
{
key3_down_flag = 0;
LED3=1;
}
}
}