九九乘法表判断器.docx
《九九乘法表判断器.docx》由会员分享,可在线阅读,更多相关《九九乘法表判断器.docx(23页珍藏版)》请在冰豆网上搜索。
九九乘法表判断器
信息与电气工程学院
课程设计说明书
(2010/2011学年第二学期)
课程名称:
单片机原理及应用
题目:
九九乘法表判断器
专业班级:
学生姓名:
学号:
指导教师:
杨怡君、王静爽、韩昱
设计周数:
2
设计成绩:
2011年6月20日
目录
一课程设计任务及目的----------------------------------------------------------------2
1.1课程设计任务---------------------------------------------------------------2
1.2课程设计目的----------------------------------------------------------------2
二课程设计----------------------------------------------------------------3
2.1硬件设计----------------------------------------------------------------3
2.1.1硬件方案设计------------------------------------------------------------3
2.1.2单元电路设计------------------------------------------------------------5
2.2.3系统调试----------------------------------------------------------------8
2.2软件设计-----------------------------------------------------------------9
2.2.1系统分析------------------------------------------------------------------9
2.2.2系统设计------------------------------------------------------------------10
2.2.3系统实施------------------------------------------------------------------18
三课程设计总结------------------------------------------------------------------18
四参考文献------------------------------------------------------------------19
一.课程设计任务及目的
1.1课程设计任务
技术要求:
以MCS-51单片机为核心,设计出一个九九乘法表判断器。
2个数码管显示输入答案;一个数字加1循环按键,一个乘按键,一个输入答案按键,一个清零按键。
若输入正确,蜂鸣器鸣响2秒;答案错误,则清零重新输入。
主要任务:
a、确定总体设计法案;
b、设计键盘输入电路;
c、设计显示电路;
d、编写系统程序;
e、利用Protel设计硬件电路原理图和PCB图;
f、软硬件联机调试。
1.2课程设计目的
(1)通过九九乘法表判断器的设计,掌握数码管动态显示的原理;
(2)通过单片机课程设计,熟练掌握软件编程的方法,将理论知识联系到实践中去,提高我们的动脑动手能力;
(3)完成系统的硬件设计、软件设计、仿真调试,学会将硬件知识和软件知识结合起来,使两者相互补充,共同实现一个系统的功能;
(4)通过课程设计加深理解课堂教学内容,掌握单片机的基本应用方法。
通过实验熟悉微机基本接口芯片的外型、引脚、编程结构。
掌握程序设计和单片机基本接口电路的设计、应用方法,做到理论联系实际
二、课程设计
2.1硬件设计
2.1.1总体设计
方案(电路原理图如下)
系统组成:
该系统由单片机基本电路、数码管显示电路,按键输入电路以及蜂鸣器电路组成。
其中单片机基本电路已在课程设计专用单片机基本电路给出。
系统工作原理:
(如图)
系统通过键盘输入模块向单片机输入数据,经过单片机的计算按条件再向数码管显示模块和蜂鸣器输出指令,使之执行相应的动作。
各个模块的工作原理将在下文做具体介绍。
2.1.2单元电路设计
(一)单片机基本系统
1、电路说明
课程设计配发的小电路板(ISP-MCUBasiccircuit)电路原理图见下图。
该板作为课程设计的核心电路板使用,板上有单片机及附属电路,RS-232通信驱动电路,高低电平测试电路等。
课程设计电路中需要的其他电路在此基础上扩展,通过插孔连接。
扩展电路在万用板上制作。
2、器件安装
PCB板上画成熔断器的器件“W1~W4”安装导线短接,最先安装。
然后依次安装电阻、插孔座、DIP插座、发光二极管、瓷片电容、独石电容、电解电容、按钮,最后安装接线端子和DB9插座。
注意所有插座、插孔座、按钮及接线端子一定要安装牢靠。
晶体谐振器处安装插孔座,以便更换晶振。
3、使用说明
基本电路板上的单片机使用宏晶公司支持串口下载程序(ISP)的单片机,如STC90C52AD。
单片机的技术资料和用于下载程序的软件可从宏晶公司网站上下载,也可向指导老师所要。
需要阅读理解单片机资料中“在系统可编程使用”,用到模数转换功能的组还要阅读“A/D转换寄存器及应用”。
调试程序时建议充分利用程序下载方便的有利条件,先编一些短小的程序验证硬件电路的正确性和使用方法的正确性。
完整程序复杂时建议使用单片机仿真软件帮助排除错误。
也可利用下载软件自带的串口工具帮助调试,通过单片机把运行状态和重要数据送到PC机。
扩展电路尽量不要再使用P3.0和P3.1口,必须使用时可作为单片机的输出口使用。
标识符
器件名称
规格型号
数量
标识符
器件名称
规格型号
数量
U1
单片机
STC90C52AD
1
C11C12
瓷片电容
22p或30p
2
U2
RS232驱动
MAX232
1
C13-C17
独石电容
0.22uF(224)
5
J1-J4,CRY
LstsHsts
接线插孔座
排母
86针
C1C2
电解电容
1.0uF/50V
2
C3C4C0
电解电容
10uF/50V
3
CRY
晶体谐振器
6MHz
1
C5-C8
电解电容
47uF(22uF)
4
High,Low,PS
发光二极管
φ3
3
JPS
接线端子
电源用
1
R1
金属膜电阻
200Ω
1
RST
按钮
小(0.2×0.3)
1
R0
金属膜电阻
6.8K
1
JDB
DB9插座
DB9针形座
1
R2R3R4
金属膜电阻
3.3K
3
U1
DIP插座
DIP40
1
R9
金属膜电阻
1M
1
U2
DIP插座
DIP16
1
(二)按键输入单元设计
1、电路说明
按键输入单元的电路图如图。
该单元作为系统的输入,采用了四个独立按键,分别为数字加一循环按键K1(接P1.0口)、乘按键K2(接P1.1口)、答案输入按键K3(接P1.2键)、清零按键K4按键(接P1.3口)。
当按键按下,电源与地短路,使单片机端口电平被拉低,从而检测出一个输入。
各个接口通过插针与单片机相连。
2、器件安装
按钮顺向相对引脚为一对,每个钮有两对引脚,安装的时候要注意将同极性的两个引脚接到一起,以提高可靠性。
上拉电阻为10KΩ。
(三)数码管显示单元
1、电路说明
数码管显示单元的电路原理图如图。
该单元作为系统的输出显示,采用两个共阳极数码管动态显示。
两数码管段选信号引脚并联通过0.33KΩ的限流电阻接到单片机的P2口,从P2.0到P2.7一次接数码管的a—dp脚。
由于采用了共阳极的数码管,因此不需要驱动芯片来驱动数码管显示,只需单片机引脚给出低电平相应断即可点亮。
两个数码管的片选端分别接两个PNP型三级管的集电极,三级管的射极接电源,基极接单片机P1.5、P1.6端。
该三极管起到了控制以及放大电流的作用,使得单片机可以通过给相应端口送低电平而使数码管点亮。
2.器件安装
通过查询得到数码管的引脚排序,找出响应的引脚。
在单片机端口外接0.33KΩ的限流电阻,以防止电流过大损坏数码管。
两个数码管的片选端分别接两个PNP型三级管的集电极,三级管的射极接电源,基极接单片机。
注意数码管、三极管的引脚不能接错。
(三)蜂鸣器输出单元
1.电路说明
蜂鸣器输出单元的电路图如图。
Vcc
该单元作为系统的输出,在计算结果正确时鸣响。
蜂鸣器通过一个PNP型三极管与电源和单片机P1.4口相连。
三极管的放大作用避免了蜂鸣器驱动电流的不足,也使得单片机可以通过给P1.4口低电平使蜂鸣器鸣响。
2.器件安装
注意三级管的极性,以及限流电阻的接法。
GND
(四)附加电路器件表
标识符
器件名
规格型号
数量
R4~R7
电阻
10k
4
R8~R17
电阻
0.33k
10
Q1~Q3
PNP型三级管
9012
3
LS0
蜂鸣器
1
2.1.3系统调试
在焊接完毕附加电路以后,可通过肉眼做初步的观察,看是否存在虚焊、漏焊等明显缺陷,确认没有以后,可以通电对蜂鸣器单元、数码管显示单元进行调试:
将蜂鸣器的使能端接到5V电源负极,正常鸣响则该单元合格。
再将每个数码管的使能端和段选端接到电源负极,如果每段都正常点亮则该单元合格。
若某单元不正常,则需找出错误改正后在调试,直到合格为止。
对于按键单元则可以通过万用表测其通态与断态的电阻来确定其实否合格。
合格时,通态电阻接近0,断态电阻接近无穷。
至此,硬件电路设计完毕。
2.2软件设计
2.2.1系统分析
该系统为一个九九乘法表判断器,故需要有乘数及答案的输入。
在硬件电路中设置了4个按键,K1、K2、K3、K4分别作为数字加一循环、乘、答案输入、清零按键。
两个数码管显示输入的数字。
而蜂鸣器则在答案正确的时候作提示用。
在按方面,由于只有一个数字循环键,所以,将乘按键和答案输入键设置为多功能按键。
在第一次按下K2时再按K1则可输入第一个乘数,第二次按下K2键的时候按K1键可以输入第二个乘数。
在K3第一次按下后,按K1输入答案的十位数,K3第二次按下后输入答案的个位数,K3第三次按下则判断并显示结果:
正确则蜂鸣2秒,错误则清零重来。
这样就减少了K1键的按键次数。
同时,在乘数没有输入完毕,即K2键按下少于2次时,答案输入按键是无效的;在输入答案时,K2是无效的。
这样避免了误操作。
在此技术要求下,程序流程图如下:
2.2.2系统设计(C语言编写)
根据系统流程图编写系统程序如下:
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitinckey=P1^0;//定义按键及数码管位选信号端口
sbitmulkey=P1^1;
sbitanswerkey=P1^2;
sbitclrkey=P1^3;
sbitbuzzer=P1^4;
sbitdsp_ten=P1^5;
sbitdsp_one=P1^6;
uintcodeseg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};//数码管字型码
uintdata_in,answer,answer_one,answer_ten,result,muler1,muler2,number;
ucharanswerkey_val,mulkey_val,dsp_flg,mul_end_flg=0;
//////////////////////////////////////////////////////
/*函数名:
delay_1ms()*/
/*功能:
一毫秒基准延时子函数*/
/*入口参数:
delay_time*/
voiddelay_1ms(uintdelay_time)
{
while(delay_time--)
{
ucharj;
for(j=0;j<63;j++);
}
}
////////////////////////////////////////////////////////////////////
/*函数名:
beep_500ms()*/
/*功能:
蜂鸣器500ms基准鸣响子函数*/
/*入口参数:
beep_time*/
voidbeep_500ms(uintbeep_time)
{
uinti;
EA=0;//关中断,防止蜂鸣器鸣响频率受影响
while(beep_time--)
{
for(i=500;i>0;i--)
{
delay_1ms
(1);//蜂鸣器震动周期为2ms频率为500Hz
buzzer=!
buzzer;
}
}
EA=1;
}
///////////////////////////////////////////////////////////////////////////////////////
/*函数名:
reset()*/
/*函数功能:
复位子函数,清零所有变量,从新开始程序*/
voidreset()
{
P2=0xff;
data_in=dsp_flg=mul_end_flg=number=answerkey_val=mulkey_val=0;
result=muler1=muler2=answer=answer_one=answer_ten=0;
//beep_500ms
(1);//按键提示,调试用
}
////////////////////////////////////////////
/*a函数名:
LED_dap()*/
/*中断方式动态显示子函数*/
voidLED_dsp()interrupt1
{
TH0=(65536-2000*2)>>8;//清零定时器溢出位,重装初值
TL0=(65536-2000*2)&0x0f;
if(dsp_flg==1)//答案输入标志位为一,开始输入答案,动态显示两位答案
{
dsp_ten=0;//十位数码管亮,个位数码管灭
dsp_one=1;
P0=seg[answer_ten];//给P0口送答案十位数的段码
delay_1ms(3);//
dsp_ten=1;//个位数码管亮,十位数码管灭
dsp_one=0;
P0=seg[answer_one];//给P0口送答案个位数的段码
delay_1ms
(2);//经调试,延时2ms显示效果较好
}
if(dsp_flg==0)//答案输入标志位为0,未开始输入答案,显示一位乘数
{
dsp_ten=1;//个位数码管亮,十位数码管灭
dsp_one=0;
P0=seg[number];//给P0口送乘数的段码
delay_1ms(3);
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////
/*函数名:
inckey_prg()*/
/*函数功能:
数字加1按键子函数,按一次此键使选定数据位加一*/
voidinckey_prg()
{
if(inckey==0)
{EA=0;//软件消抖,延迟10毫秒,关闭中断,防止干扰消抖时间
delay_1ms(10);
EA=1;
if(inckey==0)
{
while(!
inckey);//确实按下,等待按键抬起,消抖结束
data_in++;//确实按一次输入数据加一
}
if(data_in>9)//若数据大于9则清零,循环
data_in=0;
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*函数名:
mulkey_prg()*/
/*函数功能:
乘按键子函数,使乘按键具有两种功能,*/
/*第一次按下mulkey_val=1可输入第一个乘数muler1;*/
/*第二次按下mulkey_val=2开始输入第二个乘数muler2*/
voidmulkey_prg()
{
EA=0;
delay_1ms(8);
EA=1;
if(mulkey==0)
{
while(!
mulkey);
data_in=0;//清零上次输入数据输入暂存单元
mulkey_val++;//乘按键功能码加一
if(mulkey_val>2)//乘按键只有两种功能,功能码大于2则置零
mulkey_val=0;
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////
/*函数名:
answerkey_prg()*/
/*函数功能:
输入答案按键子函数,使答案输入键具有三种功能:
*/
/*第一次按下answerkey_val=1可输入答案十位数字;*/
/*第二次按下answerkey_val=2可输入答案个位数字;*/
/*第三次按下answerkey_val=3判断答案的正误。
*/
voidanswerkey_prg()
{
EA=0;
delay_1ms(8);
EA=1;
if(answerkey==0)
{
while(!
answerkey);
mulkey_val=0;//清零乘按键功能码,使乘数输入功能失效
data_in=0;//清零上次输入数据输入暂存单元
dsp_flg=1;//答案输入状体标志位置一,说明开始输入答案
answerkey_val++;//答案输入按键功能码加一
if(answerkey_val>3)//超出其功能范围,则清零功能码
answerkey_val=0;
}
}
///////////////////////////////////////////////////////////////////////////////
/*函数名:
clrkey_prg()*/
/*函数功能:
清零键子函数,按该键,回到初始状态*/
voidclrkey_prg()
{
EA=0;
delay_1ms(8);
EA=1;
if(clrkey==0)
{
while(!
clrkey);
reset();//调用复位子程序
}
}
////////////////////////////////////////////////////////////
/*函数名:
muler_in_prg()*/
/*功能:
乘数输入子函数,输入乘数*/
voidmuler_in_prg()
{
switch(mulkey_val)
{case1:
//乘按键功能一,输入第一个乘数
{
inckey_prg();//调用数子加一子涵数
muler1=number=data_in;//存数据
}break;
case2:
//乘按键功能二,输入第二个乘数
{
inckey_prg();
muler2=number=data_in;
mul_end_flg=1;//乘数输入结束状态标志位置一,说明两个乘数都已输入
}break;
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*函数名:
answer_in_prg()*/
/*功能:
答案输入与判断子函数,输入答案并与积作比较,判断答案正误*/
voidanswer_in_prg()
{
switch(answerkey_val)
{
case1:
//答案输入键功能一,输入答案的十位数
{
inckey_prg();//输入答案十位数字
answer_ten=data_in;//将答案的十位存入answer_ten
}break;
case2:
//答案输入键功能二,输入答案的个位数
{
inckey_prg();//输入答案个位数字
answer_one=data_in;//将答案的个位存入answer_one
}break;
case3:
//答案输入键功能三,计算结果,并判断答案是否正确。
{
result=(muler1*muler2);//将求积的结果存入resul
answer=(answer_ten*10+answer_one);//将答案存入answer
if(answer==result)//判断输入答案是否与结果相等,
{
beep_500ms(4);//若相等,则蜂鸣器响两秒;
answerkey_val=0;
}
elsereset();//否则,重新开始。
}break;
}
}
/*********主函数*