找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

51单片机的串口通讯例程

  [复制链接]
187196467 发表于 2010-5-9 22:27:43 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
51单片机的串口通讯例程详情见附件
  1. // 采用查询方式进行串口通讯的例子

  2. // 采用这种方式的弊端:
  3. // 1.如果对方没有发送数据,则本机无限等待,而不能做其它事情
  4. // 2.如果对方发送数据而本机正做其它事情,那么有可能丢失数据。

  5. // 因此实际上串口接收常采用中断方式,串口发送则不需要。


  6. #include <reg51.h>

  7. extern void serial_init(void);
  8. extern unsigned char getchar(void);
  9. extern void putchar(unsigned char ch);
  10. extern void puthex(unsigned char ch);


  11. void main(void)
  12. {
  13. unsigned char i;

  14. serial_init(); // 串口初始化


  15. do {
  16. i=getchar(); // 如果没有收到串口数据则一直等待(查询接收串口数据的弊端)

  17. ++i;
  18. --i; // 观察断点

  19. putchar(i); // 在串口显示接收到的ASCII数据(就是把原来收到的数据再送回串口)
  20. putchar(' ');
  21. putchar(' ');

  22. putchar('0');
  23. putchar('x');
  24. puthex(i); // 在串口以十六进制格式显示接收的ASCII数据

  25. putchar(' ');
  26. putchar(' ');

  27. ++i;
  28. --i; // 观察断点

  29. }while(1);
  30. }
复制代码



  1. // 题目:串口初始化C代码
  2. // 要求:
  3. // 1.波特率1200bps,无奇偶校验,停止位1,数据位8
  4. // 2.定时器T1做波特率发生器

  5. // 软件模拟测试说明:
  6. // 1.这个测试采用查询方式进行串口通讯
  7. // 2.将软件仿真环境的晶震设为11.0592 MHz
  8. // 3.软件模拟全速运行, 观察波特率是1200bps
  9. // 4.在串口1中输入数字或字母,可观察到通讯是否有误。

  10. //#pragma src

  11. #include <reg51.h>

  12. //串口初始化
  13. void serial_init(void)
  14. {
  15. //ET1 = 0; //CLR 0ABH ;禁止T1中断
  16. TMOD = 0x20; //MOV 89H,#20H ;timer 1 mode 2: 8-Bit reload(定时器T1 模式2: 8位自动初值重装)
  17. TH1 = 0xE8; //MOV 8DH,#0E8H
  18. TL1 = 0xE8; //MOV 8BH,#0E8H ;1200bps, 11.059
  19. TR1 = 1; //SETB 8EH ;启动定时器1

  20. SCON = 0x50; // mode 1: 10-bit UART, enable receiver(模式1: 10位异步发送/接收, 使能接收允许位)
  21. //SM1 = 1; // ;串行口 模式1
  22. //SM0 = 0;
  23. //REN = 1; // ;允许串行中断接收

  24. SM2 = 1; //SETB O9DH ;收到有效的停止位时才将RI置1

  25. ES = 1; //SETB 0ACH ;允许串行中断
  26. EA = 1; //SETB 0AFH ;总中断开
  27. }

  28. //中断方式处理串口数据

  29. void serial(void) interrupt 4 using 1
  30. {
  31. if(RI)
  32. {
  33. // RI = 0;
  34. // 串口接收, 采用临时缓冲
  35. }
  36. #if 0
  37. if(TI)
  38. {
  39. // TI = 0;
  40. // 串口发送, 没有必要使用中断方式
  41. }
  42. #endif

  43. }

  44. // 查询方式接收串口数据
  45. unsigned char getchar(void)
  46. {
  47. while(!RI);// 没有收到串口数据则一直等待
  48. RI=0;
  49. return SBUF;
  50. }
  51. // 查询方式发送串口数据
  52. void putchar(unsigned char ch)
  53. {
  54. SBUF=ch;
  55. while(!TI);
  56. TI=0;
  57. }

  58. code unsigned char HEX_TAB []="0123456789ABCDEF";
  59. void puthex(unsigned char ch)
  60. {
  61. unsigned char i,j;
  62. i=ch>>4;
  63. j=ch&0x0f;
  64. putchar(HEX_TAB[i]);
  65. putchar(HEX_TAB[j]);
  66. }
复制代码


串口通讯例程.rar (20.09 KB, 下载次数: 35)
jesterma 发表于 2010-6-11 11:28:30 | 显示全部楼层
不错!{:13_781:}
hpdell 发表于 2010-6-13 13:50:33 | 显示全部楼层
不错!!!!!!!!!
kevintang 发表于 2010-7-24 11:06:56 | 显示全部楼层
感谢分享.....................
kevintang 发表于 2010-7-24 11:07:20 | 显示全部楼层
感谢分享!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
nywnss 发表于 2010-10-12 11:40:31 | 显示全部楼层
{:13_780:}收下了,哈哈!~
xyw372546455 发表于 2010-10-18 18:19:38 | 显示全部楼层
{:13_1488:}为什么我就下不了呢!。。。
fmboy 发表于 2010-10-18 22:27:55 | 显示全部楼层
不错,顶一下
fmboy 发表于 2010-10-18 22:59:33 | 显示全部楼层
学习一下,谢谢
hsy2966 发表于 2011-3-1 23:11:34 | 显示全部楼层
haohaomashangqukankan好号码闪回去


hsy2966于2011-3-1 23:12补充以下内容:
        #include<reg52.h>
        typedef unsigned int uint16;
        typedef unsigned char uint8;
        void init()
        {
                TMOD=0X20;
                TH1=0XFD;
                TL1=0XFD;
                TR1=1;
                SCON=0X50;
                ES=1;
                EA=1;
        }
        void main()
        {
                init();
                while(1);

        }
        void serial() interrupt 4
        {        RI=0;
        ACC=SBUF;
        ES=0;
        P1=0Xef;
        SBUF=ACC;
        while(TI==0);
        TI=0;
        ES=1;
       
       
        }


hsy2966于2011-3-1 23:12补充以下内容:
        #include<reg52.h>
        typedef unsigned int uint16;
        typedef unsigned char uint8;
        void init()
        {
                TMOD=0X20;
                TH1=0XFD;
                TL1=0XFD;
                TR1=1;
                SCON=0X50;
                ES=1;
                EA=1;
        }
        void main()
        {
                init();
                while(1);

        }
        void serial() interrupt 4
        {        RI=0;
        ACC=SBUF;
        ES=0;
        P1=0Xef;
        SBUF=ACC;
        while(TI==0);
        TI=0;
        ES=1;
       
       
        }
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-23 10:27 , Processed in 0.062012 second(s), 12 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表