武汉理工大学华夏学院信息工程课程设计报告书课程名称单片微型计算机与接口技术课程设计总评成绩学生姓名、学号朱富鑫***********学生专业班级物联网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 灯的控制。
代码如下:void LedScan(){static unsigned char i = 0;P0 = 0xFF;P1 = (P1 & 0xF8) | i;P0 = LedBuff[i];if (i < 7)i++;elsei = 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,让定时器跑起来。
配置波特率的函数:void ConfigUART(unsigned int baud){SCON = 0x50;TMOD &= 0x0F;TMOD |= 0x20;TH1 = 256 - (11059200/12/32)/baud;TL1 = TH1;ET1 = 0;ES = 1;TR1 = 1;}设计完整代码:#include <reg52.h>sbit ADDR3 = P1^3;sbit ENLED = P1^4;sbit KEY1 = P2^4;sbit KEY2 = P2^5;sbit KEY3 = P2^6;sbit KEY4 = P2^7;unsigned char code LedChar[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E};unsigned char LedBuff[8] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,0xFF};unsigned char code led[ ]={ 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 };unsigned char image[] = {0xFF,0xFF,0x7F,0xBF,0xDF,0xEE,0xF5,0xFB};unsigned char no[]={0xFF,0x7D,0xBB,0xD7,0xEF,0xD7,0xBB,0x7D};unsigned char T0RH = 0;unsigned char T0RL = 0;unsigned char RxdByte = 0;unsigned char index = 0;unsigned char tmrs;unsigned int sec = 10;unsigned int cnt = 0;unsigned int over = 0;unsigned int go = 0;unsigned int flag1s = 0;unsigned int flag250ms = 0; unsigned int begin = 1;void ConfigTimer0(unsigned int ms); void ConfigUART(unsigned int baud); void main(){bit backup1 = 1;bit backup2 = 1;bit backup3 = 1;bit backup4 = 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 ) { o ver = 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;}}}}}void ConfigTimer0(unsigned int ms) //定时器配置函数{unsigned long tmp;tmp = 11059200 / 12;tmp = (tmp * ms) / 1000;tmp = 65536 - tmp;tmp = tmp + 18;T0RH = (unsigned char)(tmp>>8);T0RL = (unsigned char)tmp;TMOD &= 0xF0;TMOD |= 0x01;TH0 = T0RH;;TL0 = T0RL;ET0 = 1;TR0 = 1;}void ConfigUART(unsigned int baud) //波特率配置函数{SCON = 0x50;TMOD &= 0x0F;TMOD |= 0x20;TH1 = 256 - (11059200/12/32)/baud;TL1 = TH1;ET1 = 0;ES = 1;TR1 = 1;}void LedScan() //数码管及LED扫描函数{static unsigned char i = 0;P0 = 0xFF;P1 = (P1 & 0xF8) | i;P0 = LedBuff[i];if (i < 7)i++;elsei = 0;}void InterruptTimer0() interrupt 1 //定时器0中断函数{static unsigned int tmr1s = 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;}}}void InterruptUART() interrupt 4 //串口中断函数{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显示完后可以进入抢答环节四、项目设计结果分析(分析试验过程中,现象或问题的正确性和必然性,以及对有没有达到技术要求进行分析,写出整个调试经过和现象,并分析产生不正确结果的原因和处理方法。