电子综合实习报告.docx

上传人:b****2 文档编号:17812590 上传时间:2023-08-04 格式:DOCX 页数:21 大小:503.21KB
下载 相关 举报
电子综合实习报告.docx_第1页
第1页 / 共21页
电子综合实习报告.docx_第2页
第2页 / 共21页
电子综合实习报告.docx_第3页
第3页 / 共21页
电子综合实习报告.docx_第4页
第4页 / 共21页
电子综合实习报告.docx_第5页
第5页 / 共21页
电子综合实习报告.docx_第6页
第6页 / 共21页
电子综合实习报告.docx_第7页
第7页 / 共21页
电子综合实习报告.docx_第8页
第8页 / 共21页
电子综合实习报告.docx_第9页
第9页 / 共21页
电子综合实习报告.docx_第10页
第10页 / 共21页
电子综合实习报告.docx_第11页
第11页 / 共21页
电子综合实习报告.docx_第12页
第12页 / 共21页
电子综合实习报告.docx_第13页
第13页 / 共21页
电子综合实习报告.docx_第14页
第14页 / 共21页
电子综合实习报告.docx_第15页
第15页 / 共21页
电子综合实习报告.docx_第16页
第16页 / 共21页
电子综合实习报告.docx_第17页
第17页 / 共21页
电子综合实习报告.docx_第18页
第18页 / 共21页
电子综合实习报告.docx_第19页
第19页 / 共21页
电子综合实习报告.docx_第20页
第20页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

电子综合实习报告.docx

《电子综合实习报告.docx》由会员分享,可在线阅读,更多相关《电子综合实习报告.docx(21页珍藏版)》请在冰点文库上搜索。

电子综合实习报告.docx

电子综合实习报告

重庆大学本科学生课程设计指导教师评定成绩表

学号

20085208

指导教师

黄扬帆

学院

自动化学院

专业

自动化

学生姓名

王诗年、陈宇、冉宇、常洋

课程设计

题目

单片机双机通信系统

课程设计

成绩

 

指导教师签名:

年月日

说明:

1、学院、专业、年级均填全称。

2、本表除评语、成绩和签名外均可采用计算机打印。

重庆大学本科学生课程设计任务书

课程设计题目

单片机双机通信系统

学院

自动化

专业

自动化

年级、班

08级自动化一班

设计要求:

1.基本要求:

设计两个单片机最小系统,能实现有线通信,一方为发射,另一方为接收。

2.提高要求:

两个单片机最小系统能相互通信,并能实现校验。

 

学生应完成的工作:

设计基本方案,完成软件设计,设计电路图,线路板布线,电路焊接,软件仿真,硬件调试,得到最后成果.

 

参考资料:

 

课程设计工作计划:

第一周,接受设计任务书,设计基本方案,完成电路图;第二周,完成电路板布线以及焊接,同时编写软件程序;第三周,烧录程序,硬件调试,得到最后成果.

 

任务下达日期2011年2月21日完成日期2011年3月11日

指导教师黄扬帆(签名)学生王诗年、陈宇、冉宇、常洋(签名)

说明:

1、学院、专业、年级均填全称。

2、本表除签名外均可采用计算机打印。

本表不够,可另附页,但应在页脚添加页码。

电子综合实习报告书

----单片机双机通信系统的设计

一、引言

由于MCS51系列单片机具有性能稳定、工作可靠、价格低廉等特点,因此其应用相当广泛。

一个MCS51系列的单片机(如Atmel89c51)内部包含有RAM、FLASHROM、两个或者三个16位的定时器/计数器、一个通用异步串行通信控制器(UART)等多种资源。

但即便如此,在一些相对复杂的单片机应用系统中,仅仅一个单片机资源还是不够的,因此而常常需要扩充I/O接口、定时器/计数器、串行通信接口、RAM、ROM等。

采用通用的标准器件进行扩充是通常的做法,但将单片机本身作为一个通用的扩充器件来使用,也不失为一个好的方法。

在这种情况下,一个系统中就使用了两个或两个以上的单片机,而单片机之间就要通过互连来进行数据通信。

MCS51系列的单片机(以下简称单片机)都带有串口,利用串口进行互连通信极为方便,其各种连接方式在许多书籍和资料上都有介绍,在此不再重述。

但如果系统要求扩充的资源是对外连接的串口,或对相互之间的数据传送有一定的速度要求,则单片机的串口就不能用作系统内两单片机的通信接口了。

所幸的是,单片机的并行端口也能相互连接来进行数据通信。

根据单片机端口内部结构的特点,这些端口的端口线可以直接相连,从而使两单片机之间并行通信接口的实现不用另外的硬件电路设备。

此次设计就是针对上述情况展开的。

系统结构框图如图

(1)所示。

二、键盘设计

1、硬件接线部分

考虑到此次设计要求用到的按键数比较多(0~9,A~F共16个按键),为了节约I/O资源,采用行列式键盘,如图

(2)所示

(2)

按键编排如图(3)所示

图(3)

2、4×4矩阵键盘识别处理

按键设置在行列式交点上,行列线分别连接到按键开关的两端。

当行线通过上拉电阻接+5伏时,被钳位在高电平状态,事先认为设定好行线和列线的序号。

此处设行号为i,从上到下编为0-3对应于p1.0-p1.3口,列线设为j,从左到右编为0-3对应于p1.4-p1.7口。

每个按键有它的行值和列值 ,行值和列值的组合就是识别这个按键的编码。

事先有数组存放好对应键值的段选码。

矩阵的行线和列线分别通过两并行接口和CPU通信。

每个按键的状态同样需变成数字量“0”和“1”,开关的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。

键盘处理程序的任务是:

确定有无键按下,判断哪一个键按下,键的功能是什么;还要消除按键在闭合或断开时的抖动。

两个并行口中,一个输出扫描码,使按键逐行动态接地,另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。

3、键盘识别处理程序

键盘识别程序如下:

voidscanf(void)/*键盘扫描子程序*/

{

uchari,j,k=0;/*i为行号,j为列号*/

unsignedcharnum[4][4]={0xc0,0xf9,0xa4,0xb0,

0x99,0x92,0x82,0xf8,

0x80,0x90,0x88,0x83,

0xc6,0xa1,0x86,0x84};

/*采用共阳极输出*/

while

(1)

{

for(k=0;k<8;k++)/*循环8次,取得8个键盘键值*/

{/*存入TAB[]数组*/

P1=0x0F;

delay();/*软件延时去抖动*/

if((P1&0x0F)!

=0x0F)

{

switch(P1)/*确定行号*/

{

case0x07:

i=3;break;

case0x0b:

i=2;break;

case0x0d:

i=1;break;

case0x0e:

i=0;break;

default:

break;

}

}

P1=0xF0;//反转行和列上的电平

if((P1&0xF0)!

=0xF0)

{

switch(P1)/*确定列号*/

{

case0x70:

j=3;break;

case0xb0:

j=2;break;

case0xd0:

j=1;break;

case0xe0:

j=0;break;

default:

break;

}

TAB[k]=num[j][i];/*P1输出对应的按键值*/

}

}

}

三、数码管显示设计

1、数码管显示工作原理

七段LED显示器但是最常用的显示器件。

它是由7个LED二极管组成。

图(4)七段LED图

八位LED动态显示电路只需要两个8位I/O口。

其中一个控制段选码,另一个控制位选。

要想每位显示不同的字符,必须利用人的视觉暂留,采用扫描方式。

数码管显示部分硬件接线如图(5)所示

图(5)

四、单片机的选择及其连接

1、单片机型号的选择

单片机选用两片Atmel公司的常用芯片AT89C51,一片用于接收键盘的输入并做出判断,一片用于接收数据并驱动8个七段数码管实现动态显示。

AT89C51完全可以满足功能要求,而且价格便宜,容易获得。

2、协议设计

规定协议内容如下:

数据传输的双方均使用2400bps的速率传送数据,使用主从通信方式,主机发送数据,从机接收数据,双方在发送数据和接收数据时使用查询方式。

(此处设计甲机发送,乙机接收)

双方开始数据传输时,甲机先发送AAH给乙机,当乙机接收到AAH之后,向甲机回答BBH。

甲机收到BBH后就把数码表TAB[8]中的8个数据发送给乙机,并发送校验和。

乙机收到8个数据并计算收到的数据的校验和,与甲机发送过来的校验和进行比较,若校验和相同(正确)则发送00H给甲机;否则发送FFH(错误)甲机,重新接收。

乙机接收到8个数据后送8个数码管动态显示。

3、双机电路如图所示

图(6)

五、总体电路图及程序设计

#include"reg51.h"

#defineucharunsignedchar

//时钟频率11.0592MHz,每秒钟921600个时钟周期,

sfrPSEG=0x80;

sfrPNUM=0xA0;

charLEDNow=0;

bitsuccess=1;

charkeystate;//上一次中断结束时键盘的状态,keystate/4>15表示无键按下

//否则,商表示按键编号,余数表示状态

//0表示检测到按下,等待去抖动

//1表示已经响应过事件,等待弹起

//2表示已经弹起,等待再次去抖动

//3未定义

charnum[8];

charcodenumcode[16]={0xf3,0x42,0xe9,0x6b,0x5a,0x3b,0xbb,0x62,0xfb,0x7b,0xfa,0x9b,0xb1,0xcb,0xb9,0xb8};

sbitACC0=ACC^0;

sbitACC1=ACC^1;

sbitACC2=ACC^2;

sbitACC3=ACC^3;

sbitACC4=ACC^4;

sbitACC5=ACC^5;

sbitACC6=ACC^6;

sbitACC7=ACC^7;

sbitB0=B^0;

sbitB1=B^1;

sbitB2=B^2;

sbitB3=B^3;

sbitB4=B^4;

sbitB5=B^5;

sbitB6=B^6;

sbitB7=B^7;

ucharHammingCode(uchardat)reentrant

{

chara[8];

chari,j;

a[3]=dat&1;

dat>>=1;

a[5]=dat&1;

dat>>=1;

a[6]=dat&1;

dat>>=1;

a[7]=dat&1;

dat>>=1;

for(i=1;i<8;i<<=1){

a[i]=0;

for(j=1;j<8;++j)

if(i&j!

=0&&i!

=j)

a[i]^=a[j];

}

dat=0;

a[0]=0;

for(i=7;i>0;i-=1){

a[0]^=a[i];

dat=(dat<<1)+a[i];

}

dat=(dat<<1)+a[0];

returndat;

}

charHammingDecode(uchardat)

//返回值>0则表示解码成功且正确结果为返回值,否则返回-1

{

chari,j;

chara[8];

for(i=0;i<8;++i){

a[i]=dat&1;

dat>>=1;

}

for(i=1;i<8;++i)

a[0]&=a[i];

if(a[0]!

=0)

return-1;

for(i=1;i<8;i<<=1){

for(j=1;j<8;++j)

if(i&j!

=0&&i!

=j)

a[i]^=a[j];

if(a[i]!

=0)

return-1;

}

return(((a[7]*2+a[6])*2+a[5])*2+a[3]);

}

voidOnDataError()

{

TB8=1;

SBUF=0xff;

}

voidSend(chardat)

{

success=0;

TB8=0;

SBUF=HammingCode(dat);

}

voidOnRecv(uchardat,bitex)

{

if(ex==0){

dat=HammingDecode(dat);

if(dat!

=-1){

num[1]=dat;

TB8=1;

SBUF=0;

}

else

OnDataError();

}

else{

if(dat==0){

success=1;

}else{

Send(num[0]);

}

}

}

 

voidOnKeyPress(charkey)

{

num[0]=key;

Send(key);

}

voidProgT0()interrupt1

{

charprekey,prestate,row,col,press;

TR0=0;//关闭计时器

PNUM=~(1<<(LEDNow+6));

PSEG=numcode[num[LEDNow]];

LEDNow=(LEDNow+1)%2;//扫描显示数码管

if(!

success)

Send(num[0]);//若未发送成功则重新发送一次数据

prekey=keystate/4;

prestate=keystate%4;

if(prekey<16){

row=prekey%4;

col=prekey/4;

P1=0xff;

P1&=~(1<<(row));

press=!

(P1&(1<<(4+col)));

switch(prestate){

case0:

if(press){

keystate++;

OnKeyPress(prekey);

}else{

keystate=100;

}

break;

case1:

if(!

press){

keystate++;

}

break;

case2:

keystate=100;

break;

default:

break;

}

}else{

P1=0xff;

P1&=0x0f;

for(row=0;row<4;++row){

if(!

(P1&(1<

break;//此行有键按下

}

if(row<4){

P1=0xff;

P1&=~(1<

for(col=0;col<4;++col){

if(!

(P1&(1<<(col+4))))

break;//此列有键按下

}

if(col<4){

keystate=(row+4*col)*4;

}

}

}

//再次开启计时器

TH0=0xf9;//0xED;

TL0=0xc0;//0x40;

TR0=1;

}

voidProgS()interrupt4

{

if(RI){

OnRecv(SBUF,RB8);

RI=0;

}

}

voidmain()

{

chari;

TMOD=0x29;//设置计数器工作模式

EA=1;

ET0=1;//开启中断

TH0=0xf9;//0xED;

TL0=0xc0;//0x40;//计数初值

TR0=1;//开启计数器

for(i=0;i<2;++i)

num[i]=0;//初始数码管显示0000

SCON=0xd0;//初始化串口

TH1=0xFD;

TL1=0xFD;

TR1=1;

ES=1;

RI=TI=0;

while

(1);

}

六、设计小结

我觉得做电子综合实习之于单片机课程设计是十分有意义的,而且是十分必要的。

在已度过的大学时间里,我们大多数接触的是专业课。

我们在课堂上掌握的仅仅是专业课的理论知识,如何去锻炼我们的实践能力?

如何把我们所学的专业基础课理论知识运用到实践中去呢?

我想做类似的课程设计就为我们提供了良好的实践平台。

在做本次课程设计的过程中,我感触最深的当属查阅大量的设计资料了,无论是课本上的还是网上的都浏览了不少相关的程序,从中也借鉴了别人的思想,开阔了自己的思路。

做电子综合课程设计,对设计者的软硬件的理解和掌握的要求都比较高。

在设计程序之前,设计者必学对所用单片机的内部结构有一个系统的了解,知道该单片机内有哪些资源;要有一个清晰的思路和一个完整的的软件流程图;在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;在设计课程过程中遇到问题是很正常德,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题。

回顾这一周以来自己从接到题目到编写出程序、画出电路原理图,自己真的收获不少。

无论是软件的使用还是对单片机内部资源的了解,自己的认识都加深了很多。

另外,这次课程设计让我感到了团队合作的重要性。

在团队中,我们互帮互助,对整个课程设计来说,这是至关重要的,缺少每一个人都会对我们的设计产生影响。

还有要感谢指导老师在我们遇到困难时,给予我们的建议与鼓励!

七、参考文献

1,单片机接口技术(C51版)张道德编著水利水电出版社

2.单片微型计算机原理及接口技术杨光友朱宏辉主编水利水电出版社

3.51单片机C语言应用程序设计实例精讲戴佳戴卫恒编著电子工业出版社

4.单片机语言C51典型应用设计刘文涛编著人民邮电出版社

5.μVision2单片机应用程序开发指南尹勇李宇编著科学出版社

6.单片机控制实习与专题制作蔡朝洋编著北京航天航空大学出版社

附录

1、元件清单

综合设计元器件清单

元件名称

.需要数量

元件名称

需要数量

电容20p

4

电容10Uf/16v

2

三极管

16

5v蜂鸣器

2

数码管

4

弹簧按键

34

电阻10k

18

电阻470

16

晶振11.0592

2

89c51单片机

2

译码器

4

导线

若干

实验板:

2

工具:

烙铁

1

镊子

1

领用人签字:

斜口钳

1

小起子

1

领用时间:

指导教师签字:

2、原理图

3、布线图

4、实物图

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 求职职场 > 社交礼仪

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2