基于单片机的三路抢答器的设计
1课程设计的任务与要求
1.1 课程设计的任务
(1)设计一个可供3人进行的抢答器。
(2)系统设置复位按钮,按动后,重新开始抢答。
(3)抢答器开始时数码管显示序号00,选手抢答实行优先显示,优先抢答选手的编号一直保持到主持人将系统清除为止。抢答后显示优先抢答者序号,同时发出音响,并且不出现其他抢答者的序号。
(4)抢答器具有定时抢答功能,且一次抢答的时间有主持人设定,本抢答器的时间设定为30秒,当主持人启动“开始”开关后,定时器开始减计时。
(5)设定的抢答时间内,选手可以抢答,这时定时器停止工作,显示器上显示选手的号码和抢答时间。并保持到主持人按复位键。
1.2 课程设计的要求
(1)基于单片机的三路抢答器的设计,并用Proteus 设计与仿真出来。
(2)程序用Keil 编程出来,并且生成Hex 文件。
(3)设计的方案要能够长期,有效,稳定的运行。
(4)力求简单实用。
1.3 课程设计的研究基础
本设计是以三路抢答为基本理念。考虑到依需设定限时回答的功能,利用AT89C51单片机及外围接口实现的抢答系统,利用单片机的定时器/计数器定时和记数的原理,将软、硬件有机地结合起来,使得系统能够正确地进行计时,同时使数码管能够正确地显示时间。用开关做键盘输出,扬声器发生提示。同时系统能够实现:在抢答中,只有开始后抢答才有效,如果在开始抢答前抢答为无效;抢答时间和回答问题时间倒记时显示,满时后系统计时手动复位。
2 基于单片机三路抢答器系统方案制定
2.1 方案提出
方案一:
图1 方案一设计方案
方案二:
图2 方案二设计方案
2.2 方案比较
第一个方案比第二个方案多了一个驱动电路,所以第一个方案的电路会比较复杂。
2.3 方案论证
该系统采用51系列单片机AT 89C 52作为控制核心,该系统可以完成运算控制、信号识别以及显示功能的实现。由于用了单片机,使其技术比较成熟,应用起来方便、简单并且单片机周围的辅助电路也比较少,便于控制和实现。整个系统具有极其灵活的可编程性,能方便地对系统进行功能的扩张和更改。
2.4 方案选择
通过以上两个方案的比较,选择第二个方案。
3 基于单片机三路抢答器系统方案设计
3.1各单元模块功能介绍及电路设计
3.1.1振荡电路的设计
AT89C52内部有一个用于构成片内振荡器的高增益反相放大器, 振荡器产生的信号送到CPU, 作为CPU 的时钟信号, 驱动CPU 产生执行指令功能的机器周期。引脚XTAL1和XTAL2是此放大器的输人端和输出端。这个放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一起可构成一个自激振荡器, 振荡电路的连接如图所示图3所示,外接石英晶体或陶瓷谐振器以及电容C1和C2构成并联谐振电路, 接在放大器的反馈回路中。
图3 振荡电路
3.1.2 复位电路的设计
单片机复位是使CPU 和系统中的其他功能部件都处在一个确定的初始状态, 并从这个状态开始工作。无论是在单片机刚开始接上电源时, 还是断电后或者发生故障后都要复位。89系列单片机的复位信号是从RST 引脚输人到芯片的施密特触发器中的。当系统处于正常工作状态时, 且振荡器稳定后, 如果RST 引脚有一个高电平并维持2个机器周期(24个振荡周期), 则CPU 就可响应并且将系统复位。复位分为手动复位和上电复位。本设计系统采用的是手动复位, 当按下按钮时, 即使人的动作很快, 也会使按钮保持通达数十毫秒,所以, 手动复位能确保复位时间要求。复位电路连接如图4。
图4 复位电路
3.1.3 计时和组号显示的设计
计时部分由一个共阴极四位八段数码管前二位构成。时间显示是由一个共阴极四位八段数码管前二位构成,组号显示是由一个共阴极四位八段数码管后二位构成,通过P0口直接对其控制。电路图如下:
图5 显示电路
3.1.4 选手按键的设计
三位选手通过按键产生的电平下降沿信息送至P2.0~P2.2口,然后再经由主控制模块处理锁存,最后在数码管上显示最早按下的选手号。电路图如下:
图6 选手按键
3.1.5 主持人控制电路的设计
主持人控制部分由一个开始键组成。开始按键通过外部中断送信息给控制模块,电路图如下:
图7 主持人控制电路
3.1.6蜂鸣器电路设计
P3.4口控制的蜂鸣器主要是提醒选手答题时间到。电路图如下:
图8 蜂鸣器电路
3.2电路参数的计算及元器件的选择
电容C1,C2都是30uF,C3是100n 。电阻R1,R2都是10K.
3.3 特殊器件的介绍
7段LED 数码管是利用7个LED (发光二极管)外加一个小数点的LED 组合而成的显示设备,可以显示0~9等10个数字和小数点,使用非常广泛。数码管可以分为共阳极与共阴极两种,共阳极就是把所有LED 的阳极连接到共同接点com ,而每个LED 的阴极分别为a 、b 、c 、d 、e 、f 、g 及h (小数点);共阴极则是把所有LED 的阴极连接到共同接点com ,而每个LED 的阳极分别为a 、b 、c 、d 、e 、f 、g 及h (小数点)。
图9 数码管原理图
我用的是共阴极。
3.4 系统整体电路图
图10 总电路图
4 基于单片机三路抢答器系统仿真和调试
4.1 仿真软件介绍
Proteus 软件是Labcenter Electronics公司的一款电路设计与仿真软件,它包括ISIS 、ARES 等软件模块,ARES 模块主要用来完成PCB 的设计,而ISIS 模块用来完成电路原理图的布图与仿真。Proteus 的软件仿真基于VSM 技术,它与其他软件最大的不同也是最大的优势就在于它能仿真大量的单片机芯片,比如MCS-51系列、PIC 系列等等,以及单片机外围电路,比如键盘、LED 、LCD 等等。通过Proteus 软件的使用我们能够轻易地获得一个功能齐全、实用方便的单片机实验室。
4.2 系统仿真实现
根据设计的方案,在Proteus 中画出相应的原理图,在Keil 中把所需程序生成HEX 文件,导入到原理图中的单片机中,就可以实现仿真了。步骤如下:
(1)Keil 创建文件步骤:
1)新建项目文件。点击Project 菜单,选择弹出的下拉式菜单中的New Project。在“文件名”中输入您的第一个C 程序项目名称, “*****.uv2”。“保存”后的文件扩展名为uv2,这是KEIL uVision2 项目文件扩展名,以后可以直接点击此文件以打开先前做的项目。
2)选择所要的单片机,常用Ateml 公司的AT89C51。
3)在项目中创建新的程序文件。点击新建文件的快捷按钮,出现一个新的文字编辑窗口,这个操作也可以通过菜单File -New 或快捷键Ctrl+N 来实现。好了,现在可以编写程序了。
4)点击保存新建的程序,*****.c,保存在项目所在的目录中,这时会发现程序单词有了不同的颜色,说明KEIL 的C 语法检查生效了。
5)将程序文件加到项目中。在屏幕左边的Source Group1 文件夹图标上右击弹出菜单,在这里可以做在项目中增加减少文件等操作。选“Add File to Group „Source Group 1‟”弹出文件窗口,选择刚刚保存的文件,按ADD 按钮,关闭文件窗,程序文件加到项目中。这时在Source Group1 文件夹图标左边出现了一个小+号说明,文件组中有了文件,点击它可以展开查看。
6)设定创建HEX 文件选项。
7)编译运行。
8)查错并直至无错误。
(2)Proteus 仿真步骤:
1)创建文件并命名“****.dsn”。
2)放置元件,设定好参数,并连接电路图。
3)双击单片机芯片,添加“****.hex”文件。
4)仿真运行。
5)检查错误直至达到项目要求。
4.3 系统测试
没有按开始键时:
图11 开始显示
按开始键没有人抢答时:
图12 没人抢答显示
按开始键有人抢答时:
图13 有人抢答显示
30秒内一直没有人抢答时:
图14 30秒后没人抢答
按复位键时:
图15 按复位键
4.4 数据分析
主持人按键来控制总开关,主持人按下开关那么选手开始抢答,此时数码管开始30—0计数,并且选手们必须在规定的时间内进行抢答,若过了30秒还没抢答那么抢答失效,选手们若有一个在规定的时间内抢答成功则其余的选手不可以再抢答,即该选手抢答成功。
最小系统的电路不工作,首先应该确认电源电压是否正常。用电压表测量接地引脚跟电源引脚之间的电压,看是否符合电源电压,常用的是5V 左右。接下来就是检测复位引脚的电压是否正常,EA 引脚的电压要正常为5V 左右。
5 总结
5.1 设计小结
通过此次的课程设计,让我更进一步的巩固了单片机的各种知识。但在设计的过程中,遇到了很多的问题,有一些知识已经不太清楚了,但是通过一些资料又重新的翻阅并且认真的复习了相关教科书中的内容。此次的课程设计树立了对自己工作能力的信心,相信会对今后的学习工作生活都有非常重要的影响,而且大大的提高了动手能力,使我充分的体会到了创造过程中的探索的艰难和成功的喜悦。虽然这次做出的作品还存在很多需要改进的地方,但是在整个设计过程中所学习到的东西是这次实训所得到的最大收获跟财富,使我终身受益。
5.2 收获体会
经过近两个月的努力, 在老师和同学的讨论和帮助下, 我成功地完成了三路抢答器的设计,通过此次课程设计,我重新认识到了对书本上的知识要独立运用的道理。在抢答器设计过程中,发现了很多细节性的问题,也出现了很多错误,经过和同学们研究、商讨最后都解决,感觉团队协作能力是非常有必要的!通过此次的抢答器的设计,让我重新拾起了以前所学习的电子知识和C 语言的编程,也使我加深了对单片机及接口技术的理解和应用,由于知识水平的局限,设中可能会存在着一些不足,我真诚的接受老师和同学的批评和指正。
5.3 展望
本设计可以对抢答器扩展的功能有:
(1)可以将该抢答器扩展抢答定时功能,添加定时中断可以比较精确的设置延时。
(2)可以对该抢答器扩展多个选手抢答,这样可以对抢答器不受3位的限制。
(3)可以对该对抢答器加上其他功能,如停止键,加时间,减时间键。
6参考文献
[1] 郭天祥主编. 新概念51单片机C 语言教程:入门、提高、开发、拓展全攻略. 北京:电子工业出版社,2008:108-120.
[2]侯玉宝等主编. 基于Proteus 的51系列单片机设计与仿真. 北京:电子工业出版社,2008.9.
[3]谢维成,杨加国主编. 单片机原理与应用及C51程序设计. 北京:清华大学出版社,2009.7. 7附录 1系统流程图
图 16
图 17
图 18
2器件清单
表1 器件清单
排阻 电阻 电容 晶振 按钮
共阴4位8段数码管
扬声器 三极管
10K 20PF 12MHZ
1 2 3 1 5 1 1 1
3程序
#include
#include #define uchar unsigned char #define uint unsigned int
int a,b,c,d;//数码管数字定义
uint l,l2,n,m,lsd;
sbit s1=P3^5;//控制键定义 sbit d1=P2^0; sbit d2=P2^1;
sbit d3=P2^2;//抢答键定义 sbit w1=P2^4; sbit w2=P2^5; sbit w3=P2^6; sbit w4=P2^7; sbit feng=P3^4;//蜂鸣器 uchar code table[]={
0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71, 0x76,0x79,0x38,0x3f, 0x40,0x00};
void display(uchar,uchar,uchar,uchar); void display2(uchar,uchar,uchar,uchar); void delay(uint z) {
uint t1,y; for(t1=z;t1>0;t1--) for(y=110;y>0;y--);
}
void main() {a=3; b=c=d=0; lsd=0x0f;
w1=w2=w3=w4=1; TMOD=0x01;
TH0=(65536-10000)/256; TL0=(65536-10000)%256; EA=1; ET0=1; while(1) {display(a,b,c,d); if(s1==0) {delay(1);
if(s1==0) { TR0=1; s1=0; if(d1==0) {P1=0xfe; m=0;
while( ((a!=0)||(b!=0)||(c!=0)||(d!=0))) {TR0=0; display2(a,b,20,1); m++; if(m
feng=1;
} if(d2==0) {P1=0xfd; m=0;
while( ((a!=0)||(b!=0)||(c!=0)||(d!=0))) {TR0=0; display2(a,b,20,2); m++; if(m
m=0;
while( ((a!=0)||(b!=0)||(c!=0)||(d!=0))) {TR0=0; display2(a,b,20,3); m++; if(m
void display(uchar qi,uchar ba,uchar sh,uchar g) { }
void display2(uchar qi,uchar ba,uchar sh,uchar g) {
P0=0xff; P0=0xff;
w1=0;
P0=table[qi]; delay(1); w1=1; P0=0xff;
w2=0;
P0=table[ba]|0x80; delay(1); w2=1; P0=0xff; w3=0; P0=table[sh]; delay(1); w3=1; P0=0xff; w4=0; P0=table[g]; delay(1); w4=1; P0=0xff;
w1=0;
P0=table[qi];
w1=1; P0=0xff;
w2=0;
P0=table[ba]; delay(1); w2=1; P0=0xff; w3=0; P0=table[sh]; delay(1); w3=1; P0=0xff; w4=0; P0=table[g]; delay(1); w4=1; P0=0xff;}
void timer0() interrupt 1
{ TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
d--;
if(d==-1)
{P1=lsd; lsd=_crol_(lsd,1); d=9; c--; if(c==-1) {
c=9; b--; if(b==-1) {b=9; a--; if(a==-1) {a=b=c=d=0; TR0=0; feng=0; }}} }
}
基于单片机的三路抢答器的设计
1课程设计的任务与要求
1.1 课程设计的任务
(1)设计一个可供3人进行的抢答器。
(2)系统设置复位按钮,按动后,重新开始抢答。
(3)抢答器开始时数码管显示序号00,选手抢答实行优先显示,优先抢答选手的编号一直保持到主持人将系统清除为止。抢答后显示优先抢答者序号,同时发出音响,并且不出现其他抢答者的序号。
(4)抢答器具有定时抢答功能,且一次抢答的时间有主持人设定,本抢答器的时间设定为30秒,当主持人启动“开始”开关后,定时器开始减计时。
(5)设定的抢答时间内,选手可以抢答,这时定时器停止工作,显示器上显示选手的号码和抢答时间。并保持到主持人按复位键。
1.2 课程设计的要求
(1)基于单片机的三路抢答器的设计,并用Proteus 设计与仿真出来。
(2)程序用Keil 编程出来,并且生成Hex 文件。
(3)设计的方案要能够长期,有效,稳定的运行。
(4)力求简单实用。
1.3 课程设计的研究基础
本设计是以三路抢答为基本理念。考虑到依需设定限时回答的功能,利用AT89C51单片机及外围接口实现的抢答系统,利用单片机的定时器/计数器定时和记数的原理,将软、硬件有机地结合起来,使得系统能够正确地进行计时,同时使数码管能够正确地显示时间。用开关做键盘输出,扬声器发生提示。同时系统能够实现:在抢答中,只有开始后抢答才有效,如果在开始抢答前抢答为无效;抢答时间和回答问题时间倒记时显示,满时后系统计时手动复位。
2 基于单片机三路抢答器系统方案制定
2.1 方案提出
方案一:
图1 方案一设计方案
方案二:
图2 方案二设计方案
2.2 方案比较
第一个方案比第二个方案多了一个驱动电路,所以第一个方案的电路会比较复杂。
2.3 方案论证
该系统采用51系列单片机AT 89C 52作为控制核心,该系统可以完成运算控制、信号识别以及显示功能的实现。由于用了单片机,使其技术比较成熟,应用起来方便、简单并且单片机周围的辅助电路也比较少,便于控制和实现。整个系统具有极其灵活的可编程性,能方便地对系统进行功能的扩张和更改。
2.4 方案选择
通过以上两个方案的比较,选择第二个方案。
3 基于单片机三路抢答器系统方案设计
3.1各单元模块功能介绍及电路设计
3.1.1振荡电路的设计
AT89C52内部有一个用于构成片内振荡器的高增益反相放大器, 振荡器产生的信号送到CPU, 作为CPU 的时钟信号, 驱动CPU 产生执行指令功能的机器周期。引脚XTAL1和XTAL2是此放大器的输人端和输出端。这个放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一起可构成一个自激振荡器, 振荡电路的连接如图所示图3所示,外接石英晶体或陶瓷谐振器以及电容C1和C2构成并联谐振电路, 接在放大器的反馈回路中。
图3 振荡电路
3.1.2 复位电路的设计
单片机复位是使CPU 和系统中的其他功能部件都处在一个确定的初始状态, 并从这个状态开始工作。无论是在单片机刚开始接上电源时, 还是断电后或者发生故障后都要复位。89系列单片机的复位信号是从RST 引脚输人到芯片的施密特触发器中的。当系统处于正常工作状态时, 且振荡器稳定后, 如果RST 引脚有一个高电平并维持2个机器周期(24个振荡周期), 则CPU 就可响应并且将系统复位。复位分为手动复位和上电复位。本设计系统采用的是手动复位, 当按下按钮时, 即使人的动作很快, 也会使按钮保持通达数十毫秒,所以, 手动复位能确保复位时间要求。复位电路连接如图4。
图4 复位电路
3.1.3 计时和组号显示的设计
计时部分由一个共阴极四位八段数码管前二位构成。时间显示是由一个共阴极四位八段数码管前二位构成,组号显示是由一个共阴极四位八段数码管后二位构成,通过P0口直接对其控制。电路图如下:
图5 显示电路
3.1.4 选手按键的设计
三位选手通过按键产生的电平下降沿信息送至P2.0~P2.2口,然后再经由主控制模块处理锁存,最后在数码管上显示最早按下的选手号。电路图如下:
图6 选手按键
3.1.5 主持人控制电路的设计
主持人控制部分由一个开始键组成。开始按键通过外部中断送信息给控制模块,电路图如下:
图7 主持人控制电路
3.1.6蜂鸣器电路设计
P3.4口控制的蜂鸣器主要是提醒选手答题时间到。电路图如下:
图8 蜂鸣器电路
3.2电路参数的计算及元器件的选择
电容C1,C2都是30uF,C3是100n 。电阻R1,R2都是10K.
3.3 特殊器件的介绍
7段LED 数码管是利用7个LED (发光二极管)外加一个小数点的LED 组合而成的显示设备,可以显示0~9等10个数字和小数点,使用非常广泛。数码管可以分为共阳极与共阴极两种,共阳极就是把所有LED 的阳极连接到共同接点com ,而每个LED 的阴极分别为a 、b 、c 、d 、e 、f 、g 及h (小数点);共阴极则是把所有LED 的阴极连接到共同接点com ,而每个LED 的阳极分别为a 、b 、c 、d 、e 、f 、g 及h (小数点)。
图9 数码管原理图
我用的是共阴极。
3.4 系统整体电路图
图10 总电路图
4 基于单片机三路抢答器系统仿真和调试
4.1 仿真软件介绍
Proteus 软件是Labcenter Electronics公司的一款电路设计与仿真软件,它包括ISIS 、ARES 等软件模块,ARES 模块主要用来完成PCB 的设计,而ISIS 模块用来完成电路原理图的布图与仿真。Proteus 的软件仿真基于VSM 技术,它与其他软件最大的不同也是最大的优势就在于它能仿真大量的单片机芯片,比如MCS-51系列、PIC 系列等等,以及单片机外围电路,比如键盘、LED 、LCD 等等。通过Proteus 软件的使用我们能够轻易地获得一个功能齐全、实用方便的单片机实验室。
4.2 系统仿真实现
根据设计的方案,在Proteus 中画出相应的原理图,在Keil 中把所需程序生成HEX 文件,导入到原理图中的单片机中,就可以实现仿真了。步骤如下:
(1)Keil 创建文件步骤:
1)新建项目文件。点击Project 菜单,选择弹出的下拉式菜单中的New Project。在“文件名”中输入您的第一个C 程序项目名称, “*****.uv2”。“保存”后的文件扩展名为uv2,这是KEIL uVision2 项目文件扩展名,以后可以直接点击此文件以打开先前做的项目。
2)选择所要的单片机,常用Ateml 公司的AT89C51。
3)在项目中创建新的程序文件。点击新建文件的快捷按钮,出现一个新的文字编辑窗口,这个操作也可以通过菜单File -New 或快捷键Ctrl+N 来实现。好了,现在可以编写程序了。
4)点击保存新建的程序,*****.c,保存在项目所在的目录中,这时会发现程序单词有了不同的颜色,说明KEIL 的C 语法检查生效了。
5)将程序文件加到项目中。在屏幕左边的Source Group1 文件夹图标上右击弹出菜单,在这里可以做在项目中增加减少文件等操作。选“Add File to Group „Source Group 1‟”弹出文件窗口,选择刚刚保存的文件,按ADD 按钮,关闭文件窗,程序文件加到项目中。这时在Source Group1 文件夹图标左边出现了一个小+号说明,文件组中有了文件,点击它可以展开查看。
6)设定创建HEX 文件选项。
7)编译运行。
8)查错并直至无错误。
(2)Proteus 仿真步骤:
1)创建文件并命名“****.dsn”。
2)放置元件,设定好参数,并连接电路图。
3)双击单片机芯片,添加“****.hex”文件。
4)仿真运行。
5)检查错误直至达到项目要求。
4.3 系统测试
没有按开始键时:
图11 开始显示
按开始键没有人抢答时:
图12 没人抢答显示
按开始键有人抢答时:
图13 有人抢答显示
30秒内一直没有人抢答时:
图14 30秒后没人抢答
按复位键时:
图15 按复位键
4.4 数据分析
主持人按键来控制总开关,主持人按下开关那么选手开始抢答,此时数码管开始30—0计数,并且选手们必须在规定的时间内进行抢答,若过了30秒还没抢答那么抢答失效,选手们若有一个在规定的时间内抢答成功则其余的选手不可以再抢答,即该选手抢答成功。
最小系统的电路不工作,首先应该确认电源电压是否正常。用电压表测量接地引脚跟电源引脚之间的电压,看是否符合电源电压,常用的是5V 左右。接下来就是检测复位引脚的电压是否正常,EA 引脚的电压要正常为5V 左右。
5 总结
5.1 设计小结
通过此次的课程设计,让我更进一步的巩固了单片机的各种知识。但在设计的过程中,遇到了很多的问题,有一些知识已经不太清楚了,但是通过一些资料又重新的翻阅并且认真的复习了相关教科书中的内容。此次的课程设计树立了对自己工作能力的信心,相信会对今后的学习工作生活都有非常重要的影响,而且大大的提高了动手能力,使我充分的体会到了创造过程中的探索的艰难和成功的喜悦。虽然这次做出的作品还存在很多需要改进的地方,但是在整个设计过程中所学习到的东西是这次实训所得到的最大收获跟财富,使我终身受益。
5.2 收获体会
经过近两个月的努力, 在老师和同学的讨论和帮助下, 我成功地完成了三路抢答器的设计,通过此次课程设计,我重新认识到了对书本上的知识要独立运用的道理。在抢答器设计过程中,发现了很多细节性的问题,也出现了很多错误,经过和同学们研究、商讨最后都解决,感觉团队协作能力是非常有必要的!通过此次的抢答器的设计,让我重新拾起了以前所学习的电子知识和C 语言的编程,也使我加深了对单片机及接口技术的理解和应用,由于知识水平的局限,设中可能会存在着一些不足,我真诚的接受老师和同学的批评和指正。
5.3 展望
本设计可以对抢答器扩展的功能有:
(1)可以将该抢答器扩展抢答定时功能,添加定时中断可以比较精确的设置延时。
(2)可以对该抢答器扩展多个选手抢答,这样可以对抢答器不受3位的限制。
(3)可以对该对抢答器加上其他功能,如停止键,加时间,减时间键。
6参考文献
[1] 郭天祥主编. 新概念51单片机C 语言教程:入门、提高、开发、拓展全攻略. 北京:电子工业出版社,2008:108-120.
[2]侯玉宝等主编. 基于Proteus 的51系列单片机设计与仿真. 北京:电子工业出版社,2008.9.
[3]谢维成,杨加国主编. 单片机原理与应用及C51程序设计. 北京:清华大学出版社,2009.7. 7附录 1系统流程图
图 16
图 17
图 18
2器件清单
表1 器件清单
排阻 电阻 电容 晶振 按钮
共阴4位8段数码管
扬声器 三极管
10K 20PF 12MHZ
1 2 3 1 5 1 1 1
3程序
#include
#include #define uchar unsigned char #define uint unsigned int
int a,b,c,d;//数码管数字定义
uint l,l2,n,m,lsd;
sbit s1=P3^5;//控制键定义 sbit d1=P2^0; sbit d2=P2^1;
sbit d3=P2^2;//抢答键定义 sbit w1=P2^4; sbit w2=P2^5; sbit w3=P2^6; sbit w4=P2^7; sbit feng=P3^4;//蜂鸣器 uchar code table[]={
0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71, 0x76,0x79,0x38,0x3f, 0x40,0x00};
void display(uchar,uchar,uchar,uchar); void display2(uchar,uchar,uchar,uchar); void delay(uint z) {
uint t1,y; for(t1=z;t1>0;t1--) for(y=110;y>0;y--);
}
void main() {a=3; b=c=d=0; lsd=0x0f;
w1=w2=w3=w4=1; TMOD=0x01;
TH0=(65536-10000)/256; TL0=(65536-10000)%256; EA=1; ET0=1; while(1) {display(a,b,c,d); if(s1==0) {delay(1);
if(s1==0) { TR0=1; s1=0; if(d1==0) {P1=0xfe; m=0;
while( ((a!=0)||(b!=0)||(c!=0)||(d!=0))) {TR0=0; display2(a,b,20,1); m++; if(m
feng=1;
} if(d2==0) {P1=0xfd; m=0;
while( ((a!=0)||(b!=0)||(c!=0)||(d!=0))) {TR0=0; display2(a,b,20,2); m++; if(m
m=0;
while( ((a!=0)||(b!=0)||(c!=0)||(d!=0))) {TR0=0; display2(a,b,20,3); m++; if(m
void display(uchar qi,uchar ba,uchar sh,uchar g) { }
void display2(uchar qi,uchar ba,uchar sh,uchar g) {
P0=0xff; P0=0xff;
w1=0;
P0=table[qi]; delay(1); w1=1; P0=0xff;
w2=0;
P0=table[ba]|0x80; delay(1); w2=1; P0=0xff; w3=0; P0=table[sh]; delay(1); w3=1; P0=0xff; w4=0; P0=table[g]; delay(1); w4=1; P0=0xff;
w1=0;
P0=table[qi];
w1=1; P0=0xff;
w2=0;
P0=table[ba]; delay(1); w2=1; P0=0xff; w3=0; P0=table[sh]; delay(1); w3=1; P0=0xff; w4=0; P0=table[g]; delay(1); w4=1; P0=0xff;}
void timer0() interrupt 1
{ TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
d--;
if(d==-1)
{P1=lsd; lsd=_crol_(lsd,1); d=9; c--; if(c==-1) {
c=9; b--; if(b==-1) {b=9; a--; if(a==-1) {a=b=c=d=0; TR0=0; feng=0; }}} }
}