51单片机课设答题积分器设计.docx
- 文档编号:28692463
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:20
- 大小:606.19KB
51单片机课设答题积分器设计.docx
《51单片机课设答题积分器设计.docx》由会员分享,可在线阅读,更多相关《51单片机课设答题积分器设计.docx(20页珍藏版)》请在冰豆网上搜索。
51单片机课设答题积分器设计
成绩
某大学
课程设计报告
题目51单片机答题积分器设计
课程名称单片机综合程序设计
专业机械设计制造及其自动化
班级才不告诉你
学生姓名我是谁
学号88888888
设计地点你来抓我?
指导教师我自己
设计起止时间:
2019年12月23日至2020年1月4日
一、实验背景及目的
单片机也叫控制器(MCU),是20世纪70年代中期发展起来的一种面向控制的大规模集成电路模块,其特点是功能强、体积小、可靠性高、价格低廉,它一面世便在工业控制、数据采集、智能仪表化、机电一体化、家用电器等领域得到了广泛应用,极大的提高了这些领域的技术水平和自动化程度。
因此,单片机的开发与应用已经成为高科技和工程领域的一项重大课题。
本设计是以89C51单片机为基础原件设计的答题积分器,通过两个答题按钮来作答,回答题目则进行积分,由数码管显示两人得分。
5轮游戏后游戏结束铃声响起,双色点阵屏用对应颜色显示对应队员的字母。
本设计将围绕基于单片机的答题积分器介绍关于单片机的定时、中断、数码管显示、点阵屏显示、按键、蜂鸣器以及开发仿真软件Keil、Proteus。
二、总体设计介绍
根据功能和指标要求,本系统选用MCS-51系列单片机为主控机,实现答题积分器的设计,具体设计要求如下:
(1)数码管第一位显示玩家A的成绩,数码管第四位显示玩家B的成绩,中间以分隔符隔开两人成绩。
(2)点阵屏在比赛结束后显示获胜玩家,用红色显示字母A或用绿色显示字母B。
(3)蜂鸣器要在比赛结束后立即响起,示意比赛结束。
(4)按键应包括:
玩家A作答键,玩家B作答键以及复位按键。
三、结构总图
四、硬件设计
1.
总体硬件设计
硬件清单:
AT89C51单片机
8位共阴数码管
双色点阵屏
按键
蜂鸣器
晶振
P1:
作为输出口,控制LED数码管显示数据;
P2.0;P2.1:
控制数码管的段选和位选;
P2.2:
作为蜂鸣器的输出口;
P2.3;P2.4;P2.5:
接独立按键,进行答题和复位操作;
P3:
作为输出口,控制双色点阵屏显示图案。
本设计选用AT89C51单片机作为主控单元。
显示部分:
采用LED数码管及双色点阵屏进行动态显示。
按键部分:
采用3枚独立按键进行操作。
提示部分:
采用蜂鸣器作为比赛结束的提示。
2.数码管显示模块
由两个共阴4位数码管在电路板上拼接而成,可以显示8位数字。
使用P1端口的8位的端口,用来提供位码和段码;连接2个锁存器,来控制8个数码管的a,b,…,g,Dp该怎样显示;而锁存
后的位码,则是控制显示内容到哪一位(位码为低的显示,为高的不显示)。
3.双色点阵屏模块
点阵显示器,可以用像素显示图象或文字。
8×8点阵管的内部由8排8列共64个像素点。
每个像素点有红、绿发光二极管各一个。
每一排上的发光二极管接成共阳连接;有红绿两套列线,同列同色发光管的阴极连接到一起。
总共有8根排线,红、绿列线各8根。
因为是排共阳,列共阴,显示图形必须采用动态扫描的办法。
任意时刻,只有一根共阳排线为高电平,列线控制这一排上像素的亮与灭、红与绿的组合。
8排轮流显示,借助于视觉残留,实现视觉上各排的“同时”显示。
使用P3.0、P3.1、P3.2、P3.4、P3.5及P3.6作为输出口,控制双色点阵屏显示图案及其颜色变化。
4.按键模块
实验板上有8个独立按键,根据实验要求,使用P2.3、P2.4、P2.5口来接K1、K2、K3这3个按键。
因为所连接的MCU的P2端口内部具有上拉电阻,所以,按键在释放状态,对应的口线应该读到1电平;按键压下的状态,应该读到0电平。
按键实际使用中有机械抖动出现,编程已经考虑到机械抖动。
5.蜂鸣器模块
ULN2003的内部是一组7个达林顿管,作电流放大用。
输出极性与输入相反。
当输入为高电平时,蜂鸣器响。
ULN2003在实验板上,有一个蜂鸣器,两个继电器,一组步进电机的驱动接口,本次项目使用蜂鸣器。
将单片机的P2.2连接到ULN2003的in1接口,当in1接通时,即在in1接口提供高电平,out1接口的蜂鸣器才能起效果。
五、
电路原理图
六、软件设计
1.程序功能
通过两个答题按钮来作答,回答题目则进行积分,由数码管显示两人得分。
5轮游戏后游戏结束蜂鸣器铃声响起,双色点阵屏用对应颜色显示对应队员的字母,按下复位按键,积分清零、点阵屏熄灭,答题重新开始。
2.
流程图
A队B队
3.主要功能模块
3.1中断信号服务程序
voidtime(void)interrupt1using1
{
TH0=0xf7;
TL0=0;
P1=~stutab[x];
Dig=1;
Dig=0;
P1=DispBuf[x];//动态显示消影,将本行及下面的两行保留和删除,观察显示效果
Seg=1;
Seg=0;
x++;
if(x==6)
{
x=0;
}
k++;
if(y==5||z==5)
{
if(k<200)
Spk=~Spk;
}
}
3.2点阵屏显示程序
voidSend2Byte(unsignedchardat1,unsignedchardat2)
{
unsignedchari;
for(i=0;i<8;i++)
{
SER=dat1&0x80;
SRCLK=1;
_nop_();//等价于NOP指令,用于短延时
SRCLK=0;
dat1<<=1;//向左移1位
}
for(i=0;i<8;i++)
{
SER=dat2&0x80;
SRCLK=1;
_nop_();//等价于NOP指令,用于短延时,下同
SRCLK=0;//移位时钟下降沿,形成完整移位时钟
dat2<<=1;//左移1位
}
LATCH=1;
_nop_();//等价于NOP指令,用于短延时
LATCH=0;
}
voidSendSeg(unsignedchardat)
{
unsignedchari;
for(i=0;i<8;i++)
{
SER_B=dat&0x80;
SRCLK_B=1;
_nop_();
SRCLK_B=0;
dat<<=1;
}
LATCH_B=1;
_nop_();
LATCH_B=0;
}
3.3主函数程序
voidmain(void)
{
unsignedchari;
InitT0();//设置定时器0中断,
并使能CPU中断
for(;;)
{
if(k==400)
k=0;
if(Key1==0)//判断A按键是否被按下
{
y++;
delay(500);//延时
if(y>5)
y--;
}
if(Key2==0)//判
断B按键是否被按下
{
z++;
delay(500);
if(z>5)
z--;
}
if(Key3==0)//判断清零按
键是否被按下
{
y=0;
z=0;
delay(500);
}
DispBuf[0]=table[y];
DispBuf[1]=0x40;
DispBuf[2]=0x40;
DispBuf[3]=table[z];
//送数显示
if((y==5)&&(z!
=5))//A胜利时显示红色字母A
{
for(i=0;i<8;i++)
{
SendSeg(0);
Send2Byte(~tab1[i],tab1[i]);
SendSeg(segout[i]);
delay
(1);
}
}
if((z==5)&&(y!
=5))//B胜利时显示绿色字母B
{
for(i=0;i<8;i++)
{
SendSeg(0);
Send2Byte(tab2[i],~tab2[i]);
SendSeg(segout[i]);
delay
(1);
}
}
if((z==5)&&(y==5))
{
continue;
}
}
}
4.完整源代码
#include
#include
unsignedcharcodetable[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//字形码表初始化定义
unsignedcharcodestutab[6]={0x01,0x02,0x04,0x08,0x10,0x20};
unsignedchardataDispBuf[6];
unsignedcharx=0,y=0,z=0,k=0;//初始化变量
unsignedcharsegout[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//初始化序号数组用于选排
unsignedcharcodetab1[]={0x00,0xfc,0xfe,0x1b,0x1b,0xfe,0xfc,0x00};//字母A字形码
unsignedcharcodetab2[]={0x00,0x00,0x66,0x99,0x99,0x99,0xff,0x00};//字母B字形码
sbitLATCH_B=P3^0;
sbitSRCLK_B=P3^1;
sbitSER_B=P3^2;
sbitLATCH=P3^4;
sbitSRCLK=P3^5;
sbitSER=P3^6;
sbitDig=P2^0;
sbitSeg=P2^1;
sbitSpk=P2^2;
sbitKey1=P2^3;
sbitKey2=P2^4;
sbitKey3=P2^5;
voidInitT0(void)
{
TMOD=(TMOD&0xf0)|0x01;
TH0=0xf7;//根据波特率算出分频
TL0=0x00;
TR0=1;
ET0=1;
EA=1;
}
voidtime(void)interrupt1using1
{
TH0=0xf7;
TL0=0;
P1=~stutab[x];
Dig=1;
Dig=0;
P1=DispBuf[x];
Seg=1;
Seg=0;
x++;
if(x==6)
{
x=0;
}
k++;
if(y==5||z==5)//当两队中有一队计分达到5则触发蜂鸣器
{
if(k<200)
Spk=~Spk;
}
}
voidSend2Byte(unsignedchardat1,unsignedchardat2)
{
unsignedchari;
for(i=0;i<8;i++)
{
SER=dat1&0x80;
SRCLK=1;
_nop_();//等价于NOP指令,用于短延时
SRCLK=0;
dat1<<=1;
}
for(i=0;i<8;i++)
{
SER=dat2&0x80;
SRCLK=1;
_nop_();
SRCLK=0;
dat2<<=1;
}
LATCH=1;
_nop_();
LATCH=0;
}
voidSendSeg(unsignedchardat)
{
unsignedchari;
for(i=0;i<8;i++)
{
SER_B=dat&0x80;
SRCLK_B=1;
_nop_();
SRCLK_B=0;
dat<<=1;
}
LATCH_B=1;
_nop_();
LATCH_B=0;
}
voiddelay(intmilisec)
{
inti;
while(milisec!
=0)
{
for(i=0;i<110;i++)
{
}
milisec--;
}
}
voidmain(void)
{
unsignedchari;
InitT0();//设置定时器0中断,并使能CPU中断
for(;;)//永久循环,不断检测
{
if(k==400)
k=0;
if(Key1==0)
{
y++;
delay(500);
if(y>5)
y--;
}
if(Key2==0)
{
z++;
delay(500);//延时
if(z>5)
z--;
}
if(Key3==0)
{
y=0;
z=0;
delay(500);
}
DispBuf[0]=table[y];
DispBuf[1]=0x40;
DispBuf[2]=0x40;
DispBuf[3]=table[z];
if((y==5)&&(z!
=5))
{
for(i=0;i<8;i++)
{
SendSeg(0);
Send2Byte(~tab1[i],tab1[i]);
SendSeg(segout[i]);
delay
(1);
}
}
if((z==5)&&(y!
=5))
{
for(i=0;i<8;i++)
{
SendSeg(0);
//先消影
Send2Byte(tab2[i],~tab2[i]);//发送背景个前景数据
SendSeg(segout[i]);
//选排
delay
(1);//延时
}
}
if((z==5)&&(y==5))
{
continue;
}
}
}
七、课设心得
本学期我们专业进行了为期两周的单片微机综合实验,本实践环节是针对《C/C++程序设计语言》、《电工技术》、《电子技术》和《微机原理与应用》课程的主要内容所安排的实践性环节,也是电学和计算机技能方面的综合训练。
通过本环节,使同学们深化对理论知识的理解、培养动手能力、使所学知识更好地贴近工程实际,提高在机电一体化领域中应用计算机的能力,提升学习兴趣。
当然,这其中也有很多问题,第一,不够细心,由于对课本理论的不熟悉导致编程出现错误。
第二,是在学习态度上,这次课设是对我们的学习态度的一次检验。
对于这次单片机综合课程实习,我们的第一大心得体会就是作为一名工程技术人员,要求具备的首要素质绝对应该是严谨。
我们这次实习所遇到的多半问题多数都是由于我们不够严谨。
第三,有足够的毅力与决心,有足够的挑战困难的勇气,就没有什么办不到的。
在这次难得的课程设计过程中我们锻炼了自己的思考能力和动手能力。
通过设计电路的过程中,加强了我们思考问题的完整性和实际生活联系的可行性。
在方案设计选择和芯片的选择上,培养了我们综合应用单片机的能力,对单片机的各个管脚的功能也有了进一步的认识。
还锻炼我们个人的查阅技术资料的能力,动手能力,发现问题,解决问题的能力。
并且我们熟练掌握了有关器件的性能及测试方法。
再次感谢老师的辅导以及组员的帮助,是他们让我对单片机有了一个更好的认识,课程设计时间虽然很短,但我们学习了很多的东西,使我们眼界打开,感受颇深。
通过这次实训,一方面我学习到了许多以前没学过的专业知识与知识的应用,另一方面还提高了自己动手进行设计的能力。
本次实训,是对自我能力的进一步锻炼,也是一种考验。
在这次实训中我还提高了自己的综合素质。
首先,它使得我对C51编程有了更深刻的认识,在设计的过程中,我不仅复习了以前学习过的知识,还掌握了新的知识。
我相信这次实训中所获得的宝贵知识和经验可以帮助我在单片机编程这方面有长足的进步,也让我对未来的工作有了进一步的认识,我会好好总结这次的实训带给我的宝贵经验。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 单片机 答题 积分器 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)