从一个简单的项目,学会单片机的使用:51单片机设计的8路抢答器
单片机作为可编程器件,简化了电路的设计、方便了逻辑设计,从此再也不用使用一大堆电路做硬件逻辑了。拆开任何一件功能稍微复杂一点电子产品,里边都可以看到单片机的身影。学会单片机对找工作也很有利,而且待遇还不错,今天就从实例分享的角度和大家共享一个案例,用单片机来实现一个抢答器。
在电视节目中,经常看到抢答器出现在知识竞赛、答题竞赛节目中,如江苏卫视的《一站到底》,抢答器可以准确、公正、直观、公平的显示出抢答选手的编号,可以更好的促进各选手之间的竞争意识,营造紧张的抢答气氛,增加节目的趣味性和观赏性。
抢答器的设计框图
抢答器要实现如下功能:抢答功能、显示功能、倒计时功能、自锁功能。节目后台需要控场,拥有抢答器的绝对控制权。功能需求 如下:
开始、结束功能 :只有按下开始按键后,现场选手才可以开始抢答,否则抢答事件不被处理视为无效;自锁、互锁功能 :为了保证抢答的公平性,在开始抢答后,第一个按下抢答的视为有效抢答,产生有效抢答后其他抢答视为无效;计时、设置功能 :后台/主持人可以设置抢答时间的长短,以倒数秒的方式显示,增强紧张气氛;显示、声音功能 :用数码管显示倒计时秒数,选手抢答成功后显示抢答者编号和剩余时间;在该设计中,按键采用机械式的四腿按键来实现,按键数量10个;显示采用三位数码管来实现,两位显示时间,一位显示选手编号;声音提示用蜂鸣器来实现。核心器件采用51单片机来实现。其功能框图如下图所示。
1-抢答器功能框图
按键输入电路设计
该抢答器设计中总共有10个按键,其中8个按键用于给用户抢答用,所代表的编号为1-8,另外两个按键分别为开始键和结束键,由主持人或者后台控制。由于8路输入抢答按键具有互锁功能,所以只要有一个有效输入后,其他抢答都是无效的,这个功能可以在程序中实现,为了方便程序设计,这里采用8输入与非门来实现,所用型号为74LS30,该与非门有8路输入,1个输出,功能框图如下所示。
2-74LS30与非门框图
8个按键作为74LS30的输入,输出通过NPN三极管接入51单片机的外部中断0接口,以中断的方式实现按键功能的检测,单片机的中断资源为低电平有效,为了提高电路稳定性在三极管的集电极上加入上拉电阻,以防误动作。
3-按键输入电路设计
开始和结束两个按键采用独立式按键设计,占用掉单片机的两个IO口,程序中采用轮询来实现。
数码管显示电路设计
显示部分采用数码管来实现,根据设计要求,两位用于显示倒计时时间,最大可以显示99;一位用于显示选手编号,故需要3颗数码管,该设计中采用共阳数码管来实现,所谓共阳数码管是指公共端接高电平,段选管脚接低电平后相应的字段才会被点亮。共阴数码管正好相反,公共端接低电平,段选管脚接高电平后相应的字段才会被点亮。数码管的实物图如下所示。
4-数码管实物图
数码管的引脚比较多,除了8个段选管脚外,还有公共端/位选引脚,如果用三颗独立的数码管可能需要较多单片机引脚资源,为了解决这个问题,本例设计采用74HC595作为数码管驱动。74HC595是串入并出的移位寄存器,只需要三个引脚就可以控制8个引脚的输出,而且还可以实现级联。所以74HC595通常在数码管驱动和点阵屏中应用比较多。
这三颗数码管中,分为时间显示和编号显示两组,用到三颗74HC595,其中两颗级联用于控制时间显示的数码管,总共用到6个单片机的IO口,驱动电路如下图所示。
5-数码管驱动电路
蜂鸣器发声电路设计
需求中提到发声设计,当有效按键事件发生时,蜂鸣器发声作为提示音,当倒计时进入5秒之内后还没有人按键抢答时,蜂鸣器每隔1秒发声,制造现场紧张的气氛,提高节目的观赏性和娱乐性,增强节目效果。本例中选择了蜂鸣器,蜂鸣器驱动电路如下图所示。
6-蜂鸣器驱动电路
由于单片机的IO口驱动能力有限,所以采用三极管来驱动,这里选用了PNP三极管。三极管驱动蜂鸣器时工作于饱和状态,为了让三极管充分饱和,将蜂鸣器接在了三极管的集电极,这个地方初学者在设计电路时要注意。图中当单片机的IO口输出低电平时蜂鸣器工作发声。
抢答器程序设计
该设计使用keil5作为编程环境,涉及到数码管显示、按键检测/互锁、蜂鸣器发声、定时器等相关功能模块的程序编写。程序设计的流程图如下所示。
7-程序设计流程图
程序的功能逻辑介绍如下,上电后数码管显示FFF字样,并首先检测“开始”按键是否按下,如果没有按下开始按键则表示抢答未开始。如果按下了开始按键,抢答器启动,秒显示开始倒计时,有人按下抢答键时蜂鸣器发声、倒计时停止并显示抢答者编号,整个抢答事件结束,直到主持人/后台按下结束按键后再显示FFF。如果倒计时进入5秒内,仍未有人抢答,则每个整秒蜂鸣器响一次,直至结束。
以上为程序逻辑设计和程序的流程图讲解,下面介绍各功能模块的程序设计。
首先介绍数码管的程序编写 ,再编写程序时,都会预先定义好数码管的字段表,根据共阳数码管和共阴数码管的不同,其字段表也是不一样的,但是两者是互补的,数码管可显示的字段表如下图所示。
8-数码管字段表
程序代码如下:
/*共阳数码管的0-9数字字码表*/
uchar code seg_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x8e,0xff};
其次是按键部分 ,抢答按键采用中断来实现,开始/结束按键采用轮询实现,部分定义代码如下所示。
//定义抢答按键
sbit KEY_1=P0^0; //1
sbit KEY_2=P0^1; //2
sbit KEY_3=P0^2; //3
sbit KEY_4=P0^3; //4
sbit KEY_5=P0^4; //5
sbit KEY_6=P0^5; //6
sbit KEY_7=P0^6; //6
sbit KEY_8=P0^7; //6
//定义开始/结束按键
sbit START = P2^4;
sbit STOP = P2^5;
仿真电路的设计和验证
在做板子之前,先用Proteus仿真软件做了仿真。Proteus仿真支持51单片机并可以实现运行程序的功能,当把程序写好后加载至Proteus即可实现程序的调试,Proteus还可以与Keil软件实现联调功能。所设计的仿真电路如下图所示。
9-仿真电路-初始显示FFF字样
在上电初期,显示“FFF”字样,前两个数码管代表倒计时时间,后一个数码管代表抢答者的编号。按下开始按键后,抢答器开始工作,如下图所示。
10-抢答成功界面
上图表示,在倒计时时间还有7秒的时候,5号选手完成了有效抢答,直至主持人/后台按下结束后再显示FFF,否则一直显示该界面。
抢答器的焊接调试
为了实现功能验证,选择用万用板手工焊接实现这个设计。最终的实物图如下所示:
11-最终实物图正面
电源供电为DC5V,可以使用电池盒供电,也可以选择5V输出的手机充电器供电,导线走在了电路板正面,虽然丑了点,但是方便一点。电路板的反面如下图所示。
12-最终实物图背面
反面是用焊锡连接实现的。由于功能不是很复杂,程序写完后,调试了没几次就完成了功能,前文中所描述的功能都实现了。按键互锁的功能也实现了。下图是通电运行的界面,表示5号抢答者在倒计时28秒的时候抢答成功,这时候其他抢答者的按键无效。只有开始或者结束按键是其作用的。
13-抢答成功界面
该抢答器的设计虽然是一个很简单的练手项目,但是却涉及到了单片机中最常用的外设电路,可以帮助初学者熟悉数码管、按键、蜂鸣器的使用和控制方法。初学者可以借助这个产品熟悉单片机开发过程中所用的各种软件和产品开发的流程。
对这个电路进行PCB Layout,设计个外壳就成了一个不错的产品。还可以增加蓝牙模块或者WiFi模块,实现电子屏的控制和显示,再把功能完善一下,就可以用在舞台上了。
基于单片机的LCD数字电流表的设计与实现
摘 要 : 本文中数字电流表的控制系统采用AT89S51单片机,A/D转换器采用ADC0809为主要硬件,实现数字电流表的硬件电路与软件设计。该系统的数字电流表电路简单,所用的元件较少,成本低,调节工作可实现自动化。数字电流表可以测量0~200 mA的8路输入电流值,并在LCD液晶显示屏上显示出来。
0 引言
在现实中,根据测试系统的要求,往往需要采集被测对象的各种参数,如电压、电流等,这些参数的采集是至关重要的,它们直接影响到整个测试系统的测试精度。在有些应用中,需要对电流进行检测,必须先将其电流信号转换为电压信号,然后才能实现A/D转换。常用的转换方法是在电路中加入精密电阻,由此将电流信号转换为电压信号[1]。这种方法的优点是测量简单方便,但是这种方法当电流很小时,从电阻上取得的电压值可能很小,影响测量精度,因而很难选择一个合适的阻值;其次,所得到的电流检测信号只有通过放大以后才能进入电路中的比较器,从而增加了电路设计调试时的复杂度。因此,需要采用电流/电压转换芯片,并结合单片机以实现对电流信号的检测。本文中采用精密电阻,克服了常规测量电流方法存在的测量范围小、测量误差大等缺点,可提高测量精度,同时采用单片机可实现自动检测。
1 硬件电路设计
本设计旨在设计一款测量范围在0~200 mA、显示精度在小数点前一位的基于AT89S51单片机带液晶显示功能的电流表,经查阅多种相关资料,确定本设计的总体框图如图1所示。
图1所示电路工作过程:将需要检测的电流信号经过I/V变换变为电压信号,将其输出的电压信号连接到ADC0809进行A/D转换,电压信号经过采样后,输出到单片机,单片机控制中断的过程以及数据的读取过程,最后通过控制液晶显示所读取的数据。
1.1 I/V变换电路部分
对本设计来说,由于精度要求并不高,故用有源I/V即可满足要求,有源I/V变换是利用有源器件——运算放大器和电阻电容组成的,如图2所示。
该有源I/V变换电路利用同相放大电路,把电阻R1上的输入电压变成标准输出电压。该同相放大电路的放大倍数为:
若取R1=20 Ω,R2=100 kΩ,R3=100 kΩ,R4=25 kΩ,R5=10 kΩ,则当输入电流为0~200 mA时,对应于0~5 V的电压输出。
1.2 A/D转换模块
基于成本、功耗、分辨率、模拟电压转换范围等因素,此处选择ADC0809芯片。ADC0809与8051单片机的硬件接口有3种形式,分别是查询方式、中断方式和延时等待方式。A/D转换后得到的数据应及时传送给单片机进行处理。数据传送的关键问题是如何确认A/D转换的完成,因为只有确认完成后,才能进行传送。在本设计中,选择中断方式,即把表明转换完成的状态信号(EOC)作为中断请求信号,以中断方式进行数据传送。
1.3 单片机模块
该电流表可测量0~200 mA的直流电压,通过电位器调节产生,显示位数3位[2],工作电压5 V。通过A/D转换芯片ADC0809把模拟信号转换为数字量传送到单片机的P3口,并在P2口把转换的结果显示出来。在仿真软件Protesus[3]里选择元器件后连接电流表总图,如图3所示。
本设计选用的AT89S51是ATMEL公司推出的高性能8位微控制器,由于ADC0809无片内时钟,时钟信号可由AT89S51的ALE信号经D触发器二分频后获得。ALE引脚的脉冲频率是8051时钟频率的1/6。本设计中单片机时钟频率采用6 MHz,则ALE输出的频率是1 MHz,二分频后为500 kHz,符合ADC0809对频率的要求。
1.4 显示部分
本电流表的显示[4]选择LCDl602型LCD,它具有电流小、功耗低、体积小、字迹清晰、美观、方便、使用寿命长、无电磁辐射等优点。从图3中可看出其与AT89S51的P0口相连,其DO~D7为8位双向数据线,VSS为地电源,VDD接5 V正向电源,VEE为液晶显示器对比度调整端,接正向电源时对比度最弱,而接地电源时对比度最高。该引脚通过一只1 kΩ的电位器来调整其对比度。RS为寄存器选择引脚,RS为高电平时选用数据寄存器;RS为低电平时选用指令寄存器。RW为可读写信号引脚,RW高电平时为读操作;RW低电平时为写操作。当RS和RW共同为低电平时则写入指令或者显示地址;当RS为低电平、RW为高电平时为读忙信号;当RS为高电平、RW为低电平时为写人数据。E为使能端,当E由高电平跳变为低电平时,LCD液晶模块开始执行命令。
2 电流表软件设计
本电流表的主程序流程包括:系统初始化、中断处理程序、数值转换程序、显示处理程序。较关键的是数据采集部分和显示部分。
2.1 数据采集部分
本部分程序设计的思想如下:首先由ADC0809采集数据,采集完成后单片机通过中断将数据读入,然后将所得十六进制数转换成十进制数,将此十进制数的百、十、个位分别取出,在预先设置好的表中查出其所对应的显示指令并显示出来。以下为数值转换的主代码[5]。
codes=PORT;//将中断值赋予codes
codes1=(codes&0xf0)>>4;//取出codes的高4位
codes0=codes&0x0f;//取出codes的低4位
code_d=codes1*16+codes0;//将codes转化为十进制数
bai=code_d/100;//将code_d的百位取出
shi=code_d/10%10;//将code_d的十位取出
ge=code_d%10;//将code_d的个位取出
2.2 数值显示程序
这部分程序首先要将单位mA显示出来,因为这单位是不变的。要把测得的数值在液晶屏上显示出来时,此处调用一个getchar函数。在这个函数中,用了一个do{}while语句。在此语句的一开头首先测试液晶模块是否空闲,若不空闲则等待其空闲,当液晶空闲时,执行嵌套switch/case语句。由于要显示三个数字,所以设定了一个变量i,当i=0时显示百位,当i=1时显示十位,当i=2时显示个位。显示数字时可选择查表法。先建立三个表,每一位对应一个表。以下为显示十位的例子。
case 1:
{
PA=TABLE2[shi*2+t];
t++;
}break;
显示完成后,进行适当的延时以保证显示的稳定性。
3 结论
在本次设计中,通过使用Proteus绘制电路图,用C语言编写程序,程序运行完毕后,电压表的显示屏上就可以显示出电流数值来。调节电位器,显示数值就会发生变化。电压表的最小显示值是0 mA,最大显示值是200 mA,这与设计目的一致,1 s内大约可以测量2次电压值。
参考文献
[1] 柳金龙.浅谈数字电压表的特点[J].中国计量,2004(8):43-44.
[2] 王韬.3位半积分式A/D转换DC电压表[J].电子设计工程:电子世界,2002(2):44-45.
[3] 周润景,张丽娜.刘映群.PROTEUS入门使用教程[M].北京:机械工业出版社,2007.
[4] 马俊,刘晓林.智能键盘字符输入及LCD显示系统设计[J].电子设计工程,2009,17(1):66-68.
[5] 马忠梅,籍顺心,张凯,等.单片机的C语言应用程序设计(第3版)[M].北京:北京航空航天大学出版社,2003.
相关问答
00HD.(30H)=00H3.要用传送指令访问MCS- 51 片外RAM,它_作业帮[最佳回答]一,选择题1.当CPU响应外部中断0后,PC的值是(A)A.0003HB.2000HC.000BHD.3000H2.当MCS-51复位时,下面说法准确的是(A)A.PC=0000HB....
89S51单片机 中的DJNZ指令是怎么用的呢?例如:DJNZRn,rel;Rn←...[最佳回答]Rn减1后的完整地说是:减1后不为0则跳转;减1后为0则顺序执行.
mcs- 51单片机 工作方式和其功能特点?方式0:这种工作方式比较特殊,与常见的微型计算机的串行口不同,它又叫同步移位寄存器输出方式。在这种方式下,数据从RXD端串行输出或输入,同步信号从TXD...
c 51 的数据类型""idata,code,xdata,pdata""各对应at89 s51单片机 的哪些存储空间?idata对应于内部RAM00H~FFHcode对应于程序存储器的0000H~1FFFH(8K)如果扩展可寻址64K。使用MOVCxdata对应于外部RAM0000H~FFFFH(需要...
给 51单片机 编程时接vcc。vDD还接哪个引脚?除了Vcc接电源通常是5v,某些型号是3.3V,Vdd接地,EA接高电平(这个在某些单片机最小系统里不是必须的)txd接单片机rxd,rxd接单片机txd,如果下载时选内部晶振...
mcs 51 指令执行过程分为?MCS-51单片机的指令如果按功能划分可以分为五类:1,数据传送类指令:完成数据在单片机内部之间的传送。分为8位数和16位两种。除了奇偶位外,指令的执行对PSW...
mcs- 51单片机 的特点及应用?MCS-51单片机是美国INTE公司于1980年推出的产品,与MCS-48单片机相比,它的结构更先进,功能更强,在原来的基础上增加了更多的电路单元和指令,指令数达111条,MC...
tro 单片机 什么意思?是TR0不是TRO51内核单片机中TR0=1表示控制定时器0启动TR1=1表示控制定时器1启动单片机(Single-ChipMicrocomputer)是一种集成电路芯片,是采用超大规模集....
单片机s tc90c516rd+和at89 s 52的联系和区别?两种都是51单片机,内核是一样的,IO引脚也一样主要的不同是FALSH,RAM及外设的不同,程序下载方式也不同stc90c516rd+可以用串口进下ISP下载,可以看其它的...
mcs- 51单片机 在正常运行时.rst/vpd引脚是低电平还是高阻?rst/vpd引脚是高电平,mcs-51单片机将处于复位状态。rst/vpd引脚是低电平,mcs-51单片机将正常运行。rst/vpd引脚是高电平,mcs-51单片机将处于复位状态。rst/vp.....