基于proteus的51单片机仿真实例六十一、串口发送字符串实例

1、本例中的单片机通过串口按一定时间间隔,通过串口数据发送端P3.1(TXD)向主机发送字符串,利用proteus内置的虚拟终端(virtual terminal)的RXD端连接单片机的TXD端,单片机发送的字符可以在虚拟终端中显示出来,另外还要注意将单片机的晶振频率设为11.0592MHz。并且虚拟终端的波特率等设置要与程序中的设置相同。
2、本例中程序像主机发送的是英文字符串,所发送的字母表会通过虚拟终端显示出来,在系统运行后,如果虚拟终端没有显示,可单击proteus的调试(debug)菜单,然后单击virtual terminal-VT1。
 
3、在keil c51中新建工程ex49,编写如下程序代码,编译并生成ex49.hex文件
//实例49:利用虚拟中断实现串口数据的发送
//
#include        //包含头文件
//毫秒级延时函数
void delay(unsigned int x)
{
  unsigned char i;
 while(x--)
 {
   for(i = 0;i < 120;i++);
 }
}
//字符发送函数
void putchar(unsigned char data1)  
{
  SBUF = data1;               //将待发送的字符送入发送缓冲器
 while(TI == 0);            //等待发送完成
 TI = 0;                     //发送中断标志请0
}
//字符串发送函数
void putstring(unsigned char *dat)
{
  while(*dat != '\0')           //判断字符串是否发送完毕
 {
   putchar(*dat);        //发送单个字符
  dat++;                 //字符地址加1,指向先下一个字符
  delay(5);
 }
}
//主函数
void main(void)
{
  unsigned char c = 0;
 SCON = 0x40;         //串口工作方式设置
 TMOD = 0x20;         //定时器工作方式设置
 PCON = 0x00;        //波特率倍增设置
 TL1 = 0xfd;         //波特率设置
 TH1 = 0xfd;        //
 TI = 0;           // 清0发送中断标志         
 TR1 = 1;          //开启定时器
 delay(200);
 putstring("Receiving from 8051...\r\n");      //发送字符串,结尾回车换行
 putstring("----------------------\r\n"); 
 delay(50);
 while(1)
 {
   putchar(c + 'A');          //发送字符
  delay(100);
  putchar(' ');         //
  delay(100);
  if(c == 25)           //每输出一遍后加横线
  {
    putstring("\r\n----------\r\n");
   delay(100);
  }
  c = (c+1)%26;
  if(c%10 == 0)         //每输出10个字符后回车换行
  {
    putstring("\r\n");
   delay(100);
  }
 }
}
 
4、在proteus中新建仿真文件ex49.dsn,电路原理图如下所示:
基于proteus的51单片机仿真实例六十一、串口发送字符串实例_第1张图片

5、将ex49.hex文件载入at89c51中,启动仿真,观察程序运行结果,下图是某一时刻程序运行结果
基于proteus的51单片机仿真实例六十一、串口发送字符串实例_第2张图片

你可能感兴趣的:(51单片机)