您好,欢迎来到尚车旅游网。
搜索
您的当前位置:首页C51单片机8路抢答器实训报告

C51单片机8路抢答器实训报告

来源:尚车旅游网


《单片机与接口技术》课程设计报告

抢答系统设计

学生姓名: _ _____曾超________ 学 号:___2013582031____________ 班 级:___物联网____________ 指导老师:__刘艳军_____________ 日 期:__2015/06/28_____________

1 题目与要求 ................................................................................................................................... 3

1.1 问题提出 ............................................................................................................................ 3 1.2 本系统涉及的知识点 ........................................................................................................ 3 2系统硬件设计 ................................................................................................................................ 3

2.1 模块图 ................................................................................................................................ 3 2.2 部分模块电路图 ................................................................................................................ 4 ................................................................................................................................................ 6 3系统软件设计 ................................................................................................................................ 6 4 总结 ............................................................................................................................................ 20

4.1程序调试情况 ................................................................................................................... 20 4.2本人在程序设计中感想 ................................................................................................... 22 (四)参考文献(左对齐,宋体粗四号) ................................................................................. 22

1 题目与要求

1.1 问题提出

实现一个“抢答系统设计”。

1)制作一个8人抢答器,以开关中的某个开关的按下(闭合)作为抢答按键。 2)无人抢答时,8只数码管轮流循环显示1~8(跑马),谁先抢答,数码管停止跑马,8个数码管同时亮谁的编号,并用蜂鸣器发提示音;其后再有人按键,系统不予响应,直到复位键按下,开始下一轮抢答。

3)主持人端有一个复位键,可重新开始抢答;有一个答案正确的按键,和一个答案错误的按键,按下时有不同的提示音;

要想实现8路抢答器,首先要清楚抢答器的功能。需要设置多少个功能键?

功能按键通过哪个I/O口控制?对于此系统,我们第一步应该做什么,先完成哪个部分?

1.2 本系统涉及的知识点

本系统涉及到的知识点有:

1.按键的处理。

2.数码管的动态静态显示。

2系统硬件设计

2.1 模块图

2.2 部分模块电路图

1. 4*3矩阵键盘,本系统中只用到3个功能键,故令P1^4=0控制列线,P1^1,P1^2,P^3分别为横线,不需要做扫描。分别控制S1,S5,S9.

2.8路按键,为本系统的8路抢答按键。通过P3口输入控制。

3.蜂鸣器,接在P1^5.

3系统软件设计

延时函数模块代码如下:

Void mDelay(unsigned int Delay){

unsigned int i;

for(;Delay>0;Delay--){ for(i=0;i<124;i++){ ; } } }

主程序函数模块,代码:

#include sbit P14=P1^4; sbit Right=P1^1; sbit False=P1^2; sbit P13=P1^3; sbit Beep = P1^5;

unsigned char table[8]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f}; unsigned char wei[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F}; void main() {

int i,t; P14=0; //ap1: P3=0xff; while(1) { for(i=0;i<8;i++) { P2=wei[i]; //从这里开始修改选手编号跑马效果 P0=table[i]; mDelay(150); if(P3!=0xff) { //r8=P3;

switch(P3){ case 0xfe: { //for(t=0;t<2;t++)//抢答后选手编号闪烁次数 //{ P2=0xfe;//按下哪一个按键,则数码管位码送该位。即3号抢答,调到3号数码管,4号抢答跳到4号数码管 P0=0x06; mDelay(500); P0=0x00; mDelay(500); //} while(1){ P0=0x06; P2=0x00; //此处写蜂鸣器提示音 if(Right==0){ for(t=0;t<3;t++)//抢答后选手编号闪烁次数 { P2=0xfe;//按下哪一个按键,则数码管位码送该位。即3号抢答,调到3号数码管,4号抢答跳到4号数码管 P0=0x06; mDelay(500); P0=0x00; mDelay(500); } Beep=0; mDelay(150); Beep=1; mDelay(150); Beep=0; mDelay(150); Beep=1; mDelay(150); Beep=0;

mDelay(500); Beep=1; mDelay(500); } if(False==0){ for(t=0;t<3;t++)//抢答后选手编号闪烁次数 { P2=0xfe;//按下哪一个按键,则数码管位码送该位。即3号抢答,调到3号数码管,4号抢答跳到4号数码管 P0=0xff; mDelay(500); P0=0x00; mDelay(500); } Beep=0; mDelay(500); Beep=1; mDelay(500); Beep=0; mDelay(500); Beep=1; mDelay(500); Beep=0; mDelay(500); Beep=1; mDelay(500); } if(P13==0) break; } break; } case 0xfd: { P2=0xfd; P0=0x5b; mDelay(500);

P0=0x00; mDelay(500); while(1){ P0=0x5b; P2=0x00; if(Right==0){ for(t=0;t<3;t++)//抢答后选手编号闪烁次数 { P2=0xfe;//按下哪一个按键,则数码管位码送该位。即3号抢答,调到3号数码管,4号抢答跳到4号数码管 P0=0x06; mDelay(500); P0=0x00; mDelay(500); } Beep=0; mDelay(150); Beep=1; mDelay(150); Beep=0; mDelay(150); Beep=1; mDelay(150); Beep=0; mDelay(500); Beep=1; mDelay(500); } if(False==0){ for(t=0;t<3;t++)//抢答后选手编号闪烁次数 { P2=0xfe;//按下哪一个按键,则数码管位码送该位。即3号抢答,调到3号数码管,4号抢答跳到4号数码管 P0=0xff; mDelay(500);

P0=0x00; mDelay(500); } Beep=0; mDelay(500); Beep=1; mDelay(500); Beep=0; mDelay(500); Beep=1; mDelay(500); Beep=0; mDelay(500); Beep=1; mDelay(500); } if(P13==0) break; } break;//退出switch } case 0xfb: { P2=0xfb; P0=0x4f; mDelay(500); P0=0x00; mDelay(500); while(1){ P0=0x4f; P2=0x00; if(Right==0){ for(t=0;t<3;t++)//抢答后选手编号闪烁次数 { P2=0xfe;//按下哪一个按键,则数码管位码送该位。即3号抢答,调到3号数码管,4号抢答跳到4号数码管 P0=0x06;

mDelay(500); P0=0x00; mDelay(500); } Beep=0; mDelay(150); Beep=1; mDelay(150); Beep=0; mDelay(150); Beep=1; mDelay(150); Beep=0; mDelay(500); Beep=1; mDelay(500); } if(False==0){ for(t=0;t<3;t++)//抢答后选手编号闪烁次数 { P2=0xfe;//按下哪一个按键,则数码管位码送该位。即3号抢答,调到3号数码管,4号抢答跳到4号数码管 P0=0xff; mDelay(500); P0=0x00; mDelay(500); } Beep=0; mDelay(500); Beep=1; mDelay(500); Beep=0; mDelay(500); Beep=1; mDelay(500); Beep=0; mDelay(500); Beep=1; mDelay(500);

} if(P13==0) break; } break; } case 0xf7: { P2=0xf7; P0=0x66; mDelay(500); P0=0x00; mDelay(500); while(1){ P0=0x66; P2=0x00; if(Right==0){ for(t=0;t<3;t++)//抢答后选手编号闪烁次数 { P2=0xfe;//按下哪一个按键,则数码管位码送该位。即3号抢答,调到3号数码管,4号抢答跳到4号数码管 P0=0x06; mDelay(500); P0=0x00; mDelay(500); } Beep=0; mDelay(150); Beep=1; mDelay(150); Beep=0; mDelay(150); Beep=1; mDelay(150); Beep=0; mDelay(500); Beep=1; mDelay(500);

} if(False==0){ for(t=0;t<3;t++)//抢答后选手编号闪烁次数 { P2=0xfe;//按下哪一个按键,则数码管位码送该位。即3号抢答,调到3号数码管,4号抢答跳到4号数码管 P0=0xff; mDelay(500); P0=0x00; mDelay(500); } Beep=0; mDelay(500); Beep=1; mDelay(500); Beep=0; mDelay(500); Beep=1; mDelay(500); Beep=0; mDelay(500); Beep=1; mDelay(500); } if(P13==0) break; } break; } case 0xef: { P2=0xef; P0=0x6d; mDelay(500); P0=0x00; mDelay(500); while(1){ P0=0x6d;

P2=0x00; if(Right==0){ for(t=0;t<3;t++)//抢答后选手编号闪烁次数 { P2=0xfe;//按下哪一个按键,则数码管位码送该位。即3号抢答,调到3号数码管,4号抢答跳到4号数码管 P0=0x06; mDelay(500); P0=0x00; mDelay(500); } Beep=0; mDelay(150); Beep=1; mDelay(150); Beep=0; mDelay(150); Beep=1; mDelay(150); Beep=0; mDelay(500); Beep=1; mDelay(500); } if(False==0){ for(t=0;t<3;t++)//抢答后选手编号闪烁次数 { P2=0xfe;//按下哪一个按键,则数码管位码送该位。即3号抢答,调到3号数码管,4号抢答跳到4号数码管 P0=0xff; mDelay(500); P0=0x00; mDelay(500); } Beep=0; mDelay(500);

Beep=1; mDelay(500); Beep=0; mDelay(500); Beep=1; mDelay(500); Beep=0; mDelay(500); Beep=1; mDelay(500); } if(P13==0) break; } break; } case 0xdf: { P2=0xdf; P0=0x7d; mDelay(500); P0=0x00; mDelay(500); while(1){ P0=0x7d; P2=0x00; if(Right==0){ for(t=0;t<3;t++)//抢答后选手编号闪烁次数 { P2=0xfe;//按下哪一个按键,则数码管位码送该位。即3号抢答,调到3号数码管,4号抢答跳到4号数码管 P0=0x06; mDelay(500); P0=0x00; mDelay(500); } Beep=0;

mDelay(150); Beep=1; mDelay(150); Beep=0; mDelay(150); Beep=1; mDelay(150); Beep=0; mDelay(500); Beep=1; mDelay(500); } if(False==0){ for(t=0;t<3;t++)//抢答后选手编号闪烁次数 { P2=0xfe;//按下哪一个按键,则数码管位码送该位。即3号抢答,调到3号数码管,4号抢答跳到4号数码管 P0=0xff; mDelay(500); P0=0x00; mDelay(500); } Beep=0; mDelay(500); Beep=1; mDelay(500); Beep=0; mDelay(500); Beep=1; mDelay(500); Beep=0; mDelay(500); Beep=1; mDelay(500); } if(P13==0) break; } break; }

case 0xbf: { P2=0xbf; P0=0x07; mDelay(500); P0=0x00; mDelay(500); while(1){ P0=0x07; P2=0x00; if(Right==0){ for(t=0;t<3;t++)//抢答后选手编号闪烁次数 { P2=0xfe;//按下哪一个按键,则数码管位码送该位。即3号抢答,调到3号数码管,4号抢答跳到4号数码管 P0=0x06; mDelay(500); P0=0x00; mDelay(500); } Beep=0; mDelay(150); Beep=1; mDelay(150); Beep=0; mDelay(150); Beep=1; mDelay(150); Beep=0; mDelay(500); Beep=1; mDelay(500); } if(False==0){ for(t=0;t<3;t++)//抢答后选手编号闪烁次数

{ P2=0xfe;//按下哪一个按键,则数码管位码送该位。即3号抢答,调到3号数码管,4号抢答跳到4号数码管 P0=0xff; mDelay(500); P0=0x00; mDelay(500); } Beep=0; mDelay(500); Beep=1; mDelay(500); Beep=0; mDelay(500); Beep=1; mDelay(500); Beep=0; mDelay(500); Beep=1; mDelay(500); } if(P13==0) break; } break; } case 0x7f: { P2=0x7f; P0=0x7f; mDelay(500); P0=0x00; mDelay(500); while(1){ P0=0x7f; P2=0x00; if(Right==0){ for(t=0;t<3;t++)//抢答后选手编号闪烁次

数 { P2=0xfe;//按下哪一个按键,则数码管位码送该位。即3号抢答,调到3号数码管,4号抢答跳到4号数码管 P0=0x06; mDelay(500); P0=0x00; mDelay(500); } Beep=0; mDelay(150); Beep=1; mDelay(150); Beep=0; mDelay(150); Beep=1; mDelay(150); Beep=0; mDelay(500); Beep=1; mDelay(500); } if(False==0){ for(t=0;t<3;t++)//抢答后选手编号闪烁次数 { P2=0xfe;//按下哪一个按键,则数码管位码送该位。即3号抢答,调到3号数码管,4号抢答跳到4号数码管 P0=0xff; mDelay(500); P0=0x00; mDelay(500); } Beep=0; mDelay(500); Beep=1; mDelay(500); Beep=0; mDelay(500);

}

}

}

Beep=1; mDelay(500); Beep=0; mDelay(500); Beep=1; mDelay(500); } if(P13==0) break; } break; } } }

P2=P2<<1|0x01; mDelay(150);

4 总结

(1)熟悉单片机的型号及各引脚功能。 (2)熟悉单片机硬件电路设计。 (3)熟练单片机C语言程序设计。

(4)用C语言实现软件系统,并在仿真环境下调试运行。 (5)根据硬件电路图和程序代码将产品制作出来并调试。

4.1程序调试情况

8路抢答器开始时,选手编号进行跑马。

抢答成功,8位数码管同时显示选手编号

4.2本人在程序设计中感想

在设计复位按键时,在case语句下循环语句用了两重while循环,导致我无法退出循环及switch分支,无法复位。在思考程序整体后,删除外重while语句,内层while用break跳出,在case语句下再加上一句break语句,跳出分支,实现复位按键的功能。

(四)参考文献

[1] 谭浩强,C程序设计(第二版),北京:清华大学出版社,

2001.1。

[2] 单片机,单片机原理及接口技术(第二版),北京:高等教育出版社,2009.1。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- sceh.cn 版权所有 湘ICP备2023017654号-4

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务