先看程序。
-
#include <C8051F020.h>
-
-
typedef unsigned char uchar;
-
typedef unsigned int uint;
-
-
xdata uchar Transmit_Data[6]={0x31,0x32,0x33,0x34,0x35,0x36};
-
xdata uchar Receive_Data[6];
-
-
void SYSCLK_CMOS_Init (void)
-
{
-
OSCXCN = 0x20; // start external oscillator in
-
OSCICN = 0x88; // select external oscillator as SYSCLK
-
}
-
void Uart0_Init()
-
{
-
SADEN0 = 0x00;
-
SADDR0 = 0x00;
-
PCON |= 0x80;
-
SCON0 = 0x50;
-
SCON0 &= 0xFC;
-
IE |= 0x10;
-
-
}
-
void Timer1_Init()
-
{
-
CKCON = 0x10; // T1采用系统时钟,不分频
-
TMOD = 0x20; // T1为8bit自动重载模式
-
TCON = 0x40; // TR1置1,启动定时器
-
}
-
-
void F021_Config (void)
-
{
-
-
WDTCN = 0xDE; //看门狗禁止
-
WDTCN = 0xAD;
-
-
SYSCLK_CMOS_Init();
-
-
XBR0 = 0x04; // 将UART0 TX0配置到P0.0口,RX0配置到P0.1口
-
XBR1 = 0x00; //
-
XBR2 = 0x40; // Crossbar 交叉开关配置使能
-
-
P0MDOUT = 0x00; // TX0和RX0为开漏模式,故宜加上拉电阻
-
P1MDIN = 0xFF; // Input configuration for P1
-
}
-
void Timer1_BoundRate (uchar temp)
-
{
-
TH1=temp;
-
TL1=TH1;
-
}
-
void main()
-
{
-
-
F021_Config();
-
Uart0_Init();
-
Timer1_BoundRate(100);
-
Timer1_Init();
-
EA=1;
-
while(1)
-
{
-
-
}
-
}
-
void uart0_ISR() interrupt 4
-
{
-
if(SCON0&0x01)
-
{
-
SCON0&=0xfe;
-
Receive_Data[1]=SBUF0;//将接收数据保存到res
-
Transmit_Data[1]=Receive_Data[1];
-
SBUF0=Transmit_Data[1];
-
-
}
-
if(SCON0&0x02)
-
{
-
SCON0&=0xfd;
-
}
-
}
程序很简单,本来这个芯片也是支持51指令集,我不过多解释,我下面用一些图片说明一下,我相信诸位都懂的。我用的是外部有源晶振,24MHZ,这里要设置为24MHZ.
下面是调试界面,波特率9600,
在上图中,可看到仿真界面显示波特率是9614,我实际设置的是9600,这就是因为时钟频率带来的波特率误差,不用担心,这是正常的,串口是异步方式的,而且每个电平都有一段时间的,所以实际测试下来的误差会远远小于理论上的。这里的波特率误差是9600-9614/9600=0.1458%,这个也是理论误差,要想得到实际的误差你就要用示波器观察波形,然后抓波形,计算了。
实践表明,当波特率的相对误差小于4.5%时,不会影响数据的正确接收,一般要保证传输的可靠性,要求误差不大于2.5%。这是网友的话,可以参考一下,我没有实际测试的。
接下来是程序里面的一些解释,
看看看门狗,
WDTCN = 0xDE; //看门狗禁止
WDTCN = 0xAD;
XBR0 = 0x04; // 将UART0 TX0配置到P0.0口,RX0配置到P0.1口
XBR1 = 0x00; //
XBR2 = 0x40; // Crossbar 交叉开关配置使能
XBR3 = 0x00; //
UART0 SLAVE 地址设置
SMOD0的设置
SCON0 = 0x50; //工作在模式1,为8bit可变波特率通讯
IE|=0x10;使能UART0中断。
CKCON = 0x10; // T1采用系统时钟,不分频
TMOD = 0x20; // T1为8bit自动重载模式
TCON = 0x40; // TR1置1,启动定时器
其实这里有很多配置都和51类似,算是复习51,我也懒得多说,主要的区别在于F021有个端口配置功能,你可以按照一定顺序将UART,DAC,ADC,IIC,SPI,等等的接口分配给P0-P3口,这点和51大大的不同。呵呵,这个怎么分配,主要通过XBR寄存器,诸位就自己去看吧。不难的。好了就这样吧。
文章评论(0条评论)
登录后参与讨论