一.实验目的、内容、仪器
实验目的:1. 掌握 51 单片机串口工作原理。
2. 掌握 51 单片机串口初始化编程。
3. 掌握 51 单片机串口的软硬件编程。
实验内容:从串口接收6个字符(0-F),并将其显示到六位数码管上。
实验仪器:7SEG-MPX8-CC:八位数码管共阴极,74HC573:锁存器,AT89C52:52单片机,RESPACK-8:排阻,led:灯,VIRTUAL TERMINAL:虚拟串口监视器,COMPIN:串口设备。
二.硬件原理
三.程序流程图
四.代码实现
#include <reg52.h>
typedef unsigned int u16;//对系统默认数据类型进行重定义
typedef unsigned char u8;
int i,j,N=0;
sbit dula=P2^6;
sbit wela=P2^7;
int zhhcc[8];
char code table[]={ 0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
//0~f十六个数字数组
void uart_init(u8 baud)
{
TMOD|=0X20; //设置计数器工作方式 2
SCON=0X50; //设置为工作方式 1
PCON=0X80; //波特率加倍
TH1=baud; //计数器初始值设置
TL1=baud;
ES=1; //打开接收中断
EA=1; //打开总中断
TR1=1; //打开计数器
}
void delay(x)
{
int i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
void main()
{
uart_init(0XFA);//波特率为 9600
while(1) //进入显示循环
{ while(1)
{ P0=0xfe; wela=1; wela=0;
P0=zhhcc[0];dula=1;dula=0; //显示第一位
P0=0xff;
delay(5);
if(N==1)
break;
P0=0xfd; wela=1; wela=0;
P0=zhhcc[1];dula=1;dula=0;P0=0xff; //显示第二位
delay(5);
if(N==2)
break;
P0=0xfb; wela=1; wela=0;
P0=zhhcc[2];dula=1;dula=0;P0=0xff; //显示第三位
delay(5);
if(N==3)
break;
P0=0xf7; wela=1; wela=0;
;
P0=zhhcc[3];dula=1;dula=0; P0=0xff; //显示第四位
delay(5);
if(N==4)
break;
P0=0xef; wela=1; wela=0;
P0=zhhcc[4];dula=1;dula=0;P0=0xff; //显示第五位
delay(10);
if(N==5)
break;
P0=0xdf; wela=1; wela=0;
P0=zhhcc[5];dula=1;dula=0;P0=0xff; //显示第六位
delay(5);
if(N==6)
break;
P0=0xbf; wela=1; wela=0;
P0=zhhcc[6];dula=1;dula=0;P0=0xff; //显示第七位
delay(5);
if(N==7)
break;
P0=0x7f; wela=1; wela=0;
P0=zhhcc[7];dula=1;dula=0;P0=0xff; //显示第八位
delay(5);
if(N==8){N=0;};
break;
}
}
}
void uart() interrupt 4 //串口通信中断函数
{
u8 rec_data;
if(RI==1)
{
RI = 0; //清除接收中断标志位
rec_data=SBUF; //存储接收到的数据
SBUF=rec_data; //将接收到的数据放入到发送寄存器
switch(SBUF)
{
case '0':zhhcc[N]=table[0];N++;break;
case '1':zhhcc[N]=table[1];N++;break;
case '2':zhhcc[N]=table[2];N++;break;
case '3':zhhcc[N]=table[3];N++;break;
case '4':zhhcc[N]=table[4];N++;break;
case '5':zhhcc[N]=table[5];N++;break;
case '6':zhhcc[N]=table[6];N++;break;
case '7':zhhcc[N]=table[7];N++;break;
case '8':zhhcc[N]=table[8];N++;break;
case '9':zhhcc[N]=table[9];N++;break;
}
while(!TI); //等待发送数据完成
TI=0; //清除发送完成标志位
}
}
五.实验步骤
(1)了解译码器的功能,以及数码管动态显示原理
(2)搭建仿真电路,勾选debug,建立keil工程,选择单片机型号
(3)给工程创建源码文件,并以.c结尾,添加文件到源组里
(4)生成hex文件,点击魔术棒,在output中勾选Create HRX_File
(5)对代码进行编译,调试debug,点击USE,在下拉菜单里选中“Proteus VSM Monitor 一 51 ”进行设置
(6)将程序导入到单片机中运行,双击单片机,选择生成的hex文件
(7)在keil中启动调试,开始运行,观察proteus中的电路
六.结果及讨论
串口是一种通信方式。
不同型号单片机串口数量不一样,比较高级的单片机有多个串口。下图中的单片机有2个串口资源。
串口对于单片机而言就是指2个引脚进行通信,如下图,一根引脚是RXD,代表接收数据引脚;一根引脚是TXD,代表发送数据引脚。注意串口引脚的名字取名方式。单片机想发送数据,是用TXD发出去。想接收数据,是用RXD接收。
单片机和电脑通信需要有一个中间芯片,起到中间桥梁作用,一方面接受单片机信息,一方面将信息发送到电脑;或者一方面接受电脑信息,一方面将信息发送到单片机。是双工通信,互不影响,可同时进行。
中间桥梁芯片一般是CH340、PL2303这些芯片。