Chinaunix首页 | 论坛 | 博客
  • 博客访问: 354738
  • 博文数量: 79
  • 博客积分: 1270
  • 博客等级: 中尉
  • 技术积分: 1370
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-12 08:48
个人简介

freedom~~~~~~~~~~

文章分类

全部博文(79)

文章存档

2014年(10)

2013年(2)

2012年(13)

2011年(54)

分类: 嵌入式

2011-10-05 17:59:13

发送程序:
  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置位可以读取接受到的数组。
然后做进一步的传输。

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