Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1927078
  • 博文数量: 187
  • 博客积分: 1457
  • 博客等级: 上尉
  • 技术积分: 2422
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-13 09:41
个人简介

如需要绘制PCB,设计电路可以和我联系。sunhenu@163.com.

文章分类

全部博文(187)

文章存档

2017年(2)

2016年(2)

2015年(7)

2014年(13)

2013年(80)

2012年(83)

分类: LINUX

2012-06-29 11:43:36

先看程序。

点击(此处)折叠或打开

  1. #include <C8051F020.h>    

  2. typedef unsigned char uchar;
  3. typedef unsigned int uint;

  4. xdata uchar Transmit_Data[6]={0x31,0x32,0x33,0x34,0x35,0x36};
  5. xdata uchar Receive_Data[6];    

  6. void SYSCLK_CMOS_Init (void)
  7. {
  8.     OSCXCN = 0x20; // start external oscillator in
  9.     OSCICN = 0x88; // select external oscillator as SYSCLK
  10. }
  11. void Uart0_Init()
  12. {
  13.     SADEN0 = 0x00;     
  14.     SADDR0 = 0x00;     
  15.      PCON |= 0x80;     
  16.     SCON0 = 0x50;
  17.     SCON0 &= 0xFC;     
  18.     IE |= 0x10;
  19.     
  20. }
  21. void Timer1_Init()
  22. {
  23.     CKCON = 0x10; // T1采用系统时钟,不分频
  24.     TMOD = 0x20; // T1为8bit自动重载模式
  25.     TCON = 0x40; // TR1置1,启动定时器
  26. }

  27. void F021_Config (void)
  28. {
  29.       
  30.     WDTCN = 0xDE; //看门狗禁止
  31.     WDTCN = 0xAD;
  32.     
  33.         SYSCLK_CMOS_Init();
  34.     
  35.     XBR0 = 0x04;    // 将UART0 TX0配置到P0.0口,RX0配置到P0.1口
  36.     XBR1 = 0x00;    //
  37.     XBR2 = 0x40;    // Crossbar 交叉开关配置使能

  38.     P0MDOUT = 0x00; // TX0和RX0为开漏模式,故宜加上拉电阻
  39.     P1MDIN = 0xFF; // Input configuration for P1
  40. }
  41. void Timer1_BoundRate (uchar temp)
  42. {
  43.         TH1=temp;
  44.         TL1=TH1;    
  45. }
  46. void main()
  47. {
  48.     
  49.     F021_Config();
  50.     Uart0_Init();
  51.     Timer1_BoundRate(100);
  52.     Timer1_Init();    
  53.     EA=1;
  54.     while(1)
  55.     {
  56.     
  57.     }
  58. }
  59. void uart0_ISR() interrupt 4
  60. {
  61.     if(SCON0&0x01)
  62.         {
  63.             SCON0&=0xfe;
  64.             Receive_Data[1]=SBUF0;//将接收数据保存到res
  65.             Transmit_Data[1]=Receive_Data[1];
  66.             SBUF0=Transmit_Data[1];
  67.             
  68.      }
  69.     if(SCON0&0x02)
  70.         {        
  71.             SCON0&=0xfd;
  72.         }
  73. }
程序很简单,本来这个芯片也是支持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;    // T18bit自动重载模式

TCON = 0x40;    // TR11,启动定时器

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

 


阅读(4667) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~