51 单片机串口实验
2016-01-25 12:02
316 查看
51单片机有一个全双工的串行口。
在 PROTEUS 软件中,可以使用虚拟终端,和单片机的串口进行通信实验。
此时,并不需要在电路中加上 TTL-RS232 电平转换器件。直接把单片机的串口,和虚拟终端连接在一起就可以了。
但是在一些书中,以及一些网络文章,却在单片机和虚拟终端之间,夹了一个 MAX232。
要知道,TTL-RS232 电平转换器件中是反相器,本来,串口通信时,1 是空闲位,如果反相后再送到对方,就不会起空闲的作用了。
实际上,TTL-RS232 电平转换器都是成对的使用,发送方加上一个,接收方,也要加上一个,这样,信号电平才是正常的。
一般来说,做一个简单的通信实验,完全可以不加电平转换器。
有一个关于串口简单通信的问题,(链接:http://zhidao.baidu.com/question/560670975,)就可以使用下面的电路,进行实验。
这个题目的要求是:
每次按一次键,虚拟终端从 0 开始显示,按一次增一次。可以增加到 9,最好到 F。
在虚拟终端输入 0 到 9,则由数码管显示。
实现这些要求的全部程序如下:
//-----------------------------------
#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
sbit k1 = P2^2;
uchar code table[] = {
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
char a = 0;
//-----------------------------------
void delay(uint x)
{
uchar i;
while(x--) for(i = 0; i < 120; i++);
}
//-----------------------------------
void com(uchar com)
{
SBUF = com;
while(!TI);
TI = 0;
}
//-----------------------------------
void main()
{
PCON = 0x80; //倍增
SCON = 0x50;
TMOD = 0x20;
TH1 = 0xfd; //晶振如果是 11.0592MHz,波特率则为 19200。
TL1 = 0xfd;
TR1 = 1;
IE = 0x90;
while(1) {
if(!k1) {
delay(10);
if(!k1) {
a++; if(a == 16) a = 0;
while(!k1);
if(a < 10) com((a + 0x30)); //变成ASCII码再发送
else com((a + 0x37));
} } }
}
//-----------------------------------
void ert() interrupt 4
{
char i;
if(RI) {
RI = 0;
i = SBUF & 0x0f; //简单的处理,仅仅保留低四位
P0 = ~table[i]; //显示 0~F
}
}
//-----------------------------------
实验时,虚拟终端的波特率,要设置为 19200。
在 PROTEUS 软件中,可以使用虚拟终端,和单片机的串口进行通信实验。
此时,并不需要在电路中加上 TTL-RS232 电平转换器件。直接把单片机的串口,和虚拟终端连接在一起就可以了。
但是在一些书中,以及一些网络文章,却在单片机和虚拟终端之间,夹了一个 MAX232。
要知道,TTL-RS232 电平转换器件中是反相器,本来,串口通信时,1 是空闲位,如果反相后再送到对方,就不会起空闲的作用了。
实际上,TTL-RS232 电平转换器都是成对的使用,发送方加上一个,接收方,也要加上一个,这样,信号电平才是正常的。
一般来说,做一个简单的通信实验,完全可以不加电平转换器。
有一个关于串口简单通信的问题,(链接:http://zhidao.baidu.com/question/560670975,)就可以使用下面的电路,进行实验。
这个题目的要求是:
每次按一次键,虚拟终端从 0 开始显示,按一次增一次。可以增加到 9,最好到 F。
在虚拟终端输入 0 到 9,则由数码管显示。
实现这些要求的全部程序如下:
//-----------------------------------
#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
sbit k1 = P2^2;
uchar code table[] = {
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
char a = 0;
//-----------------------------------
void delay(uint x)
{
uchar i;
while(x--) for(i = 0; i < 120; i++);
}
//-----------------------------------
void com(uchar com)
{
SBUF = com;
while(!TI);
TI = 0;
}
//-----------------------------------
void main()
{
PCON = 0x80; //倍增
SCON = 0x50;
TMOD = 0x20;
TH1 = 0xfd; //晶振如果是 11.0592MHz,波特率则为 19200。
TL1 = 0xfd;
TR1 = 1;
IE = 0x90;
while(1) {
if(!k1) {
delay(10);
if(!k1) {
a++; if(a == 16) a = 0;
while(!k1);
if(a < 10) com((a + 0x30)); //变成ASCII码再发送
else com((a + 0x37));
} } }
}
//-----------------------------------
void ert() interrupt 4
{
char i;
if(RI) {
RI = 0;
i = SBUF & 0x0f; //简单的处理,仅仅保留低四位
P0 = ~table[i]; //显示 0~F
}
}
//-----------------------------------
实验时,虚拟终端的波特率,要设置为 19200。
相关文章推荐
- 51 汇编编程:多路延时开关
- 51 汇编编程:中断的现场保护与恢复
- 51 汇编编程:一种单片机抢答器
- 数字电路:设计《BIN 到 BCD 码的转换电路》
- ArcGIS教程:自然邻域法的工作原理
- 51 汇编编程:停留保持的流水灯
- 数字电路:设计《三个开关控制一个灯的电路》
- 为什么volatile不能保证原子性而Atomic可以
- 80x86汇编语言编程:求两个单元中,有多少个对应的位是不同的
- 显示一个钟表
- 80x86汇编语言:输入数字,输出对应月份的英文
- 51 单片机的串口通信与控制
- 80x86汇编语言编程:求素数
- iOS集成环信昵称和头像(自己服务器)
- xp中搭建php环境(安装apache并配置apache)
- C# socket编程实践——简单聊天室
- 添加模块儿
- 00~99 再从99~00动态循环程序
- GitLab 基本使用说明
- linux