微机综合实践课程设计.docx
《微机综合实践课程设计.docx》由会员分享,可在线阅读,更多相关《微机综合实践课程设计.docx(30页珍藏版)》请在冰豆网上搜索。
微机综合实践课程设计
桂林电子科技大学
微机综合实践课程设计
设
计
报
告
指导老师:
吴兆华
学生:
刘芯豪
学号:
桂林电子科技大学机电工程学院
《微机综合实践课程设计》设计报告
一、设计题目
步进电机控制系统设计
二、设计内容与要求
用8051单片机设计一个控制系统,控制8*8点阵式LED循环显示“★”、“●”和心形图,要求通过按键来选择要显示的图形。
显示时间可调。
三、设计目的意义
随着社会的发展,单片机因其高可靠性和高性价比,在工业控制系统、 智能化仪器仪表和智能接口等诸多领域内得到了极为广泛的应用。
LED电子显示屏是利用发光二极管构成的点阵模块或像素单元组成可变面积的显示屏幕,它具有高清晰度、色彩鲜艳、视角大、工作稳定、寿命长、功耗低等优点。
由于采用单元模块化结构,屏体大小可按用户要求灵活拼制;它的超高亮度,使它在户内外显示中具有不可替代的作用。
随着信息产业的高速发展,LED显示作为信息传播的一种重要手段,已广泛应用于室内外需要进行服务内容和服务宗旨宣传的公众场所,例如户内外公共场所广告宣传、机场车站旅客引导信息、公交车辆报站系统、证券与银行信息显示、餐馆报价信息豆示、高速公路可变情报板、体育场馆比赛转播、楼宇灯饰、交通信号灯、景观照明等。
显然,LED显示已成为城市亮化、现代化和信息化社会的一个重要标志。
因此,本设计具有很强的现实应用性,且是对我们所学知识应用的一个很好的检验。
1、通过学习单片机原理,初步了解如何用汇编语言实现对51单片机系统进行控制。
通过简单图形显示控制的设计,将所学的知识融会贯通,锻炼独立设计、制作和调试单片机应用系统的能力,为进一步的科研实践活动打下一定的基础。
2、通过单片机最小系统的应用,掌握单片机内部定时/计数器应用与编程、及硬件调试、设计方法。
3、在这次的动手设计之后,领会单片机的应用系统的软硬件调试的方法,掌握单片机编程方法,及软件keil C51的使用方法,熟悉软件调试过程及方法,对单片机系统和LED显示技术有了进一步的理解。
4、课程设计中让我们对点阵的工作原理有了了解,知道其点亮方式和扫描显示图形,当我们在做扩展屏幕的时候会有一些直接的参考,为下一次可能用到而积累知识。
5、制作电路板需要动手使用电烙铁,焊锡,培养自己动手操作能力。
6、本次做硬件电路使用AltiumDesigner电路设计软件,让我们对这个软件有一定的了解并掌握其软件的基本功能,如何导入软件库,如何添加元器件的封装,如何使用原理图库绘制原理图,如何使用PCB封装库绘制元器件封装,如何在PCB中摆放元器件,如何选择我们需要的线宽等等。
7、根据课题要求,从提出并选择设计方案、查找确定所用元器件、设计并搭制硬件电路、编程写入并调试等一系列过程,锻炼了分析、解决问题的能力及相互学习的精神。
8、在制作电路板之前,还是用了proteus仿真软件对电路图进行仿真,验证我们所设计的原理图是否合理,功能能否按照要去实现,最重要的还是学会了一个电路仿真软件,当我们身边没有单片机开发板时也可以通过仿真软件来设计我们的电路,验证我们的程序。
9、为我们以后的工作积累经验,培养团队的合作精神和分工协调能力,为今后能独立承担起电路设计、能进行微机单片机应用系统的开发与设计工作打下一定的基础。
10、本次课程设计我们三个人一个小组,每个人设计一个方案,最终经过讨论分析得到了我们小组最终的一个整体方案,培养我们对方案分析,解决问题和团队合作的能力。
四、系统硬件电路图
4.1系统框图
硬件电路的设计框图如图1所示。
图1硬件电路的设计框图
4.2电路设计软件AltiumDesigner
我们在制作硬件,得到我们所需要的成品,需要运用各种软件,工具来实现我们的目的。
首先知道我们需要什么元器件,运用什么样的电路图,得到我们所需要的电路图如何将电路放到我们的铜板上面,焊接元器件,调试电路等等各种步骤,都需要我们了解,并亲自动手操作。
右图是我们的小组制作的硬件电路。
我们采用的软件是AltiumDesigner电路设计软件,AltiumDesigner是原Protel软件开发商Altium公司推出的一体化的电子产品开发系统,主要运行在Windows操作系统。
这套软件通过把原理图设计、电路仿真、PCB绘制编辑、拓扑逻辑自动布线、信号完整性分析和设计输出等技术的完美融合,其主要功能有:
1.原理图设计;
2.印刷电路板设计;
3.FPGA的开发;
4.嵌入式开发;
5.3DPCB设计。
基于这些优点,AltiumDesigner可以为设计者提供了全新的设计解决方案,使设计者可以轻松进行设计,使用这款软件将使电路设计的质量和效率大大提高。
我们的本次课设只需使用其前面的两点便可,有助于我们比较成功的完成课程设计任务。
4.3元器件清单
Footprint
Comment
LibRef
Designator
Description
Quantity
RAD0.1
30PF
CAP
C1,C2
2
RB.1/.2
CAP-2
CAP-2
C3
1
XTAL-1
CRY
CRY
CY1
1
RB.1/.2
LED
LED
D1
1
SIP2
CON2
CON2
J1Soures
Connector
1
SIP-8*2
点阵
CON8*2
J2
1
sip-4
CON4
CON4
J5
Connector
1
SW1
SW4
SW4
KEY1,KEY2,
KEY3,KEY4,S1
5
AXIAL0.4
1k
RES
R1,R3
2
AXIAL0.4
10k
RES
R2
1
SIP-9
10k
排阻
R4
1
DIP-40
51
51
U1
1
18
4.4电路的设计及注意事项
4.4.1电路原理图和PCB的设计
第一步:
新建一个工程
绘制一个完整的电路图,我们的第一步是建立一个工程文件,我们的后续工作都在这个工程文件下面进行,建立工程的步骤为:
File—New—Project—PCBProject。
如下图所示步骤:
然后得到我们的工程文件,但这只是一个空的工程,里面什么都没有,只是给我们开辟了一个空间,我们需要在这个空间里面加入我们的原理图。
第二步:
新建一个原理图
建立完工程之后接下来我们需要建立一个能够画电路图的原理图,步骤为:
File—New—Schematic。
如下图所示步骤
第三步:
新建一个PCB
原理图只是给我们提供绘制理论电路的地方,只是一个简单的物理电路图,最终需要制作刻录电路图形在电路板上面的是PCB,建立好工程和电路图之后我们还需要建立一个PCB,它是联系理论电路与实物电路的桥梁,步骤为:
File—New—PCB。
如下图所示步骤
最后得到有一个完整的工程文件,里面包含我们的“.SchDoc”和“.PcbDoc”两个文件,在这个工程文件中根据我们的方案绘制电路图和PCB。
4.4.2注意事项
绘制原理图的注意事项:
1、我们要保证所需要的原理图元器件在我们的原理图库中存在,如果没有,我们建立一个原理图库,绘制我们需要的元器件,步骤为:
File—New—Library—SchematicLibrary。
绘制好元器件之后并对元器件添加封装和设置器件的参数;
2、放置每一种元器件的第一个时,按下TAB键,修改元器件的属性,则再次放下该器件时已经具有封装、参数值以及顺序编号;
3、连线不方便或者距离较远时,利用网络标号来表示电器链接;
4、使用ERC来检查我们的电路原理图连线是否有问题,从而消除电路漏连,重复编号等错误,提高我们电路原理图设计的可靠性;
5、放置电路原理图之前,有些器件可能是没有添加有封装,或者封装错误,所以当我们选择元器件的时候先按下TAB键来添加或者修改我们元器件合适的封装,防止我们使用了错误的封装无法安插元器件,减少错误的发生。
绘制PCB的注意事项:
1、绘制PCB的第一步是元器件的布局,根据PCB走线最短原则,按照电路图将电路划分成不同的功能模块,如电源部分,驱动部分,CPU部分的放置,然后根据PCB的尺寸和安装整体移动各相关模块,这样就能保证相同模块内的走线最短,各个模块之间的连接最合理;
2、布局时充分利用CrossProbe工具图标迅速找到PCB和Sch中对应的元器件,方便布局;
3、可以从Sch通过CrossProbe工具图迅速找到PCB中对应的元器件,也可以从PCB中通过CrossProbe工具图迅速调到原理中相应元器件或网络标号相应的位置;
4、在进行布线时,很多同学都喜欢使用自动布线功能,方便,节省时间。
我们最好不要使用自动布线,采用模块化布局,然后边调整边走线的方式,使我们的电路图形看起来更加简洁美观。
5、导线宽度设计,布线之前我们需要设计我们的线性规则,导线的宽度至少为28mil,防止导线宽度过小,在腐蚀电路图形时导线断开,有些同学在腐蚀电路板的时候因为导线宽度设计不合理,制作电路板时导线被腐蚀掉;
6、线间距设计,至少为10mil,防止导线挨得过近,产生短路,或者在信号流通时产生信号干扰;
7、焊盘设计,焊盘用于焊锡与元器件的连接,我们的焊盘大小设计要合理,按照手工焊接的话,我们的焊盘直径为75mil,孔的大小约为40mil,设计合理的焊盘大小,防止在钻孔的时候把焊盘钻掉。
4.5电路原理图
4.6图形显示PCB
五、程序流程图与源程序
5.1程序流程图
5.1.1主程序流程图
5.1.2中断子程序流程图
外中断0子程序流程图
定时器0中断子程序流程图
5.2源程序清单
5.2.1汇编语言程序
CNTAEQU30H
COUNTEQU31H
ORG00H;程序起始地址
LJMPSTART
ORG03H;外中断0程序入口
LJMPINIT0
ORG0BH;定时器0中断程序入口地址
LJMPT0X
ORG30H
START:
MOVCNTA,#00H;初始化
MOVCOUNT,#00H
MOVR0,#20
MOVTMOD,#01H;T0工作模式1
MOVTH0,#(65536-50000)/256;设置初值
MOVTL0,#(65536-50000)MOD256
MOVIP,#01H
CLRC
SETBTR0;启动定时器0
SETBET0;定时器0中断允许
SETBEX0
SETBIT0
SETBEA;开总中断
WT1:
MOVR6,#5;消抖
MOVR7,#248
D1:
DJNZR7,$;R7减1不为0则继续减,直至为零
DJNZR6,D1;R6减1不为0则转到D1处
JBP1.0,WT2;辨别按键状态,若按键没按下,则转到WT2处
MOVCOUNT,#00H;显示第一个图形
WT2:
MOVR6,#5
MOVR7,#248
D2:
DJNZR7,$
DJNZR6,D2
JBP1.1,WT3
MOVCOUNT,#01H;显示第二个图形
WT3:
MOVR6,#5
MOVR7,#248
D3:
DJNZR7,$
DJNZR6,D3
JBP1.2,WT4;显示第三个图形
MOVCOUNT,#02H
WT4:
MOVR6,#5
MOVR7,#248
D4:
DJNZR7,$
DJNZR6,D4
JBP1.1,NEXT
L1:
LCALLDELAY
NEXT:
SJMPWT1;
DELAY:
MOVR6,#250
L2:
NOP
NOP
DJNZR6,L2
RET
LOOP:
NOP
MOVDPTR,#TAB;TAB表首地址送DPDR
MOVA,CNTA;
MOVCA,@A+DPTR;查表TAB
MOVP2,A
MOVDPTR,#GRAPH;GRAPH表首地址送DPDR
MOVA,COUNT
MOVB,#8
MULAB
ADDA,CNTA
MOVCA,@A+DPTR;查表GRAPH
MOVP0,A
INCCNTA
MOVA,CNTA
CJNEA,#8,NEX
MOVCNTA,#00H
LJMPLOOP
INIT0:
CLREX0
MOVA,R0
ADDCA,#20
MOVR0,A
CJNER0,#100,NEX
MOVR0,#20
SETBEX0
T0X:
NOP
MOVTH0,#(65536-50000)/256;重置初值
MOVTL0,#(65536-50000)MOD256
DJNZR0,NEX
INCCOUNT
MOVR1,COUNT
CJNER1,#02H,NEX
MOVCOUNT,#00H
NEX:
RETI
TAB:
DB0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH
GRAPH:
DB00H,08H,78H,3CH,3CH,78H,08H,00H;"★",0
DB00H,3CH,7EH,7EH,7EH,7EH,3CH,00H;"●",1
DB00H,0CH,1H,3H,7CH,3EH,1EH,0CH;"心形",2*
END
5.2.2C语言程序
#include
#defineucharunsignedchar
#defineuintunsignedint
uchartable[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//列扫描数组
ucharFigure[3][8]={//字模取模方式阴码逆向逐列式
{0x00,0x08,0x78,0x2C,0x2C,0x78,0x08,0x00},/*"★",0*/
{0x00,0x3C,0x7E,0x7E,0x7E,0x7E,0x3C,0x00},/*"●",1*/
{0x00,0x0C,0x1E,0x3E,0x7C,0x3E,0x1E,0x0C},/*"心形",2*/
};
ucharlie;//列扫描
ucharhang;//行扫描
uchartime;//定时时间
uchartemp;//暂存P1口状态
uintcount=20;
/*************************************************/
/*函数功能:
延时函数*/
/*voiddelay(uintz)*/
/*入口参数:
z*/
/*出口参数:
无*/
/*************************************************/
voiddelay(uintn)
{
uinti,j;
for(i=n;i>0;i--)
for(j=110;j>0;j--);
}
/*************************************************/
/*函数功能:
检查P1口哪个按键按下*/
/*voidcheck()*/
/*入口参数:
无*/
/*出口参数:
无*/
/*************************************************/
voidcheck()
{
temp=P1;
temp=temp&0x1f;
if(temp!
=0x1f)
{
delay(5);
temp=P1;
temp=temp&0x1f;
if(temp!
=0x1f)
switch(temp)
{
case0x1e:
hang=0;break;
case0x1d:
hang=1;break;
case0x1b:
hang=2;break;
default:
break;
}
}
}
/*************************************************/
/*函数功能:
主函数*/
/*voidmain()*/
/*入口参数:
无*/
/*出口参数:
无*/
/*************************************************/
voidmain()
{
TMOD=0x01;//选择T0工作模式1
TH0=(65536-50000)/256;//定时时间为50ms
TL0=(65536-50000)%256;
EA=1;//打开总中断
EX0=1;//打开外部中断0
ET0=1;//打开定时器0中断
IT0=1;//外中断0下降沿触发
TR0=1;//打开定时器0
IP=0x01;//设置外中断0为高优先级
while
(1)
{
check();
for(lie=0;lie<8;lie++)
{
P0=Figure[hang][lie];
P2=table[lie];
delay
(1);
}
}
}
/*************************************************/
/*函数功能:
外部中断0调整图形显示时间*/
/*voidInit0()interrupt0*/
/*入口参数:
无*/
/*出口参数:
无*/
/*************************************************/
voidInit0()interrupt0
{
count=count+20;
if(count==200)//1180
count=20;
}
/*************************************************/
/*函数功能:
对图形显示进行定时*/
/*voidT_0()interrupt1*/
/*入口参数:
无*/
/*出口参数:
无*/
/*************************************************/
voidT_0()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
time++;
if(time==count)
{
time=0;
hang++;
}
if(hang==3)
hang=0;
}
六、系统功能分析与说明
6.1STC89C52RC单片机介绍
本次课程设计的单片机采用STC89C52RC,它是一种低功耗、高性能的8位CMOS微控制器。
片内含有8KB的存储器(EPROM),与8031引脚和指令系统完全兼容。
主要特性如下:
1.增强型8051单片机,6时钟/机器周期和12时钟/机器周期可以任意选择,指令代码完全兼容传统8051;
2.工作电压:
5.5V~3.3V(5V单片机)/3.8V~2.0V(3V单片机);
3.工作频率范围:
0~40MHz,相当于普通8051的0~80MHz,实际工作频率可达48MHz;
4.用户应用程序空间为8K字节
5.片上集成512字节RAM;
6.通用I/O口(32个),复位后为:
P1/P2/P3/P4是准双向口/弱上拉,P0口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为I/O口用时,需加上拉电阻;
7.ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器,可通过串口(RxD/P3.0,TxD/P3.1)直接下载用户程序,数秒即可完成一片;
8.具有EEPROM功能;
9.具有看门狗功能;
10.共3个16位定时器/计数器。
即定时器T0、T1、T2;
11.外部中断4路,下降沿中断或低电平触发电路,PowerDown模式可由外部中断低电平触发中断方式唤醒;
12.通用异步串行口(UART),还可用定时器软件实现多个UART;
13.工作温度范围:
-40~+85℃(工业级)/0~75℃(商业级);
14.PDIP封装和PLCC封装。
6.1.1STC89C52RC单片机引脚功能
STC89C52RC的PDIP和PLCC引脚图
·VCC(40引脚):
电源电压;
·VSS(20引脚):
接地;
·P0端口(P0.0~P0.7,39~32引脚):
P0口是一个漏极开路的8位双向I/O口。
作为输出端口,每个引脚能驱动8个TTL负载,对端口P0写入“1”时,可以作为高阻抗输入。
在访问外部程序和数据存储器时,P0口也可以提供低8位地址和8位数据的复用总线。
此时,P0口内部上拉电阻有效。
在FlashROM编程时,P0端口接收指令字节;而在校验程序时,则输出指令字节。
验证时,要求外接上拉电阻。
·P1端口(P1.0~P1.7,1~8引脚):
P1口是一个带内部上拉电阻的8位双向I/O口。
P1的输出缓冲器可驱动(吸收或者输出电流方式)4个TTL输入。
对端口写入1时,通过内部的上拉电阻把端口拉到高电位,这是可用作输入口。
P1口作输入口使用时,因为有内部上拉电阻,那些被外部拉低的引脚会输出一个电流(IL)。
此外,P1.0和P1.1还可以作为定时器/计数器2的外部技术输入(P1.0/T2)和定时器/计数器2的触发输入(P1.1/T2EX),具体功能如下表:
在对FlashROM编程和程序校验时,P1接收低8位地址。
P1.0和P1.1引脚复用功能
引脚号
功能特性
P1.0
T2(定时器/计数器2外部计数输入),时钟输出
P1.1
T2EX(定时器/计数器2捕获/重装触发和方向控制)
·P2端口(P2.0~P2.7,21~28引脚):
P2口是一个带内部上拉电阻的8位双向I/O端口。
P2的输出缓冲器可以驱动(吸收或输出电流方式)4个TTL输入。
对端口写入1时,通过内部的上拉电阻把端口拉到高电平,这时可用作输入口。
P2作为输入口使用时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会输出一个电流(IL)。
在访问外部程序存储器和16位地址的外部数据存储器(如执行“MOVX@DPTR”指令)时,P2送出高8位地址。
在访问8位地址的外部数据存储器(如执行“MOVX@R1”指令)时,P2口引脚上的内容(就是专用寄存器(SFR)区中的P2寄存器的内容),在整