//参考程序B: WUART0.C此程序用UART0实现RS-232通信,运行前将TX0和P0.0 短接,
//RXD 和P0.1短接,当接收到一个数据后,再将接收到的数据送出。
#include <c8051f020.h> /*SFR定义*/
#include <intrins.h>
#define BAUDRATE 38400 /*UART0的波特率*/
#define SYSCLK 11059200 /*系统时钟频率*/
sbit BUZ = P3^5; /*P3.5=0,响蜂鸣器*/
void SYSCLK_Init (void); /*时钟系统初始化*/
void PORT_Init (void); /*I/O口初始化*/
void UART0_Init (void); /*串口中断0初始化*/
void send_byte(void);
idata unsigned int x[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
static unsigned int k=0;
static unsigned int n;
static unsigned int m;
//unsigned char temp;
/*延时子程序*/
/*void delay(unsigned int m)
{
unsigned char i,j;
for(i=0;i<1;i++){
for(j=0;j<m;j++)
_nop_();
}
}*/
void main(void)
{
WDTCN = 0xde; /*关看门狗*/
WDTCN = 0xad;
SYSCLK_Init (); /*初始化系统时钟*/
PORT_Init (); /*初始挂交叉开关和I/O口*/
UART0_Init (); /*初始化UART0*/
EA=1;
ES0=1;
while(1){
if(n<=7){
n++;
for (m=0; m < 256; m++) ;
send_byte();
}
}
}
//时钟系统初始化
void SYSCLK_Init (void)
{
int i; /*延时计数器*/
OSCXCN = 0x67; /*打开外部晶体振荡器(11.0592MHZ)*/
for (i=0; i < 256; i++) ; /*延时*/
while (!(OSCXCN & 0x80)) ; /*查询外部晶体是否稳定起振*/
OSCICN = 0x88; /*用外部晶体作为系统时钟,并使能时钟丢失检测*/
}
//I/O口初始化
void PORT_Init (void) /*I/O口初始化*/
{
XBR0 = 0x04; /*使能UART0*/
XBR1 = 0x00;
XBR2 = 0x40; /*使能交叉开关和弱上拉*/
P0MDOUT |= 0x01; /*使能TX0作为推挽输出*/
//P1MDOUT |= 0x00;
//P2MDOUT |= 0x00;
//P3MDOUT |= 0x00;
// P74OUT=0x00;
}
//串口初始化
void UART0_Init (void)
{
SCON0 = 0x50; /*SCON0:模式1,8位UART,时能RX*/
TMOD = 0x20; /*TMOD: 定时器工作再模式2, 8位重载*/
TH1=-(SYSCLK/BAUDRATE/16); /*设置定时1用作波特率的重载值,TH1=B8H*/
TR1 = 1; /*开定时器1*/
CKCON |= 0x10; /*定时器1用系统时钟作为它的时基*/
PCON |= 0x80; /*SMOD00 = 1(波特率加倍)*/
}
/*串口中断0子程序*/
void UART0_ISR (void) interrupt 4
{
//int i;
if(!RI0) //是发送中断还是接收中断
{
TI0 = 0; /*清发送标志位*/
//for (i=0; i < 256; i++) ;
}
}
//串口发送子程序
void send_byte(void){
if(k==8) {
k=0;
}
SBUF0=x[k];
k++;
}
评论0
最新资源