找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3314|回复: 0
打印 上一主题 下一主题
收起左侧

Proteus仿真 51单片机测试printf发送函数 可以发送字符串和数字

[复制链接]
跳转到指定楼层
楼主
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

其他详见附件!printf可以发送数字  put_seris_port("字符串");可以发送字符串,接收部分已经写好!

单片机源程序如下:
  1. #include<reg52.h>                 //库文件
  2. #include<stdio.h>
  3. #include "string.h"       
  4. #include "master.h"
  5. #define uchar unsigned char//宏定义无符号字符型
  6. #define uint unsigned int  //宏定义无符号整型
  7. /********************************************************************
  8.                             端口定义
  9. *********************************************************************/
  10. sbit P1_0=P1^0;
  11. sbit P1_1=P1^1;
  12. sbit P1_2=P1^2;
  13. sbit P1_3=P1^3;
  14. /********************************************************************
  15.                             变量定义
  16. *********************************************************************/
  17. unsigned char uart_rx_finish=0;  
  18. unsigned char uart_rx_cnt=0;
  19. unsigned char dis2[16];                   //串口接收数据显示
  20. /********************************************************************

  21. /********************************************************************
  22.                             延时函数
  23. *********************************************************************/
  24. void delay_ms(uchar ms)
  25. { uchar i;
  26. while(ms--)
  27. for(i=0;i<120;i++);
  28. }
  29. void DelayUs2x(unsigned char t)        //  T=tx2+5 uS
  30. {   
  31. while(--t);
  32. }
  33. /********************************************************************
  34.                             主函数
  35. *********************************************************************/
  36. void main()
  37. {
  38.   uint i=0;
  39.   UART_Init();         
  40.   delay_ms(500);
  41.   delay_ms(500);
  42.   delay_ms(500);
  43.   while(1)
  44.           {  i++;
  45. //         puts_to_SerialPort("d\r\n");    //数据发送以\r\n作为结束符
  46.          printf("%d\r\n",i);    //数据发送以\r\n作为结束符
  47.          delay_ms(500);
  48.         }
  49. }       
  50. /********************************************************************
  51.                               串口处理程序
  52. *********************************************************************/
  53. void UART_Init(void)
  54. {
  55.     SCON  = 0x50;                        // SCON: 模式 1, 8-bit UART, 使能接收  
  56.     TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装
  57.         PCON = 0x00;
  58.     TH1   = 0xFD;               // TH1:  重装值 9600 波特率 晶振 11.0592MHz
  59.         TL1 = TH1;  
  60.     TR1   = 1;                  // TR1:  timer 1 打开                        
  61.     EA    = 1;                  //打开总中断
  62.     ES    = 1;                  //打开串口中断
  63. }

  64. void SendByte(unsigned char dat)//串口发送单字节数据
  65. {
  66.         unsigned char time_out;
  67.         time_out=0x00;
  68.         SBUF = dat;                          //将数据放入SBUF中
  69.         while((!TI)&&(time_out<100))  //检测是否发送出去
  70.         {time_out++;DelayUs2x(10);}        //未发送出去 进行短暂延时
  71.         TI = 0;                                                //清除ti标志
  72. }

  73. void SendStr(unsigned char *s,unsigned char length)           //发送定长度字符串
  74. {
  75.         unsigned char NUM;
  76.         NUM=0x00;
  77.         while(NUM<length)        //发送长度对比
  78.         {
  79.                 SendByte(*s);  //放松单字节数据
  80.                 s++;                  //指针++
  81.                 NUM++;                  //下一个++
  82.            }
  83. }
  84. char putchar(char c) //printf函数会调用putchar()
  85.         {
  86.         SendByte(c);
  87.         return c;
  88. }
  89. void puts_to_SerialPort(uchar *s)
  90. {
  91.         while(*s != '\0')
  92.         {
  93.                  SendByte(*s);
  94.                 s++;
  95.                 delay_ms(5);       
  96.         }
  97. }
  98. void UART_SER (void) interrupt 4         //串行中断服务程序
  99. {
  100.         uchar c;
  101.         if(RI)                        //判断是接收中断产生
  102.         {
  103.                 c  = SBUF;
  104.              if(c=='\n') {
  105.                 uart_rx_finish=1;  
  106.                 dis2[uart_rx_cnt]='\0';       
  107.                  }
  108.                  else{
  109.                   if(uart_rx_cnt<sizeof(dis2)-1)
  110.                            dis2[uart_rx_cnt++]=c;
  111.                  }

  112.                 RI=0;                      //标志位清零
  113.         }         
  114.         if(TI)  //如果是发送标志位,清零
  115.         TI=0;
  116. }
  117. /********************************************************************
  118.                               结束
  119. *********************************************************************/
复制代码

所有资料51hei提供下载:
甲keil.rar (61.74 KB, 下载次数: 48)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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