单片机单片机课程设计-双机串行通信.doc_第1页
单片机单片机课程设计-双机串行通信.doc_第2页
单片机单片机课程设计-双机串行通信.doc_第3页
单片机单片机课程设计-双机串行通信.doc_第4页
单片机单片机课程设计-双机串行通信.doc_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单片机课程设计报告姓名: 学号:组员: 班级:电子信息工程1班题目:单片机双机串行通信学院:信息科学技术学院指导老师: 设计时间:2014年9月10日 - 9月15日2一、总体设计1.实现功能:用单片机的串口模拟短信的收发,当a主机要向b主机发送一行字符串时,首先a主机把这行字符串打印到1602lcd液晶屏幕上,当a主机按发送按键的时候,a主机向b主机发送一行字符串,这时字符串会通过串口发送到b主机上,当b主机收到字符串时,会在1602lcd液晶屏幕上把字符串打印出来,这时按下b主机上的接受按键,b主机会把要发送的字符串,打印到b主机的1602lcd液晶屏幕上,按下b主机的发送按键,这时b主机会通过串口向a主机发送字符串。最后用两个矩阵键盘模拟发送短信用的字母键盘,a主机可以通过矩阵键盘输入想要发送的数据,然后按发送按键发送,同样b主机也可以通过矩阵键盘输入信息,然后通过发送按键发送。2. 设计方案:首先把两个ats89c51各自连接成单片机最小系统,在把他们的txd、rxd口分别与max232相连,然后一个max232的t1out和r1in ,分别与另一个max232的r1in和t1out相连,p0口接矩阵键盘,p1口接液晶显示的数据端。总的电路图如图:图1、总电路图二、设计基础1.单片机串行口通信方式图2.at89c51计算机与外界的信息交换称为通信,常用的通信方式有两种:并行通信和串行通信。51单片机用4个接口与外界进行数据输入与数据输出就是并行通信,并行通信的特点是传输信号的速度快,但所用的信号线较多,成本高,传输的距离较近。串行通信的特点是只用两条信号线(一条信号线,再加一条地线作为信号回路)即可完成通信,成本低,传输的距离较远。51单片机的串行接口是一个全双工的接口,它可以作为uart(通用异步接受和发送器)用,也可以作为同步移位寄存器用。51单片机串行接口的结构如下:(1)数据缓冲器(sbuf)接受或发送的数据都要先送到sbuf缓存。有两个,一个缓存,另一个接受,用同一个接地址99h,发送时用指令将数据送到sbuf即可启动发送;接收时用指令将sbuf中接收到的数据取出。(2)串行控制寄存器(pcon)scon用于串行通信方式的选择,收发控制及状态指示,各位含义如下:sm0sm1sm2rentb8rb8tirism0,sm1:串行接口工作方式选择位,这两位组合成00,01,10,11对应于工作方式0、1、2、3。串行接口工作方式特点见下表sm0sm1工作方式功能波特率 0008位同步移位寄存器(用于i/o扩展)forc/1201110位异步串行通信(uart)可变(t1溢出率*2smod/32)10211位异步串行通信(uart)forc/64或forc/3211311位异步串行通信(uart)可变(t1溢出率*2smod/32)sm2:多机通信控制位。ren:接收允许控制位。软件置1允许接收;软件置0禁止接收。tb8:方式2或3时,tb8为要发送的第9位数据,根据需要由软件置1或清0。rb8:在方式2或3时,rb8位接收到的第9位数据,实际为主机发送的第9位数据tb8,使从机根据这一位来判断主机发送的时呼叫地址还是要传送的数据。ti:发送中断标志。发送完一帧数据后由硬件自动置位,并申请中断。必须要软件清零后才能继续发送。ri:接收中断标志。接收完一帧数据后由硬件自动置位,并申请中断。必须要软件清零后才能继续接收。(3)输入移位寄存器接收的数据先串行进入输入移位寄存器,8位数据全移入后,再并行送入接收sbuf中。(4)波特率发生器波特率发生器用来控制串行通信的数据传输速率的,51系列单片机用定时器t1作为波特率发生器,t1设置在定时方式。波特率用来表示串行通信数据传输快慢程度的物理量,定义为每秒钟传送的数据位数。(5)电源控制寄存器pcon,其最高位为smod。(6)波特率计算对于方式1和方式3,波特率都是由定时器1的溢出率决定,计算公式如下: 定时器t1工作于方式0时,k=13;定时器t1工作于方式1时,k=16;定时器t1工作于方式2和方式3,k=8;2、1602lcd操作(1)1602lcd特性:+5v电压,对比度可调内含复位电路提供各种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等多种功能有80字节显示数据存储器ddram内建有160个5x7点阵的字型的字符发生器cgrom8个可由用户自定义的5x7的字符发生器cgram字符型lcd1602通常有14条引脚线或16条引脚线的lcd,多出来的2条线是背光电源线vcc(15脚)和地线gnd(16脚)图3、1602各引脚的定义hd44780内置了ddram(显示数据存储ram)、cgrom(字符存储rom)和cgram(用户自定义ram)。 ddram就是显示数据ram,用来寄存待显示的字符代码。共80个字节,其地址和屏幕的对应关系如下表: 也就是说想要在lcd1602屏幕的第一行第一列显示一个“a”字,就要向ddram的00h地址写入“a”的代码就行了。但具体的写入是要按lcd模块的指令格式来进行的,后面我会讲到的。一行有40个地址 在1602中我们就用前16个就行了。第二行也一样用前16个地址。对应如下: ddram地址与显示位置的对应关系 1602液晶模块内部的字符发生存储器(cgrom)已经存储了160个不同的点阵字符图形,如下表所示,这些字符有:阿拉伯数字、英文字母的大小写、常 用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“a”的代码是01000001b(41h),显示时模块把地址41h中的点 阵字符图形显示出来,我们就能看到字母“a” 图4、1602字符表上表中的字符代码与我们pc中的字符代码是基本一致的。因此我们在向ddram写c51字符代码程序时甚至可以直接用p1a这样的方法。pc在编译时就把“a”先转为41h代码了。字符代码0x000x0f为用户自定义的字符图形ram(对于5x8点阵的字符,可以存放8组),就是cgram了。对ddram的内容和地址操作,hd44780的指令集及其设置说明,共有11条指令:基本操作时序: 读状态 输入:rs=l,rw=h,e=h输出:db0db7=状态字 写指令 输入:rs=l,rw=l,e=下降沿脉冲,db0db7=指令码 输出:无 读数据 输入:rs=h,rw=h,e=h 输出:db0db7=数据 写数据 输入:rs=h,rw=l,e=下降沿脉冲,db0db7=数据 输出:无 1.清屏指令 功能: 清除液晶显示器,即将ddram的内容全部填入“空白”的字符码20h; 光标归位,即将光标撤回液晶显示屏的左上方; 将地址计数器(ac)的值设为0。 2.光标归位指令 功能: 把光标撤回到显示器的左上方; 把地址计数器(ac)的值设置为0; 保持ddram的内容不变 3.输入模式设置指令 功能:设定每次写入1位数据后光标的移位方向,并且设定每次写入的一个字符是否移动。参数设定的情况如下所示: 位名设置 i/d0=写入新数据后光标左移 1=写入新数据后光标右移 s0=写入新数据后显示屏不移动 1=写入新数据后显示屏整体右移1个字 4. 显示开关控制指令功能:控制显示器开/关、光标显示/关闭以及光标是否闪烁。参数设定的情况如下: 位名设置 d0=显示功能关 1=显示功能开 c0=无光标 1=有光标 b0=光标不闪烁 1=光标闪烁 5. 设定显示屏或光标移动方向指令 功能:使光标移位或使整个显示屏幕移位。参数设定的情况如下: s/c r/l设定情况 0 0光标左移1格,且ac值减1 0 1光标右移1格,且ac值加1 1 0显示器上字符全部左移一格,但光标不动 1 1显示器上字符全部右移一格,但光标不动 6.功能设定指令 功能:设定数据总线位数、显示的行数及字型。参数设定的情况如下: 位名设置 dl 0=数据总线为4位 1=数据总线为8位 n 0=显示1行 1=显示2行 f0=57点阵/每字符1=510点阵/每字符 7.设定cgram地址指令功能:设定下一个要存入数据的cgram的地址。8.设定ddram地址指令 功能:设定下一个要存入数据的cgram的地址。 (注意这里我们送地址的时候应该是0x80+address,这也是前面说到写地址命令的时候要加上0x80的原因) 9.读取忙信号或ac地址指令 功能: 读取忙碌信号bf的内容,bf=1表示液晶显示器忙,暂时无法接收单片机送来的数据或指令; 当bf=0时,液晶显示器可以接收单片机送来的数据或指令; 读取地址计数器(ac)的内容。 10.数据写入ddram或cgram指令 功能: 将字符码写入ddram,以使液晶显示屏显示出相对应的字符; 将用户自己设计的图形存入cgram。 11.从cgram或ddram读出数据的指令功能:读取ddram或cgram中的内容。 基本操作时序: 读状态 输入:rs=l,rw=h,e=h输出:db0db7=状态字 写指令 输入:rs=l,rw=l,e=下降沿脉冲,db0db7=指令码 输出:无 读数据 输入:rs=h,rw=h,e=h输出:db0db7=数据 写数据 输入:rs=h,rw=l,e=下降沿脉冲,db0db7=数据 输出:无 2.max232芯片用8051串行接口通信,如果两台8051单片机之间的距离很近(不超过1.5m),可以采用直接将两台8051单片机的串行接口直接相连,利用其自身的ttl电平(0-5v)直接传输数据信息。如果传输距离较远(超过1.5m),由于传输线的阻抗与分布电容,会产生电平损耗和波形畸变,以至于检测不出数据或数据出错。此时可利用 rs232标准总线接口,将单片机输出的ttl电平转换为rs232标准电平(逻辑1为-15-5v;逻辑0为+5-+15v)。用rs232可将传输距离提高到15m,如果想远距离传输,可以采用rs422或者rs485。电平转换芯片max232是美信公司(maxim)生产,专用于进行将ttl电平转换为rs232电平的芯片,max232内部有泵电源,能将+5v电源电压在芯片内提高到rs232电平所需的+10v或者-10v电平。图5、两个max232的接法3.整体电路设计最终设计电路如下图3所示,发送方的数据由串行口txd段输出,经过电平转换芯片max232将ttl电平转换为rs232电平输出,经过传输线将信号传送到接收端。接收方也使用max232芯片进行电平转换后,信号到达接收方串行口的接收端。接受方接收后,通过1602lcd液晶显示接收的信息。图6、串行通信电路3、 软件设计本单片机课程设计实现的功能:单片机间的串口通信。首先,a主机与b主机进入模拟英文对话(英文短语直接调用已编好的数组,无需输入)的交流短信模式.。a主机发送数据时,a主机显示器显示要发送的数据,发送键按下就开始向b主机发送数据,发送成功后,发送灯闪烁提示发送成功。a主机接收数据时,将b主机发送来的数据送到a主机显示器显示,接收完毕,接收灯亮起提示接收成功。b主机的发送与接收英问短语与a主机是一致的。当a主机与b主机进行完模拟英文对话的交流短信模式结束之后,a主机与b主机进入到可输入数据的数字串口通信模式,此模式增加了增加输入功能,其他功能与模拟英文对话的交流短信模式是一样的。 串行口工作于方式1;用定时器1产生9600bit/s的波特率,工作于方式2。2. 程序流程图(1)发送端程序流程图 开始 发送数字 键盘输入数据 模式 ? 是 否 lcd显示数字 lcd显示英文 发送数据 发送数据 ? 否 ? 否 是 是 接收数据接收数据 ? 否? 否 是 是 lcd显示数字 lcd显示英文 (2) 接收方程序流程图同上四、 联合调试在protues上进行仿真实验。首先使用keilc将编写完成的程序编译生成hex文件,将hex文件烧录到两片单片机中,进行仿真实验,结果如下图所示,可以看到,接收端已将接受到的数据完整的显示了出来。图7.仿真图五、 设计小结 作为一名电子信息工程的大四学生,这次单片机的课程设计对我们来说是非常必要而且有意义的。从大三开设单片机课程开始,我们仅仅停留在专业基础课的理论知识上,如何锻炼自己的实践能力、如何把理论与实际相结合?我想这次单片机的课程设计就为我们提供了一个很好的平台。在和小组一起做课程设计的过程中,我又重新学到了很多,收获了很多。感触最深的是查阅大量的关于串行通信的资料了,在此过程中,我们与小组成员相互讨论,相互学习,对于串行通信又有了更加深刻的了解。 当然,我们也遇到了不少困难:发送端和接收端的通信协议问题导致数据不能正确的传输等等,最终小组成员相互探讨,各个问题得以一一解决。 除了感受到把理论与实际相结合的必要性与重要性,我也感受到了团队合作的意义,我相信,本次单片机课程设计让我们每个同学都受益匪浅。六、 附录1. a机发送程序/*串口通信模拟短信通信*/*发送方写完信息,点击按下发送按键,发送数据,发送成功后,发送灯闪烁三次*/*接收方接收开始信息时,接收灯亮起,按下接收按键,接收灯熄灭,随后开始填下将要发送的数据*/#includesbit led1=p20; /定义接收灯sbit led2=p21; /定义发送灯sbit lcden=p27; /定义lcd使能端sbit lcdrs=p26; /定义lcd的rs端#define uchar unsigned char#define uint unsigned intuchar code table=hello,;uchar code table1=nice to meet you.;uchar code table2=me too,;uchar code table3=your name?.;uchar code table4=my name is,;uchar code table5= jox.;uchar code digit=0123456789-+=-*/; /定义字符数组显示数字及正负号uint butter16=0;/定义待发送数据数组uchar agr,agr0,agr1,agr2,num,flag,flag1,flag2,flag3,a1,a2,temp;/定义全局标志位及全局变量char num1,num2; /定义全局变量void delay(uint z) /延时子程序uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);void led2_turn()/发送灯闪烁子程序led2=0;delay(500);led2=1;delay(500);led2=0;delay(500);led2=1;delay(500);void write_com(uchar com) /液晶写指令子程序lcdrs=0;p1=com;delay(5);lcden=1;delay(5);lcden=0;void write_data(uchar date) /液晶写数据子程序lcdrs=1; p1=date;delay(5);lcden=1;delay(5);lcden=0;void lcdinit()/液晶初始化函数lcden=0;write_com(0x38); write_com(0x0f); write_com(0x06);write_com(0x01);write_com(0x80);/设液晶初始地址为第一行第一列 void send(unsigned char dat) /数据发送程序 sbuf=dat; /将要发送的数据存入发送缓冲器中while(ti=0); /若发送中断标志位没有置1(正在发送数据),就等待ti=0; /若发送完成,ti自动置1,这里把它清零 void trinit()/串口通信初始化tmod=0x20;/设置定时器1为工作方式2th1=0xfd;/设波特率置tl1=0xfd;tr1=1;pcon=0x00;sm0=0;sm1=1;ren=1;es=1;void extern_interrupt()/外部中断初始化ex0=1; /开外部中断0ex1=1; /开外部中断1it0=1; /下降沿触发中断uint keeyboard()/键盘扫描子程序p0=0xfe;temp=p0;temp=temp&0xf0;num1=20;while(temp!=0xf0)temp=p0;switch(temp)case 0xee:num1=7;break;case 0xde: num1=8;break;case 0xbe: num1=9;break;case 0x7e: num1=13;break;while(temp!=0xf0)/松手检测temp=p0;temp=temp&0xf0;p0=0xfd;temp=p0;temp=temp&0xf0;while(temp!=0xf0)temp=p0;switch(temp)case 0xed:num1=4;break;case 0xdd: num1=5;break;case 0xbd: num1=6;break;case 0x7d: num1=14;break;while(temp!=0xf0)/松手检测temp=p0;temp=temp&0xf0;p0=0xfb;temp=p0;temp=temp&0xf0;while(temp!=0xf0)temp=p0;switch(temp)case 0xeb:num1=1;break;case 0xdb: num1=2;break;case 0xbb: num1=3;break;case 0x7b:num1=10;break;while(temp!=0xf0)/松手检测temp=p0;temp=temp&0xf0;p0=0xf7;temp=p0;temp=temp&0xf0;while(temp!=0xf0)temp=p0;switch(temp)case 0xe7: num1=15;break;case 0xd7: num1=0;break;case 0xb7: num1=12;break;case 0x77: num1=11;break;while(temp!=0xf0)/松手检测temp=p0;temp=temp&0xf0;return(num1);void main(void)uchar i,numn;uint m;uint *pbutter;/定义数组指针pbutter=&butter0;/将数组指针初始化为butter起止地址flag=1;flag3=0;agr=0;agr0=0;agr1=0;agr2=0;a1=1;led1=1; /关闭接收灯led2=1; /关闭发送灯i=0;ea=1; /开总中断extern_interrupt();/外部中断初始化lcdinit();/lcd初始化trinit(); /串口初始化while(1)while(flag=1) /等待标志位置1flag=0;es=0;for(i=0;i7;i+)write_data(tablei); /液晶写数据delay(100);write_com(0x80+0x40); /液晶地址改变到第2行第1列for(i=0;i18;i+)write_data(table1i); /液晶写数据delay(100);while(agr=0); /等待发送信号for(i=0;i7;i+)send(tablei);/发送数据delay(100);for(i=0;i18;i+)send(table1i); /发送数据delay(100);led2_turn();delay(500);write_com(0x01);/清屏 es=1;/开外部中断,等待接收数据write_com(0x01);/再次清屏,防止光标不在第一行第一位,否则可能出现在第二位一位while(flag1=1)while(agr0=0);flag1=0;es=0;delay(1000);write_com(0x01);for(i=0;i8;i+)write_data(table2i);delay(100);write_com(0x80+0x40);for(i=0;i12;i+)write_data(table3i);delay(100);agr=0;while(agr=0);for(i=0;i8;i+)send(table2i);delay(100);for(i=0;i12;i+)send(table3i);delay(100);led2_turn();delay(500);write_com(0x01); es=1;write_com(0x01);/再次清屏,防止光标不在第一行第一位,否则可能出现在第二位 while(flag2=1)agr0=0;while(agr0=0);flag2=0;es=0;delay(1000);write_com(0x01);for(i=0;i12;i+)write_data(table4i);delay(100);write_com(0x80+0x40);for(i=0;i7;i+)write_data(table5i);delay(100);agr=0;while(agr=0);for(i=0;i12;i+)send(table4i);delay(100);for(i=0;i7;i+)send(table5i);delay(100);led2_turn();delay(500);write_com(0x01); es=1;write_com(0x01);/再次清屏,防止光标不在第一行第一位,否则可能出现在第二位flag3=1;delay(10);write_com(0x01); while(flag3=1)/进入自由发送与接收数据的模式led1=1;m=keeyboard();/扫描键盘数据if(num1!=20)/判断键盘是否有数据输入,有的话执行if语气led1=1;*pbutter=m;/将键盘数据存在butter数组中pbutter+;delay(5);write_data(digitbutternumn);numn+;if(agr1=1) /判断是否发送数据led1=1;agr1=0;for(i=0;inumn;i+)send(butteri);delay(100);numn=0;pbutter=&butter0;write_com(0x01);delay(10);led2_turn();es=1;if(agr2=1)agr2=0;write_com(0x01);delay(10);write_com(0x80); void exter0() interrupt 0/外部中断0子程序 led1=1;agr0=1;agr2=1;void exter1() interrupt 2 /外部中断1子程序agr=1;agr1=1;es=0;void ser() interrupt 4 /串口中断子程序ri=0;led1=0;led2=1;num=sbuf;if(num=,)write_data(num);write_com(0x80+0x3e);if(flag3=1)write_data(digitnum);elsewrite_data(num);if(num=.)if(a1=1)a1-; flag1=1; else if(a2=0)a2-;flag2=1; 2. b机接收程序/*串口通信模拟短信通信*/*发送方写完信息,点击按下发送按键,发送数据,发送成功后,发送灯闪烁三次*/*接收方接收开始信息时,接收灯亮起,按下接收按键,接收灯熄灭,随后开始填下将要发送的数据*/#includesbit led1=p20;sbit led2=p21;#define uchar unsigned char#define uint unsigned intuchar code table=hi,;uchar code table1=i am happy.;uchar code table2=danny,;uchar code table3=and you?.;uchar code digit=0123456789-+=-*/; uint butter16=0;sbit lcden=p27;sbit lcdrs=p26;uchar agr,agr0,agr1,agr2,num,flag,flag1,flag2,a1,a2,temp;char num1,num2,numm;void delay(uint z)uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);void led2_turn()led2=0;delay(500);led2=1;delay(500);led2=0;delay(500);led2=1;delay(500);void write_com(uchar com)lcdrs=0;p1=com;delay(5);lcden=1;delay(5);lcden=0;void write_data(uchar date)lcdrs=1;p1=date;delay(5);lcden=1;delay(5);lcden=0;void lcdinit()lcden=0;write_com(0x38);write_com(0x0f);write_com(0x06);write_com(0x01);write_com(0x80); void send(unsigned char dat) /数据发送程序 sbuf=dat; /将要发送的数据存入发送缓冲器中while(ti=0); /若发送中断标志位没有置1(正在发送数据),就等待ti=0; /若发送完成,ti自动置1,这里把它清零 void trinit()tmod=0x20;/设置定时器1为工作方式2th1=0xfd;tl1=0xfd;tr1=1;pcon=0x00;sm0=0;sm1=1;ren=1;es=1;void extern_interrupt()ex0=1; /开外部中断0ex1=1; /开外部中断1it0=1; /下降沿触发中断uint keeyboard()/键盘扫描子程序p0=0xfe;temp=p0;temp=temp&0xf0;num1=20;while(temp!=0xf0)temp=p0;switch(temp)case 0xee:num1=7;break;case 0xde: num1=8;break;case 0xbe: num1=9;break;case 0x7e: num1=13;break;while(temp!=0xf0)/松手检测temp=p0;temp=temp&0xf0;p0=0xfd;temp=p0;temp=temp&0xf0;while(temp!=0xf0)temp=p0;switch(temp)case 0xed:num1=4;break;case 0xdd: num1=5;break;case 0xbd: num1=6;break;case 0x7d: num1=14;break;while(temp!=0xf0)/松手检测temp=p0;temp=temp&0xf0;p0=0xfb;temp=p0;temp=temp&0xf0;while(temp!=0xf0)temp=p0;switch(temp)case 0xeb:num1=1;break;case 0xdb: num1=2;break;case 0xbb: num1=3;break;case 0x7b:num1=10;break;while(temp!=0xf0)/松手检测temp=p0;temp=temp&0xf0;p0=0xf7;temp=p0;temp=temp&0xf0;while(temp!=0xf0)temp=p0;switch(temp)case 0xe7: num1=15;break;case 0xd7: num1=0;break;case 0xb7: num1=12;break;case 0x77: num1=11;break;while(temp!=0xf0)/松手检测temp=p0;temp=temp&0xf0;return(num1);void main(void)uchar i,numn;uint m;uint *pbutter;pbutter=&but

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论