注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题

tiankai001的个人空间 http://home.eeworld.com.cn/space-uid-139222.html [收藏] [复制] [分享] [RSS]

日志

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

热度 1已有 13644 次阅读2010-2-19 23:30 |个人分类:proteus for 51 mcu|

1、在上一实例中,我们利用proteus中自带的虚拟终端实现了单片机通过串口向主机发送字符串的功能。本例中我们加入串口接收字符的功能
 
2、为了实现单片机通过终端接收字符的功能,我们需要在电路中再加入一路虚拟终端,新加入的这一路虚拟终端连接到单片机的串行接收端口RXD上,在仿真运行后,在该终端输入字符,然后将字符发送到单片机的串行接收端,
3、在keil c51中新建工程ex50,编写如下程序代码,编译并生成ex50.hex文件
// 实例50:利用虚拟中断实现串口数据的发送和接收
//
#include <reg51.h>          //包含头文件
//毫秒级延时函数
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 = 0x50;           //串口方式1 ,允许接收
 TMOD = 0x20;           //T1工作于方式2
 PCON = 0x00;           //波特率不倍增
 TL1 = 0xfd;              //波特率设置
 TH1 = 0xfd;            //
 EA = 1;                    //开总中断
 ES = 1;               //开串口接收中断
 //TI = 0;
 TR1 = 1;             //定时器开启
 delay(200);
 putstring("Receiving from 8051...\r\n");         //串口向终端发送字符串,结尾处回车换行
 putstring("----------------------\r\n");
 delay(50);
 while(1)
 {
   
 }
}

//
void revdata(void) interrupt 4
{
  unsigned char temp;
 if(RI == 0) return;         //如果没有接收中断标志,返回
 ES = 0;            //关闭串口中断
 RI = 0;            //清串行中断标志位
 temp = SBUF;        //接收缓冲器中的字符
 putchar(temp);        //将接收的字符发送出去
 ES = 1;                 //开启串口中断
}
4、在proteus中新建仿真文件ex50.dsn,电路原理图如下所示
5、将ex50.hex文件载入at89c51中,启动仿真,在vertual terminal1中输入字符,vertual terminal中会即时显示出输入的字符。下图是程序运行结果。

发表评论 评论 (30 个评论)

回复 屋顶的雪 2010-6-1 15:11
很厉害
回复 LS110600617 2010-7-24 21:08
tiankai001大哥:当我第一遍按照步骤做的时候,很顺利,可以跳出两个窗口,并可以收发;但是当我停止仿真,想要重新运行仿真的时候,却没有窗口弹出,这个是为啥??搞不懂。
回复 tiankai001 2010-7-24 22:08
LS110600617: tiankai001大哥:当我第一遍按照步骤做的时候,很顺利,可以跳出两个窗口,并可以收发;但是当我停止仿真,想要重新运行仿真的时候,却没有窗口弹出,这个是为啥
呵呵,那就从菜单里打开这两个窗口
回复 LS110600617 2010-7-24 22:28
tiankai001: 呵呵,那就从菜单里打开这两个窗口
果然可以,厉害
回复 panankang 2011-1-16 16:54
兄弟问下!!!为什么串行接收端没啥子反应!!!!请给予解惑!!!谢谢!!1
回复 tiankai001 2011-1-16 17:20
panankang: 兄弟问下!!!为什么串行接收端没啥子反应!!!!请给予解惑!!!谢谢!!1
这是用的proteus中的虚拟端口,看看你设置的对不对
回复 xin2893 2011-3-27 08:54
学习了~~~兄弟
回复 xin2893 2011-3-27 09:09
putstring("Receiving from 8051...\r\n");   想问下,这里  Receiving from 8051是什么意思呀?dat指针没给地址,怎么能访问到内容呢?初学者,无法理解
回复 tiankai001 2011-3-28 08:33
xin2893: 学习了~~~兄弟
共同学习、交流
回复 tiankai001 2011-3-28 08:36
xin2893: putstring("Receiving from 8051...\r\n");   想问下,这里  Receiving from 8051是什么意思呀?dat指针没给地址,怎么能访问到内容呢?初学者,无法
这里是让终端显示的字符,\r\n是回车换行的ASCII码。unsigned char *dat在函数的参数里直接定义了,
回复 xin2893 2011-4-4 14:45
恩  理解了~~~
回复 xiejunjie 2011-4-12 12:25
回复 xiejunjie 2011-4-12 12:30
博主问你个问题,proteus中单片机的编辑选项中Advanced Properties为什么不能保存为Simulate Program Fetches,每次打开都是Enable trace logging
回复 tiankai001 2011-4-12 14:19
xiejunjie: 博主问你个问题,proteus中单片机的编辑选项中Advanced Properties为什么不能保存为Simulate Program Fetches,每次打开都是Enable trace logging
这个我还真么研究过,呵呵
回复 ssqmy 2011-4-15 09:35
博主,运行时无法输入字符是怎么回事呢?
回复 tiankai001 2011-4-15 17:54
ssqmy: 博主,运行时无法输入字符是怎么回事呢?
是不是你的设置有问题?

重建一个项目试试
回复 ssqmy 2011-4-15 20:05
谢谢博主的回答,可是重建了也不行,我是一个新手,不知道还要进行哪些设置,能劳烦博主说详细一点吗?
回复 tiankai001 2011-4-15 20:37
ssqmy: 谢谢博主的回答,可是重建了也不行,我是一个新手,不知道还要进行哪些设置,能劳烦博主说详细一点吗?
时间过得太久了,我还不一定能想起来
回复 ssqmy 2011-4-15 21:15
呵呵,如果可以的话,我想向您学习一下单片机,我的QQ是1216682236
回复 uestcsd 2011-4-18 10:06
请教博主,在仿真运行后,在该终端输入字符,怎么将字符发送到单片机的串行接收端?
12下一页

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

关闭

站长推荐上一条 /1 下一条

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-11-12 22:18 , Processed in 0.037224 second(s), 12 queries , Gzip On, MemCache On.

Powered by EEWORLD电子工程世界

© 2019 http://bbs.eeworld.com.cn/

返回顶部