标题: 注释最全的单片机串口实验程序+Proteus仿真 [打印本页]

作者: jijkf    时间: 2020-6-10 15:32
标题: 注释最全的单片机串口实验程序+Proteus仿真
给大家看下最全串口实验
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include <reg51.h>
  2. sbit p1_0 = P1^0;

  3. //初始化串口 (设置串口,开启串口中断)
  4. void init_uart(void)
  5. {
  6.         SCON = 0x50;                        // SCON: 方式 1, 8-bit, 允许接收数据
  7.         TMOD |= 0x20;               // TMOD: 设置定时器1工作在方式2, 8-bit 自动重装
  8.         TH1 = 0xFD;               // TH1:  初始值为0xFD  波特率:9600 晶振频率:11.0592MHz  
  9.         TL1 = 0x0;
  10.         TR1 = 1;                  // TR1:  开启定时器1                        
  11.         EA  = 1;                  //打开总中断
  12.         ES  = 1;                  //打开串口中断
  13. }      

  14.            
  15. // 发送一个字节数据
  16. void uart_send_byte(unsigned char dat)
  17. {
  18.         SBUF = dat; // 将数据送到发送缓冲寄存器SBUF,一位一位的发送
  19.         while(!TI); // 等待发送完毕 (发送完毕TI硬件置1)
  20.         TI = 0;// 将TI清零,表示可以发送下一字节数据。
  21. }

  22. // 发送字符串
  23. void uart_send_str(unsigned char *s)
  24. {
  25.         while(*s != '\0')// '\0':字符串结束标志
  26.         {
  27.                 uart_send_byte(*s);// 发送1个字节数据,1个字符占8位,1字节
  28.                 s++;// 指向下一个字符
  29.         }
  30. }


  31. // 串口中断处理函数 (串口接收到数据,发送数据完毕都可以引起串口中断)
  32. void uart_interrupt(void) interrupt 4                 //也叫串行中断服务程序
  33. {
  34.         unsigned char recv_data;// 用来存放接收到的数据
  35.         unsigned char send_data[] = "I received.\n";// 要发送的信息
  36.        
  37.         if(RI) //接收数据(1字节)完毕,RI会被硬件置1
  38.         {
  39.                 RI = 0;                            // 将 接收中断标志位 清零(让串口可以继续接收数据)
  40.                 recv_data = SBUF;                   //读取接收到的数据,并存放到data
  41.        
  42.                
  43.                 if(recv_data == '1')//如果收到的字符是'0',就让灯灭
  44.                 {
  45.                         p1_0 = 0;//  p1.0引脚低电平,LED灯亮
  46.                 }
  47.                 else
  48.                 {
  49.                         p1_0 = 1;// p1.0引脚高电平,LED灯灭
  50.                 }

  51.             uart_send_str(send_data); //收到数据之后,发送字符串"I received."给对方
  52.         }
  53.         if(TI)// 发送数据(1字节)完毕
  54.         {
  55.                 TI = 0;// 将 发送中断标志位 清零(让串口可以继续发送数据)
  56.         }
  57. }

  58. void main(void)
  59. {
  60.         init_uart();// 初始化串口
  61.        
  62.         while(1)// 主循环不做任何动作。(死循环)
  63.         {}
  64. }
复制代码

所有资料51hei提供下载:
串口通信仿真实验.rar (65.53 KB, 下载次数: 42)







欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1