《单片机串行通信实验报告.pdf》由会员分享,可在线阅读,更多相关《单片机串行通信实验报告.pdf(24页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 单片机串行通信实验报告 实验六 串行通信 实验报告 班级:学号:姓名:教师:init();delay(200);while(1)send();send(1);send(2);send(1);send(3);send(2);send(2);send(3);send(1);/*初始化*/void init(void)SCON=0 x40;/串口模式 1 只发 送不接收 TMOD=0 x20;/T1 工作模式 2 TH1=0 xf4;/波特率 2400 TL1=0 xf4;PCON=0 x00;/不加倍 SMOD=0 TI=0;TR1=1;/开定时中断 /*发送函数*/void send(ucha
2、r temp)SBUF=temp;while(TI=0);TI=0;delay(50);/*延时函数*/void delay(uchar i)unsigned int j;for(i;i0;i-)for(j=0;j100;j+);乙机(U2)代码:#include#define uchar unsigned char#define uint unsigned int void init(void);void delay(uchar t);void xianshi(void);uchar code distable=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7
3、d,0 x07,0 x7f,0 x6f;/共阴数码管段码 uchar code wi=0 x01,0 x02,0 x04,0 x08,0 x10,0 x20,0 x40,0 x80;uchar tab9=0,0,0,0,0,0,0,0,0;uchar i=0,temp;uint a,b,c,d,e,f,g,h;void main()init();while(1)xianshi();/初始化/void init(void)PCON=0 x00;/不加倍 SMOD=0 SCON=0 x50;/设置串口方式 1 且允许串口接收 REN=1 TMOD=0 x20;/设置 T1 为方式 2 TH1=0
4、xf4;TL1=0 xf4;/设置波特率 2400 TR1=1;/开启定时器 1 ES=1;/允许串行口中断 EA=1;/允许全局中断 /串口中断接收程序/void receive()interrupt 4 temp=SBUF;while(RI=0);RI=0;if(temp=)temp=0;tabi=temp;i+;if(i=9)i=0;a=tab1;b=tab2;c=tab3;d=tab4;e=tab5;f=tab6;g=tab7;h=tab8;/数码管显示/void xianshi(void)uchar i,dm,wx;/m1:m0 00=标准;01=推挽;10=输入;11=开漏输出 P
5、1M1=0X00;P1M0=0Xff;P2M1=0X00;P2M0=0Xff;/设定 P1,P2 推挽输出 while(1)for(i=1;i9;i+)/rami=tabi;dm=distabletabi;/取显示段码 wx=wii-1;/取位选码 P1=0 x00;/关显示 P2=dm;/段码赋给 P2 口 P1=wx;/点亮位选的那个数码管 delay(1);/延时 /*uchar k,ram8;ram0=a;ram1=b;ram2=c;ram3=d;ram4=e;ram5=f;ram6=g;ram7=h;for(k=0;k0;x-)for(y=25;y0;y-)for(z=100;z0;
6、z-);2、仿真结果 3、问题分析 在数码管显示这块,刚开始是这样写的 在 proteus 上仿真的时候是没有任何问题的,但是后来在实验板上数码管显示特别暗,几乎看不出来有显示数字,想了想可能是没有加推挽输出,然后就将推挽输出代码加入,然后重新 下载,但是结果和之前没什么不同。后来想既然这样的话,那就不是推挽的问题了,是这段显示代码有问题,于是将显示代码改为数码管的动态扫描。这样的话,在 Proteus 上仿真和实验板上都能出来结果了。二、单片机与PC机通信 单片机向 PC 机发送数据。单片机向 PC 机重复发送本机(学生本人)学号,发送波特率为 1200,采用方式 1,单片机外部晶振频率为1
7、1.0592M。Proteus 仿真电路:由于是 1200 的波特率,需要注意的是:将这里要改为 1200 1、C 源程序清单#include#define uchar unsigned char void delay(uchar i);void send(uchar temp);void init(void);void main(void)init();/delay(50);while(1)send(0 x31);send(0 x32);send(0 x31);send(0 x33);send(0 x32);send(0 x32);send(0 x33);send(0 x31);send(0
8、 x20);/*初始化*/void init(void)SCON=0 x40;/串口模式 1 只发送不接收 TMOD=0 x20;/T1 工作模式 2 TH1=0 xe8;/波特率 1200 TL1=0 xe8;PCON=0 x00;/不加倍 SMOD=0 TI=0;TR1=1;/开定时中断 /*发送函数*/void send(uchar temp)SBUF=temp;while(TI=0);TI=0;delay(50);/*延时函数*/void delay(uchar i)unsigned int j;for(i;i0;i-)for(j=0;j100;j+);2、运行结果 Proteus 仿
9、真:PC 机:3、问题分析 这个程序其实和上一个的甲机程序大同小异,需要注意的是,发送的是ASCll 码。三、问题解答 1、在该实验中,单片机串行口工作在什么工作方式下?说明该工作方式的特点。答:串行口是工作在方式 1。方式 1 特点:(1)、8 位 UART 接口。(2)、帧结构为 10 位,包括起始位(为 0),8 位数据位,1 位停止位。(3)、波特率由指令设定,由T1 的溢出率决定。2、波特率是什么?怎样设置单片机串口通讯的波特率?如果实验要求通讯波特率为 4800bps,怎样修改程序?答:模拟线路信号的速率,以波形每秒的振荡数来衡量。如果数据不压缩,波特率等于每秒钟传输的数据位数,如
10、果数据进行了压缩,那么每秒钟传输的数据位数通常大于调制速率,使得交换使用波特和比特/秒偶尔会产生错误。在信息传输通道中,携带数据信息的信号单元叫码元,每秒钟通过信道传输的码元数称为码元传输速率,简称波特率。波特率是指数据信号对载波的调制速率,它用单位时间内载波调制状态改变的次数来表示(也就是每秒调制的符号数),其单位是波特(Baud,symbol/s)。波特率是传输通道频宽的指标。波特率设置:串行口的四种工作方式对应三种波特率。由于输入的移位时钟的来源不同,所以,各种方式的波特率计算公式也不相同。方式 0 的波特率=fosc/12 方式 2 的波特率=((2SMOD)/64)fosc 方式 1
11、 的波特率=((2SMOD)/32)(T1 溢出率)方式 3 的波特率=((2SMOD)/32)(T1 溢出率)注意:SMOD 为 PCON 寄存器的最高位(即PCOM)。T1 溢出率=fosc/12256(TH1)-将该公式代人方式 1 或 3 最后推出公式:TH1=256-(fosc*2SMOD)/(baudrate*12*32)如果你用方式 2(波特率=((2SMOD)/64)fosc)的话,12M 的晶振就不能得到 9600 波特率了(除非你改变你的晶振),所以你只能选择方式 1 或 3。而且 12M 的晶振在串口传输时会有误差,就如你上面算的那样结果会有小数点,TH1 又只能是整数的,所以传输时会有误差。如果是 4800 的波特率,将初始化程序里的TH1、TL1 的值改为 0 xfa 即可 11.0592MHZ 的晶振 标准波特率 实际波特率 定时器预置数 150 150 0X41 200 200 0X70 300 300 0XA0 600 600 0XD0 1200 1200 0XE8 2400 2400 0XF4 4800 4800 0XFA 7200 7200 0XFC 9600 9600 0XFD 14400 14400 0XFE 28800 28800 0XFF
限制150内