先看程序。
- #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寄存器,诸位就自己去看吧。不难的。好了就这样吧。
阅读(5834) | 评论(0) | 转发(0) |