单片机开发工程案例分析与解析_第1页
单片机开发工程案例分析与解析_第2页
单片机开发工程案例分析与解析_第3页
单片机开发工程案例分析与解析_第4页
单片机开发工程案例分析与解析_第5页
免费预览已结束,剩余50页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、单片机开发工程案例分析与解析3. 1定时报警器设计一个单片机控制的简易定时报警器。要求根据设定的初始值(1-59秒)进行倒计时,当计时到0时数码管闪烁“ 00”(以IHz闪烁),按键功能如下:键无效。(1)设定键:(2)增一键:(3)递一键:(4)确认键:在倒计时模式时,按下此键后停止倒计时,进入设置状态;如果已经处于设置在设置状态时,在设置状态时,在设置状态时,如果已经处于计时状态则此键无效。3. 1.2模块1:系统设计(1)任务分析与整体设计思路状态则此每按一次递增键,初始值的数字增每按一次递减键,初始值的数字减按下此键后,单片机按照新的初始值进行倒计时及显示倒计时的数字。根据题冃的要求,

2、需要实现如下几个方面的功能。计时功能:要实现计时功能则需要使用定时器来计时,通过设置定时器的初始值来控制溢出屮断的时间间隔,再利用一个变量记录定时器溢出的次数,达到定时1秒中的功能。然后,当计时每到1秒钟后,倒计时的讣数器减1。当倒计时计数器到0时,触发另一个标志变量,进入闪烁状态。显示功能:显示倒计时的数字要采用动态扫描的方式将数字拆成“十位”和“个位”动态扫描显示。如果处于闪烁状态,则可以不需要动态扫描显示,只需要控制共阴极数码管的位控线,实现 数码管的灭和亮。键盘扫描和运行模式的切换:主程序在初始化一些变量和寄存器Z后,需要不断循环地读取键盘的状态和动态扫描数码管显示相应的数字。根据键盘

3、的按键值实现设置状态、计时状态的切换。(2)单片机型号及所需外围器件型号,单片机硬件电路原理图选用MCS-51系列AT89S51单片机作为微控制器,选择两个四联的共阴极数码管组成8位显示模块,由于AT89S51单片机驱动能力有限,采用两片74HC244实现总线的驱动,一个74HC244完成位控线的控制和驱动,另一个74HC244完成数码管的7段码输出,在输出口上各串联一个100欧姆 的电阻对7段数码管限流。由于键盘数量不多,选择独立式按键与P1 口连接作为四个按键输入。没有键按下时P1. 0-P1. 3为高电平,当有键按下时,P1.0-P1.3相应管脚为低电平。电路原理图如图3-1所示。USV

4、CCKEY1R5 lOKR12 lOK八15VCC31PIOT PUT P12P13P14P15P16PITIXT1INTOT1TOEA VPPOOPOlP02P03POlP05poePO"39 LED_A35 LED_537 LED C36 LED D35 LED ELED C 6LED D 3U3lAl1A21A3lAl1313"lYl1Y2iY3lYl31 LED.F : 33 LED_G 夕LED E 112A12Y1t/C2 ICAP19ISP20P21P22PyP21P25P26P2721 LED JO22 LED JI f23 LED J224 LED J32

5、5 LED J l、26 LED J527 LED_J6523 LED pZS9LED_Aly nS.叹 k LED 朗1 10 q 叹8LED DI ULED_E1 12 LED” LEDjn TT LED Fl> C 9 .B揺切;Al 2.ALED15CU6COM1EC7L COMl5L COM 'IL COI3IL COM)3U4lAl1A21A3 lAllYl1Y21Y3lYlRST 9RESET1716S9S52Med_j4ii 7eD 513 patois.FXDTXDALE PPSE18 L_C616 L_COM14 L_CQy312 L_CO 呱2A12A22A

6、32A42Y12Y22Y32Y19 L-C0X57 L.8 沖5 LlCOT"LED JU 10 LED_C1_S LE“1 J LED_E1 12 LED_D H " LED_a_9_L£D BI6LED Al 2CONICOM2COM3COMI"L COM5L COMIL C0I7IIL COM1G2GHC211LED15C图3-1定时报警器电路原理图(3)程序设计思路,单片机资源分配以及程序流程 单片机资源分配采用单片机的P3 口作为按键的输入,使用独立式按键与P3. 0-P3. 3连接,构成四个功能按键。在计时功能屮,需要三个变量分别暂存定时器溢

7、出的次数(Tl_cnt )、倒计时的初始值(init_val )以及当前倒计时的秒数(cnt_val ) o按键扫描功能屮,需要两个变量,一个变量( key_val_new )用来存储当前扫描的键值(若无 按键按下则为255),另一个变量(key_val_old )用来存储上一次扫描的键值。只有这两个变量值 不一样时,才能说明是一次新的按键按下或弹起了,同时将新的键值赋给key_val_old变量。在显示功能屮,需要定义一组数组(code类型),值为0-9数字对应的数码管7段码。还需要定义一个变 量(show_val)暂存要显示的数据,用于动态扫描显示屮。在整个程序中,定义了一个状态变量(st

8、ate.val )用来存储当前单片机工作在哪种状态。 程序设计思路鉴于题目要求,存在三种工作模式:初始值设置模式、倒计时模式、计时到0时的闪烁模式。变量state_val为0时,处于倒计时模式。变量state_val为1时,处于初始值设置模式。变量state.val为2时,处于闪烁模式。这些状态的切换取决于按下哪一个键以及是否计时到0。状态的切换图如图3-2递增键/; state val=1 W减键/按K 设罔键按下 确认键/、;State_val=O *订破倒讣数减到0z按下 确认键val=2 1闪拣;V 7按卜设B键图3-2状态的切换单片机复位Z后,默认处于倒计时模式,启动定时器,定时器每

9、隔250US溢出一次,根据定时器溢出次数来计时,至IJ 1秒时将时间的计数器减lo当“设置键”按下时,变量state.val由0变 为1,切换到设置模式。可以使用“递增键”“递减键”对计时初始值进行修改。按下“确认键”时,回到计时模式开始以新的初始值进行倒计时。当倒计时到 0时,变量state.val由1变为2,处于 闪烁状态,在这种状态下,根据按键的情况分别又切换到计时和设置状态。程序流程主程序首先需要初始化定时器的参数和一些变量,然后进入一个循环结构,在循环屮始终只做两件事, 一是键盘的扫描,二是数码管的动态扫描。在扫描键盘后,根据前一次按键的结果是否与本次键值相同。如果不同,表示有键按下

10、或弹起,同时用本次按键值更新上一次的按键值。这样设计旨在避免一个按键长时间按下时被重复判为有新键按下,使 得当前按下的键只有松开后,下一次按下时才算为一次新的按键。根据按键的值分别改变变量(state.val )的值或者在设置状态时的倒计时初始值。完整的主 程序图如图3-3所示。丕1疔rMianO /初姐化变呆 和定时器扫描按键丄 Li"*Key_n ew=Key二Key_old=Key_new7呆存键彳Fnew=T?-rJy -<Key_new=2"?> N设笛欖式关定时器设模式初始值-1 r Y.二设肾初始4也+1Key_new=47;;:r开定时器<

11、Xeylnew=3?;7:动态和描图3-3主程序的流程图在定时器的参数屮,选择定时器T1的8位自动装载模式,每 250US产生一次溢出中断,屮断服务程序如图3-4所示。图;-4屮断服务g序流齒4)软硬件调试方案软件调试方案:伟福软件中,在“文件 新建文件”中,新建C语言源程序文件,编写相应的程序。在“文件新建项目”的菜单中,新建项目并将C语言源程序文件包括在项目文件中。在“项目编译”菜单屮将C源文件编译,检查语法错误及逻辑错误。在编译成功后,产生*.bin ”后缀的目标文件。硬件调试方案:在设计平台屮,将单片机的P3. 0-P3. 3分别与独立式键盘的相应位通过插线 连接起来。在伟福中将程序文

12、件编译成目标文件后,运行MCUT载程序,选择相应的flash数据文件,/ 晶振:11.0592M/*变量的定义:show_val:init_val:state_val:shan_val:显不的值0-59初始值状态值0-计数状态;1-设置状态;2-闪烁状态Tl_cnt:cnt_val:led_seg_code :四个按键的值255-无键;1-设置键2-增一键3-减一键4-确定键 定时器计数溢出数倒计时的数值数码管段码*/include regSl. h"包含文件sbitApi_o=pro;设置键sbitPl_仁 P1A1;增一键sbitP1_2=P1A2;sbitP1_3=P1A3;减

13、一键确定键unsignedchar datashan_val;闪烁时LED的开/关状态unsignedchar datacnt_val; /unsignedint data Tl_cnt; /unsignedchardatakey_val_new, key_保存倒计数的当前值保存定时器溢出次数存放当前扫描的键和前一次按下的键值unsignedchardatastate_val; /unsignedchardatashow_val; /unsigned char code led_seg.延时- while(i) :按键扫描chardataval old:/状态值存放需要在数码管显示的数字暂存倒

14、计数的初始值init_val: /:_code 10 = 0x3f, 0x06, 0x05b, 0x04f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f;/void delay (unsigned int i) /大约延时i*2个微秒unsigned char scan_key() unsigned char i;点击“编程”按钮,将程序文件下载到单片机的Flash屮。然后,上电重新启动单片机,检查所编写的程序是否达到题目的要求,是否全面完整地完成试题的内 容。3.1,3程序设计(仅供参考的C语言源程序)T1-250 微秒按键 P10 P11 P12 P13i=Pl&

15、amp;0x0f:delay (100) ; / 延时,去抖动 if (i=(Pl&0x0f) if (Pl_0=0) 1=1: else辻(Pl_l=0) i=2;else辻(P1_2h0) i二3;else if (Pl_3=0)else i=255; return i;/数码管显示V)void led_show(unsigned int/unsigned char i;辻1 I i=v%10;P0=led_seg_code i ; /P2=0xfe;动态扫描取要显示的数的个位转换为7段码显示个位delay (15);/i=v%100/10:P0=led_seg_code i ;

16、/P2=0xfd; delay (5);/延时取十位转换为7段码显示十位延时处于闪烁状态else PO=led_seg_code0: /if (shan_val) P2=0xff: /将数码管的关闭else P2=0x£c: /将数码管的打开void timerl () interrupt 3 /Tl 屮断,250us 屮断一次/定时器Tl屮断服务程序 Tl_cnt+:switch (state_val)case 0: if(Tl_cnt>3999) / Tl_cnt=0; if(cnt_val!=0) cnt_val: else state_val=2: /show val=

17、cnt val;如果计数3999,计时Is break;case 2:if(Tl_cnt>1999) / Tl_cnt=0; shan_val=!shan_val; / "如果计数1999,计时0.5s闪烁状态break;定时计数到0时,切换状态mainO/主程序init_val=59: / 初始化各变量 cnt_val=init_val;show val=cnt val: state_val=O;key_val_old=255;Tl_cnt=0;shan_val=0; /初始化51的寄存器TMOD二0x20; /用T1计时8位自动装载定时模式 微秒溢出一次;250= (256

18、-X)*12/11.0592 打开总中断允许开屮断允许开定时器T1THl=0xl9;/250-> x= 230,4 TLl=0xl9;EA=1;ET1=1;TR1=1;/wh订e仃) key_val_new=scan_key 0 : / 255 表不无键按下i f (key_val_new! =key_val_old)/只有当前扫描的键值与上次扫描的不同,才判断是有键按下 key_val_old=key_val_new; switch (key_val_new) case 1: /设置键state_val=l; / TR1=1; / show_val=init_val: / break;

19、case 2: if (state_val=l) /辻(init_val>0)/处于设置状态停止计时显示原来的倒计数初始值只有在设置状态,增1键才有用更改原来的倒计数初始值init_val; elseinit_val=59:show_val=init_val;/ break;显示更改后的倒计数初始值case 3: if (state_val=l) / if (init_val<59) /init_val+; elseinit_val=O;只有在设置状态,减1键才有用更改原来的倒计数初始值show_val=init_val; / break: case 4: if(state_val

20、!=0) / cnt_val=init_val; /显示更改后的计数初始值show_val=cnt_val; / TR1=1; / state_val=0; / break;led_show(show_val); /如果已处于计数模式,确认键不起作用将初始值赋给计数变量将计数变量的数字显示启动定时器T1将状态切换为计数模式动态扫描3. 2交通灯设计一个基于单片机的交通灯信号控制器。已知东、西、南、北四个方向各有红黄绿色三个灯,在东西方向有两个数码管,在南北方向也有两个数码管。要求交通灯按照表1进行显示和定时切换,并要求在 数码管上分别倒计时显示东西、南北方向各状态的剩余时间。表1交通灯的状态切

21、换表南北方向东西方向序号状态序号状态1绿灯亮25秒,红、黄灯灭1红灯亮30秒,绿、黄灯灭2黄灯亮5秒,红、绿灯灭3红灯亮30秒,绿、黄灯灭2绿灯亮25秒,红、黄灯灭3黄灯亮25秒,红、绿灯灭:回到状态1回到状态13.2.1模块1:系统设计(1) 任务分析与整体设计思路试题要求实现的功能主要包括计时功能、动态扫描以及状态的切换等几部分。计时功能:要实现计时功能则需要使用定时器来计时,通过设置定时器的初始值来控制溢出中断的时间间隔,再利用一个变量记录定时器溢出的次数,达到定时1秒屮的功能。当计时每到1秒钟后,东西、南北信号灯各状态的暂存剩余时间的变量减lo当暂存剩余时间的变量减到0时,切换到下一个

22、状态,同时将下一个状态的初始的倒计时值装载到计时变量屮。开始下一个状态,如此 循环重复 执行。动态扫描:需要使用4个数码管分别显示东西、南北的倒计时数字,将暂存各状态剩余时间的 数字从变量屮提取出“十位”和“个位”,用动态扫描的方式在数码管屮显示。整个程序依据定时器的溢出数来计时,每计时1S则相应状态的剩余时间减1, 一直减到0时触发下一个状态的开始。单片机硬件电路原理图VS(2)O 1 A* 5 ( S:P1nra非LEDS LED3t LEDa LED聲LCDLEDLEDLEDLED 'LEDLEDLEDLED10P5OP51抵? 石3£00 £00lAIiTl

23、leIjCLA5It* mItULIITI122n乂2T15TIKiR£ LOOriHC:IIITD紂LiD_riILZD_r;:12& J5s/ ILL!D_rS13Ifi'LCDlK 1:LC.lAlU、 lAllAlLU2AI2XHail*严R» ICO1818m3TIsn2T32TIvccS34£5±:I (82URSTLE&jilLE5J1 1LE&_C1LE5_E1g Tig.cxI'l-L ecu $L CCH LLiDJIlJ 3:g3gi;a5; r ig5:igI:210LOq 8an$LED1

24、:.gu-UD9LSDili.gA、LCISCKU:CK Iecu£ L CCOttecuecu1 L-CCBI 1ecuLC&LSCKteyen 87vcc T图3-5交通灯硬件电路原理图选用MCS5係列ATS9S51单片机作为微控制器,选择两个四联的共阴极数码管组成块,由于AT89S51单片机驱动能力有限,采用两片74HC244实现总线的驱动,一个s位显示模74HC244完成共阴极数码管位控线的控制和驱动,另一个74HC244完成数码管的7段码输出,在7段码输出口上各串联一个100欧姆的电阻对7段数码管限流。用P3 口的P3, 0-P3. 5完成发光二极管的控制,实现交通

25、灯信号的显示,每个发光二极管串联500欧姆电阻起限流作用。硬件电路原理图如图3-5所示。(3)程序设计思路,单片机资源分配以及程序流程单片机资源分配 单片机P3 口的P3. 0-P3. 1引脚用作输出,控制发光二极管的显示。在计时模块屮,需要定义两个数组变量(init_sn3init_ew3)来存储东西、南北两个方向在不同状态屮倒计时的初始值,题目屮每个方向的交通灯共有3种显示状态,因此数组元素个数为3o还需要定义两个变量(cnt_sn, cnt_e鞭)暂存东西、南北两个方向的倒计时剩余时间。在状态的切换屮,为了明确当前处于哪种状态,东西、南北方向各设置一个状态变量(state_val_s n

26、, state_val_ew),当倒讣时的剩余时同到零时,状态变量增1,表示启动下一个状态,当该变量增到3时变为0,回到序号为1的状态。君程丿的思路设计屮,由于没有键盘功能,因此只涉及定时计数和动态扫描功能。主程序将变量初始化之 后,设置单片机定时器和屮断特殊功能寄存器的初始值,将定时器T1的工作方式设置为8位自动装载模式,定时器每隔250us产生一次溢出。在初始化变量与寄存器后,主程序进入一个循环结构,在循环中只做动态扫描的工作,根据东西、南北 两向的剩余时时间进行动态扫描显示。计时以及状态的切换通过定时器的屮断服务程序来实现,在中断服务程序中,每计时到一秒时,则各方向当前状态的剩余时间减1

27、, 一直减到0时触发下一个状态的开始,程序流程改变交通灯的指示。主程序MianO定时器中断T1溢出计数Tl_cnt+1初始化变量T1 ent<4000T1 cnt=0初始化定时器的相关寄存器南北方向倒计时ent sn=0 ?打开中断ystateJ'l_sn-=0ent sn=cnt snTstate val sn=动态扫描Y南北交通灯按序号1的状态显示东西状态 state val南北交通灯按序号2的状态显不南北交通灯 按序号3的 状态显示图3-7交通灯主程序流程图东西方向倒计时fr- ent ew=O ?ent ev=cnt ew1退岀中断东西交通灯按序 号1的状态显示东西交通灯

28、按序号2的状态显示东西交通灯 按序号3的状态显示图38屮断服务程序流程图4)软硬件调试方案软件调试方案:伟福软件屮,在“文件 新建文件”中,新建C语言源程序文件,编写相应的 程序。在“文件 新建项目”的菜单中,新建项目并将C语言源程序文件包括在项目文件屮。检查语法错误及逻辑错误。在编译成功后,产生在“项目编译”菜单屮将C源文件编译,以“ *hex ”和“ *bin "后缀的目标文件。硬件调试方案:在设计平台屮,将单片机的P3. 0-P3. 5分别与独立式键盘的相应位通过插线 连接起来。在伟福屮将程序文件编译成目标文件后,点击“编程”按钮,将程序文件下载到单片机的Flash屮。然后,上

29、电重新启动单片机,检查所编写的程序是否达到题目的要求,是否全面完整地完成试题的内 容。运行“ MCUF载程序”,选择相应的flash数据文件,3.2.2程序设计(仅供参考的C语言源程序)/晶振:11.0592M T1-250微秒溢出一次/*变量的定义:show val sn, show val ew:显不的值0-59state val sn, state val ew:定时器计数溢出数状态值南北方向0-绿灯亮;1-黄灯亮;2-红灯亮Tl_cnt:ent sn, ent ew:倒计时的数值倒计时led_seg_code :数码管7段码*/sbitsbitsbitsbitsbitsbitSN_gr

30、ee n=P3 2 ;/南北方向绿灯 SN_yellow=P3X ;/南北方向黄灯SN_red=P3"0 :/ 南北方向红灯 EW_gree 门二卩3人5 :/东西方向绿灯 EW_yellow=P3A4 :/东西方向黄灯EW_red=P3A3 ;/东西方向红灯unsigned char data cnt_sn, cnt_ew;unsigned int data Tl_cnt;unsigned char data state_val_sn, state_val_ew;char code led_seg_code10 = 0x3f, 0x06, 0x05b, 0x04f, 0x66>

31、; 0x6d, 0x7d, 0x07, 0x7f, 0x6f ; char code init_sn3 = 24,4, 29;char code init_ew3 = 29, 24, 4;延时/ void delay(unsigned int i)/ while(i); / void led_show(unsigned int u, unsigned int v) unsigned char i;i=u%10;/暂存个位P0=led_seg_codei;P2=0xbf;delay(100) ; / 延时 i二u%100/10; / 暂存十位 P0=led_ _seg_codei;P2=0x7f

32、;delay(100) ; /延时i二曲10; /暂存个位P0=led_seg_code i;P2=0xfe; delay(100) ; / 延时 i=v%100/10; / 暂存十位P0=led_seg_codei;P2=0xfd;delay (100) ; / 延时 >/Tl屮断void timerl() interrupt 3 Tl_cnt+;辻(Tl_cnt>3999) /如果计数3999,计时Is Tl_cnt=0;if (cnt_sn!=0) /南北方向计时 cnt_sn: else state_val_sn+;if (state_val_sn>2)state v

33、al sn=0;ent sn=init snstate val sn:switch (state_val_sn) /case 0: SN_green=0 ;/SN_yellow=l ;/SN_red=l ;/ break;根据状态值,刷新各信号灯的状态南北方向绿灯南北方向黄灯南北方向红灯case 1: SN_green=l ;/南北方向绿灯SN_ye11ow=0 ;/SN_red=l ;/南北方向黄灯南北方向红灯break;case 2;SN_green=l :/ 南北方向绿灯SN_ye 11 ow= 1 :/南北方向黄灯SN_red=0 ;/南北方向红灯break:if (cnt_ew!=0

34、) /东西方向计时else state_val_ew+;if (state_val_ew>2) state_val_ew=O; ent ew=init ewstate val ew:switch(state_val_ew) /case 0: EW_green=l ;/EW_yellow=l:/EW_red=O :/極g据状态值,刷新各信号灯的状态茶西方向绿灯东西方向黄灯东西方向红灯break;case 1: EVLgreen=O :/EW_yellow=l :/EW_red=l ;/东西方向绿灯东西方向黄灯东西方向红灯break:case 2: EVLgreen=1 ;/EW_yello

35、w=0 ;/7EW_red=l :/东西方向绿灯东西方向黄灯东西方向红灯break;/ mainOent ew=init ew0;/ 初始化各变量 cnt_sn=init_snO;Tl_cnt=O;state_val_sn=O; /启动后,默认工作在序号为1的状态state_val_ew=O:/初始化各灯的状态SN_green=0 ;/南北方向绿灯亮 SN_yellow=l ;/南北方向黄灯灭 SN_red=l :/南北方向红灯灭 EW_green=l ;/东西方向绿灯灭 EW_yellow-l;/东西方向黄灯灭 EW_red=0 :/东西方向红灯亮/初始化51的寄存器TMOD=Ox20;/用

36、T1计时8位自动装载定时模式THl=0xl9;/0x4b; /500微秒溢出一次;250=(256-x)*12/ll0592 -> x= 230.4TL1二0x19;EA二1; /开屮断ET1=1:TR1=1: 开定时器T1while(1) led_show(cnt_sn, cnt_ew) ;/主程序结束3. 3. 3密码锁单片机控制的密码锁设计。AT89S52单片机Pl引脚外接独立式按键S1-S8,分別代表数字键0-5.确定键、取消键。单片机从P3. 0-P3. 3输出4个信号,分别为1个电磁开锁驱动信号和密码错误指示、报警输出、已 开锁指示信号,分別用发光二极管Ll-L4指示。P3.

37、 4接一有源蜂鸣器,用于实现提示音。基本要求:(1)初始密码为123450,输完后按确定键开锁,取消键清除所有输入,每次按键有短“滴”声按键提示 音。(2)密码输入正确后,输出一个电磁锁开锁信号与已开锁信号,并发出两声短“滴”声提示。4秒后开锁信号与已开锁指示清零。(3)密码输入错误时,发出一声长“滴”声错误指示提示音,并密码错误指示灯亮,三次密码错误时,发出长鸣声报警,并密码错误指示灯亮,报警指示灯亮,此后1 5秒内无法再次输入密码, 15秒过后,清除所有报警和指示。(4)5秒内无任何操作后,清除所有输入内容,等待下次输入。3. 3. 1模块1系统设计(1 )分析任务要求。写出系统整体设计思

38、路根据题目的要求,需要考虑如下几个任务:按键的输入,密 码的判断,密码输入正确或错误的计时、输出信号的控制等。键盘的输入:由于需要输入6个数字作为密码,先要判断按键时数字键还是功能键,若判断为数字键按 下,则需要将每次键盘的输入内容依次暂存在一个数组屮。在每次按键输入时,需要启动 定时器实现待机计时 (5秒)。若5秒内没有输入内容则清除已输入的内容。密码的判断和计时:在按下确认键Z后,要将输入的内容与初始密码核对,如果密码正确,输 出相应的指示,同时还要启动定时器实现4s的计时。如果密码错误,错误计数变量增1,同时输出密码指示信号,若错误次数超过 3s,则输出报警等信号,同时启动定时器实现15

39、秒的计时。输出信号的控制主要根据按键输入与密码的核对情况来决定。整体程序设计思想:程序分为主程序和中断服务程序两个主要部分,主程序完成变量和单片机特殊功能 寄存器的初始化后,进入一个循环结构。在循环中,首先判断有无按键按下,若有按键则判断是否数字键还是 功能键,根据按键的情况执行相应的功能。然后根据密码是否正确的判断情况,执行相应的操作。循环屮最后 将需要显示的内容通过动态扫描在数码管上显示。屮断服务程序只要实现三个状态的计时,待机时需要计时 5秒,密码正确需要计时5s,密码3 次输入错误需要计时15秒。当前处于何种计时,由主程序根据密码判断结果来决定。(2)选择单片机型号和所需外围器件型号,

40、设计单片机硬件电路原理图采用MCS51系列单片机At89S51作为主控制器,外围电路器件包括数码管驱动、蜂鸣器的输 出驱动、独 立式键盘以及发光二极管的输出等。数码管驱动采用2个四联共阴极数码管显示,由于单片机驱动能力有限,采用74HC244作为数 码管的 驱动。在74HC244的7段码输出线上串联1 00欧姆电阻起限流作用。蜂鸣器的驱动采用PNP三极管8550来驱动,低电平有效。独立式按键使用上提拉电路连接,在没有键按 下时,输出高电平。发光二极管串联500欧姆电阻再接到电源上,当输入为低电平时,发光二极管导通发光。硬件电路原理图如图3-9所示。Ufisao Isa: 2sa: 3J d 5

41、 sas <15PE13P5iVCC严KS: »馆10 TFOO11 TPOl1;»&>11nt>11»ipoe»irw:DHlKODmKlnK5roFllKtpceEl医sar也TK&baL£ F'«CfLE&_JO2, S,3 LTDaH ISDU I2D10Ji、V913J -l«-1A3m11"2UlYIUl9a:2Y24rri心m(«.12TI3110.00irD_ci f L 6,4w.r ILO HlnZD Jlrrt T*LA1LA2LAS

42、LA:lY】lY;lYI1± L-CeW IL ccn 2 «( t eg ALED JI U萨Y1¥5Vi» L ecu fiKEYlI I八OY:RS lOKBl:xo rr/£2111 Y10SYS心BXSYIcnaereXl» iCftS5X1L y*Cl丄0:LCD屮PPPL2DQk 04 EK Jtl: oh 6看。S£1£U£U分析软件任务要求,?13£00?ll£00VCC£00JLiiF3kVCCT图3-9密码锁电路原理图写出程序设计思路,分配单片机内部资源

43、,皿ai10Iecu:ruccuiLSDtE L.CC<U1CCOCaCf-1;1I L_«e»&;11»com1 jgiL£DricentauLTDJil108COKl:L.cceaLTD Cl8LED_ryCg Cl1;r、&fi joiac1 UCOMTdconA1 JOMSULLIX画出程序流程图软件任务要求主要包括按键扫描、密码判断、动态扫描输入的内容、计时、指示信号输出以及蜂鸣器提示音的输出等。主程序主要完成变量与寄存器的初始化、按键的扫描与判断、密码的判断以及数码管动态扫描显示等。主程序流程图如图3 -10 所主程序开

44、始zTo初始化变g设g定时器与中断扫描键盘,若有按键则开定时器.启动待机讣时YKey val=key val old?key_val_old 一 Key_valKey_val!=255&cnt_state!=2Key_Val<6? N数字惟键值存入存数抬针指定n元/数拆针增1.Key_val=? N动态扫描密码正确吗?Key_val=7?取尚 键?开定时器n il时清除所有输入内容Cn t_state=l密码错误次数清零密码错误抬示灯灭开锁信号灯亮已开锁信号灯亮错误次数V2、X错误次数增1密码错误灯亮开定时器 T1, Cnt state=2报警灯亮密码错误灯亮密码错误次数清零图3

45、-10密码锁的主程序流程图中断服务程序主要完成三种定时的计时工作,包括按键Z后启动的待机计时,当待机超过则清除已输5s 入的内容。密码输入正确Z后的计时,4s之后清除开锁驱动信号与已开锁指示信号。 密码输入错误3次的计时,计时15s,在则15s内无法再次输入密码,15秒过后清除所有报警与指示。屮断 服务程序流程图如图3-11所示。定时器中 断开始定时器溢出次数T1 ent+讣时1秒JYTl_cnt>3999?卜A11 Cnt=O待机汁时cnt_state=O?iN.-"ent val 5s<5? *Ml|ent val 5s卄|cnt val 5s=0 关 定时器清除所

46、有输入卜密码正确汁时Jcnt_state=l?-NIfcnt_val_4s=u, cnt_state=O 关定时騒、清所有输 入、清开锁信号ent_val_4s+1 -Cnt val 4s<4?-Yent_val_4s=0» ent_state=O 关定hF器、清矗所有输 入、密码错误和报警亮 指示灯v:cnt_val_15s<15?s_匚ent_state=2?Xent val 15s卄中断返回图3-11密码锁屮断服务程序流程图单片机资源的分配与变量的定义:密码的输入与判断需要定义4个变量。原始密码存储在数组init_val6中。键盘输入的密码存储在数据show_val

47、6屮,变量key.index的值表示当前按键是六位密码屮的哪一位,每输入一个密码数字该变量增 一。密码输入错误的次数暂存在变量error.num屮。计时功能需要5个变量。模式变量ent_state存储计时属于什么状态,0表示待机计时,1表示密码正确的 计时,2表不密码错误3次的计时。三个变量(cnt_val_15s, cnt_val_5s, ent_val_4s )分別 实现待机、密码正确和 密码错误3次后的计时工作。定时器T1每250ms产生一次屮断,变量Tl_ent记录定时器溢出屮断的次数,当记 录到4000时表示计时1秒。(4 )设计系统软件调试方案、硬件调试方案及软硬件联合调试方案软件

48、调试方案:伟福软件屮,在“文件新建文件”屮,新建C语言源程序文件,编写相应的程序。在“文件 新建项目”的菜单屮,新建项目并将 C语言源程序文件包括在项目文件中。在“项目编译”菜单中将 C源文件编译,以“札hex ”和“札bin ”后缀的目标文件。硬件调试方案:在设计平台屮,将单片机的起来,将P3. 0-P3. 3分别与4个发光二极管连接起来,检查语法错误及逻辑错误。在编译成功后,产生P1. 0-P1. 1分別与8个独立式键盘通过插线连接P3. 4与蜂鸣器的输入连接起来。运行“MCUFlash在伟福屮将程序文件编译成目标文件后,将下载线安装在实验平台的下载线接口上,下载程序”,选择相应的flas

49、h数据文件,点击“编程”按钮,将程序文件下载到单片机的 中。然后,上电重新启动单片机,检查所编写的程序是否达到题目的要求,是否全面完整地完成 试题的内容。3. 3. 2程序设计/晶振11.0592MHz , T1每250微秒屮断,按键PL0-P1.7,发光二极管接P3. 0-P3. 3, p34 /*变量的定义:show_val:显不的值init_val6:密码初始值key_val:返回按键的值255-表示无按键按下key_index:当前按键是哪一位密码Tl_cnt:定时器计数溢出数cnt_val_15s:报警计时的数值cnt_val_5s:cnt_val_4s:待机时间计时输入正确,等待4秒清除开锁信号cnt_state:计时状态error_num:错误次数nclude "reg51h" /*说明sbitrelay_open=P3A0;/电磁锁开锁驱动sbitpw_error=P3A1;sbita1arm_out=P3A2;sbitsbit unsignedopen_lock=P3A3;aud i o_out=P3A4:char data ent val/密码错误信号/报警输出/已开锁指示信号有源蜂鸣器1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论