免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1042 | 回复: 0
打印 上一主题 下一主题

AT89C52简单的串口操作 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-23 01:27 |只看该作者 |倒序浏览
发送程序:
  1. #include<REG52.h>
  2. #include<intrins.h>

  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. void Delay(uint del)
  6. {
  7.     uint i,j;
  8.     for(i=0; i<del; i++)
  9.     for(j=0; j<1827; j++)
  10.     ;
  11. }
  12. void Com_Init(void)
  13. {
  14.      TMOD = 0x20;//方式2,8位自动填充
  15.      PCON = 1<<7;//设置smod为1
  16.      SCON = 0x40;//SM0,SM1,SM2,REN,TB8,RB8,TI,RI设置为0x40,不允许读,串口工作方式1,波特率可变为2smod*fosc/[32*12*(256-x)]
  17.      TH1 = 0xfd;
  18.      TL1 = 0xfd;//19200 自填充
  19.      TR1 = 1;//启动定时器    
  20. }
  21. void Main()
  22. {
  23.     uchar i = 0;
  24.     uchar code Buffer[] = "Welcome To The MCU World. http://dlmcu.taobao.com QQ:85536436 ";     //所要发送的数据
  25.     uchar *p;
  26.     Com_Init();    
  27.     while(1)
  28.     {
  29.         p = Buffer;
  30.         while(1)
  31.         {    
  32.             SBUF = *p;
  33.             while(!TI) //如果发送完毕,硬件会置位TI
  34.             {
  35.                 _nop_();    
  36.             }
  37.             p++;
  38.             if(*p == '\0')
  39.             {
  40.                 Delay(200);                //延时2秒钟再进行下次发送
  41.                 TI = 0;
  42.                 break;                    //在每个字符串的最后,会有一个'\0'
  43.             }
  44.             TI = 0;         //TI清零
  45.         }            
  46.     }
  47. }
  48. 说明:
  49. 串口的初始化中,需要设置TIME1,这个定时器的的溢出率在波特率中有用,其中PCON电源控制器最高位SMOD与波特率有关系,然后就是设置TIME1的初始值,开启定时器。
  50. 当发送1个数值后,就是8位,即1个字符,先赋值给SBUF,由SBUF将并行的数据换成串行的数据在P3.1中根据01的不同会出现不同的电压即完成物理层的传输,另外一方即可根据电压判断不同的01,然后形成8位的并行数据。
接受程序:
  1. #include<REG52.h>
  2. #include<intrins.h>

  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  6. uchar LED_Buffer[8] = {0}; //从串口接收的数据
  7. void Delay_1ms(uint i)//1ms延时
  8. {
  9.     uchar x,j;
  10.     for(j=0;j<i;j++)
  11.     for(x=0;x<=148;x++);    
  12. }
  13. void Com_Int(void) interrupt 4
  14. {
  15.     static uchar i = 0;         //定义为静态变量,当重新进入这个子函数时 i 的值不会发生改变
  16.     if(RI == 1)                     //当硬件接收到一个数据时,RI会置位
  17.     {
  18.         LED_Buffer[i] = SBUF - 48; //这里减去48是因为从电脑中发送过来的数据是ASCII码。
  19.         RI = 0;         
  20.         if(i==8)
  21.         {
  22.             i = 0;
  23.         }
  24.         i++;        
  25.     }
  26. }

  27. void Com_Init(void)
  28. {
  29.      TMOD = 0x20;
  30.      PCON = 0x00;
  31.      SCON = 0x50;            
  32.      TH1 = 0xfd; //设置波特率 9600
  33.      TL1 = 0xfd;
  34.      TR1 = 1;        //启动定时器1
  35.      ES = 1;        //开串口中断
  36.      EA = 1;        //开总中断        
  37. }

  38. void Main()
  39. {
  40.     uchar i = 0;
  41.     Delay_1ms(100);
  42.     Com_Init();
  43.     while(1)
  44.     {
  45.         P0 = table[LED_Buffer[i]];
  46.         P2 = i++;
  47.         Delay_1ms(1);
  48.         if(i == 8) i=0;
  49.     }
  50. }
说明:
可以再串口RI或者TI置位后,设置中断函数,TI和RI由硬件。通过RI置位可以读取接受到的数组。
然后做进一步的传输。

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP