单片机最小系统的设计焊接和调试.docx
《单片机最小系统的设计焊接和调试.docx》由会员分享,可在线阅读,更多相关《单片机最小系统的设计焊接和调试.docx(28页珍藏版)》请在冰点文库上搜索。
![单片机最小系统的设计焊接和调试.docx](https://file1.bingdoc.com/fileroot1/2023-5/3/6b80aa01-b7ce-4851-854f-2505257a92d0/6b80aa01-b7ce-4851-854f-2505257a92d01.gif)
单片机最小系统的设计焊接和调试
摘要
单片机即单片微型计算机(Single-ChipMicrocomputer),是集CPU,RAM,ROM,定时,计数和多种接口于一体的微控制器。
其中51单片机是各种单片机中最为典型和最有代表性的一种,广泛应用于各个领域。
单片机最小系统,或者称为最小应用系统,是指用最少的元件组成的单片机可以工作的系统。
主要由电源、复位、振荡电路以及扩展部分等部分组成。
本课题设计中的单片机最小系统主要由STC89C52单片机控制,用MAX232芯片实现串口程序下载。
由单片机最小系统及扩展七段共阴极LED译码管显示电路和4*4矩阵键盘电路组成。
使用C语言进行编程,通过按矩阵键盘的各个功能键实现数据输入,数据显示和串口通信的功能。
本论文主要介绍了单片机最小系统的软、硬件部分的设计,以及在设计、调试过程中遇到的问题及解决方案。
本课题设计的最小系统结构简单,造价成本低,功能完全,具有很强的实用性。
关键字:
单片机、最小系统、矩阵键盘、七段共阴极译码管
Abstract
Single-ChipMicrocomputer,isthesetofCPU,RAM,ROM,timing,countingandvarietyofinterfaceintegratedmicrocontroller.51variousSCMSCMisthemosttypicalandthemostrepresentativeone,widelyusedinvariousfields.Thesmallestsingle-chipsystem,orcalledtheminimumapplicationsystem,isasystemwiththeleastelementofsingle-chipcanworkmainlybythepower,thereset,theoscillationcircuitandtheextensionpart.
Thesmallestsingle-chipsystemdesignofthisprojectinthemaincontrolledbySTC89C52MCU,MAX232chipserialdownload.Fromthesmallestsingle-chipsystemandtheexpansionofthecommoncathodesevensegmentLEDdecodingdisplaycircuitandthe4*4matrixkeyboardcircuit.TheuseofClanguageprogramming,bypressingthefunctionkeymatrixkeyboarddatainput,datadisplayandserialcommunicationfunction.Thispapermainlyintroducesthedesignofsoft,hardwareMCUminimumsystem,andmeetinthedesign,thedebuggingprocessoftheproblemsandsolutions.Theminimumsystemstructureisdesignedinthisthesisissimple,lowcost,fullyfunctional,verypractical.
Keyword:
Singlechipmicrocomputer、theminimumsystem、matrixkeyboard、Atotalofsevensegmentdecodertubecathode
1.课程设计
1.1设计要求
本次课程设计是基于STC89C52单片机的扩展设计,利用52单片机为核心,需要完成以下的功能:
(1)功能选择
通过功能选择键,使得单片机处于不同的工作状态并通过LED显示相应的内容;可选择的功能包括:
数据输入,数据显示,串口通信。
(2)数据输入
通过功能选择键选择“数据输入”后,可分次输入10个4位十进制数据,并将输入的数据保存在内部RAM中。
数据输入要求:
第一步输入序号0~9,表明输入的是第几个4位十进制数据;
第二步按下回车键,完成序号输入;
第三步输入最多4位的十进制数据;
第四步按下回车键,完成数据输入;
重复第一步,开始新数据的输入;
输入数据的显示格式是:
最左边是序号,然后是空格,之后是从右到左的最多4位十进制数;若在输入过程中(第一步或第三步)出现错误,按“清除”键,重新从第一步开始输入数据。
(3)数据显示
通过功能选择键选择“数据显示”后,可显示之前输入的10个4位十进制数据中的任一个,要求:
第一步输入序号0~9,表明显示的是第几个4位十进制数据;
第二步显示相应的数据;
重复第一步、第二步,显示其他的数据;
数据的显示格式是:
最左边是序号,然后是空格,之后是要显示的数据,从右到左最多4位十进制数。
(4)数据通信
将两个单片机最小系统通过串口连接起来,其中一个作为主系统,另一个作为辅系统。
当通过功能选择键选择“串行通信”后,当在主系统上按下数字键后主系统的LED按从左向右移东的方式显示按键输入的数字,同时辅系统的LED上显示与主系统同样的内容。
1.2设计原理
显示模块STC89C52复位系统
矩阵键盘
时钟电路
图1单片机最小系统原理框图
2.硬件设计及原理分析
2.1复位电路
单片机的置位和复位,都是为了把电路初始化到一个确定的状态,一般来说,单片机复位电路作用是把一个例如状态机初始化到空状态,而在单片机内部,复位的时候单片机是把一些寄存器以及存储设备装入厂商预设的一个值。
单片机复位电路原理是在单片机的复位引脚RST上外接电阻和电容,实现上电复位。
当复位电平持续两个机器周期以上时复位有效。
复位电平的持续时间必须大于单片机的两个机器周期。
具体数值可以由RC电路计算出时间常数。
复位电路由按键复位和上电复位两部分组成。
(1)上电复位:
STC89系列单片及为高电平复位,通常在复位引脚RST上连接一个电容到VCC,再连接一个电阻到GND,由此形成一个RC充放电回路保证单片机在上电时RST脚上有足够时间的高电平进行复位,随后回归到低电平进入正常工作状态,这个电阻和电容的典型值为10K和10uF。
(2)按键复位:
按键复位就是在复位电容上并联一个开关,当开关按下时电容被放电、RST也被拉到高电平,而且由于电容的充电,会保持一段时间的高电平来使单片机复位。
仿真原理图如下所示:
图2复位部分原理图
2.2时钟振荡电路
单片机系统里都有晶振,在单片机系统里晶振作用非常大,全程叫晶体振荡器,他结合单片机内部电路产生单片机所需的时钟频率,单片机晶振提供的时钟频率越高,那么单片机运行速度就越快,单片接的一切指令的执行都是建立在单片机晶振提供的时钟频率。
在通常工作条件下,普通的晶振频率绝对精度可达百万分之五十。
高级的精度更高。
有些晶振还可以由外加电压在一定范围内调整频率,称为压控振荡器(VCO)。
晶振用一种能把电能和机械能相互转化的晶体在共振的状态下工作,以提供稳定,精确的单频振荡。
单片机晶振的作用是为系统提供基本的时钟信号。
通常一个系统共用一个晶振,便于各部分保持同步。
有些通讯系统的基频和射频使用不同的晶振,而通过电子调整频率的方法保持同步。
晶振通常与锁相环电路配合使用,以提供系统所需的时钟频率。
如果不同子系统需要不同频率的时钟信号,可以用与同一个晶振相连的不同锁相环来提供。
原理图如下所示:
图3时钟振荡电路原理图
2.3数码管显示电路
LED数码管显示是利用半导体发光制成条形的发光二极管,封装在一起组成数字或其他符号形状。
数码管根据公共端不同,分为共阴极和共阳极两种形式。
本次设计采用共阴级数码管,考虑到六位数码显示管显示,本次设计采用了数码管LG5631AH。
在本课程设计中,我们用六段数码管进行数据显示,所以采用了LED动态显示的方式。
将所有数码管的段选线接在一起,用一个I/O口控制,本设计中用P0口控制,公共端不是直接接地,而是通过相应的I/O线控制,本设计中用到了P1.0-P1.5。
在使用P0口时,需要加上拉电阻,设计中选用了10K的排阻。
原理图如下所示:
图4数码管显示模块
2.4矩阵键盘
键盘的工作方式一般有循环扫描和中断扫描两种。
循环扫描方式利用CPU在完成其他工作的空余,调用键盘扫描子程序来响应键输入要求。
在执行键功能程序时,CPU不再响应键输入要求。
键盘扫描程序通常具备4项功能:
第一,判断键盘上有无键按下。
第二,去除键抖动影响。
在判断有键按下,软件延时一段时间后,再判断键盘状态。
如果仍为有键按下状态,则确定;否则按键抖动处理。
第三,扫描键盘,得到按键的键号。
第四,判别闭合的键是否释放。
在系统初始化后,CPU必须反复轮流调用扫描式显示子程序和键盘输入程序。
在识别有键闭合后,执行规定的操作,然后再重新进人上述循环。
循环工作方式采用扫描键盘的工作方式,虽然能响应键输人的命令或数据,但是这种方式不管键盘上有无键按下,CPU总要定时扫描键盘;而应用系统在工作时,并不经常需要按键输入,因此,CPU常处于空扫描状态。
为了提高CPU的工作效率,可采用中断扫描工作方式,即只在键盘有键按下时发中断请求,CPU响应中断请求后,转中断服务程序,进行键盘扫描,识别键码。
中断扫描工作方式的一种简易键盘接口电路。
其直接由P1口中高、低字节构成4x4行列式键盘。
键盘的列线与P2口的低4位相接,键盘的行线接到P2口的高4位。
初始化时,键盘行输出口全部置0。
当有键按下时,相应的引脚被拉至低电平,1NT0端为低电平,向CPU发出中断请求,若CPU开放外部中断,则响应该中断请求,进人中断服务程序。
此外还须注意保护与恢复现场。
原理图如下所示:
图5键盘部分的仿真原理图
2.5单片机的外围电路
2.5.1RX232接口
RS232接口连接器一般使用型号为DB-9的9芯插头座,只需3条接口线,即"发送数据"、"接收数据"和"信号地"即可传输数据,在此用于串口通信接口,其引脚图如下所示:
图6RX232接口图
特点:
(1)RS232的规范中,电压值在+3V~+15V(一般使用+6V)称为"0"或"ON"。
电压在-3V~-15V(一般使用-6V)称为"1"或"OFF";
(2)RS232为全双工工作模式,其信号的电压是参考地线而得到的,可以同时进行数据的传送和接收。
引脚功能介绍:
1数据载波检测 DCD 2接收数据 RXD 3发送数据 TXD 4数据终端准备 DTR 5信号地 GND 6数据设备准备好 DSR 7请求发送 RTS 8清除发送 CTS 9振铃指示 DELL
3.仿真部分
3.1仿真程序
程序部分见附录
3.2数据输入功能的实现
如下图,实现数据的输入:
从左端第一位,输入的是数据的序号,第二位为空格,后四位是输入的四位数。
图7数据输入的仿真
3.3数据显示功能的实现
如下,实现数据显示的功能:
图8数据显示的仿真
3.4串口通信的实现
左边芯片作为主芯片,右边芯片作为辅芯片,使用主芯片的P3.1口做串口输出,辅芯片的P3.0做串口输入,实现串口通信,即主系统的LED按从左向右移东的方式显示按键输入的数字,同时辅系统的LED上显示与主系统同样的内容。
仿真结果如下图所示:
图9串口通信的仿真
(1)
图10串口通信的仿真
(2)
3.5矩阵键盘按键功能
矩阵键盘的16个按键中,有六个作为功能键使用,十个是数据键,展示图如下:
数字7
数字8
数字9
数据输入
数字4
数字5
数字6
数据显示
数字1
数字2
数字3
串口通信
桌面
数字0
回车
清除
图11矩阵键盘的分布
3.6功能键的实现
如下图所示,图12为清除按键的作用效果,图13为桌面按键的作用效果:
图12清除按键的作用效果图
图13桌面按键的作用效果
4.硬件设计
焊接电路板的正面图如图14所示:
图14焊接电路板正面图
焊接电路板的反面图如图15所示:
图13焊接电路板反面图
5.元件清单
序
号
名称
数量
1
万能实验电路板
1块
2
STC89C52
1片
3
晶振12MHz
1个
4
DB9插座
1只
5
RS-232C串口电缆(9针)
1根
6
74HC373
1片
7
30pf瓷片电容
2个
8
10uf电解电容
1个
9
0.1uf瓷片电容
5个
10
MAX232
1片
11
10K/9脚排阻
1个
12
电阻10K、5.1K、4.7K
若干
13
排针、按钮、LED、导线
若干
6.心得体会
通过本学期开设的单片机理论课学习,我对其理论知识,包括单片机最小系统的构建和功能扩展有了一定的了解,在学期末又安排了单片机的课程设计,它是以STC89C52为核心构建单片机最小系统,扩展了矩阵键盘,LED显示的功能,来实现数据输入,数据显示,串口通信的要求。
拿到课设题目之后,我先了解了他的任务要求,并根据所学知识进行分析,因为自己能力有限,我在网上查阅资料研究程序,之后在proteus软件环境中进行原理图的仿真,导入程序后进行编译,看到实现了任务书中的要求。
最后,我根据原理图进行了硬件设计,对电路板焊接,焊接完成后对其测试,遗憾的是,板子焊接出现问题,调试没有成功。
经过本次的单片机课程设计,我加深了对他理论知识的理解,提高了自己解决问题和动手的能力,为以后课程的学习奠定基础。
7.参考文献
[1]尹勇撒继铭等,单片计算机原理及应用(第1版),科学出版社,2013年
[2]谢自美.电子线路设计·实验·测试(第三版).武汉:
华中科技大学出版社
[3]李群芳.单片微型计算机与接口技术(第3版).电子工业出版社,2008
[4]刘教瑜.单片机原理及应用.武汉理工大学出版社,2011
[5]张东亮.单片机原理与应用.人民邮电出版社,2009
[6]V.Yu.Teplov,A.V.Anisimov.ThermostattingSystemUsingaSingle-ChipMicrocomputerandThermoelectricModulesBasedonthePeltierEffect[J],2002
[7]YeagerBrent.Howtotroubleshootyourelectronicscale[J]..PowderandBulkEngineering.1995
附录
程序1
#include"reg52.h"
voiddelay(unsignedchars);
voidkeyscan(void);
voidkeydown(void);
voidinput(void);
voidscreen(intsmode);
inttest=0;
unsignedcharint_on=0;//用于刚进入通信模式时的初始化只有在通信模式下需要打开中断1为中断已开化
unsignedchartemp;//读按键用的测试变量
unsignedcharkey;//按键序号
unsignedcharMODE=3;//模式选择,0为输入模式,1为显示模式,2为串口通信模式
unsignedcharFUNC=0;//功能选择,1为回车,2为清除
unsignedcharreg[10][4];//输入内容存放的数组
unsignedchardis_buf[6];//显示缓存
unsignedcharinputmode;//通过回车键来判断输入模式,0为输入序号,1为输入4位十进制数据
unsignedchargroup,datpos;//分别存储数据的组数和十进制数据位数
unsignedcharLedNum[]={~0xc0,~0xf9,~0xa4,~0xb0,~0x99,~0x92,~0x82,~0xf8,~0x80,~0x90,~0x88,~0x83,~0xc6,~0xa1,~0x86,~0x84};
voiddelay(unsignedchars)//延时函数
{
inti,j;
for(j=s;j>=0;j--)
for(i=125;i>0;i--);
}
voidscreen(intsmode)//对数码管操作的函数1为清空显示0号位光标2为移位
{
intp;
if(smode==1)
{
for(p=0;p<6;p++)
{
dis_buf[p]=0x00;//清屏
}
dis_buf[0]=0x08;//带输入光标
}
elseif(smode==2)
{
for(p=5;p>0;p--)//显示缓存移位
{
dis_buf[p]=dis_buf[p-1];
}
}
}
voidkeyscan(void)//按键扫描函数
{
P2=0x0F;//低四位输入列为高电平行为低电平
temp=P2;//读P2口
temp=temp&0x0F;
temp=~(temp|0xF0);
switch(temp)
{
case1:
key=0;break;//p2.0被拉低
case2:
key=1;break;//p2.1被拉低
case4:
key=2;break;//p2.2被拉低
case8:
key=3;break;//p2.3被拉低
default:
key=16;
}
temp=0;
P2=0xF0;//高四位输入行为高电平列为低电平
//delay
(1);
temp=P2;//读P2口
temp=temp&0xF0;//屏蔽低四位
temp=~((temp>>4)|0xF0);
switch(temp)
{
case1:
break;//p2.4被拉低
case2:
key=key+4;break;//p2.5被拉低
case4:
key=key+8;break;//p2.6被拉低
case8:
key=key+12;break;//p2.7被拉低
default:
key=16;
}
switch(key)
{
case3:
//模式选择为输入
MODE=0;
inputmode=0;//从数据序号开始输入
key=16;//键盘序号置空
FUNC=0;//功能键置空
screen
(1);
break;
case7:
//模式选择为显示
MODE=1;
key=16;//键盘序号置空
screen
(1);
break;
case11:
MODE=2;break;
case14:
FUNC=1;break;//按键功能选择
case15:
FUNC=2;break;
case12:
MODE=3;break;//模式3为空余模式,可自定义或欢迎界面
default:
{
switch(key)
{
case0:
case1:
case2:
key+=7;break;
case8:
case9:
case10:
key-=7;break;
case13:
key=0;
}
datpos++;//存数位数加一
if(datpos==4)datpos=0;
}
}
P2=0xf0;
while(P2!
=0xf0);//保证按键弹起后再跳出程序
}
voidkeydown(void)
{
P2=0xF0;
//delay
(1);
if(P2!
=0xF0)//判断按键是否按下如果按钮按下会拉低P2其中的一个端口
{
keyscan();//调用按键扫描程序
}
}
voidinput(void)
{
if(FUNC==1)//回车时输入模式切换
{
if(inputmode==1)
{
screen
(1);//清屏并在0号位输入光标
}
elsedis_buf[2]=0x08;//在2号位输入光标
inputmode=1-inputmode;
FUNC=0;//切换完成功能变量置空
}
if(FUNC==2)
{
inputmode=0;//重新从数据组数开始输入
reg[group][0]=0;//清空已输入的错误数据
reg[group][1]=0;
reg[group][2]=0;
reg[group][3]=0;
screen
(1);
FUNC=0;
}
if(key<10)
{
if(inputmode==0)
{
group=key;//序号确认
dis_buf[0]=LedNum[group];
datpos=-1;//数据键入位置归零
}
elseif(inputmode==1)//对应组数据输入
{
dis_buf[datpos+2]=LedNum[key];
reg[group][datpos]=key;
delay
(1);
}
}
}
voidmain()
{
unsignedcharLedSele[]={~0x01,~0x02,~0x04,~0x08,~0x10,~0x20};
unsignedcharroll;
//if(P2^0&P2^7==1)MODE=2;//电路中辅系统的P2.0和P2.7置一,区别于主系统。
辅系统保持在通信模式
SCON=0x50;//REN=1允许串行接受状态,串口工作模式2