1、1第第12章章 单片机各种应用设计单片机各种应用设计 介绍各种常用的单片机测控应用设计案例,通过案例使读介绍各种常用的单片机测控应用设计案例,通过案例使读者了解单片机系统的的各种常见的应用设计。者了解单片机系统的的各种常见的应用设计。12.1 单片机控制步进电机的设计单片机控制步进电机的设计 步进电机是步进电机是将脉冲信号转变为角位移或线位移的开环控制将脉冲信号转变为角位移或线位移的开环控制元件元件。非超载的情况下,电机转速、停止位置非超载的情况下,电机转速、停止位置只取决于脉冲信号只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,的频率和脉冲数,而不受负载变化的影响,给电机加一脉冲信给电
2、机加一脉冲信号,电机则转过一个步距角。因而步进电机号,电机则转过一个步距角。因而步进电机只有周期性误差而只有周期性误差而无累积误差无累积误差,在,在速度、位置速度、位置等控制领域有较为广泛的应用。等控制领域有较为广泛的应用。231.控制步进电机的工作原理控制步进电机的工作原理 驱动步进电机由单片机通过对每组线圈中的电流的顺序切换驱动步进电机由单片机通过对每组线圈中的电流的顺序切换来使电机作步进式旋转,切换是单片机输出脉冲信号来实现。来使电机作步进式旋转,切换是单片机输出脉冲信号来实现。调节脉冲信号频率就可改变步进电机转速;改变各相脉冲先调节脉冲信号频率就可改变步进电机转速;改变各相脉冲先后顺序
3、,就可改变电机旋转方向。后顺序,就可改变电机旋转方向。步进电机驱动可采用步进电机驱动可采用双四拍双四拍(ABABBCBCCDCDDADAABAB)方式,)方式,也可采用也可采用单四拍单四拍(A AB BC CD DA A)方式。为使步进电机旋转平)方式。为使步进电机旋转平稳,还可采用单、双八拍方式(稳,还可采用单、双八拍方式(A AABABB BBCBCC CCDCDD DDADAA A)。各种工作方式时序)。各种工作方式时序见见图图12-112-1。4 图图12-1 各种工作方式时序图各种工作方式时序图5 图图12-112-1脉冲信号是高电平有效,但实际控制时公共端是接脉冲信号是高电平有效,
4、但实际控制时公共端是接在在VCCVCC上,所以实际控制脉冲是低电平有效。上,所以实际控制脉冲是低电平有效。2.电路设计与编程电路设计与编程 【例【例12-1】单片机对步进电机控制的原理电路见单片机对步进电机控制的原理电路见图图12-1。编。编写程序,用四路写程序,用四路I/O口输出实现环形脉冲分配,控制步进电机按口输出实现环形脉冲分配,控制步进电机按固定方向连续转动。同时,通过固定方向连续转动。同时,通过“正转正转”和和“反转反转”两个按键两个按键来控制电机的正转与反转。按下来控制电机的正转与反转。按下“正转正转”按键,步进电机正转按键,步进电机正转;按下;按下“反转反转”按键,步进电机反转;
5、松开按键,电机停止转按键,步进电机反转;松开按键,电机停止转动。动。ULN2003是高耐压、大电流达林顿阵列系列产品,是高耐压、大电流达林顿阵列系列产品,7个个NPN达林顿管组成。多用于单片机、智能仪表、达林顿管组成。多用于单片机、智能仪表、PLC等控制电等控制电6图图12-2 单片机控制步进电机接口电路单片机控制步进电机接口电路7路路中。在中。在5V5V电压下能与电压下能与TTLTTL和和CMOSCMOS电路直接相连电路直接相连,可直接驱动可直接驱动继电器等负载。具有电流增益高、工作电压高、温度范围宽、继电器等负载。具有电流增益高、工作电压高、温度范围宽、带负载能力强等特点。带负载能力强等特
6、点。输入输入5V5V的的TTLTTL电平,电平,输出可达输出可达500mA/50V500mA/50V。适于各类高速大功率驱动的系统。适于各类高速大功率驱动的系统。参考程序参考程序:#include reg51.h#include reg51.h#define#define ucharuchar unsigned char unsigned char#define#define uintuint unsigned unsigned intint#define out P2#define out P2sbitsbit pos=P00;pos=P00;/定义检测正转控制位定义检测正转控制位P0.0P
7、0.0sbitsbit negneg=P01;=P01;/定义检测反转控制位定义检测反转控制位P0.1P0.1void void delayms(uintdelayms(uint););8ucharuchar code turn=0 x02,0 x06,0 x04,0 x0c,0 x08,0 x09,0 x01,0 x03;code turn=0 x02,0 x06,0 x04,0 x0c,0 x08,0 x09,0 x01,0 x03;/步进脉冲数组步进脉冲数组void void main(voidmain(void)ucharuchar i;i;out=0 x03;out=0 x03;wh
8、ile(1)while(1)if(!posif(!pos)/)/如果正转按键按下如果正转按键按下 i=i 8?i+1:0;/i=i 8?i+1:0;/如果如果i8i 0?i-1:7;i=i 0?i-1:7;out=out=turniturni;delayms(50);delayms(50);void void delayms(uintdelayms(uint j)j)/函数功能:延时函数功能:延时 ucharuchar i;i;for(;jfor(;j0;j-)0;j-)i=250;i=250;while(-i);while(-i);i=249;i=249;while(-i);while(-i
9、);1012.2 单片机控制直流电机单片机控制直流电机 直流电机多用在直流电机多用在无无交流电源、方便移动场合,具有低速大交流电源、方便移动场合,具有低速大力矩等特点。如何用单片机控制直流电机。力矩等特点。如何用单片机控制直流电机。1.控制直流电机的工作原理控制直流电机的工作原理 对直流电机可精确控制其对直流电机可精确控制其旋转速度旋转速度或或转矩转矩,通过两个磁场,通过两个磁场相互作用产生旋转。结构相互作用产生旋转。结构见见图图12-3(a),定子装设一对直流,定子装设一对直流励磁的静止主磁极励磁的静止主磁极N和和S,在转子上装设电枢铁心。定子与转子,在转子上装设电枢铁心。定子与转子间有一气
10、隙。在电枢铁心上放置了由两根导体连成的电枢线圈,间有一气隙。在电枢铁心上放置了由两根导体连成的电枢线圈,线圈首端和末端分别连到两个圆弧形铜片上,此铜片称为线圈首端和末端分别连到两个圆弧形铜片上,此铜片称为换向换向片片。由换向片构成的整体称为换向器。由换向片构成的整体称为换向器。11 换向器固定在转轴上,换向片与转轴间互相绝缘。在换向换向器固定在转轴上,换向片与转轴间互相绝缘。在换向片上放置一对固定不动的电刷片上放置一对固定不动的电刷B1B1和和B2B2,当电枢旋转时,电枢,当电枢旋转时,电枢线圈通过换向片和电刷与外电路接通。线圈通过换向片和电刷与外电路接通。定子通过永磁体或受激励电磁铁产生一固
11、定磁场,由于转定子通过永磁体或受激励电磁铁产生一固定磁场,由于转子由一系列电磁体构成,当电流通过其中一个绕组时会产生子由一系列电磁体构成,当电流通过其中一个绕组时会产生一个磁场。一个磁场。对有刷直流电机,转子上换向器和定子电刷在电机旋转时对有刷直流电机,转子上换向器和定子电刷在电机旋转时为每个绕组供给电能。通电转子绕组与定子磁体有相反极性,为每个绕组供给电能。通电转子绕组与定子磁体有相反极性,因而相互吸引,使转子转动至与定子磁场对准的位置。当转因而相互吸引,使转子转动至与定子磁场对准的位置。当转子到达对准位置时,电刷通过换向器为下一组绕组供电,从子到达对准位置时,电刷通过换向器为下一组绕组供电
12、,从而使转子维持旋转运动而使转子维持旋转运动,见,见图图12-312-3(b b)。12(a a)有刷直流电机结构示意图)有刷直流电机结构示意图(i i)导体)导体adad处于处于N N极下极下 (iiii)导体)导体adad处于处于S S极下极下(b b)有刷直流电机工作示意图)有刷直流电机工作示意图图图12-312-3 直流电机工作示意图直流电机工作示意图 13 直流电机直流电机转速转速与施加与施加电压电压成正比,成正比,转矩转矩与与电流电流成正比。成正比。由于必须在工作期间改变直流电机的速度,直流电机控制是由于必须在工作期间改变直流电机的速度,直流电机控制是一较困难问题。直流电机高效运行
13、的常见方法是施加一个一较困难问题。直流电机高效运行的常见方法是施加一个 PWMPWM(脉宽调制)脉冲波,其占空比对应于所需速度。(脉宽调制)脉冲波,其占空比对应于所需速度。电机电机起到了一个低通滤波器作用,起到了一个低通滤波器作用,PWMPWM信号相对容易产生,这种信号相对容易产生,这种驱动方式使用更为广泛。驱动方式使用更为广泛。2.电路设计与编程电路设计与编程 【例【例12-212-2】原理电路原理电路见见图图12-412-4。使用单片机两个。使用单片机两个I/OI/O脚控制脚控制直流电机转速和旋转方向。其中直流电机转速和旋转方向。其中P3.7P3.7脚脚输出输出PWMPWM信号控制直流信号
14、控制直流电机转速;电机转速;P3.6P3.6脚脚控制直流电机旋转方向。控制直流电机旋转方向。14图图12-412-4 单片机控制直流电机的接口电路单片机控制直流电机的接口电路 当当P3.6=1P3.6=1时,时,P3.7P3.7发送发送PWMPWM波,直流电机正转。且可通过波,直流电机正转。且可通过“INCINC”和和“DECDEC”两个按键来增大和减少直流电机转速。反两个按键来增大和减少直流电机转速。反之,之,P3.6=0P3.6=0时,时,P3.7P3.7发送发送PWMPWM信号,直流电机反转。信号,直流电机反转。因此,增大和减小电机转速,实际上是通过按下因此,增大和减小电机转速,实际上是
15、通过按下 “INCINC”或或“DECDEC”按键来改变输出按键来改变输出PWMPWM信号占空比,控制直流信号占空比,控制直流电机转速。图电机转速。图12-412-4中驱动电路使用了中驱动电路使用了NPNNPN低频、低噪声小功率低频、低噪声小功率达林顿管达林顿管 2SC2547 2SC2547。参考程序如下:参考程序如下:1516#include reg51.h#include reg51.h#include#include intrins.hintrins.h#define#define ucharuchar unsigned char unsigned char#define#define
16、 uintuint unsigned unsigned intint sbitsbit INC=P34;INC=P34;sbitsbit DEC=P35;DEC=P35;sbitsbit DIR=P36;DIR=P36;sbitsbit PWM=P37;PWM=P37;void void delay(uintdelay(uint););intint PWM=900;PWM=900;void void main(voidmain(void)DIR=1;DIR=1;while(1)while(1)if(!INCif(!INC)PWM=PWM=PWMPWM0?PWM-1:0;/0?PWM-1:0;/
17、如果如果PWM0PWM0,则,则PWM=PWM-1PWM=PWM-1;否则;否则PWM=0PWM=01712.3 频率计的制作频率计的制作1.工作原理工作原理 利用单片机定时器利用单片机定时器/计数器可实现信号频率测量。频率测量计数器可实现信号频率测量。频率测量有有测频法测频法和和测周法测周法两种。两种。测频法测频法利用外部电平变化引发的外利用外部电平变化引发的外部中断,测算部中断,测算1s内出现的次数,从而实现对频率测内出现的次数,从而实现对频率测量量;测周测周法法是通过测算某两次电平变化引发的中断间的时间,再求倒是通过测算某两次电平变化引发的中断间的时间,再求倒数,从而实现对频率测定。总之
18、,测频法是直接根据定义来数,从而实现对频率测定。总之,测频法是直接根据定义来测定频率,测周法是通过测定周期间接测定频率。理论上,测定频率,测周法是通过测定周期间接测定频率。理论上,测频法适于较高频率测量,测周法适于较低频率测量。本例测频法适于较高频率测量,测周法适于较低频率测量。本例采用测频法。采用测频法。2.电路设计与软件编程电路设计与软件编程【例【例12-3】设计以单片机为核心的频率测量装置,测量加在设计以单片机为核心的频率测量装置,测量加在P3.4脚上数字时钟信号频率,并在外部扩展的脚上数字时钟信号频率,并在外部扩展的6位位LED数码管上显示数码管上显示测量频率值。原理电路与仿真测量频率
19、值。原理电路与仿真见见图图12-5。本频率计测量的信号由数字时钟源本频率计测量的信号由数字时钟源“DCLOCK”产生,在电产生,在电路中添加数字时钟源的具体操作与设置路中添加数字时钟源的具体操作与设置Proteus的使用说明的使用说明。手。手动改变被测时钟信号源频率,观察是否与动改变被测时钟信号源频率,观察是否与LED数码管上显示的测数码管上显示的测量结果相同。量结果相同。19图图12-5 频率计原理电路与仿真频率计原理电路与仿真20参考程序如下。参考程序如下。#include#includesfr16 DPTR=0 x82;sfr16 DPTR=0 x82;/定义寄存器定义寄存器DPTRDP
20、TRunsigned char cnt_t0,cnt_t1,qian,bai,shi,ge,bb,wan,shiwan;unsigned char cnt_t0,cnt_t1,qian,bai,shi,ge,bb,wan,shiwan;unsigned long freq;unsigned long freq;/定义频率定义频率unsigned char code table=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,unsigned char code table=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0
21、 x07,0 x7f,0 x6f,0 x77,0 x7c,0 x39,0 x5e,0 x79,0 x71;0 x07,0 x7f,0 x6f,0 x77,0 x7c,0 x39,0 x5e,0 x79,0 x71;/共阴数码管段码表共阴数码管段码表void delay_1ms(unsigned void delay_1ms(unsigned intint z)z)/函数功能:延时约函数功能:延时约1ms1ms unsigned char unsigned char i,ji,j;for(ifor(i=0;i=0;iz;iz;i+)+)for(jfor(j=0;j110;j+);=0;j110;
22、j+);21void init()void init()/函数功能:定时器函数功能:定时器/计数器及中断系统初始化计数器及中断系统初始化 freq=0;freq=0;/频率赋初值频率赋初值cnt_t1=0;cnt_t1=0;cnt_t0=0;cnt_t0=0;IE=0 x8a;IE=0 x8a;/开中断,开中断,T0T0,T1T1中断中断TMOD=0 x15;TMOD=0 x15;/T0/T0为定时器方式为定时器方式1 1,T1T1为计数器于方式为计数器于方式1 1TH1=0 x3c;TH1=0 x3c;/T1/T1定时定时50ms50msTL1=0 xb0;TL1=0 xb0;TR1=1;T
23、R1=1;/开启定时器开启定时器T1T1TH0=0;TH0=0;/T0/T0清清0 0TL0=0;TL0=0;TR0=1;TR0=1;/开启定时器开启定时器T0T0 void void display(unsigneddisplay(unsigned long long freq_numfreq_num)/)/函数功能:驱动数码管显示函数功能:驱动数码管显示 shiwanshiwan=freq_num%1000000/100000;=freq_num%1000000/100000;wan=freq_num%100000/10000;wan=freq_num%100000/10000;22qia
24、nqian=freq_num%10000/1000;=freq_num%10000/1000;/显示千位显示千位baibai=freq_num%1000/100;=freq_num%1000/100;/显示百位显示百位shi=freq_num%100/10;shi=freq_num%100/10;/显示十位显示十位gege=freq_num%10;=freq_num%10;/显示个位显示个位P0=0 xdf;P0=0 xdf;/P0/P0口是位选口是位选P2=P2=tableshiwantableshiwan;/显示十万位显示十万位delay_1ms(5);delay_1ms(5);P0=0
25、xef;P0=0 xef;P2=P2=tablewantablewan;/显示万位显示万位delay_1ms(3);delay_1ms(3);P0=0 xf7;P0=0 xf7;P2=P2=tableqiantableqian;/显示千位显示千位delay_1ms(3);delay_1ms(3);23P0=0 xfb;P0=0 xfb;P2=P2=tablebaitablebai;/显示百位显示百位delay_1ms(3);delay_1ms(3);P0=0 xfd;P0=0 xfd;P2=P2=tableshitableshi;/显示十位显示十位delay_1ms(3);delay_1ms(
26、3);P0=0 xfe;P0=0 xfe;P2=P2=tablegetablege;/显示个位显示个位delay_1ms(3);delay_1ms(3);void main()void main()/主函数主函数 P0=0 xff;P0=0 xff;/初始化初始化P0P0口口init();init();/计数器初始化计数器初始化while(1)while(1)if(cnt_t1=19)if(cnt_t1=19)/定时定时1s1s 24cnt_t1=0;cnt_t1=0;/定时完成后清定时完成后清0 0 TR1=0;TR1=0;/关闭关闭T1T1定时器,定时定时器,定时1S1S完成完成delay
27、_1ms(141);delay_1ms(141);/延时较正误差延时较正误差,通过实验获得通过实验获得TR0=0;TR0=0;/关闭关闭T0T0DPL=TH00;DPL=TH00;/利用利用DPTRDPTR读入其值读入其值DPH=TH0;DPH=TH0;freq=cnt_t0freq=cnt_t0*65535;65535;freq=freq=freq+DPTRfreq+DPTR;/计数值放入变量计数值放入变量 display(freqdisplay(freq););/调用显示函数调用显示函数 void t1_func()interrupt 3void t1_func()interrupt 3/
28、定时器定时器T1T1的中断函数的中断函数 TH1=0 x3c;TH1=0 x3c;TL1=0 xb0;TL1=0 xb0;cnt_t1+;cnt_t1+;25void t0_func()interrupt 1void t0_func()interrupt 1/定时器定时器T0T0的中断函数的中断函数 cnt_t0+;cnt_t0+;12.4 12.4 电话电话机机拨号的模拟拨号的模拟1.1.设计要求设计要求 设计模拟电话拨号时的状况,把模拟电话键盘拨出的某一设计模拟电话拨号时的状况,把模拟电话键盘拨出的某一电话号码,显示在电话号码,显示在LCDLCD显示屏上。电话键盘除了显示屏上。电话键盘除了
29、0 09 9的的1010个数个数字键外,还有字键外,还有“*”键键用于实现删除功能,即删除一位最后用于实现删除功能,即删除一位最后26输入的号码;输入的号码;“#”键用于清除显示屏上所有的数字显示。此键用于清除显示屏上所有的数字显示。此外还要求每按下一个键,发出声响,表示按下该键。还有外还要求每按下一个键,发出声响,表示按下该键。还有LCD显示器,显示所拨的电话号码。显示器,显示所拨的电话号码。2.电路设计与编程电路设计与编程【例例12-412-4】设计一模拟电话拨号时的电话键盘及显示装置,设计一模拟电话拨号时的电话键盘及显示装置,把电话键盘拨出的电话号码及其他信息,显示在把电话键盘拨出的电话
30、号码及其他信息,显示在LCDLCD显示屏上。显示屏上。电话键盘共电话键盘共1212个键,除了个键,除了0 09 9的的1010个数字键个数字键外,还有外,还有“*”键键用于删除最后输入的用于删除最后输入的1位号码的功能;位号码的功能;“#”键用于清除显示键用于清除显示屏上屏上27所有的数字显示。所有的数字显示。此外还要求每按下一个键,蜂鸣器要发出此外还要求每按下一个键,蜂鸣器要发出声响,以表示按下该键。显示信息声响,以表示按下该键。显示信息共共2行行,第第1行行为设计者信为设计者信息,息,第第2行行显示所拨的电话号码。显示所拨的电话号码。本例的电话拨号键盘采用本例的电话拨号键盘采用4 43 3
31、矩阵键盘,共矩阵键盘,共1212个键。拨号个键。拨号号码显示采用号码显示采用LCD 1602 LCD 1602 液晶显示模块。因此涉及了单片机与液晶显示模块。因此涉及了单片机与4 43 3矩阵式键盘以及与矩阵式键盘以及与16162 2的液晶显示屏的接口设计,还有的液晶显示屏的接口设计,还有各种驱动程序的编制。液晶显示屏采用各种驱动程序的编制。液晶显示屏采用LCD1602(LCD1602(即即ProteusProteus中的中的LM016L)LM016L)。本设计原理电路及仿真见本设计原理电路及仿真见图图12-6。28图图12-1012-10 电话拨号的模拟电话拨号的模拟29参考程序如下。参考程
32、序如下。#include#include#define#define uintuint unsigned unsigned intint#define#define ucharuchar unsigned char unsigned charucharuchar keycode,DDram_valuekeycode,DDram_value=0 xc0;=0 xc0;sbitsbit rsrs=P20;=P20;sbitsbit rwrw=P21;=P21;sbitsbit e=P22;e=P22;sbitsbit speaker=P23;speaker=P23;ucharuchar code
33、table=0 x30,0 x31,0 x32,0 x33,0 x34,code table=0 x30,0 x31,0 x32,0 x33,0 x34,0 x35,0 x36,0 x37,0 x38,0 x39,0 x20;0 x35,0 x36,0 x37,0 x38,0 x39,0 x20;ucharuchar code code table_designertable_designer=HIT ZYG Design;=HIT ZYG Design;/第第1 1行显示设计者信息行显示设计者信息30void void lcd_delaylcd_delay();();void void de
34、lay(uintdelay(uint n);n);void void lcd_init(voidlcd_init(void););void void lcd_busy(voidlcd_busy(void););void void lcd_wr_con(ucharlcd_wr_con(uchar c);c);void void lcd_wr_data(ucharlcd_wr_data(uchar d);d);ucharuchar checkkey(voidcheckkey(void););ucharuchar keyscan(voidkeyscan(void););void main()void
35、 main()ucharuchar num;num;lcd_initlcd_init();();lcd_wr_con(0 x80);lcd_wr_con(0 x80);31for(numfor(num=0;num=14;num+)=0;num=0)&(keycode=0)&(keycode=9)lcd_wr_con(0 x06);lcd_wr_con(0 x06);lcd_wr_con(DDram_valuelcd_wr_con(DDram_value););lcd_wr_data(tablekeycodelcd_wr_data(tablekeycode););DDram_valueDDram
36、_value+;+;32 else else if(keycodeif(keycode=0 x0b)=0 x0b)ucharuchar i,ji,j;j=0 xc0;j=0 xc0;for(ifor(i=0;i=15;i+)=0;i=15;i+)lcd_wr_con(jlcd_wr_con(j););lcd_wr_data(table10);lcd_wr_data(table10);void void lcd_delaylcd_delay()()/函数功能:液晶显示延时函数功能:液晶显示延时 ucharuchar y;y;for(yfor(y=0;y0 xff;y+)=0;y0;i-)=50;
37、i0;i-)for(jfor(j=n;jn;j0;j-);0;j-);ucharuchar checkkey(voidcheckkey(void)/函数功能:检测键有无按下函数功能:检测键有无按下 ucharuchar temp;temp;P1=0 xf0;P1=0 xf0;temp=P1;temp=P1;38temp=temp&0 xf0;temp=temp&0 xf0;if(tempif(temp=0 xf0)=0 xf0)return(0);return(0);elseelse return(1);return(1);ucharuchar keyscan(voidkeyscan(void
38、)/函数功能:键盘扫描并返回所按下的键盘号函数功能:键盘扫描并返回所按下的键盘号 ucharuchar hanghao,liehao,keyvalue,buffhanghao,liehao,keyvalue,buff;if(checkkeyif(checkkey()=0)()=0)39 return(0 xff);return(0 xff);/无键按下,返回无键按下,返回0 xff0 xff else else/无键按下,返回无键按下,返回0 xff0 xff ucharuchar sound;sound;for(soundfor(sound=50;sound0;sound-)=50;soun
39、d0;sound-)speaker=0;speaker=0;delay(1);delay(1);speaker=1;speaker=1;delay(1);delay(1);P1=0 x0f;P1=0 x0f;40 buff=P1;buff=P1;if(buffif(buff=0 x0e)=0 x0e)hanghaohanghao=0;=0;else else if(buffif(buff=0 x0d)=0 x0d)hanghaohanghao=3;=3;else else if(buffif(buff=0 x0b)=0 x0b)hanghaohanghao=6;=6;41 else else
40、if(buffif(buff=0 x07)=0 x07)hanghaohanghao=9;=9;P1=0 xf0;P1=0 xf0;buff=P1;buff=P1;if(buffif(buff=0 xe0)=0 xe0)liehaoliehao=2;=2;else else if(buffif(buff=0 xd0)=0 xd0)liehaoliehao=1;=1;42 else else if(buffif(buff=0 xb0)=0 xb0)liehaoliehao=0;=0;keyvaluekeyvalue=hanghao+liehaohanghao+liehao;while(P1!=0
41、 xf0);while(P1!=0 xf0);return(keyvaluereturn(keyvalue););4312.5 812.5 8位竞赛抢答器设计位竞赛抢答器设计 目前,各类竞赛中大多用到竞赛抢答器,以单片机为核心配目前,各类竞赛中大多用到竞赛抢答器,以单片机为核心配上抢答按钮开关以及数码管显示器并结合编写的软件,很容易制上抢答按钮开关以及数码管显示器并结合编写的软件,很容易制作一个竞赛抢答器,且修改方便。作一个竞赛抢答器,且修改方便。1.1.设计要求设计要求 设计一个以单片机为核心设计一个以单片机为核心8 8位竞赛抢答器,要求如下:位竞赛抢答器,要求如下:(1 1)抢答器同时供)
42、抢答器同时供8 8名选手或名选手或8 8个代表队比赛,分别用个代表队比赛,分别用8 8个按个按钮钮S0S0S7S7表示。表示。(2 2)设置一个系统清除和抢答控制开关)设置一个系统清除和抢答控制开关S S,该开关由主持人,该开关由主持人控制。控制。(3 3)抢答器具有锁存与显示功能。即选手按动按钮,锁存相)抢答器具有锁存与显示功能。即选手按动按钮,锁存相应的编号,且优先抢答选手的编号一直保持到主持人将系统应的编号,且优先抢答选手的编号一直保持到主持人将系统清除为止。清除为止。(4)抢答器具有定时抢答功能,且一次抢答时间由主持人设)抢答器具有定时抢答功能,且一次抢答时间由主持人设定(如定(如30
43、秒)。当主持人启动秒)。当主持人启动“开始开始”键后,定时器进行减键后,定时器进行减计时,同时扬声器发出短暂声响,声响持续时间为计时,同时扬声器发出短暂声响,声响持续时间为0.5s左右。左右。(5)参赛选手在设定的时间内进行抢答,抢答有效,定时器)参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答剩余时间,并保停止工作,显示器上显示选手的编号和抢答剩余时间,并保持到主持人将系统清除为止。持到主持人将系统清除为止。45 (6 6)如定时时间已到,无人抢答,本次抢答无效,系统报警)如定时时间已到,无人抢答,本次抢答无效,系统报警并禁止抢答,定时显示器上显示并禁止
44、抢答,定时显示器上显示0000。通过键盘改变可抢答时间,可把定时时间变量设为全局变量,通过键盘改变可抢答时间,可把定时时间变量设为全局变量,通过键盘扫描程序使每按下一次按键,时间加通过键盘扫描程序使每按下一次按键,时间加1(超过(超过30时置时置0)。同时单片机不断进行按键扫描,当参赛选手的按键按下时,)。同时单片机不断进行按键扫描,当参赛选手的按键按下时,用于产生时钟信号的定时计数器停止计数,同时将选手编号(按用于产生时钟信号的定时计数器停止计数,同时将选手编号(按键号)和抢答时间分别显示在键号)和抢答时间分别显示在LED上。上。2.电路设计与仿真电路设计与仿真 【12-5】8位竞赛抢答器的
45、原理电路与仿真见位竞赛抢答器的原理电路与仿真见图图12-7。晶振频。晶振频率为率为12MHz。图中为剩余。图中为剩余18秒时,秒时,7号选手抢答成功。号选手抢答成功。46 图中图中MAX7219MAX7219是一串行接收数据的动态扫描显示驱动器。是一串行接收数据的动态扫描显示驱动器。MAX7219MAX7219驱动驱动8 8位以下位以下LEDLED显示器时,它的显示器时,它的DINDIN、LOADLOAD、CLKCLK端分端分别与单片机三条口线别与单片机三条口线(P3.0(P3.0 P3.2)P3.2)相连。相连。MAX7219MAX7219采用采用1616位数据串行移位接收方式,即单片机将位
46、数据串行移位接收方式,即单片机将16 16 位二进制数逐位发送到位二进制数逐位发送到DINDIN端,在端,在CLKCLK的每个上升沿将一位数的每个上升沿将一位数据移入据移入MAX7219 MAX7219 内移位寄存器,当内移位寄存器,当16 16 位数据移入完后,在位数据移入完后,在LOADLOAD脚信号上升沿将脚信号上升沿将16 16 位数据装入位数据装入MAX7219MAX7219内相应位置,能内相应位置,能对送入的数据进行对送入的数据进行BCDBCD译码并显示。本例对译码并显示。本例对MAX7219MAX7219进行相应进行相应的初始化设置,具体请查阅有关的初始化设置,具体请查阅有关MA
47、X7219MAX7219技术资料。技术资料。47 图图12-712-7 8 8位竞赛抢答器原理电路与仿真位竞赛抢答器原理电路与仿真48参考程序如下:参考程序如下:#include#includesbitsbit DIN=P30;DIN=P30;/与与max7219max7219接口定义接口定义sbitsbit LOAD=P31;LOAD=P31;sbitsbit CLK=P32;CLK=P32;sbitsbit key0=P10;key0=P10;/8/8路抢答器按键路抢答器按键sbitsbit key1=P11;key1=P11;sbitsbit key2=P12;key2=P12;sbit
48、sbit key3=P13;key3=P13;sbitsbit key4=P14;key4=P14;sbitsbit key5=P15;key5=P15;sbitsbit key6=P16;key6=P16;sbitsbit key7=P17;key7=P17;sbitsbit key_clearkey_clear=P20;=P20;/主持人时间设置、清除主持人时间设置、清除sbitsbit begin=P21;begin=P21;/主持人开始按键主持人开始按键49sbitsbit sounder=P37;sounder=P37;/蜂鸣器蜂鸣器unsigned char second=30;u
49、nsigned char second=30;/秒表计数值秒表计数值unsigned char counter=0;unsigned char counter=0;/counter/counter每每100100,miniteminite加加1 1unsigned char people=0;unsigned char people=0;/抢答结果抢答结果unsigned charunsigned charnum_addnum_add=0 x01,0 x02,0 x03,0 x04,0 x05,0 x06,0 x07,0 x08;=0 x01,0 x02,0 x03,0 x04,0 x05,0
50、 x06,0 x07,0 x08;/max7219 /max7219读写地址、内容读写地址、内容unsigned char unsigned char num_datnum_dat=0 x80,0 x81,0 x82,0 x83,0 x84,0 x85,0 x86,0 x87,0 x88,0 x89;=0 x80,0 x81,0 x82,0 x83,0 x84,0 x85,0 x86,0 x87,0 x88,0 x89;unsigned char unsigned char keyscankeyscan()/()/键盘扫描函数键盘扫描函数 unsigned char unsigned char