单片机课程设计多路抢答器.docx
《单片机课程设计多路抢答器.docx》由会员分享,可在线阅读,更多相关《单片机课程设计多路抢答器.docx(23页珍藏版)》请在冰豆网上搜索。
单片机课程设计多路抢答器
武汉理工大学华夏学院
信息工程课程设计报告书
课程名称单片微型计算机与接口技术
课程设计总评成绩
学生姓名、学号朱富鑫10213314131
学生专业班级物联网1141
指导教师姓名苏明霞
课程设计起止日期2016.6.13~2016.6.24
课程设计基本要求
课程设计是工科学生十分重要的实践教学环节,通过课程设计,培养学生综合运用先修课程的理论知识和专业技能,解决工程领域某一方面实际问题的能力。
课程设计报告是科学论文写作的基础,不仅可以培养和训练学生的逻辑归纳能力、综合分析能力和文字表达能力,也是规范课程设计教学要求、反映课程设计教学水平的重要依据。
为了加强课程设计教学管理,提高课程设计教学质量,特拟定如下基本要求。
1.课程设计教学一般可分为设计项目的选题、项目设计方案论证、项目设计结果分析、答辩等4个环节,每个环节都应有一定的考核要求和考核成绩。
2.课程设计项目的选题要符合本课程设计教学大纲的要求,该项目应能突出学生实践能力、设计能力和创新能力的培养;该项目有一定的实用性,且学生通过努力在规定的时间内是可以完成的。
课程设计项目名称、目的及技术要求记录于课程设计报告书一、二项中,课程设计项目的选题考核成绩占10%左右。
3.项目设计方案论证主要包括可行性设计方案论证、从可行性方案中确定最佳方案,实施最佳方案的软件程序、硬件电路原理图和PCB图。
项目设计方案论证内容记录于课程设计报告书第三项中,项目设计方案论证主要考核设计方案的正确性、可行性和创新性,考核成绩占30%左右。
4.项目设计结果分析主要包括项目设计与制作结果的工艺水平,项目测试性能指标的正确性和完整性,项目测试中出现故障或错误原因的分析和处理方法。
项目设计结果分析记录于课程设计报告书第四项中,考核成绩占25%左右。
5.学生在课程设计过程中应认真阅读与本课程设计项目相关的文献,培养自己的阅读兴趣和习惯,借以启发自己的思维,提高综合分和理解能力。
文献阅读摘要记录于课程设计报告书第五项中,考核成绩占10%左右。
6.答辩是课程设计中十分重要的环节,由课程设计指导教师向答辩学生提出2~3个问题,通过答辩可进一步了解学生对课程设计中理论知识和实际技能掌握的程度,以及对问题的理解、分析和判断能力。
答辩考核成绩占25%左右。
7.学生应在课程设计周内认真参加项目设计的各个环节,按时完成课程设计报告书交给课程设计指导教师评阅。
课程设计指导教师应认真指导学生课程设计全过程,认真评阅学生的每一份课程设计报告,给出课程设计综合评阅意见和每一个环节的评分成绩(百分制),最后将百分制评分成绩转换为五级分制(优秀、良好、中等、及格、不及格)总评成绩。
8.课程设计报告书是实践教学水平评估的重要资料,应按课程、班级集成存档交实验室统一管理。
一、课程设计项目名称
多路抢答器
二、项目设计目的及技术要求
1.四个独立的按键分为四路,每一个按键按下后对应的LED灯会亮。
2.在数码管上显示09到00后开始抢答,抢答时四个按键有一个按下了则对应的LED灯会亮,其它按键无效,并且会把对应的编号显示在数码管上面,同时把对应的编号通过串口显示在上位机的串口助手上。
3.抢答完毕后,如果重新开始,则在上位级的串口助手上发送A到单片机,单片机接受到后,开始新一轮的抢答,即继续完成第2个步骤。
如:
在K1,K2,K3,K4都开始按的情况下,先判断谁先按下,那么其他键无效。
再按也无效。
注:
以上所有的功能都是用单片机来完成的。
三、项目设计方案论证(分析项目要求和指标,给出总的设计方案)
实际项目实现内容:
当主持人向串口发送字符“A”后,单片机接收到开始信号,然后LED点阵移动显示3,2,1,GO后,数码管从09到00倒计时显示,当显示到00时,抢答器可以开始抢答,当其中任何一方先按下按钮后,将其代表的号码显示到数码管上,并发送到串口上,同时锁住其他的按钮,让其他选手无法再次抢答。
然后通过选手的回答,主持人判断对错后,在串口上发送“Y”,则在LED点阵上显示“对号”,如若回答错误,在串口上发送“N”,则在LED点阵上显示“X”。
设计方案:
通过对单片机程序的编写,调用LED灯,数码管,LED点阵,按键,以及串口部分,控制好单片机的时序,实现设计要求,并加入适当的拓展模块。
流程框图:
LED灯及数码管模块:
由开发板原理图可知可以编写一个扫描函数,使用74HC138译码器实现对6个数码管以及LED灯的控制。
代码如下:
voidLedScan()
{
staticunsignedchari=0;
P0=0xFF;
P1=(P1&0xF8)|i;
P0=LedBuff[i];
if(i<7)
i++;
else
i=0;
}
LED点阵模块:
由开发板原理图可知,使能U4的74HC138控制点阵,即在调用LED点阵时赋ADDR3=0即可,同理可以将LED点阵理解成8个数码管显示,使用取模软件,取出想要的图片显示,并存放在数组里,通过对LED点阵的循环赋值,可以达到LED点阵纵向移动的功能。
按键模块:
由开发板原理图可知,将P2^3口置0,是KeyOut1输出低电平,即使K1~K4转换为独立按键使用。
串口模块:
可以通过配置串行控制寄存器,调好通信的波特率,完成串口通信模块。
配置方法:
⏹1、配置串口为模式1。
⏹2、配置定时器T1为模式2,即自动重装模式。
⏹3、根据波特率计算TH1和TL1的初值,如果有需要可以使用PCON进行波特率加倍。
⏹4、打开定时器控制寄存器TR1,让定时器跑起来。
配置波特率的函数:
voidConfigUART(unsignedintbaud)
{
SCON=0x50;
TMOD&=0x0F;
TMOD|=0x20;
TH1=256-(11059200/12/32)/baud;
TL1=TH1;
ET1=0;
ES=1;
TR1=1;
}
设计完整代码:
#include
sbitADDR3=P1^3;
sbitENLED=P1^4;
sbitKEY1=P2^4;
sbitKEY2=P2^5;
sbitKEY3=P2^6;
sbitKEY4=P2^7;
unsignedcharcodeLedChar[]={
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E
};
unsignedcharLedBuff[8]={
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
};
unsignedcharcodeled[]={0xFF,0xC1,0xDF,0xDF,0xC1,0xDF,0xDF,0xC1,0xFF,0xC1,0xDF,0xDF,0xC1,0xFD,0xFD,0xC1,
0xFF,0xF7,0xF3,0xF7,0xF7,0xF7,0xF7,0xF7,0xC1,0xFF,0xFF,0xFF,0x10,0x5E,0x5E,0x52,
0x56,0x10,0xF7,0xFF,0xFF,0xFF,0xFF,0xFFF};
unsignedcharimage[]={0xFF,0xFF,0x7F,0xBF,0xDF,0xEE,0xF5,0xFB}
;
unsignedcharno[]={0xFF,0x7D,0xBB,0xD7,0xEF,0xD7,0xBB,0x7D
};
unsignedcharT0RH=0;
unsignedcharT0RL=0;
unsignedcharRxdByte=0;
unsignedcharindex=0;
unsignedchartmrs;
unsignedintsec=10;
unsignedintcnt=0;
unsignedintover=0;
unsignedintgo=0;
unsignedintflag1s=0;
unsignedintflag250ms=0;
unsignedintbegin=1;
voidConfigTimer0(unsignedintms);
voidConfigUART(unsignedintbaud);
voidmain()
{
bitbackup1=1;
bitbackup2=1;
bitbackup3=1;
bitbackup4=1;
EA=1;
ENLED=0;
ADDR3=1;
P2=0xF7;
ConfigTimer0
(1);
ConfigUART(9600);
while
(1)
{
if(go==1)
{
LedBuff[0]=led[index+0];
LedBuff[1]=led[index+1];
LedBuff[2]=led[index+2];
LedBuff[3]=led[index+3];
LedBuff[4]=led[index+4];
LedBuff[5]=led[index+5];
LedBuff[6]=led[index+6];
LedBuff[7]=led[index+7];
}
if(flag1s&begin==1)
{
if(sec==0)
{
begin=0;
over=0;
}
LedBuff[0]=LedChar[sec];
LedBuff[1]=LedChar[0];
LedBuff[2]=0xFF;
LedBuff[3]=0xFF;
LedBuff[4]=0xFF;
LedBuff[5]=0xFF;
LedBuff[6]=0xFF;
}
if(begin==0)
{
if(over==0)
{
if(KEY1!
=backup1)
{over=1;
if(backup1==0)
{
LedBuff[6]=0x7F;
LedBuff[0]=LedChar[1];
LedBuff[1]=LedChar[0];
SBUF=0x01;
while(!
TI);
TI=0;
RI=0;
}
backup1=KEY1;
}
}
if(over==0)
{
if(KEY2!
=backup2)
{
if(backup2==0)
{over=1;
LedBuff[6]=0xBF;
LedBuff[0]=LedChar[2];
LedBuff[1]=LedChar[0];
SBUF=0x02;
while(!
TI);
TI=0;
RI=0;
}
backup2=KEY2;
}
if(over==0)
{
if(KEY3!
=backup3)
{
if(backup3==0)
{over=1;
LedBuff[6]=0xDF;
LedBuff[0]=LedChar[3];
LedBuff[1]=LedChar[0];
SBUF=0x03;
while(!
TI);
TI=0;
RI=0;
}
}
backup3=KEY3;
}
}
if(over==0)
{
if(KEY4!
=backup4)
{
if(backup4==0)
{over=1;
LedBuff[6]=0xEF;
LedBuff[0]=LedChar[4];
LedBuff[1]=LedChar[0];
SBUF=0x04;
while(!
TI);
TI=0;
RI=0;
}
backup4=KEY4;
}
}
}
}
}
voidConfigTimer0(unsignedintms)//定时器配置函数
{
unsignedlongtmp;
tmp=11059200/12;
tmp=(tmp*ms)/1000;
tmp=65536-tmp;
tmp=tmp+18;
T0RH=(unsignedchar)(tmp>>8);
T0RL=(unsignedchar)tmp;
TMOD&=0xF0;
TMOD|=0x01;
TH0=T0RH;;
TL0=T0RL;
ET0=1;
TR0=1;
}
voidConfigUART(unsignedintbaud)//波特率配置函数
{
SCON=0x50;
TMOD&=0x0F;
TMOD|=0x20;
TH1=256-(11059200/12/32)/baud;
TL1=TH1;
ET1=0;
ES=1;
TR1=1;
}
voidLedScan()//数码管及LED扫描函数
{
staticunsignedchari=0;
P0=0xFF;
P1=(P1&0xF8)|i;
P0=LedBuff[i];
if(i<7)
i++;
else
i=0;
}
voidInterruptTimer0()interrupt1//定时器0中断函数
{
staticunsignedinttmr1s=0;
TH0=T0RH;
TL0=T0RH;
LedScan();
tmr1s++;
tmrs++;
if(tmrs>=250)
{
tmrs=0;
flag250ms=1;
index++;
if(index>=32)
{
if(go==1)
{
go=0;
ADDR3=1;
begin=1;
flag1s=1;
sec=9;
}
index=0;
}
}
if(tmr1s>=1000)
{
tmr1s=0;
flag1s=1;
if(sec>0)
{
sec--;
}
else
{
sec=0;
}
}
}
voidInterruptUART()interrupt4//串口中断函数
{
if(RI)
{
RI=0;
RxdByte=SBUF;
SBUF=RxdByte;
if(SBUF=='A')
{
ADDR3=0;
go=1;
sec=9;
index=0;
}
if(SBUF=='Y')
{
ADDR3=0;
LedBuff[0]=image[0];
LedBuff[1]=image[1];
LedBuff[2]=image[2];
LedBuff[3]=image[3];
LedBuff[4]=image[4];
LedBuff[5]=image[5];
LedBuff[6]=image[6];
LedBuff[7]=image[7];
}
if(SBUF=='N')
{
ADDR3=0;
LedBuff[0]=no[0];
LedBuff[1]=no[1];
LedBuff[2]=no[2];
LedBuff[3]=no[3];
LedBuff[4]=no[4];
LedBuff[5]=no[5];
LedBuff[6]=no[6];
LedBuff[7]=no[7];
}
}
if(TI)
{
TI=0;
}
}实验现象图:
按下按钮2,其他按钮在重新开始之前无法使用
判断对错:
发送’A’重新开始:
LED移动显示3,2,1,GO后从09~00显示完后可以进入抢答环节
四、项目设计结果分析(分析试验过程中,现象或问题的正确性和必然性,以及对有没有达到技术要求进行分析,写出整个调试经过和现象,并分析产生不正确结果的原因和处理方法。
)
1.不用倒计时显示到0,就可以开始抢答。
解决方法:
设置一个标志位,当显示到0后,给予可以抢答的标志,才可以进入抢答部分。
2.LED点阵移动显示。
解决方法:
由于横向移动的取模过程较为繁琐,所以采用纵向移动的方式移动显示,参考数码管扫描,使用index索引动态刷新,来完成纵向移动的显示。
3.在使用LED点阵移动时,想达到良好显示效果。
解决方法:
在定时器中断中重新建立一个250ms标志,index250ms刷新一次,即LED点阵250ms改变一帧图片。
4.数码管和LED点阵被2块74HC138译码器控制,如何解决二者冲突。
解决方法:
查阅资料,发现控制2块74HC138译码器的是ADDR3,即在完成LED点阵显示后,ADDR3赋1,打开使能U3,开启数码管,需要用到LED时ADDR3赋0,打开使能U4,使用LED点阵显示模式。
五、参考文摘(相关文摘不少于5篇,记录每篇文献的作者姓名.文献名称.文献发行城市:
文献出版社,出版年;文献内容摘要,每篇不少于100字)
例:
[1]秦志强,彭建盛,谭立新编著.AVR单片机与小型机器人制作[M].北京:
电子工业出版社,2009
内容摘要:
“……”
1.王振红,张常年;综合电子设计与实践【M】,第二版,北京:
清华大学出版社,2008.
内容摘要:
“关于仿真技术的详细讲解,各个部分都能够理解加记忆,第一章是关于电子技术的仿真,这个对于我们初学者来说,有了更简单易懂的理解模式,在电子这一方面的讲述,更多的是原理的分析。
”
2.王小海,蔡忠法,电子技术基础实验教程【M】,北京:
高等教育出版社2002.
内容摘要:
“电子技术是现代重要的技术之一,其中的教程也让我们对电子技术有了很好的了解,不只是单层次的认识,对常见的设计电路也有了很详细的讲解,不单单都是理论的知识的灌输。
”
3.宋雪松,李冬明,崔长胜,手把手教你学51单片机【M】,北京:
清华大学出版社,2014.
内容摘要:
“通信的学习不像前边控制部分那么直观,通信部分的程序只能获得一个结果,而其过程无法看到。
”
课程设计评分表
评分项目
评分成绩
1.选题合理、目的明确,平时表现积极(10分)
2.设计方案正确,具有可行性、创新性(30分)
3.设计报告规范化,参考文献不少于5篇(10分)
4.项目工艺水平及测试性能达到技术要求(25分)
5.答辩(25分)
总分(100分)
答辩记录:
指导教师综合评语:
指导教师(签名)
日期:
年月日