武汉理工大学单片机课程设计2Word格式文档下载.docx
《武汉理工大学单片机课程设计2Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《武汉理工大学单片机课程设计2Word格式文档下载.docx(27页珍藏版)》请在冰豆网上搜索。
如图所示,发送机程序设计结构如下:
图1.1发送机程序设计结构
接收机程序设计结构图如下:
图1.2接收机程序设计结构图
2硬件电路及其说明
2.1显示电路单元
2.1.174HC573资料
74HC573是八进制3态非反转透明锁存器,是高性能硅门CMOS器件。
原理说明:
74HC573的八个锁存器都是透明的D型锁存器,当使能(G)为高时,Q输出将随数据(D)输入而变。
当使能为低时,输出将锁存在已建立的数据电平上。
输出控制不影响锁存器的内部工作,即老数据可以保持,甚至当输出被关闭时,新的数据也可以置入。
这种电路可以驱动大电容或低阻抗负载,可以直接与系统总线接口并驱动总线,而不需要外接口。
特别适用于缓冲寄存器,I/O通道,双向总线驱动器和工作寄存器。
1)引脚图:
图2-174HC573引脚图
2)引脚功能表:
图2-274HC573功能真值表
2.1.2数码管显示电路
LED数码管显示是利用半导体发光制成条形的发光二极管,封装在一起组成数字或其他符号形状。
数码管根据公共端不同,分为共阴极和共阳极两种形式。
本次设计采用共阴级数码管,考虑到六位数码显示管显示,本次设计采用了数码管LG5631AH。
2.1.3显示电路原理图及其说明
图2-3显示部分电路原理图
说明:
从原理图我们可以清晰的看到电路的硬件连接,我们采用两个共阴级数码管LG5631AH作为显示部分,74HC573作为数码管与单片机的连接的中间部分,其中一片74HC573作为位选控制端口,控制六个数码管的选中,另一片作为段选端口,选中每一位七段数码管的数字显示。
这样就可以实现要求中关于矩阵键盘的显示电路和温度检测显示电路的要求。
其他与单片机功能相关部分由排针引出,实现外接。
2.2矩阵键盘单元
2.2.1矩阵键盘的原理与检测方式
1)原理说明:
列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。
这样,当按键没有按下时,所有的输入端都是高电平,代表无键按下。
行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。
2)键盘的工作方式一般有循环扫描和中断扫描两种。
循环扫描方式利用CPU在完成其他工作的空余,调用键盘扫描子程序来响应键输入要求。
在执行键功能程序时,CPU不再响应键输入要求。
键盘扫描程序通常具备4项功能:
第一,判断键盘上有无键按下。
第二,去除键抖动影响。
在判断有键按下,软件延时一段时间后,再判断键盘状态。
如果仍为有键按下状态,则确定;
否则按键抖动处理。
第三,扫描键盘,得到按键的键号。
第四,判别闭合的键是否释放。
在系统初始化后,CPU必须反复轮流调用扫描式显示子程序和键盘输入程序。
在识别有键闭合后,执行规定的操作,然后再重新进人上述循环。
循环工作方式采用扫描键盘的工作方式,虽然能响应键输人的命令或数据,但是这种方式不管键盘上有无键按下,CPU总要定时扫描键盘;
而应用系统在工作时,并不经常需要按键输入,因此,CPU常处于空扫描状态。
为了提高CPU的工作效率,可采用中断扫描工作方式,即只在键盘有键按下时发中断请求,CPU响应中断请求后,转中断服务程序,进行键盘扫描,识别键码。
中断扫描工作方式的一种简易键盘接口电路。
其直接由P1口中高、低字节构成4x4行列式键盘。
键盘的列线与P1口的低4位相接,键盘的行线接到Pl口的高4位。
图5中“与”门的4输入端分别与各列线相连,而输出端接单片机外部中断输入INT0。
初始化时,键盘行输出口全部置0。
当有键按下时,1NT0端为低电平,向CPU发出中断请求,若CPU开放外部中断,则响应该中断请求,进人中断服务程序。
此外还须注意保护与恢复现场。
2.2.2矩阵键盘电路部分及其说明
图2-4矩阵键盘电路
说明:
本次设计采用循环扫描的方法,每次检测有按键按下,由于行列电平的变化,便开始查询此时行列电平值所对应的键盘编码,再由键盘编码输出对应的数码管显示编码并显示键值,由此按下一个按键,便可以得到相应的显示部分。
本设计可实现要求。
2.3单片机最小系统及外围电路
2.3.1MAX232资料
max232在这里作为电平转换功能,应用电路如下:
图2-5max232应用电路
1)引脚图
图2-6max232引脚图
2)电路说明:
第一部分是电荷泵电路。
由1、2、3、4、5、6脚和4只电容构成。
功能是产生+12v和-12v两个电源,提供给RS-232串口电平的需要。
第二部分是数据转换通道。
由7、8、9、10、11、12、13、14脚构成两个数据通道。
其中13脚(R1IN)、12脚(R1OUT)、11脚(T1IN)、14脚(T1OUT)为第一数据通道。
8脚(R2IN)、9脚(R2OUT)、10脚(T2IN)、7脚(T2OUT)为第二数据通道。
TTL/CMOS数据从11引脚(T1IN)、10引脚(T2IN)输入转换成RS-232数据从14脚(T1OUT)、7脚(T2OUT)送到电脑DB9插头;
DB9插头的RS-232数据从13引脚(R1IN)、8引脚(R2IN)输入转换成TTL/CMOS数据后从12引脚(R1OUT)、9引脚(R2OUT)输出。
第三部分是供电。
15脚GND、16脚VCC(+5v)。
2.3.2RS232接口
a.简介:
RS232接口连接器一般使用型号为DB-9的9芯插头座,只需3条接口线,即"
发送数据"
、"
接收数据"
和"
信号地"
即可传输数据,在此用于串口通信接口,其引脚图如下所示。
b.特点:
1)RS232的规范中,电压值在+3V~+15V(一般使用+6V)称为"
0"
或"
ON"
。
电压在-3V~-15V(一般使用-6V)称为"
1"
OFF"
;
2)RS232为全双工工作模式,其信号的电压是参考地线而得到的,可以同时进行数据的传送和接收。
c.引脚功能介绍和引脚图:
1数据载波检测DCD2接收数据RXD3发送数据TXD4数据终端准备DTR5信号地GND6数据设备准备好DSR7请求发送RTS8清除发送CTS9振铃指示DELL
图2-7RS232接口引脚图
2.3.3STC89C52
1)简介:
STC89C52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
具有以下标准功能:
8k字节Flash,512字节RAM,32位I/O口线,看门狗定时器,内置4KBEEPROM,MAX810复位电路,2个16位定时器/计数器,一个6向量2级中断结构,全双工串行口。
另外STC89X52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
最高运作频率35MHz,6T/12T可选。
2)参数:
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个),复位后为:
P0/P1/P2/P3是准双向口/弱上拉,P0口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为I/O口用时,需加上拉电阻。
7..ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器,可通过串口(RxD/P3.0,TxD/P3.1)直接下载用户程序,数秒即可完成一片
8.共3个16位定时器/计数器。
即定时器T0、T1、T2
9.外部中断4路,下降沿中断或低电平触发电路,PowerDown模式可由外部中断低电平触发中断方式唤醒
10.通用异步串行口(UART),还可用定时器软件实现多个UART
11..工作温度范围:
-40~+85℃(工业级)/0~75℃(商业级)
3)引脚图如下,通用I/O口(32个),有40个引脚。
图2-8STC89C52引脚图
2.3.4复位电路
复位一般有上电和按键复位两种方式,本次设计采用按键复位,按键接在单片机的RST(30引脚)端口。
电路如下:
图2-9按键复位电路
2.3.5振荡电路
单片机系统里都有晶振,在单片机系统里晶振作用非常大,全称叫晶体振荡器,它结合单片机内部电路产生单片机所需的时钟频率,单片机晶振提供的时钟频率越高,那么单片机运行速度就越快,单片接的一切指令的执行都是建立在单片机晶振提供的时钟频率。
图2-10晶体震荡电路
2.3.6串口电路
图2-11串口电路
各部分均通过对应引脚标号相连,串口电路可实现串口通信,通信使用3根线完成:
(1)地线,
(2)发送,(3)接收。
如图。
2.3.7最小系统原理图
由单片机为核心构成有基本功能的最小系统,原理图如下:
图2-12最小系统原理图
3仿真软件介绍
3.1程序设计软件Protel
Protel公司于80年代末推出了Protel——电子行业的CAD软件,由于最初在国内普及率较高,所以发展较好,大多数公司中低频电路设计都采用此软件。
早期的版本主要用于印刷版自动布线。
后来推出著名的Protel
99se,能够Windows
9X/XP下运行。
2000年以后,Altium公司又推出了该软件的升级版Altium
Designer。
Altium
Designer在原有的基础上做出了很大的改进,能够打开如Pspice等仿真软件做出的文件。
虽然市场上还有很多电路设计软件,但是该软件还是占有很大的市场份额。
现在业界最高版本为Altium
Designer
Winter
09版。
本次设计采用的是Altium
Designer进行电路原理图的绘制。
3.2程序编写软件Keil
KeilC51是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。
Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。
本次设计编程主要使用Keil软件进行编程。
3.3仿真软件Proteus
Protues软件是英国Labcenterelectronics公司出版的EDA工具软件。
它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。
它是目前最好的仿真单片机及外围器件的工具。
虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。
Proteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。
是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,在编译方面,它也支持IAR、Keil和MPLAB等多种编译。
本次设计采用的是Proteus进行仿真。
4仿真电路测试
图4-1上电复位
图4-2数据输入显示
图4-3数据串行通信显示
5实物图及其调试
图5-1上电复位
图5-2数据输入显示
图5-3实物背面图
图5-4串行通信显示图
6小结与体会
本次课程设计结合本学期所学习的单片机的基础知识,将硬件和软件的知识全都联系起来,硬件方面有电路的连接和芯片的选取,软件方面有程序的设计和编写,这也为以后进一步学习嵌入式系统打好了基础。
通过这些天来的实习,印象最深的是编写程序和焊接电路的时候,前者是软件方面的算法问题,实现功能切换的程序方法有很多,我考虑的是利用中断来实现,可是并不满足程序的要求,经过调试和改善后得以成功。
后者是硬件电路的焊接,很多同学已经学会PCB,所以硬件电路对他们很轻松容易,而硬件电路连接复杂,单纯的技术焊接费时难测,让我觉得与一些同学还是有很大的差距,有待改进。
当然,最终实物实现了所要求的功能,可是还是有很多地方需要改进,例如PCB的设计和制作,例如程序的书写规范,不过总的来说这次单片机实习还是让我学到非常多的东西,也增加了我的动手机会,希望自己以后更加严格的要求自己,做到更好。
7参考文献
[1]尹勇撒继铭等,单片计算机原理及应用(第1版),科学出版社,2013年
[2]谢自美.电子线路设计·
实验·
测试(第三版).武汉:
华中科技大学出版社
[3]李群芳.单片微型计算机与接口技术(第3版).电子工业出版社,2008
[4]刘教瑜.单片机原理及应用.武汉理工大学出版社,2011
[5]张东亮.单片机原理与应用.人民邮电出版社,2009
附录1:
C语言源程序
发送机主程序:
#include<
reg51.h>
#include<
intrins.h>
bitFlag;
unsignedintReData,SenData;
chartable[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x84};
//数码管代码
chardis_buf;
chari=0,j=0,k=0,inp1=0,inp2=0,inp3=0,on_off=0,disp=0;
//初始化控制变量
chartemp,key,num,m,n;
chara[11][5];
voidkeydown(void);
voidkeyscan(void);
voiddisplay(void);
voidinit(void);
voiddelay(intz)
{
intx,y;
for(x=0;
x<
z;
x++)
for(y=0;
y<
110;
y++);
}
voidmain()
P0=0xff;
P2=0xff;
dis_buf=0xbf;
while
(1)
{
for(m=0;
m<
10;
m++)
for(n=0;
n<
5;
n++)
a[m][n]=0;
display();
}
}
voidkeydown(void)
P1=0xf0;
if(P1!
=0xf0)
keyscan();
//扫描函数
while(P1!
=0xF0);
voidkeyscan(void)
{intm,n;
//**********为每个按钮设置一个编号key**********************************
P1=0x0f;
//低四位输入
delay
(1);
temp=P1;
temp=(~temp)&
0x0f;
if(temp==1)key=0;
elseif(temp==2)key=4;
elseif(temp==4)key=8;
elseif(temp==8)key=12;
P1=0xf0;
delay
(1);
temp=(temp>
>
4);
if(temp==1)key=key+0;
elseif(temp==2)key=key+1;
elseif(temp==4)key=key+2;
elseif(temp==8)key=key+3;
if(key==3||key==7||key==11||key==12||key>
13){//控制按钮输入
if(key==3)//数据输入按钮
{
on_off=1;
//开数据输入开关
}
elseif(key==7)//数据显示按钮
disp=1;
num=0;
elseif(key==11)//串行通信
init();
inp2=1,i=0,j=0,inp1=0,on_off=0,disp=0,num=0;
for(m=0;
for(n=0;
a[m][n]=0;
elseif(key==12)//回车按钮
inp1++;
if(inp1==2){inp1=0;
j=0;
}
elseif(key==15)//清除按钮
i=0,j=0,inp1=0,inp2=0,on_off=0,disp=0,num=0;
elseif(key==14)//输入清除按钮
for(j=0;
j<
6;
j++)a[i][j]=0;
inp1=0;
j=0;
}else{//数据按钮输入
if(key<
3){num=key+1;
}//num为1~3
elseif(key>
3&
&
key<
7){num=key;
}//num为4~6
7&
11){num=key-1;
}//num为7~9
elseif(key==13){num=0;
}//num为0
if(disp==0&
on_off==1){
if(inp1==0){i++;
a[i][0]=num;
}//数据存储
elseif(inp1==1){j++;
a[i