当前位置:文档之家› 单片机控制打印机例程(北京荣达-串口)

单片机控制打印机例程(北京荣达-串口)

单片机控制打印机例程(北京荣达-串口)
单片机控制打印机例程(北京荣达-串口)

/*********************************************************

// 新荣达电子打印机测试程序

// 51单片机,晶振11.0592

// 时间:2009-7-10

// 用与测试串行接口打印机

// 常用打印机指令以函数行式体现

// 可根据需要自行调用单一函数

**********************************************************/

#include //51头文件

#include //字串处理函数头文件

#include

#define uchar unsigned char

sbit BUSY=P3^4; //并口打印机的BUSY,串口打印机的CTS

/**************************单字节打印函数************************************/

void print(unsigned char ch)

{

while (BUSY==1) //busy为1时,等待,如数据量小,可不判BUSY

{;}

SBUF= ch; //busy=0,将数据送到P1口

while(TI==0) //当TI为0时,表示数据未发送完成,一直等待,直到为1

{;}

TI=0; //将TI清0

}

/*********************串口初始化**********************************************/

void com_init(void)

{

TH1=0XFD; //波特率值装入计数器,9600BPS

TMOD=0X20; //串口设置,定时器1,设为方式2,8位自动重载,用于产生波特率SCON=0X50; //串口发送方式1,8位数据位,1位停止位

TR1=1; //开启定时器1

}

/**********************字符打印函数********************************************/ void print_chs(uchar ch[])

{

uchar i;

for(i=0;i

print(ch[i]);

}

/*************************汉字打印例程***************************************/

void hanzitest(void)

{

uchar i;

print(0x1b);print(0x40); //初始化打印机

print(0x1b);print(0x38);print(0x00); //调用16*16点阵汉字,24点阵为24*24

print_chs("汉字命令测试:\n");

for(i=0;i<5;i++) //搋环打印5次

{

print(0x1b);print(0x38);print(0x00); //调用16*16点阵汉字,24点阵为24*24

print(0xd0);print(0xc2); //打印数据"新"

print(0x1b);print(0x38);print(0x04); //调用12*12点阵汉字,24点阵为24*24

print(0xc8);print(0xd9);print(0xb4);print(0xef); //打印数据“荣达”

print(0x0d); //回车

}

}

/*************************行间距例程************************************/

void hangjianju(void)

{

uchar i;

print(0x1b);print(0x40); //初始化打印机

print(0x1b);print(0x38);print(0x00); //调用16*16点阵汉字,24点阵为24*24

print_chs("行间距测试:\n");

for(i=0;i<11;i=i+2) //循环打印

{

print(0x1b);print(0x31);print(i); //ESC 1,设置行间距

print_chs("LINE SPACING");print(0x0a); //打印字符串和换行

}

}

/*************************水平造表例程***************************************/ void shuipingzhaobiao(void)

{

print(0x1b);print(0x40); //初始化打印机

print(0x1b);print(0x38);print(0x00); //调用16*16点阵汉字,24点阵为24*24

print_chs("水平造表测试:\n");

print_chs("1234567890123456");// '标尺

print(0x0d);

print(0x1b);print(0x44);print(2);print(9);print(14);print(0);//ESC D

print(9); //HT命令

print_chs("HT1"); //打印字符串

print(9); //HT命令

print_chs("HT2"); //打印字符串

print(9); //HT命令

print_chs("HT3"); //打印字符串

print(0x0d);

}

/*************************打印空格或换行例程**********************************/ void konggehuanhang(void)

{

print(0x1b);print(0x40); //初始化打印机

print(0x1b);print(0x38);print(0x00); //调用16*16点阵汉字,24点阵为24*24

print_chs("换行或空格测试:\n");

print_chs("TE"); //打印字符串“TE”

print(0x1b);print(0x66);print(0);print(0x06); //空六格

print_chs("ST"); //打印字符串“ST”

print(0x0d); //回车

print_chs("TE"); //打印字符串“TE”

print(0x1b);print(0x66);print(0x01);print(0x06); //换6行

print_chs("ST"); //打印字符串“ST”

print(0x0d); //回车

}

/*************************右限例程**********************************/ void youxian(void)

{

print(0x1b);print(0x40); //初始化打印机

print(0x1b);print(0x38);print(0x00); //调用16*16点阵汉字,24点阵为24*24 print_chs("右限测试:\n");

print_chs("12345678901234567890123456789012");//标尺

print(0x1b);print(0x51);print(0x06); //ESC Q 命令,右限为6

print_chs("12345678901234567890123456789012");//打印字串

print(0x0d); //回车

}

/*************************左限例程**********************************/ void zhuoxian(void)

{

print(0x1b);print(0x40); //初始化打印机

print(0x1b);print(0x38);print(0x00); //调用16*16点阵汉字,24点阵为24*24 print_chs("左限测试:\n");

print_chs("12345678901234567890123456789012");//标尺

print(0x1b);print(0x6c);print(0x06); //ESC I 命令,左限为6

print_chs("12345678901234567890123456789012");//打印字串

print(0x0d); //回车

}

/*************************放大指令例程**********************************/ void fangda(void)

{

uchar i;

print(0x1b);print(0x40); //初始化打印机

print(0x1b);print(0x38);print(0x00); //调用16*16点阵汉字,24点阵为24*24 print_chs("放大测试:\n");

for(i=1;i<4;i++) //从1到3倍

{

print (0x1b);print(0x55);print(i); //横向放大

print_chs("RD"); //打印字符

}

print(0x0d); //回车命令

print(0x1b);print(0x40); //初始化打印机

for(i=1;i<4;i++) //从1到3倍

{

print (0x1b);print(0x56);print(i); //纵放命令

print_chs("RD"); //打印字符

print(0x0d); //回车

}

print(0x1b);print(0x40); //初始化打印机

for(i=1;i<4;i++) //从1到3倍

{

print (0x1b);print(0x57);print(i); //横纵向同时放大

print_chs("RD"); //打印字符

print(0x0d); //回车

}

}

/*************************划线指令例程**********************************/ void huaxian(void)

{

print(0x1b);print(0x40); //初始化打印机

print(0x1b);print(0x38);print(0x00); //调用16*16点阵汉字,24点阵为24*24 print_chs("划线测试:\n");

print(0x1b);print(0x57);print(2);//放大两倍打印,便于观察划线

print_chs("RD"); //打印字串

print(0x1b);print(0x2d);print(1);//允许下划线打印

print_chs("UPT"); //UPT打印下划线

print(0x1b);print(0x2d);print(0);//禁止下划线打印

print_chs("RD"); //打印字串

print(0x0d); //回车

print(0x1b);print(0x40); //初始化打印机

print(0x1b);print(0x57);print(2);//放大两倍打印,便于观察划线

print_chs("RD"); //打印字串

print(0x1b);print(0x2b);print(1); //允许上打印线打印

print_chs("UPT"); //UPT上打印上划线

print(0x1b);print(0x2b);print(0); //禁止上划线

print_chs("RD"); //打印字串

print(0x0d); //打印回车

}

/*************************上下标指令例程**********************************/ void shangxiabiao(void)

{

print(0x1b);print(0x40); //初始化打印机

print(0x1b);print(0x38);print(0x00); //调用16*16点阵汉字,24点阵为24*24 print_chs("上下标测试:\n");

print(0x1b);print(0x57);print(0x02); //放大两倍

print('M'); //打印字符'M'

print(0x1b);print(0x57);print(0x01); //原倍

print(0x1c);print(0x72);print(0); //上标命令

print('2'); //打印字符'2'

print(0x0d); //回车

print(0x1b);print(0x57);print(0x01); //原倍

print(0x1b);print(0x57);print(0x02); //放大两倍

print('M'); //打印字符'M'

print(0x1c);print(0x72);print(1); //上标命令

print(0x1b);print(0x57);print(0x01); //原倍

print('2'); //打印字符'2'

print(0x0d); //回车

}

/*************************横纵向指令例程**********************************/

void hengzhong(void)

{

print(0x1b);print(0x40);

print(0x1b);print(0x38);print(0x00); //调用16*16点阵汉字,24点阵为24*24

print_chs("横纵向测试:\n");

print(0x1c);print(0x4a); //设置纵向打印

print_chs("ABCDEFGHI"); //打印字符

print(0x0d); //回车

print(0x1b);print(0x40);

print(0x1C);print(0x4B); //设置横向打印

print_chs("ABCDEFGHI"); //打印字符

print(0x0d); //回车

}

/*************************自定义指令例程**********************************/

void zidingyi(void)

{

print(0x1b);print(0x40); //初始化指令

print(0x1b);print(0x38);print(0x00); //调用16*16点阵汉字,24点阵为24*24

print_chs("自定义字符测试:\n");

print(0x1b);print(0x36); //如是24点阵机器,在自定义字符前面要加一个1B 36 指令才行print(0x1b);print(0x57);print(2); //横向纵向放大2倍

print(0x1b);print(0x26);print(65); //ESC & 命令

print(0x02);print(0x7C);print(0x40); //字模数据

print(0xC0);print(0x40);print(0x00); //字模数据

print(0x1b);print(0x25);print(65);print(65);print(0); //ESC %

print(65); //打印定义字符

print(0x1b);print(0x3a); //ESC:命令

print(65); //复符集中的字符

print(0x0d);

}

/*************************图形指令例程**********************************/

void tuxing(void)

{

uchar code tch[ ]={0x7c,0x44,0x44,0xff,0x44,0x44,0x7c,0x00,0x41,0x62,0x54,0xc8,0x54,0x62,0x41};

uchar i;

print(0x1b);print(0x40); //初始化指令

print(0x1b);print(0x38);print(0x00); //调用16*16点阵汉字,24点阵为24*24

print_chs("图形测试:\n");

// print(0x1b);print(0x57);print(2); //横向纵向放大2倍

print(0x1b);print(0x4b);print(15);print(0); //ESC K命令

for(i=0;i<15;i++) //输入15个字节数据

print(tch[i]);

print(0x0d); //输入回车

}

/*************************曲线II指令例程**********************************/ //仅适用于热敏打印机

void quxian_2(void)

{

float X;

unsigned int Y,YY;

// Y1=50+40*abs(-0.01*X)*sin(X/10)

// Y2=50-40*abs(-0.01*X)*sin(X/10)

// Y3=50

// Y4=50+40*abs(-0.1*X)

// Y5=50-40*abs(-0.01*X)

// 你可以用C语言编写如下的程序:

// #include

// unsigned int Y,YY,X;

print(0x1b);print(0x40); //初始化指令

print(0x1b);print(0x38);print(0x00); //调用16*16点阵汉字,24点阵为24*24 print_chs("曲线1测试:\n");

for(X=0;X<150;X++) //打印150点行

{

Y= 40*exp(-0.01*X);

YY= Y*sin(X/10);

print(0x1b);print(39);print(5);print(0); //ESC命令,M=5,0

print(50+YY);print(0);print(50-YY);print(0);print(50);print(0);

print(50+Y);print(0);print(50-Y);print(0);print(13);

}

}

/*************************曲线I指令例程**********************************/ //仅适用于针式打印机

void quxian_1(void)

{

float X;

unsigned int Y,YY;

// Y1=50+40*abs(-0.01*X)*sin(X/10)

// Y2=50-40*abs(-0.01*X)*sin(X/10)

// Y3=50

// Y4=50+40*abs(-0.1*X)

// Y5=50-40*abs(-0.01*X)

// 你可以用C语言编写如下的程序:

// #include

// unsigned int Y,YY,X;

print(0x1b);print(0x40); //初始化指令

print(0x1b);print(0x38);print(0x00); //调用16*16点阵汉字,24点阵为24*24 print_chs("曲线2测试:\n");

for(X=0;X<150;X++) //打印150点行

{

Y= 40*exp(-0.01*X);

YY= Y*sin(X/10);

print(0x1b);print(39);print(5); //ESC命令,M=5

print(50+YY);;print(50-YY);print(50);;

print(50+Y);print(50-Y);print(13);

}

}

/************************旋转指令例程**********************************/ void xuanzhuan(void)

{

uchar i;

print(0x1b);print(0x40); //初始化指令

for(i=0;i<4;i++) //0,90,180,270旋转

{

print(0x1c);print(0x49);print(i); //旋转指令

print(0x1b);print(0x38);print(0); //汉字调出指令

print_chs("旋转测试"); //打印汉字}

print(0x0d); //回车

}

/************************反白指令例程**********************************/ void fanbai(void)

{

uchar i;

print(0x1b);print(0x40); //初始化指令

for(i=0;i<2;i++) //i为1时,反白打印

{

print(0x1b);print(0x69);print(i);

print(0x1b);print(0x38);print(0);

print_chs("反白测试");

}

print(0x0d);

}

/************************反向指令例程**********************************/ void fanxiang(void)

{

uchar i;

print(0x1b);print(0x40); //初始化指令

for(i=0;i<2;i++) //i为1时,禁止反向

{

print(0x1b);print(0x63);print(i);

print(0x1b);print(0x38);print(0);

print_chs("反向测试");

print(0x0d);

}

}

/************************条码指令例程**********************************/ //只有部分型号的打印机支持此指令

void tiaoma(void)

{

print(0x1b);print(0x40); //初始化指令

print(0x1d);print(0x72);print(0x01); //打印条码字符

print(0x1d);print(0x68);print(0x60); //设置条码高度为96点

print(0x1d);print(0x6B);print(0x45);print(8); //打印长度为8的CODE39码

print(0x2a);print(0x31);print(0x32);print(0x34);print(0x35);print(0x37);print(0x36);print(0x2a); //CODE39码数据print(0x0d); //回车

print(0x1d);print(0x6B);print(3); //打印EAN13码

print(0x32);print(0x37);print(0x30);print(0x38);print(0x35);print(0x38);print(0x35);print(0x30); //EAN13码数据print(0x30);print(0x39);print(0x32);print(0x34);print(0x38);print(0x00);

print(0x0d); //回车

}

Main()

{

com_init();

hanzitest();

hangjianju();

shuipingzhaobiao();

konggehuanhang();

youxian();

fangda();

huaxian();

shangxiabiao();

hengzhong();

zhuoxian();

zidingyi();

tuxing();

quxian_2(); //如用针打打印机将此函数去掉

quxian_1(); //如用热敏打印机将此函数去掉

xuanzhuan();

fanbai();

fanxiang();

tiaoma();

print(0x0d); //回车

print(0x0d); //回车

print(0x0d); //回车

while(1); //死循环

}

51单片机与PC串口通讯

目录 第1章需求分析 ............................................................................................................................ - 1 - 1.1课题名称 (1) 1.2任务 (1) 1.3要求 (1) 1.4设计思想 (1) 1.5课程设计环境 (1) 1.6设备运行环境 (2) 1.7我在本实验中完成的任务 (2) 第2章概要设计 ............................................................................................................................ - 2 - 2.1程序流程图 (2) 2.2设计方法及原理 (3) 第3章详细设计 ............................................................................................................................ - 3 - 3.1电路原理 (3) 3.1.1STC89C52芯片 ............................................................................................................. - 3 -3.2串口通信协议 (4) 3.3程序设计 (5) 3.3.1主程序模块 .................................................................................................................... - 5 - 3.3.2串口通讯模块 ................................................................................................................ - 6 - 3.3.3控制部分文件 ................................................................................................................ - 8 - 3.3.4公共部分模块 .............................................................................................................. - 11 -3.4电路搭建 (12) 3.4.1电路原理图 .................................................................................................................. - 12 -第4章上位机关键代码分析 ...................................................................................................... - 12 - 4.1打开串口操作 (12) 4.2后台线程处理串口程序 (15) 4.3程序运行界面 (18) 第5章课程设计总结与体会 ...................................................................................................... - 19 -第6章致谢 .................................................................................................................................. - 19 -参考文献........................................................................................................................................... - 19 -

51单片机串口通信及波特率设置

51单片机串口通信及波特率设置 MCS-51单片机具有一个全双工的串行通信接口,能同时进行发送和接收。它可以作为UART(通用异步接收和发送器)使用,也可以作为同步的移位寄存器使用。 1. 数据缓冲寄存器SBUF SBUF是可以直接寻址的专用寄存器。物理上,它对应着两个寄存器,即一个发送寄存器一个接收寄存器,CPU写SBUF就是修改发送寄存器;读SBUF就是读接收寄存器。接收器是双缓冲的,以避免在接收下一帧数据之前,CPU未能及时的响应接收器的中断,没有把上一帧的数据读走而产生两帧数据重叠的问题。对于发送器,为了保持最大的传输速率,一般不需要双缓冲,因为发送时CPU是主动的,不会产生重叠问题。 2. 状态控制寄存器SCON SCON是一个逐位定义的8位寄存器,用于控制串行通信的方式选择、接收和发送,指示串口的状态,SCON即可以字节寻址也可以位寻址,字节地址98H,地址位为98H~9FH。它的各个位定义如下: MSB LSB SM0 SM1 SM2 REN TB8 RB8 TI RI SM0和SM1是串口的工作方式选择位,2个选择位对应4种工作方式,如下表,其中Fosc是振荡器的频率。 SM0 SM1 工作方式功能波特率 0 0 0 8位同步移位寄存器Fosc/12 0 1 1 10位UART 可变 1 0 2 11位UART Fosc/64或Fosc/32 1 1 3 11位UART 可变 SM2在工作方式2和3中是多机通信的使能位。在工作方式0中,SM2必须为0。在工作方式1中,若SM2=1且没有接收到有效的停止位,则接收中断标志位RI不会被激活。在工作方式2和3中若SM2=1且接收到的第9位数据(RB8)为0,则接收中断标志RB8不会被激活,若接收到的第9位数据(RB8)为1,则RI置位。此功能可用于多处理机通信。 REN为允许串行接收位,由软件置位或清除。置位时允许串行接收,清除时禁止串行接收。 TB8是工作方式2和3要发送的第9位数据。在许多通信协议中该位是奇偶位,可以按需要由软件置位或清除。在多处理机通信中,该位用于表示是地址帧还是数据帧。 RB8是工作方式2和3中接收到的第9位数据(例如是奇偶位或者地址/数据标识位),在工作方式1中若SM2=0,则RB8是已接收的停止位。在工作方式0中RB8不使用。 TI 为发送中断标志位,由硬件置位,软件清除。工作方式0中在发送第8位末尾由硬件置位;在其他工作方式时,在发送停止位开始时由硬件置位。TI=1时,申请中断。CPU 响应中断后,发送下一帧数据。在任何工作方式中都必须由软件清除TI。 RI为接收中断标志位,由硬件置位,软件清除。工作方式0中在接收第8位末尾由硬件置位;在其他工作方式时,在接收停止位的中间由硬件置位。RI=1时,申请中断,要求CPU取走数据。但在工作方式1中,SM2=1且未接收到有效的停止位时,不会对RI置位。在任何工作方式中都必须由软件清除RI。 系统复位时,SCON的所有位都被清除。 控制寄存器PCON也是一个逐位定义的8位寄存器,目前仅仅有几位有定义,如下所示:MSB LSB

C51单片机和电脑串口通信电路图

C51单片机和电脑串口通信电路图与源码 51单片机有一个全双工的串行通讯口,所以单片机和电脑之间可以方便地进行串口通讯。进行串行通讯时要满足一定的条件,比如电脑的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片MAX232进行转换,虽然也可以用几个三极管进行模拟转换,但是还是用专用芯片更简单可靠。我们采用了三线制连接串口,也就是说和电脑的9针串口只连接其中的3根线:第5脚的GND、第2脚的RXD、第3脚的TXD。这是最简单的连接方法,但是对我们来说已经足够使用了,电路如下图所示,MAX232的第10脚和单片机的11脚连接,第9脚和单片机的10脚连接,第15脚和单片机的20脚连接。 串口通讯的硬件电路如上图所示 在制作电路前我们先来看看要用的MAX232,这里我们不去具体讨论它,只要知道它是TTL和RS232电平相互转换的芯片和基本的引脚接线功能就行了。通常我会用两个小功率晶体管加少量的电路去替换MAX232,可以省一点,效果也不错,下图就是MAX232的基本接线图。

按图7-3加上MAX232就可以了。这大热天的拿烙铁焊焊,还真的是热气迫人来呀:P串口座用DB9的母头,这样就可以用买来的PC串口延长线进行和电脑相连接,也可以直接接到电脑com口上。

为了能够在电脑端看到单片机发出的数据,我们必须借助一个WINDOWS软件进行观察,这里我们利用一个免费的电脑串口调试软件。本串口软件在本网站https://www.doczj.com/doc/d22102659.html,可以找到 软件界面如上图,我们先要设置一下串口通讯的参数,将波特率调整为4800,勾选十六进制显示。串口选择为COM1,当然将网站提供的51单片机实验板的串口也要和电脑的COM1连接,将烧写有以下程序的单片机插入单片机实验板的万能插座中,并接通51单片机实验板的电源。

51单片机与PC机通信资料

《专业综合实习报告》 专业:电子信息工程 年级:2013级 指导教师: 学生:

目录 一:实验项目名称 二:前言 三:项目内容及要求 四:串口通信原理 五:设计思路 5.1虚拟串口的设置 5.2下位机电路和程序设计 5.3串口通信仿真 六:电路原理框图 七:相关硬件及配套软件 7.1 AT89C51器件简介 7.2 COMPIN简介 7.3 MAX232器件简介 7.4友善串口调试助手 7.5 虚拟串口软件Virtual Serial Port Driver 6.9八:程序设计 九:proteus仿真调试 十:总结 十一:参考文献 一:实验项目名称:

基于51单片机的单片机与PC机通信 二:前言 在国内外,以PC机作为上位机,单片机作为下位机的控制系统中,PC机通常以软件界面进行人机交互,以串行通信方式与单片机进行积极交互,而单片机系统根据被控对象配置相应的前向,后向信息通道,工作时作为主控机测对象,作为被控机接受PC机监督,指挥,定期或受命向上位机提供对象及本身的工作状态信息。 目前,随着集成电路集成度的增加,电子计算机向微型化和超微型化方向发展,微型计算机已成为导弹,智能机器人,人类宇宙和太空和太空奥妙复杂系统不可缺少的智能部件。在一些工业控制中,经常需要以多台单片机作为下位机执行对被控对象的直接控制,以一台PC机为上位机完成复杂的数据处理,组成一种以集中管理、分散控制为特点的集散控制系统。 为了提高系统管理的先进性和安全性,计算机工业自动控制和监测系统越来越多地采用集总分算系统。较为常见的形式是由一台做管理用的上位主计算机(主机)和一台直接参与控制检测的下位机(单片机)构成的主从式系统,主机和从机之间以通讯的方式来协调工作。主机的作用一是要向从机发送各种命令及参数:二是要及时收集、整理和分析从机发回的数据,供进一步的决策和报表。从机被动地接受、执行主机发来的命令,并且根据主机的要求向主机回传相应烦人实时数据,报告其运行状态。 用串行总线技术可以使系统的硬件设计大大简化、系统的体积减小、可靠性提高。同时,系统的更改和扩充极为容易。MCS-51系列单片机,由于内部带有一个可用于异步通讯的全双工的穿行通讯接口,阴齿可以很方便的构成一个主从式系统。 串口是计算机上一种非常通用的设备通讯协议,大多数计算机包容两个基于RS232的串口。串口同时也是仪器仪表设备通过用的通讯协议,很多GPIB兼容的设备也带有RS-232口。同时串口通讯协议也可以用于获取远程采集设备数据。所以,深入的理解学习和研究串口通信相关知识是非常必要的。此次毕业设计选题为“PC机与MCS-51单片机的串口通讯”,使用51单片机来实现一个主从式

汇编语言实现串口通信(PC和单片机间)教学文案

8.用C语言或汇编语言实现串口通信(PC和单片机间) 上位机和下位机的主从工作方式为工业控制及自动控制系统所采用。由于PC 机分析能力强、处理速度更快及单片机使用灵活方便等特点,所以一般都将PC 机作为上位机,单片机作为下位机,二者通过RS-232或者RS-485接收、发送数据和传送指令。单片机可单独处理数据和控制任务,同时也将数据传送给PC机,由PC机对这些数据进行处理或显示 1 硬件电路的设计 MCS-51单片机有一个全双工的串行通讯口UART,利用其RXD和TXD与外界进行通信,其内部有2个物理上完全独立的接收、发送缓冲器SBUF,可同时发送和接收数据。所以单片机和PC机之间可以方便地进行串口通讯。单片机串口有3条引线:TXD(发送数据),RXD(接收数据)和GND(信号地)。因此在通信距离较短时可采用零MODEM方式,简单三连线结构。IBM-PC机有两个标准的RS-232串行口,其电平采用的是EIA电平,而MCS-51单片机的串行通信是由TXD(发送数据)和RXD(接收数据)来进行全双工通信的,它们的电平是TTL电平;为了PC机与MCS-51 机之间能可靠地进行串行通信,需要用电平转换芯片,可以采用MAXIM公司生产的专用芯片MAX232进行转换。电路如图1所示。硬件连接时,可从MAX232中的2路发送器和接收器中任选一路,只要注意发送与接收的引脚对应关系即可。接口电路如图3.5所示。

总体设计按照整体设计思路方案绘制原理图如下所示: 2 系统软件设计 软件设计分上位机软件设计和下位机软件设计。这两部分虽然在不同的机器上编写和运行,但它们要做的工作是对应的:一个发送,另一个接收。为了保证数据通信的可靠性,要制定通信协议,然后各自根据协议分别编制程序。现约定通信协议如下:PC机和单片机都可以发送和接收。上位机和下位机均采用查询方式发送控字符和数据、中断方式接收控制字符和数据。采用RS-232串口异步通信, 1上位PC机与下位单片机异步串行通信的通信协议

51单片机串口 (1)

一.基础 ●SM2,多机通信控制位,主要用于方式2和方式3。当接收机的SM2=1时可以利用收到的RB8来控制是否激活RI(RB8=0时不激活RI,收到的信息丢弃;RB8=1时收到的数据进入SBUF,并激活RI,进而在中断服务中将数据从SBUF读走)。当SM2=0时,不论收到的RB8为0和1,均可以使收到的数据进入SBUF,并激活RI(即此时RB8不具有控制RI 激活的功能)。通过控制SM2,可以实现多机通信。 在方式0时,SM2必须是0。在方式1时,若SM2=1,则只有接收到有效停止位时,RI才置1。 ●REN,允许串行接收位。由软件置REN=1,则启动串行口接收数据;若软件置REN=0,则禁止接收。 ●TI,发送中断标志位。在方式0时,当串行发送第8位数据结束时,或在其它方式,串行发送停止位的开始时,由内部硬件使TI置1,向CPU发中断申请。在中断服务程序中,必须用软件将其清0,取消此中断申请。 ●RI,接收中断标志位。在方式0时,当串行接收第8位数据结束时,或在其它方式,串行接收停止位的中间时,由内部硬件使RI置1,向CPU发中断申请。也必须在中断服务程序中,用软件将其清0,取消此中断申请。

波特率的计算 在串行通信中,收发双方对发送或接收数据的速率要有约定。通过软件可对单片机串行口编程为四种工作方式,其中方式0和方式2的波特率是固定的,而方式1和方式3的波特率是可变的,由定时器T1的溢出率来决定。 串行口的四种工作方式对应三种波特率。由于输入的移位时钟的来源不同,所以,各种方式的波特率计算公式也不相同。

方式0的波特率= fosc/12 方式2的波特率=(2SMOD /64)·fosc 方式1的波特率=(2SMOD /32)·(T1溢出率) 方式3的波特率=(2SMOD /32)·(T1溢出率) 当T1作为波特率发生器时,最典型的用法是使T1工作在自动再装入的8位定时器方式(即方式2,且TCON的TR1=1,以启动定时器)。这时溢出率取决于TH1中的计数值。 T1 溢出率= fosc /{12×[256 -(TH1)]} 根据上面的等式计算出TH1 写串口程序的步骤 1.串行口工作之前,应对其进行初始化,主要是设置产生波特率的定 时器1、串行口控制和中断控制。具体步骤如下: ?确定T1的工作方式(编程TMOD寄存器)(方式2 0x20); ?计算T1的初值,装载TH1、TL1;(有波特率计算) ?启动T1(编程TCON中的TR1位); ?确定串行口控制(编程SCON寄存器);{SM0,SM1,REN} 串行口在中断方式工作时,要进行中断设置(编程IE、IP寄存器)。

MCS-51单片机串行接口

第七章MCS-51单片机串行接口 第一节串行通信的基本概念 (一)学习要求 1.掌握串行通信的基本概念。 2. 掌握异步通信和同步通信的区别。 (二)内容提要 一:基本概念及分类 串行通信是将数据的各位一位一位地依次传送。适合于计算机之间、计算机与外部设备之间的远距离通信。 串行通信从传输方式分为: 单工方式、半双工方式、全双工方式。 从接收方式来说,串行通信有两种方式: 异步通信方式、同步通信方式。 二:串行口的功能 MCS-51单片机中的异步通信串行接口能方便地与其他计算机或传送信息的外围设备(如串行打印机、CPU终端等)实现双机、多机通信。 串行口有4种工作方式,见表7-1。方式0并不用于通信,而是通过外接移位寄存器芯片实现扩展并行I/O接口的功能。该方式又称为移位寄存器方式。方式1、方式2、方式3都是异步通信方式。方式1是8位异步通信接口。一帧信息由10位组成,其格式见图7-2a。方式1用于双机串行通信。方式2、方式3都是9位异步通信接口、一帧信息中包括9位数据,1位起始位,1位停止位,其格式见图7-2b。方式2、方式3的区别在于波特率不同,方式2、方式3主要用于多机通信,也可用于双机通信。 表7-1 (三)习题与思考题 1、什么是并行通信?什么是串行通信?各有何优缺点? 答:并行通信指数据的各位同时传输的通信方式,串行通信是指各位数据逐位顺序传输的通信方式。 2、什么是异步通信?什么是同步通信?各有何优缺点? 3、什么是波特率?某异步串行通信接口每分钟传送1800个字符,每个字符由11位组成,请计算出传送波特率。 第二节MCS-51串行接口的组成 (一)学习要求

基于51单片机的双机串行通信

机电高等专科学校2015-2016学年第1学期通信实训报告 系别:电子通信工程系 班级: xxxxxx 学号: 13xxxxxxxxx : xxxxxxx 2015年12月

基于51单片机的双机串行通信 摘要:串行通信是单片机的一个重要应用,本次课程设计就是要利用单片机来完成一个系统,实现爽片单片机床航通信,通信的结果使用数码管进行显示,数码管采用查表方式显示,两个单片机之间采用RS-232进行双击通信。在通信过程中,使用通信协议进行通信。 关键字:通信双机 一、总体设计 1设计目的 1.通过设计相关模块充分熟悉51单片机的最小系统的组成和原理; 2.通过软件仿真熟悉keil和proteus的配合使用; 3.通过软件编程熟悉51的C51编程规; 4.通过实际的硬件电路搭设提高实际动手能力。 2.设计要求: 两片单片机之间进行串行通信,A机将0x06发送给B机,在B机的数码管上静态显示1,B机将0~f动态循环发送到A机,并在其数码管上显示。 3.设计方案: 软件部分,通过通信协议进行发送接收,A机先送0x06(B机数码管显示1)给B机(B机静态显示),当从机接收到后,向B机发送代表0-f的数码管编码数组。B收到0x06后就把数码表TAB[16]中的数据送给从机。 二、硬件设计 1.51单片机串行通信功能 计算机与外界的信息交换称为通信,常用的通信方式有两种:并行通信和串行通信。51单片机用4个接口与外界进行数据输入与数据输出就是并行通信,并行通信的特点是传输信号的速度快,但所用的信号线较多,成本高,传输的距离较近。串行通信的特点是只用两条信号线(一条信号线,再加一条地线作为信号回路)即可完成通信,成本低,传输的距离较远。 51单片机的串行接口是一个全双工的接口,它可以作为UART(通用异步接受和发送器)用,也可以作为同步移位寄存器用。51单片机串行接口的结构如下:

51单片机usart通信程序(有CRC校验)

#include #include #include #define uchar unsigned char #define uint unsigned int //uchar const table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uchar p[]={0x01,0x03,0x25,0x23,0x00,0x01}; /* CRC 高位字节值表*/ uchar const crchi[] = { 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0/**/, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 } ; /* CRC低位字节值表*/ uchar const crclo[] = { 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06/**/, 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,

实验单片机与PC机串口通信

实验单片机与PC机串口通信(C51编程)实验 要求: 1、掌握串行口的控制与状态寄存器SCON 2、掌握特殊功能寄存器PCON 3、掌握串行口的工作方式及其设置 4、掌握串行口的波特率(bondrate)选择 任务: 1、实现PC机发送一个字符给单片机,单片机接收到后即在个位、十位数码管上进行显示,同时将其回发给PC机。要求:单片机收到PC机发来的信号后用串口中断方式处理,而单片机回发给PC机时用查询方式。 采用软件仿真的方式完成,用串口调试助手和KEIL C,或串口调试助手和PROTEUS分别仿真。 需要用到以下软件:KEIL,VSPDXP5(虚拟串口软件),串口调试助手,Proteus。 (1)虚拟串口软件、串口调试助手和KEIL C的联调 首先在KEIL里编译写好的程序。

打开VSPD,界面如下图所示:(注明:这个软件用来进行串口的虚拟实现。在其网站上可以下载,但使用期为2周)。 左边栏最上面的是电脑自带的物理串口。点右边的addpair,可以添加成对的串口。一对串口已经虚拟互联了,如果添加的是COM3、COM4,用COM3发送数据,COM4就可以接收数据,反过来也可以。 接下来的一步很关键。把KEIL和虚拟出来的串口绑定。现在把COM3和KEIL绑定。在KEIL中进入DEBUG模式。在最下面的COMMAND命令行,输入 modecom39600,0,8,1 %分别设置com3的波特率、奇偶校验 位、数据位、停止位 assigncom3sout %把单片机的串口和COM3绑定到一 起。因为所用的单片机是

(以上参数设置注意要和所编程序中设置一致!) 打开串口调试助手 可以看到虚拟出来的串口COM3、COM4,选择COM4,设置为波特率9600,无校验位、8位数据位,1位停止位(和COM3、程序里的设置一样)。打开COM4。 现在就可以开始调试串口发送接收程序了。可以通过KEIL发送数据,在串口调试助手中就可以显示出来。也可以通过串口调试助手发送数据,在KEIL中接收。 实验实现PC机发送一个字符给单片机,单片机接收到后将其回发给PC机。在调试助手上(模拟PC)发送数据,单片机收到后将收到的结果回送到调试助手上。 2、以下在Proteus和串口调试助手实现的结果: 将编译好的HEX程序加载到Proteus中,注意这里需要加上串口模块,用来进行串行通信参数的设置。 点击串口,可以对串口进行设置: 用串口调试助手发送数据,即可看到仿真结果。 实验参考程序源文件在exp2-comm文件夹中。

【最新编排】基于51单片机的DHT11串口通讯

//****************************************************************// // DHT 使用范例 //单片机 AT89S5 或 STC89C5 RC // 功能 串口发送温湿度数据波特率 9600 //硬件连接 P .0口为通讯口连接DHT ,DHT 地电源和地连接单片机地 电源和地 单片机串口加MAX 3 连接电脑 // 公司 济南联诚创发科技有限公司 //****************************************************************// #include #include // typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 无符号8位整型变量 */ typedef signed char S8; /* defined for signed 8-bits integer variable 有符号8位整型变量 */ typedef unsigned int U 6; /* defined for unsigned 6-bits integer variable 无符号 6位整型变量 */ typedef signed int S 6; /* defined for signed 6-bits integer variable 有符号 6位整型变量 */ typedef unsigned long U3 ; /* defined for unsigned 3 -bits integer variable 无符号3 位整型变量 */ typedef signed long S3 ; /* defined for signed 3 -bits integer variable 有符号3 位整型变量 */ typedef float F3 ; /* single precision floating point variable (3 bits) 单精度浮点数 3 位长度 */ typedef double F64; /* double precision floating point variable (64bits) 双精度浮点数 64位长度 */ // #define uchar unsigned char #define uint unsigned int #define Data_0_time 4 //----------------------------------------------// //----------------IO口定义区--------------------// //----------------------------------------------// sbit P _0 = P ^0 ; sbit P _ = P ^ ; sbit P _ = P ^ ; sbit P _3 = P ^3 ;

51单片机串口通信

一、串口通信原理 串口通讯对单片机而言意义重大,不但可以实现将单片机的数据传输到计算机端,而且也能实现计算机对单片机的控制。由于其所需电缆线少,接线简单,所以在较远距离传输中,得到了广泛的运用。串口通信的工作原理请同学们参看教科书。 以下对串口通信中一些需要同学们注意的地方作一点说明: 1、波特率选择 波特率(Boud Rate)就是在串口通信中每秒能够发送的位数(bits/second)。MSC-51串行端口在四种工作模式下有不同的波特率计算方法。其中,模式0和模式2波特率计算很简单,请同学们参看教科书;模式1和模式3的波特率选择相同,故在此仅以工作模式1为例来说明串口通信波特率的选择。 在串行端口工作于模式1,其波特率将由计时/计数器1来产生,通常设置定时器工作于模式2(自动再加模式)。在此模式下波特率计算公式为:波特率=(1+SMOD)*晶振频率/(384*(256-TH1)) 其中,SMOD——寄存器PCON的第7位,称为波特率倍增位; TH1——定时器的重载值。 在选择波特率的时候需要考虑两点:首先,系统需要的通信速率。这要根据系统的运作特点,确定通信的频率范围。然后考虑通信时钟误差。使用同一晶振频率在选择不同的通信速率时通信时钟误差会有很大差别。为了通信的稳定,我们应该尽量选择时钟误差最小的频率进行通信。 下面举例说明波特率选择过程:假设系统要求的通信频率在20000bit/s以下,晶振频率为12MHz,设置SMOD=1(即波特率倍增)。则TH1=256-62500/波特率 根据波特率取值表,我们知道可以选取的波特率有:1200,2400,4800,9600,19200。列计数器重载值,通信误差如下表: 因此,在通信中,最好选用波特率为1200,2400,4800中的一个。 2、通信协议的使用 通信协议是通信设备在通信前的约定。单片机、计算机有了协议这种约定,通信双方才能明白对方的意图,以进行下一步动作。假定我们需要在PC机与单片机之间进行通信,在双方程式设计过程中,有如下约定:0xA1:单片机读取P0端口数据,并将读取数据返回PC机;0xA2:单片机从PC机接收一段控制数据;0xA3:单片机操作成功信息。 在系统工作过程中,单片机接收到PC机数据信息后,便查找协议,完成相应的操作。当单片机接收到0xA1时,读取P0端口数据,并将读取数据返回PC机;当单片机接收到0xA2时,单片机等待从PC机接收一段控制数据;当PC机接收到0xA3时,就表明单片机操作已经成功。 3、硬件连接 51单片机有一个全双工的串行通讯口,所以单片机和计算机之间可以方便地进行串口通讯。进行串行通讯时要满足一定的条件,比如计算机的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片MAX232进行转换,虽然也可以用几个三极管进行模拟转换,但是还是用专用芯片更简单可靠。我们采用了三线制连接串口,也就是说和计算机的9针串口只连接其中的3根线:第5脚的GND、第2脚的RXD、第3脚的TXD。这是最简单的连接方法,但是对我们来说已经足够使用了,电路如下图所示,MAX232的第10脚和单片机的11脚连接,第9脚和单片机的10脚连接,第15脚和单片机的20脚连接。

51单片机串口通信,232通信,485通信,程序

51单片机串口通信,232通信,485通信,程序代码1:232通信 #include #define uchar unsigned char #define uint unsigned int uchar flag,a,i; uchar code table[]="i get"; void init() { TMOD=0X20; TH1=0XFD; TH0=0XFD; TR1=1; REN=1; SM0=0; SM1=1; EA=1; ES=1; } void main() { init();

while(1) { if(flag==1) { ES=0; for(i=0;i<6;i++) { SBUF=table[i]; while(!TI); TI=0; } SBUF=a; while(!TI); TI=0; ES=1; flag=0; } } } void ser() interrupt 4 {

RI=0; a=SBUF; flag=1; } 代码2:485通信 #include #include"1602.h" #define uchar unsigned char #define uint unsigned int unsigned char flag,a,i; uchar code table[]="i get "; void init() { TMOD=0X20; TH1=0Xfd; TL1=0Xfd; TR1=1; REN=1; SM0=0; SM1=1; EA=1; ES=1;

} void main() { init_1602(); init(); while(1) { if(flag==1) { display(0,a); } } } void ser() interrupt 4 { RI=0; a=SBUF; flag=1; }

单片机与PC机串口通信实现正文

毕业设计(论文)课题:单片机与PC机串口通信实现 学生: 孙波系部: 通信工程 班级: 通信1301 学号: 2013120325 指导教师: 童华 装订交卷日期: 2016年x月x日 装订顺序: (1)封面(2)毕业设计(论文)成绩评定记录(3)标题、中文摘要及关键词(4)正文(5)附录(6)参考文献

毕业设计(论文)成绩评定记录表 注:1.此表适用于不参加毕业答辩学生的毕业设计(论文)成绩评定; 2.平时成绩占40%、卷面评阅成绩占60%,在上面的评分表中,可分别按40分、60分来量化评分,二项相加所得总分即为总评成绩,总评成绩请转换为优秀、良好、中等、及格、不及格五等级计分。 教务处制

重庆电子工程职业学院 毕业设计(论文)开题报告 系别通信工程专业通信技术班级通信1301 学生姓名孙波学号2013120325 指导教师童华 一、毕业设计的内容和意义: 目前,随着计算机和微电子技术的高速发展,单片机在国民经济的各个领域的智能化控制中得到了非常广泛的应用。单片机已成为信息处理、物联网络、通信设备、工业控制、家用电器等各个领域不可缺少的智能部件。在一些工业控制中,经常需要以单片机作为下位机执行对被控对象的直接控制,以PC机为上位机完成复杂的数据处理,组成主从式控制系统。 为了提高系统管理的先进性,计算机工业自动控制和监测系统越来越多的采用主从式系统。较为常见的形式是由一台做管理用的上位机计算机(主机)和一台直接参与控制检测的下位机单片机(从机)构成的主从式系统,主机和从机之间以通讯的方式来协调工作。主机的作用一是向从机发送各种命令及参数;二是要及时收集、整理和分析从机发回的数据,供进一步的决策。从机被动的接收、执行主机发

51单片机串口通信的原理与应用流程解析

51单片机串口通信的原理与应用流程解析 一、原理简介 51 单片机内部有一个全双工串行接口。什么叫全双工串口呢?一般来说,只能接受或只能发送的称为单工串行;既可接收又可发送,但不能同时进行的称为半双工;能同时接收和发送的串行口称为全双工串行口。串行通信是指数据一位一位地按顺序传送的通信方式,其突出优点是只需一根传输线,可大大降低硬件成本,适合远距离通信。其缺点是传输速度较低。 与之前一样,首先我们来了解单片机串口相关的寄存器。 SBUF 寄存器:它是两个在物理上独立的接收、发送缓冲器,可同时发送、接收数据,可通过指令对SBUF 的读写来区别是对接收缓冲器的操作还是对发送缓冲器的操作。从而控制外部两条独立的收发信号线RXD(P3.0)、TXD(P3.1),同时发送、接收数据,实现全双工。 串行口控制寄存器SCON(见表1)。 表1 SCON寄存器 表中各位(从左至右为从高位到低位)含义如下。 SM0 和SM1 :串行口工作方式控制位,其定义如表2 所示。 表2 串行口工作方式控制位 其中,fOSC 为单片机的时钟频率;波特率指串行口每秒钟发送(或接收)的位数。 SM2 :多机通信控制位。该仅用于方式2 和方式3 的多机通信。其中发送机SM2 = 1(需要程序控制设置)。接收机的串行口工作于方式2 或3,SM2=1 时,只有当接收到第9 位数据(RB8)为1 时,才把接收到的前8 位数据送入SBUF,且置位RI 发出中断申请引发串行接收中断,否则会将接受到的数据放弃。当SM2=0 时,就不管第位数据是0 还是1,都将数据送入SBUF,并置位RI 发出中断申请。工作于方式0 时,SM2 必须为0。

51单片机串口通信讲解

51系列单片机串口通信实例教程 单片机的串口通信看起来是很复杂的,主要是因为他用到了更多的寄存器,与前面的知识相比他更具综合能力,写起来考虑的问题自然也变多了.而前面学习过的定时器与中断将是单片机通信的基础. 单片机的中断系统中第4个中断就是串口中断,要进行串口通信首先就要打开CPU总中断EA,还要打开串口通信中断ES,这是串口通信的前堤,而串口通信也跟计时器一样有很多的模式,因此我们还要设置SCON寄存器来指定采用哪一种方式进行通信,而在通信的过程中,我们还要设定通信的波特率,不然的话,单片机是没办法进行采样的,这样也不会得到正确的结果了.我在实验过程中用到的是1号定时器来设定的波特率,用到了计时器方式2,也就是8位自动重装,这样可以简化编程,她的实现思想就是将常数放入TH,而TL中则是初始化参数,当溢出时,单片机会自动将TH中的常数装入TL中. 再来说说波特率,我们为什么要设定波特率,因为单片机会以16倍波特率的速度进行采样,而在实验中我们用的是10位异步收发方式,因此要将SM0置0,SM1置1.而其中的10位

有8位数据位,第一位和最后一位是发送数据的起始与结束.采用高的皮特率就不会出错啦.而波特率是有一个公式的: 方式0的波特率 = fosc/12 方式2的波特率 =(2SMOD/64)· fosc 方式1的波特率 =(2SMOD/32)·(T1溢出率) 方式3的波特率 =(2SMOD/32)·(T1溢出率) T1 溢出率= fosc /{12×[256 -(TH1)]} 根据公式我们很容易就算出当晶振为110592HZ时,要达到9600的波特率,我们只需要将TL1置FDH即可,如下图: 除此之外,你还要将SCON中的REN位置1,不然的话,单片机是不会接收数据的. 还有不要忘了选择定时器的工作方式,设置TMOD为0x20既是工作方式2,8位自动重装定时器. 这样一来,初始批工作算是差不多了.而串口通信分为中断方式,和查询方式,如果你想用查询方式你也不用设置IE寄存器了. 在串口通信中,还有一个很重要的寄存器SBUF,其实也不是一个,是两个,只是它们共用同一个地址,再热气表达式的不同,单片机会自动选择使用哪一个SBUF. 下面是我写的一个例子程序,产生的效果是:向单片机发送任一个0~255之间的数,将会被显示到数码管上.并且单片机还会自动把刚才传过去的数又发送回来 ,实验过程中用到了几个工具如下:

相关主题
文本预览
相关文档 最新文档