原创 C8051F021的UART0调试

2013-1-21 11:57 1260 8 8 分类: MCU/ 嵌入式 文集: MCU

 

先看程序。
 

点击(此处)折叠或打开

  1. #include <C8051F020.h>    
  2.  
  3. typedef unsigned char uchar;
  4. typedef unsigned int uint;
  5.  
  6. xdata uchar Transmit_Data[6]={0x31,0x32,0x33,0x34,0x35,0x36};
  7. xdata uchar Receive_Data[6];     
  8.  
  9. void SYSCLK_CMOS_Init (void)
  10. {
  11.     OSCXCN = 0x20; // start external oscillator in
  12.     OSCICN = 0x88; // select external oscillator as SYSCLK
  13. }
  14. void Uart0_Init()
  15.     SADEN0 = 0x00;     
  16.     SADDR0 = 0x00;     
  17.      PCON |= 0x80;     
  18.     SCON0 = 0x50; 
  19.     SCON0 &= 0xFC;     
  20.     IE |= 0x10;
  21.     
  22. }
  23. void Timer1_Init()
  24. {
  25.     CKCON = 0x10; // T1采用系统时钟,不分频
  26.     TMOD = 0x20; // T1为8bit自动重载模式
  27.     TCON = 0x40; // TR1置1,启动定时器
  28. }
  29.  
  30. void F021_Config (void) 
  31. {
  32.       
  33.     WDTCN = 0xDE; //看门狗禁止
  34.     WDTCN = 0xAD;
  35.     
  36.         SYSCLK_CMOS_Init();
  37.     
  38.     XBR0 = 0x04;    // 将UART0 TX0配置到P0.0口,RX0配置到P0.1口
  39.     XBR1 = 0x00;    // 
  40.     XBR2 = 0x40;    // Crossbar 交叉开关配置使能
  41.  
  42.     P0MDOUT = 0x00; // TX0和RX0为开漏模式,故宜加上拉电阻
  43.     P1MDIN = 0xFF; // Input configuration for P1
  44. }
  45. void Timer1_BoundRate (uchar temp)
  46. {
  47.         TH1=temp;
  48.         TL1=TH1;    
  49. }
  50. void main()
  51. {
  52.     
  53.     F021_Config();
  54.     Uart0_Init();
  55.     Timer1_BoundRate(100);
  56.     Timer1_Init();    
  57.     EA=1;
  58.     while(1)
  59.     {
  60.     
  61.     }
  62. }
  63. void uart0_ISR() interrupt 4
  64. {
  65.     if(SCON0&0x01)
  66.         {
  67.             SCON0&=0xfe;
  68.             Receive_Data[1]=SBUF0;//将接收数据保存到res
  69.             Transmit_Data[1]=Receive_Data[1];
  70.             SBUF0=Transmit_Data[1];
  71.             
  72.      }
  73.     if(SCON0&0x02)
  74.         {        
  75.             SCON0&=0xfd;
  76.         }
  77. }
程序很简单,本来这个芯片也是支持51指令集,我不过多解释,我下面用一些图片说明一下,我相信诸位都懂的。我用的是外部有源晶振,24MHZ,这里要设置为24MHZ.
24343357_1340941791Mgbb.jpg
下面是调试界面,波特率9600,
24343357_134094188713M1.jpg
在上图中,可看到仿真界面显示波特率是9614,我实际设置的是9600,这就是因为时钟频率带来的波特率误差,不用担心,这是正常的,串口是异步方式的,而且每个电平都有一段时间的,所以实际测试下来的误差会远远小于理论上的。这里的波特率误差是9600-9614/9600=0.1458%,这个也是理论误差,要想得到实际的误差你就要用示波器观察波形,然后抓波形,计算了。
实践表明,当波特率的相对误差小于4.5%时,不会影响数据的正确接收,一般要保证传输的可靠性,要求误差不大于2.5%。这是网友的话,可以参考一下,我没有实际测试的。
接下来是程序里面的一些解释,
看看看门狗,

WDTCN = 0xDE;   //看门狗禁止

WDTCN = 0xAD;

24343357_1340941955ZddA.jpg
XBR0 = 0x04;       // 将UART0 TX0配置到P0.0口,RX0配置到P0.1

XBR1 = 0x00;       //

XBR2 = 0x40;       // Crossbar 交叉开关配置使能

XBR3 = 0x00;    //

24343357_13409420266Gpg.jpg

24343357_1340942051HjxL.jpg

 

UART0 SLAVE 地址设置

24343357_1340942086SGkg.jpg

SMOD0的设置

 

24343357_1340942115Evis.jpg

 

SCON0 = 0x50;   //工作在模式1,为8bit可变波特率通讯

 

24343357_1340942156a9O5.jpg

IE|=0x10;使能UART0中断。

24343357_13409422067S4U.jpg

CKCON = 0x10;   // T1采用系统时钟,不分频

TMOD = 0x20;    // T1为8bit自动重载模式

TCON = 0x40;    // TR1置1,启动定时器

24343357_1340942244zAUf.jpg

其实这里有很多配置都和51类似,算是复习51,我也懒得多说,主要的区别在于F021有个端口配置功能,你可以按照一定顺序将UART,DAC,ADC,IIC,SPI,等等的接口分配给P0-P3口,这点和51大大的不同。呵呵,这个怎么分配,主要通过XBR寄存器,诸位就自己去看吧。不难的。好了就这样吧。

 

文章评论0条评论)

登录后参与讨论
我要评论
0
8
关闭 站长推荐上一条 /3 下一条