信息与电气工程学院课程设计说明书(2013 /2014学年第二学期)课程名称:单片机应用题目:4路智力竞赛抢答器专业班级:自动化学生姓名:学号:指导教师:设计周数:两周设计成绩:2014年07月10日一、课程设计目的通过长达两周的单片机课程设计,使我加深对《单片机原理及应用》课程所学理论知识的理解,并将理论与实践相结合。
结合课程设计的内容,学会单片机最小系统及外围电路的设计,基本电子元器件的使用,利用Protel软件绘制电路原理图和PCB图,编写程序并结合protues进行仿真,检查电路的合理性及可行性,进行软硬件联机调试,发现问题并解决问题。
学会查阅相关专业技术资料及设计手册,提高团队合作及独立解决问题的能力。
二、课程设计任务及要求2.1 原始数据及主要任务采用STC90C52作为控制单元,实现4路智力竞赛抢答器的设计。
1.设计键盘输入电路。
2.设计显示电路。
3.合理分配地址,编写系统程序。
4.利用Protel设计硬件电路原理图和PCB图。
5.用protues仿真2.2 技术要求设计一台以MCS-51为核心的可供4名选手参加比赛的智力竞赛抢答器。
4名选手各一个按键抢答,主持人一个按键用来系统清零和开始;1个数码管显示抢答倒计时间,由“9”倒计到“0”时,无人抢答,蜂鸣器响;选手抢答成功时,一个数码管显示选手号,同时蜂鸣器发3声间隔1秒笛响,倒计时停止。
初始状态,2个数码管均为0,当抢答成功时,时间数码管显示暂停时间,选手号数码管显示选手号,直到系统清零。
三、设计思路及原理3.1 设计思路设置5个独立按键,其编号分别是1到5,key1为主持人按键,key2-key5分别为1-4号选手按键。
主持人未按键时,其他选手抢答无效,只有当主持人按下开始按键时才可以进行抢答,左边数码管从“9”到“0”开始倒计时,当4个按钮只要有一个按下即只要有人抢答时,左边数码管倒计时停止,右边数码管显示选手编号,蜂鸣器发出3声间隔1秒笛响,选手前面的指示灯也一同点亮,其他抢答都无效。
当选手答完后,由主持人按键将数码管清零,继续开始抢答。
若10秒内无人抢答,则声鸣器发出超时报警声。
选用两个共阳极数码管作为显示,数码管倒计时采用定时器T0进行1S钟计时。
3.2设计原理图振荡电路复位电路键盘输入电路数码管显示电路LED灯电路蜂鸣器电路3.4源程序代码/******************************************************************* * 文件名:main.c* 标题:4路智能抢答器* 实验平台:STC89C52* 作者:WuMing* QQ交流群:131650262 protues仿真及程序请到群共享下载* 日期:2014/07/08* 描述:主持人按下key1键时开始抢答,并数码管1从9开始倒计时,若无人抢答,蜂鸣器响;key2~key5分为4位选手,选手抢答成功时,一个数码管显示选手号,同时蜂鸣器发3声间隔1秒笛响,倒计时停止。
主持人按键清零并继续抢答。
***********************************************************************/#include <reg52.h>//数码管引脚定义sbit SMG1=P2^0; //倒计时显示sbit SMG2=P2^1; //选手号显示//LED灯引脚定义sbit LED1=P2^3; //定义LED灯sbit LED2=P2^4; //定义LED灯sbit LED3=P2^5; //定义LED灯sbit LED4=P2^6; //定义LED灯//独立按键引脚定义sbit key1=P1^0; //主持人按键sbit key2=P1^1; //1号选手按键sbit key3=P1^2; //2号选手按键sbit key4=P1^3; //3号选手按键sbit key5=P1^4; //4号选手按键//蜂鸣器引脚定义sbit BEEP=P2^7;//宏定义#define uchar unsigned char#define uint unsigned int#define N 5#define ON 0#define OFF 1//函数声明void Beep(void);//定义变量uchar num,time,count;//共阴极数码管0-F// uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6D,0x7D,0x07,// 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阳极数码管0-9uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //**********************************************//* NAME: DelayuS(uchar us)//* FUCTION: us延时//* 输入参数:无//* 输出参数:无//* 说明:根据单片机的主频进行调整,不精确//**********************************************void DelayuS( uchar us ){while ( us -- );}//**********************************************//* NAME: DelayMS(uint ms)//* FUCTION: ms延时//* 输入参数:无//* 输出参数:无//* 说明:根据单片机的主频进行调整,不精确//**********************************************void DelaymS(uint ms){uchar i;while(ms--)for(i=0;i<120;i++);}//********************************************** //* NAME: display(uchar time,uchar num)//* FUCTION: 数码管显示函数//* 输入参数:时间、选手号//* 输出参数:无//* 说明://********************************************** void Display(uchar time,uchar num){SMG1=0; //数码管位选P0=table[time]; //数码管段选DelaymS(N); //延时P0=0xFF; //清除数码管显示SMG1=1; //关闭数码管SMG2=0; //数码管位选P0=table[num]; //数码管段选DelaymS(N); //延时P0=0xFF; //清除数码管显示SMG2=1; //关闭数码管}//********************************************** //* NAME: keyscan()//* FUCTION: 检测键盘输入//* 输入参数:无//* 输出参数:无//* 说明://**********************************************void Keyscan(){if(key1==0) //检测主持人按键是否按下{DelaymS(5); //延时消抖if(key1==0) //再次确认{time=9; //数码管复位num=0;TR0=1; //开启定时器T0LED1=OFF;LED2=OFF;LED3=OFF;LED4=OFF;while(!key1);}}if(TR0==1) //TR0作为标志位,只有在TR0=1时,才允许其他选手抢答,否则无效{if(key2==0){DelaymS(5);if(key2==0){TR0=0;num=1;LED1=ON;Beep();while(!key2);}}else if(key3==0){DelaymS(5);if(key3==0){TR0=0;num=2;LED2=ON;Beep();while(!key3);}}else if(key4==0){DelaymS(5);if(key4==0){TR0=0;num=3;LED3=ON;Beep();while(!key4);}}else if(key5==0){DelaymS(5);if(key5==0){TR0=0;num=4;LED4=ON;Beep();while(!key5);}}}}//********************************************** //* NAME: Beep()//* FUCTION: 蜂鸣器函数//* 输入参数:无//* 输出参数:无//* 说明://********************************************** void Beep(void){uchar i;for(i=0;i<3;i++){BEEP=0;DelaymS(500);BEEP=1;DelaymS(500);}}//********************************************** //* NAME: Init(void)//* FUCTION: 定时器及变量的初始化//* 输入参数:无//* 输出参数:无//* 说明://********************************************** void Init(void){TMOD=0x01; //定时器T0工作方式1 TH0=(65536-45872)/256; //赋初值TL0=(65536-45872)%256;EA=1; //开总中断ET0=1; //开定时器中断time=0;num=0;}//********************************************** //* NAME: main(void)//* FUCTION: 主函数//* 输入参数:无//* 输出参数:无//* 说明://********************************************** void main(void){Init();while(1){Keyscan();Display(time,num);}}//********************************************** //* NAME: T0_time()//* FUCTION: 定时器T0中断服务函数//* 输入参数:无//* 输出参数:无//* 说明://********************************************** void T0_time() interrupt 1{TH0=(65536-45872)/256;TL0=(65536-45872)%256;count++;if(count==20){count=0;time--;if(time==0){TR0=0; //关定时器T0BEEP=0;DelaymS(400);BEEP=1;}}}四、所用器件STC90C52AD 1个晶振11.0592Mz 1个发光二极管4个瓷片电容 22pF 2个电解电容 10uF 1个按键5个共阳极数码管2个有源蜂鸣器 1个PNP三极管3个导线若干电阻若干五、课程设计心得体会通过这次课程设计,让我学会了基本电子元器件的使用,能结合所学数电、模电等学科知识,计算阻值等并合理设计电路,能独立完成单片机最小系统及外围电路的搭建,使我对单片机硬件有了更深层次的理解。