单片机课程设计报告[4]intp
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
上海电机学院课程设计
目录
第1章绪论 (1)
1.1 单片机抢答器的背景 (1)
1.2 抢答器的意义 (1)
第2章设计概述 (2)
2.1 抢答器的工作原理 (2)
2.2 设计任务 (2)
第3章系统硬件电路设计 (2)
3.1 AT89C51单片机硬件电路 (2)
3.2原理及电路总框图 (3)
第4章系统软件设计 (5)
4.1 主程序设计 (5)
4.2 子程序设计 (5)
4.2.1数码管显示电路 (5)
4.2.2键盘扫描段码表 (6)
4.3 系统流程图 (6)
4.3.1系统主程序流程图 (6)
4.3.2系统中断程序流程图 (6)
4.4 源程序代码 (8)
第5章结束语 (16)
5.1 小结 .................................................................. 错误!未定义书签。
5.2 心得体会 .......................................................... 错误!未定义书签。
参考文献 .. (17)
第1章绪论
1.1 单片机抢答器的背景
对于抢答器我们大家来说并不陌生,他是用于很多竞赛场合。
真正实现先抢先答,让最先抢到题的选手来回答问题。
抢答器不仅考验选手的反应速度同时也要求选手具备足够的知识面和一定的勇气,选手们都站在同一个起跑线上,体现了公平公正的原则。
1.2 抢答器的意义
本系统采用单片机作为整个控制核心。
控制系统的四个模块为:显示模块、存储模块、抢答开关,总开关模块。
该系统通过一个自锁按键输入抢答信号;利用一个数码管来完成显示功能;用按键来让选手进行抢答,在数码管上显示哪一组先答题的,从而实现整个抢答过程。
在知识比赛中,特别是做抢答题目的时候,在抢答过程中,为了知道哪一组或哪一位选手先答题,必须要设计一个系统来完成这个任务。
如果在抢答中,靠视觉是很难判断出哪组先答题。
利用单片机系统来设计抢答器,使以上问题得以解决,即使两组的抢答时间相差几微秒,也可分辨出哪组优先答题。
相对于类似电视台这类花几万元采购的抢答器系统,如果个人组织小型的抢答比赛,这毕竟不合适,但是依靠单片机的低成本,低功耗,可以很好的解决个人用户需要举办小型抢答比赛的需求,而且精度高,操作性好。
第2章设计概述
2.1 抢答器的工作原理
抢答器的工作原理是采用单片机最小系统,用中断式键盘进行抢答。
采用动态显示组号。
主持人按下开始抢答键才可以抢答。
主持人没有按下开始抢答按纽(P3.0),各组人员无法抢答,主持人按下开始抢答按纽(P3.0),数码管10秒倒计时(10秒内抢答有效),如果有人按下按键,程序就会判断是谁先按下的,然后数码显示管就会显示抢答成功选手的号码,并封锁键盘,数码管显示当前选手的编号,禁止其他人按键的输入,从而实现了抢答的功能。
如果在设定的时间中没有一个人按下按键,一到时间,则倒计时停止,不可以抢答。
抢答成功后。
当要进行下一次的抢答时,由主持人抬起自锁按键,主程序再次进入初始化,进入下一次抢答的就绪状态。
2.2 设计任务
(1)多路数字抢答器的硬件和软件设计;
(2)分析电路图;
(3)画出程序流程图;
(4)编写代码;
(5)程序分析与调试;
第3章系统硬件电路设计
3.1 AT89C51单片机硬件电路
单片机(SCM)是单片微型计算机(Single Chip Microcomputer)的
简称。
它是把中央处理器CPU、随机存储器RAM、只读存储器ROM、I/O 接口电路、定时/计数器以及输入输出适配器都集成在一块芯片上,构成一个完整的微型计算机。
它的最大优点是体积小,可放在仪表内部,但存储量小,输入输出适配器简单,功能较低[2]。
目前,单片机在民用和工业测控领域得到最广泛的应用,早已深深地融入人们的生活中。
近年来,AT89C51在我国非常流行,它最大的特点是内部有可以多次重复编程的ROM,并且ROM可以直接用编程器来擦写,使用起来比较方便。
本设计使用到的元器件包括:AT89C51芯片、LED二极管、七段LED数码管的译码。
其中AT89C51是系统的核心,它主要负责控制各个部分的协调工作。
在其外围接上复位电路,数码管,LED二极管,按钮以及振荡器,P1口为8个LED二极管,P2.1-P2.7为抢答输入键接口,数码管段选P0口,位选P3.5和P3.4口。
3.2原理及电路总框图
图3.1 抢答器原理框图
第4章系统软件设计
4.1 主程序设计
单片机通电以后,2位数码管显示数字“10”此时自锁开关为打开状态,任何选手的按键都无效,8个LED等长灭,当自锁开关闭合后,数码管开始”10-0”的10秒倒计时,在10秒内任意选手抢答,数码管会立即显示对应选手的号码,对应号码的LED灯也会亮起,此时任何选手的按键都无效。
若10秒内无选手抢答,则倒计时完毕以后数码管显示“00”,LED全灭,任意选手按键无效。
在任意时候打开自锁开关,则程序初始化,再次按下时可再次抢答
4.2 子程序设计
4.2.1数码管显示电路
LED数码管,实现七段数码管的显示二位十进制数。
来进行倒计时,即来限制抢答的时间。
由于本次课设选用的共阳接法所以对应的段码表如下
表4-1 共阳接法数码管段码表
4.2.2键盘扫描段码表
本次键盘扫描程序采用的是行列翻转法扫描键盘,即先置行为0,读列值,存在变量1中,然后把列置为0,读行值,存在变量2中,把变量1和变量2相加即为按键对应的键值,下表为相应按键对应的键值
表4-2 行列翻转法键盘键值表
4.3 系统流程图
4.3.1系统主程序流程图
4.3.2系统中断程序流程图
4.4 源程序代码
#include<reg51.h>
sbit p3_0=P3^0;
sbit p3_4=P3^4;
sbit p3_5=P3^5;
unsigned char key,num;
unsigned char x,y;
unsigned char count;
unsigned char keycode;
unsigned char
LED_T[10]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0xff};
//P1口LED表
flag=0;
start=0;
flagl=0;
void delay() //延时
{
unsigned int i;
i=500;
while(i--);
}
int keyscan() //键盘扫描
{
unsigned char read,recode,keyvalue;
P2=0xf0;
read=P2;
if(read!=0xf0)
{
delay();
if(read!=0xf0)
{
P2=0x0f;
recode=P2;
keyvalue=read+recode;
return keyvalue;
}
}
return 0;
}
void display() //显示
{
unsigned char code Table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//数码管段码表
switch(num)
{
case 0:{x=0;y=0;break;}
case 1:{x=1;y=0;break;}
case 2:{x=2;y=0;break;}
case 3:{x=3;y=0;break;}
case 4:{x=4;y=0;break;}
case 5:{x=5;y=0;break;}
case 6:{x=6;y=0;break;}
case 7:{x=7;y=0;break;}
case 8:{x=8;y=0;break;}
case 9:{x=9;y=0;break;}
case 10:{x=0;y=1;break;} }
p3_4=0;
p3_5=0;
P0=Table[x];
p3_4=0;
p3_5=1;
delay();
p3_4=0;
p3_5=0;
P0=Table[y];
p3_4=1;
p3_5=0;
delay();
}
unsigned char decode() //解码按键
{
switch(key)
{
case 0xb7:return 1;
case 0xbb:return 2;
case 0xbd:return 3;
case 0xbe:return 4;
case 0xd7:return 5;
case 0xdb:return 6;
case 0xdd:return 7;
case 0xde:return 8;
}
return 0;
}
void main()
{
while(1)
{
while(start==0) //P3.0自锁开关按下,程序跳出循环,开始初始化中断
{
num=10;
P1=LED_T[9];
display();
if(p3_0==0)
start=1;
}
EA=1;
TMOD=0x01;
TH0=0xd8;
TL0=0xf0;
ET0=1;
TR0=1;
count=100;
num=9;
while(flag==0&&p3_0==0) //flag=0且P3.0按下时执行此循环{
if(flagl==1) //若中断里检测到按键,P1口对应LED亮起P1=LED_T[num-1];
display();
}
start=0;
flag=0;
flagl=0;
}
}
void timer_1(void) interrupt 1
{
TH0=0xD8;
TL0=0xf0;
if(p3_0==1) //中断途中抬起P3.0自锁开关,关中断
{
TR0=0;
flag=0;
}
key=keyscan(); //检测到按键,解码按键至对应case,并且显示对应数字,关中断,防止再次进入中断,保证锁住状态
if(key!=0)
{
num=decode();
display();
TR0=0;
flag=0;
flagl=1;
}
count--; //10秒倒计时
if(count==0)
{
num--;
if(num==0)
{
TR0=0;
flag=0;
}
count=100;
}
}
第5章结束语
制作此次试验,开始很苦恼,无从下手。
后来和同组同学讨论,决定首先借助于网络资料。
网络上的资源大多并不完善,甚至有些根本看不懂。
此时真的恩头疼。
于是回想之前实验课上所学习的知识,寻找借鉴例题。
零零散散下载摘录很多东西。
又结合抢答比赛的实际应用,开始起草最初的设计草案。
想法很多,设计也几近完整,然而很多功能却无法实现。
于是小组讨论决定按照草案一步步依次解决,边解决边定稿最后设计方案。
中间遇到很多问题,困难。
这时我们才了解到对知识的掌握还有许多的生疏和欠缺。
然而此时后悔已经于事无补。
我们只能不停在网络上搜索查找学习,尽量弥补自身知识的不足。
渐渐完善此设计.这次课程设计让我充分理解了89C51芯片的工作原理,知道了抢答器的硬件和软件的实现过程,并且通过自己动手编写程序来控制抢答器的工作,我感到非常有成就感,也锻炼了我的编程能力。
在此我非常要感谢的是我的指导老师高桂革老师和我们小组的各个成员们,感谢老师和组长徐宇峰同学的细心认真的辅导和帮助,让我学到了许多原来不知道的知识。
这次课程设计能够顺利的完成,当然有我个人的努力,但同时也离不开指导老师的答疑解惑和同学的帮助。
参考文献
[1] 宋彩礼等. 《单片机原理与C51编程》. 西安交通大学出版社2008年
[2]李泉溪. 《单片机原理与应用实例仿真》.北京航天航空大学出版社2009年
[3] 江世明. 《基于Proteus的单片机应用技术》. 电子工业出版社2008年
[4] 喻宗泉. 《单片机原理与应用技术》.西安电子科技大学出版社2005年
[5] 万光毅. 《单片机实验与实践教程》. 北京航天航空大学出版社2003年。