第五章 结论
本次设计是通过两块简单的89C51单片机实现信息的串口通信。在设计过程中,通过查找资料了解了双机通信背景,从熟悉串口通信的原理,到掌握具体串口通信在双机之间的实现,从硬件电路设计到程序编写,一步步加深了自己对单片机的理解,从硬件调试到软件模拟实现等过程中,收获不少东西,也遇到了不少的问题。比如对于单片机知识不够透彻,对内容的掌握不够,缺乏灵活运用的能力,对于知识的扩展也存在一定的问题,因此,刚开始面对设计课题,感觉自己无从下手。其次,硬件设计过程中,I/O口的扩展,外部ROM的扩展,对于芯片的选择,软件编写时,对于某些指令的功能,功能模块的连接,芯片地址选择等都遇到了很大的障碍,不过在老师以及同学的帮助下得到了解决。另外,设计中犯了一些常识性的错误,对设计进程造成了一定的影响。例如,程序调试时,由于粗心,在写程序时,将0(零)和字母O混淆,还有中文标点符号和英文标点符号混淆等。这样的错误很难发现,以至于花费了很多时间。
短暂的单片机学习,有种意犹未尽之感,在这次课设中,加深了单片机相关知识的理解,之前的模棱两可已经不存在,这种感觉很好。由于自身水平有限,本次报告还有许多部分未能详细分析,在此仅作简单了解和认识。
本文采用的RS-232标准实现单片机与单片机之间的串行通信。RS-232是目前最常用的一种串行通讯接口。由于RS-232-C接口标准出现较早,难免有不足之处。
主要表现在:
1、接口的信号电平值较高,易损坏接口电路的芯片,又因为与TTL电平不容,故需使用电平转换电路才能与TTL电路连接。
2、传输速率较低,在异步传输时,波特率为20Kbps。
3、接口使用一根信号线和一根信号返回线而构成共地的传输形式,这种共地 传输容易产生共模干扰,所以抗噪声干扰性弱。
4、传输距离有限,最大传输距离标准值为50英尺,实际上也只能用在50米 左右。
因此建议使用RS-485标准实现,RS-485接口具有良好的抗噪声干扰性,长的传输距离和多站能力等优点就使其成为首选的串行接口。
12
参考文献
[1] 马忠梅.单片机的C语言应用程序设计.北京:北京航空航天大学出版社,2003
[2] 杨子文.单片机原理及应用.西安:西安电子科技大学出版社,2006. [3] 郭惠 吴讯著 单片机C语言程序设计.北京:电子工业出版社2008 [4] 谭浩强. C程序设计.北京:清华大学出版社,2009.
[5] 孙近平 张大鹏著 51系列单片机原理、开发与应用实例.北京:中
国电力出版社,2009
[6] 张先庭.单片机原理、接口与C51应用程序设计.北京:国防工业出版社,2011.
[7] 陈涛著 单片机应用及C51程序设计.北京:机械工业出版社,2011
13
附录
1.主机程序清单
#include
={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc0,0xf9,0xa4,0xb0,0x99,0x92};
#define KEY P1 unsigned char temp;
unsigned char pre_keyno = 16,keyno = 16; void key_scan(void);
void delay(unsigned int x) {
unsigned char i; while(x--) {
for(i = 0;i < 120;i++); }
}//字符发送函数
void putchar(unsigned char data1) {
SBUF = data1; //将待发送的字符送入发送缓冲器 while(TI == 0); //等待发送完成
14
TI = 0; //发送中断标志请0 }
void date_output(unsigned char date) {
putchar(date);
}//主函数 void main(void) {
unsigned char c = 0;
SCON = 0x50; //串口方式1 ,允许接收 TMOD = 0x20; //T1工作于方式2 PCON = 0x00; //波特率不倍增 TL1 = 0xfd; //波特率设置 TH1 = 0xfd; //
EA = 1; //开总中断 ES = 1; //开串口接收中断 TR1 = 1; //定时器开启 delay(200); delay(50); while(1) { while(1) {
P1 = 0xf0;
if(P1 != 0xf0) //扫描键盘获得按键序号 {
key_scan(); }
if(pre_keyno != keyno) {
15
date_output(TAB[keyno]);//显示,共阳极段码取反作为共阴极段码 } } } }
void revdata(void) interrupt 4 {
if(RI == 0) { //P1 = 0x00; return;
} //如果没有接收中断标志,返回 ES = 0; //关闭串口中断 RI = 0; //清串行中断标志位 temp = SBUF; //接收缓冲器中的字符
ES = 1; //开启串口中断 }
void key_scan(void) {
unsigned char i; //高4位置1,放入4行 KEY = 0x0f; delay(1);
//有键按下后,其中一列将变为低电平 i = KEY^0x0f;
//判断按键发生在哪一列 switch(i) {
case 1: keyno = 0;break;
16