1、3 单片机开发工程案例分析与解析3.1 定时报警器设计一个单片机控制的简易定时报警器。要求根据设定的初始值(1-59 秒)进行倒计时,当计时到 0 时数码管闪烁“00” (以 1Hz 闪烁) ,按键功能如下:(1)设定键:在倒计时模式时,按下此键后停止倒计时,进入设置状态;如果已经处于设置状态则此键无效。(2)增一键:在设置状态时,每按一次递增键,初始值的数字增 1。(3)递一键:在设置状态时,每按一次递减键,初始值的数字减 1。(4)确认键:在设置状态时,按下此键后,单片机按照新的初始值进行倒计时及显示倒计时的数字。如果已经处于计时状态则此键无效。3.1.2 模块 1:系统设计(1)任务分析
2、与整体设计思路根据题目的要求,需要实现如下几个方面的功能。计时功能:要实现计时功能则需要使用定时器来计时,通过设置定时器的初始值来控制溢出中断的时间间隔,再利用一个变量记录定时器溢出的次数,达到定时 1 秒中的功能。然后,当计时每到 1 秒钟后,倒计时的计数器减 1。当倒计时计数器到 0 时,触发另一个标志变量,进入闪烁状态。显示功能:显示倒计时的数字要采用动态扫描的方式将数字拆成“十位”和“个位”动态扫描显示。如果处于闪烁状态,则可以不需要动态扫描显示,只需要控制共阴极数码管的位控线,实现数码管的灭和亮。键盘扫描和运行模式的切换:主程序在初始化一些变量和寄存器之后,需要不断循环地读取键盘的状
3、态和动态扫描数码管显示相应的数字。根据键盘的按键值实现设置状态、计时状态的切换。(2)单片机型号及所需外围器件型号,单片机硬件电路原理图选用 MCS-51 系列 AT89S51 单片机作为微控制器,选择两个四联的共阴极数码管组成 8 位显示模块,由于 AT89S51 单片机驱动能力有限,采用两片 74HC244 实现总线的驱动,一个 74HC244 完成位控线的控制和驱动,另一个 74HC244 完成数码管的 7 段码输出,在输出口上各串联一个 100欧姆的电阻对 7 段数码管限流。由于键盘数量不多,选择独立式按键与 P1 口连接作为四个按键输入。没有键按下时 P1.0-P1.3 为高电平,当
4、有键按下时,P1.0-P1.3 相应管脚为低电平。电路原理图如图 3-1 所示。1A12 1A241A36 1A482A111 2A2132A315 2A4171Y1 181Y2 161Y3 141Y4 122Y1 92Y2 72Y3 52Y4 31G1 2G19U3HC2441A12 1A241A36 1A482A111 2A2132A315 2A4171Y1 181Y2 161Y3 141Y4 122Y1 92Y2 72Y3 52Y4 31G1 2G19U4HC244C9A2 B6D11 E12F3 G8H10 COM1 7COM3 4COM2 5COM4 1U5LED4SCHC9A2 B
5、6D11 E12F3 G8H10 COM1 7COM3 4COM2 5COM4 1U6LED4SCHLED_ALED_BLED_CLED_DLED_ELED_FLED_GLED_HLED_A1LED_B1LED_C1LED_D1LED_E1LED_F1LED_G1LED_H1R2 10R3 10R4 10R6 10R7 10R8 10R9 10R10 10 LED_A1LED_B1LED_C1LED_D1LED_E1LED_F1LED_G1LED_H1LED_A1LED_B1LED_C1LED_D1LED_E1LED_F1LED_G1LED_H1L_COM1L_COM2L_COM3L_COM4
6、L_COM5L_COM6L_COM7L_COM8L_COM1L_COM2L_COM3L_COM4L_COM5L_COM6L_COM7L_COM8LED_J0LED_J1LED_J2LED_J3LED_J5LED_J6LED_J7LED_J4EA/VP31X119 X218RESET9RD17 WR16INT012 INT113T014 T115P10/T1 P11/T2P123 P134P145 P156P167 P178P00 39P01 38P02 37P03 36P04 35P05 34P06 33P07 32P20 21P21 22P22 23P23 24P24 25P25 26P26
7、 27P27 28PSEN 29ALE/P 30TXD 11RXD 10U289S52VCCLED_J0LED_J1LED_J2LED_J3LED_ALED_BLED_CLED_DLED_ELED_FLED_GLED_HY111.0592C1CAPC2CAP R1110KR110C322UVCCS1RESETRSTRSTKEY1KEY2KEY3KEY4LED_J4LED_J5LED_J6LED_J7R5 10KR12 10KR13 10KR14 10KVCC图 3-1 定时报警器电路原理图(3)程序设计思路,单片机资源分配以及程序流程单片机资源分配采用单片机的 P3 口作为按键的输入,使用独立
8、式按键与 P3.0-P3.3 连接,构成四个功能按键。在计时功能中,需要三个变量分别暂存定时器溢出的次数(T1_cnt) 、倒计时的初始值(init_val)以及当前倒计时的秒数(cnt_val) 。按键扫描功能中,需要两个变量,一个变量(key_val_new)用来存储当前扫描的键值(若无按键按下则为 255) ,另一个变量(key_val_old)用来存储上一次扫描的键值。只有这两个变量值不一样时,才能说明是一次新的按键按下或弹起了,同时将新的键值赋给 key_val_old 变量。在显示功能中,需要定义一组数组(code 类型) ,值为 0-9 数字对应的数码管 7 段码。还需要定义一个
9、变量(show_val)暂存要显示的数据,用于动态扫描显示中。在整个程序中,定义了一个状态变量(state_val)用来存储当前单片机工作在哪种状态。程序设计思路鉴于题目要求,存在三种工作模式:初始值设置模式、倒计时模式、计时到 0 时的闪烁模式。变量 state_val 为 0 时,处于倒计时模式。变量 state_val 为 1 时,处于初始值设置模式。变量state_val 为 2 时,处于闪烁模式。这些状态的切换取决于按下哪一个键以及是否计时到 0。状态的切换图如图 3-2图 3-2 状态的切换单片机复位之后,默认处于倒计时模式,启动定时器,定时器每隔 250us 溢出一次,根据定时器
10、溢出次数来计时,到 1 秒时将时间的计数器减 1。当“设置键”按下时,变量 state_val 由 0变为 1,切换到设置模式。可以使用“递增键” “递减键”对计时初始值进行修改。按下“确认键”时,回到计时模式开始以新的初始值进行倒计时。当倒计时到 0 时,变量 state_val 由 1 变为 2,处于闪烁状态,在这种状态下,根据按键的情况分别又切换到计时和设置状态。程序流程主程序首先需要初始化定时器的参数和一些变量,然后进入一个循环结构,在循环中始终只做两件事,一是键盘的扫描,二是数码管的动态扫描。在扫描键盘后,根据前一次按键的结果是否与本次键值相同。如果不同,表示有键按下或弹起,同时用本
11、次按键值更新上一次的按键值。这样设计旨在避免一个按键长时间按下时被重复判为有新键按下,使得当前按下的键只有松开后,下一次按下时才算为一次新的按键。Stae_val=0 计 数Stae_val=1 设 置 Stae_val=2 闪 烁按 下设 置 键 按 下确 认 键按 下递 增 键 按 下递 减 键 倒 计 数 减 到 0按 下确 认 键按 下设 置 键主 程 序Mian()初 始 化 变 量和 定 时 器扫 描 按 键Key_old=Key_nw保 存 键 值Key_nw=eldN动 态 扫 描Key_nw=1? Key_nw=2? Key_nw=3?NN设 置 模 式关 定 时 器 设 置
12、 模 式初 始 值 -1设 置 模 式初 始 值 +1Key_nw=4?计 数 模 式开 定 时 器YYYYY根据按键的值分别改变变量(state_val)的值或者在设置状态时的倒计时初始值。完整的主程序图如图 3-3 所示。图 3-3 主程序的流程图在定时器的参数中,选择定时器 T1 的 8 位自动装载模式,每 250us 产生一次溢出中断,中断服务程序如图 3-4 所示。 定 时 器中 断T1溢 出 计 数 值_cnt+1状 态 =闪 烁 ?LED状 态 值Shan_vl=!shan_vlT1_cnt3999) /如果计数3999, 计时 1s T1_cnt=0;if(cnt_val!=0
13、) cnt_val-;elsestate_val=2; /定时计数到 0 时,切换状态show_val=cnt_val;break;case 2:if(T1_cnt1999) /如果计数1999, 计时 0.5s T1_cnt=0; shan_val=!shan_val; /闪烁状态break;/-主程序-main()init_val=59; /初始化各变量cnt_val=init_val;show_val=cnt_val;state_val=0;key_val_old=255;T1_cnt=0;shan_val=0; /初始化 51 的寄存器TMOD=0x20; /用 T1 计时 8 位自动
14、装载定时模式TH1=0x19; /250 微秒溢出一次; 250=(256-x)*12/11.0592 - x= 230.4TL1=0x19;EA=1; /打开总中断允许ET1=1; /开中断允许TR1=1; /开定时器 T1while(1) key_val_new=scan_key(); / 255 表示无键按下if (key_val_new!=key_val_old) / 只有当前扫描的键值与上次扫描的不同,才判断是有键按下key_val_old=key_val_new;switch (key_val_new) case 1: /设置键state_val=1; /处于设置状态TR1=1;
15、/停止计时show_val=init_val; /显示原来的倒计数初始值break;case 2: if(state_val=1) /只有在设置状态,增 1 键才有用 if (init_val0) /更改原来的倒计数初始值init_val-; elseinit_val=59;show_val=init_val;/显示更改后的倒计数初始值break;case 3: if(state_val=1) /只有在设置状态,减 1 键才有用 if (init_val59) /更改原来的倒计数初始值init_val+; elseinit_val=0;show_val=init_val; /显示更改后的计数初
16、始值break;case 4: if(state_val!=0) /如果已处于计数模式,确认键不起作用 cnt_val=init_val; /将初始值赋给计数变量show_val=cnt_val; /将计数变量的数字显示TR1=1; /启动定时器 T1state_val=0; /将状态切换为计数模式break;led_show(show_val); /动态扫描3.2 交通灯设计一个基于单片机的交通灯信号控制器。已知东、西、南、北四个方向各有红黄绿色三个灯,在东西方向有两个数码管,在南北方向也有两个数码管。要求交通灯按照表 1 进行显示和定时切换,并要求在数码管上分别倒计时显示东西、南北方向各状
17、态的剩余时间。表 1 交通灯的状态切换表南北方向 东西方向序号 状态 序号 状态1 绿灯亮 25 秒,红、黄灯灭2 黄灯亮 5 秒,红、绿灯灭1 红灯亮 30 秒,绿、黄灯灭2 绿灯亮 25 秒,红、黄灯灭3 红灯亮 30 秒,绿、黄灯灭3 黄灯亮 25 秒,红、绿灯灭回到状态 1 回到状态 13.2.1 模块 1:系统设计(1)任务分析与整体设计思路试题要求实现的功能主要包括计时功能、动态扫描以及状态的切换等几部分。计时功能:要实现计时功能则需要使用定时器来计时,通过设置定时器的初始值来控制溢出中断的时间间隔,再利用一个变量记录定时器溢出的次数,达到定时 1 秒中的功能。当计时每到1 秒钟后
18、,东西、南北信号灯各状态的暂存剩余时间的变量减 1。当暂存剩余时间的变量减到 0 时,切换到下一个状态,同时将下一个状态的初始的倒计时值装载到计时变量中。开始下一个状态,如此循环重复执行。动态扫描:需要使用 4 个数码管分别显示东西、南北的倒计时数字,将暂存各状态剩余时间的数字从变量中提取出“十位”和“个位” ,用动态扫描的方式在数码管中显示。整个程序依据定时器的溢出数来计时,每计时 1S 则相应状态的剩余时间减 1,一直减到 0 时触发下一个状态的开始。(2)单片机型号及所需外围器件型号,单片机硬件电路原理图1A12 1A241A36 1A482A111 2A2132A315 2A4171Y
19、1 181Y2 161Y3 141Y4 122Y1 92Y2 72Y3 52Y4 31G1 2G19U3HC244 1A121A24 1A361A482A111 2A2132A315 2A4171Y1 181Y2 161Y3 141Y4 122Y1 92Y2 72Y3 52Y4 31G1 2G19U4HC244C9A2 B6D11 E12F3 G8H10 COM1 7COM3 4COM2 5COM4 1U5LED4SCHC9A2 B6D11 E12F3 G8H10 COM1 7COM3 4COM2 5COM4 1U6LED4SCHLED_ALED_BLED_CLED_DLED_ELED_FLE
20、D_GLED_HLED_A1LED_B1LED_C1LED_D1LED_E1LED_F1LED_G1LED_H1R2 100R3 100R4 100R6 100R7 100R8 100R9 100R10 100 LED_A1LED_B1LED_C1LED_D1LED_E1LED_F1LED_G1LED_H1LED_A1LED_B1LED_C1LED_D1LED_E1LED_F1LED_G1LED_H1L_COM1L_COM2L_COM3L_COM4L_COM5L_COM6L_COM7L_COM8L_COM1L_COM2L_COM3L_COM4L_COM5L_COM6L_COM7L_COM8LE
21、D_J0LED_J1LED_J2LED_J3LED_J5LED_J6LED_J7LED_J4EA/VP31X119 X218RESET9RD17 WR16INT012 INT113T014 T115P10/T1 P11/T2P123 P134P145 P156P167 P178P00 39P01 38P02 37P03 36P04 35P05 34P06 33P07 32P20 21P21 22P22 23P23 24P24 25P25 26P26 27P27 28PSEN 29ALE/P 30TXD 11RXD 10U280C32VCCP30P31LED_J0LED_J1LED_J2LED_
22、J3LED_ALED_BLED_CLED_DLED_ELED_FLED_GLED_HY111.0592C130P C230PR1110KR1100C322UVCCS1RESETRSTRSTP32P33P35P34D4LEDD3LED D5LED D6LEDD2LEDD1LEDR16500R15500R14500R13500R12500R5500VCCP30P31P32P33P34P35LED_J5LED_J6LED_J7LED_J4图 3-5 交通灯硬件电路原理图选用 MCS51 系列 AT89S51 单片机作为微控制器,选择两个四联的共阴极数码管组成 8 位显示模块,由于 AT89S51 单
23、片机驱动能力有限,采用两片 74HC244 实现总线的驱动,一个 74HC244 完成共阴极数码管位控线的控制和驱动,另一个 74HC244 完成数码管的 7 段码输出,在 7 段码输出口上各串联一个 100 欧姆的电阻对 7 段数码管限流。用 P3 口的 P3.0-P3.5 完成发光二极管的控制,实现交通灯信号的显示,每个发光二极管串联 500 欧姆电阻起限流作用。硬件电路原理图如图 3-5所示。(3)程序设计思路,单片机资源分配以及程序流程单片机资源分配单片机 P3 口的 P3.0-P3.1 引脚用作输出,控制发光二极管的显示。在计时模块中,需要定义两个数组变量(init_sn3,init
24、_ew3)来存储东西、南北两个方向在不同状态中倒计时的初始值,题目中每个方向的交通灯共有 3 种显示状态,因此数组元素个数为 3。还需要定义两个变量( cnt_ sn, cnt_ ew)暂存东西、南北两个方向的倒计时剩余时间。在状态的切换中,为了明确当前处于哪种状态,东西、南北方向各设置一个状态变量(state_val_sn, state_val_ew),当倒计时的剩余时间到零时,状态变量增 1,表示启动下一个状态,当该变量增到 3 时变为 0,回到序号为 1 的状态。程序设计思路在设计中,由于没有键盘功能,因此只涉及定时计数和动态扫描功能。主程序将变量初始化之后,设置单片机定时器和中断特殊功
25、能寄存器的初始值,将定时器 T1 的工作方式设置为 8 位自动装载模式,定时器每隔 250us 产生一次溢出。在初始化变量与寄存器后,主程序进入一个循环结构,在循环中只做动态扫描的工作,根据东西、南北两向的剩余时时间进行动态扫描显示。计时以及状态的切换通过定时器的中断服务程序来实现,在中断服务程序中,每计时到一秒时,则各方向当前状态的剩余时间减 1,一直减到 0 时触发下一个状态的开始,改变交通灯的指示。程序流程图 3-7 交通灯主程序流程图主 程 序Mian()初 始 化 变 量动 态 扫 描打 开 中 断初 始 化 定 时 器 的 相 关寄 存 器定 时 器中 断T1溢 出 计 数 T1_
26、cnt+11_cnt40南 北 方 向 倒 计 时cnt_s=0?T1_cnt=0cnt_s=cnt_s-1南 北 状 态stae_valsn+退 出 中 断NNYY staeals=0? stae_valsn=1? stae_valsn=2?南 北 交 通 灯 按 序号 1的 状 态 显 示 南 北 交 通 灯 按 序号 2的 状 态 显 示 南 北 交 通 灯按 序 号 3的状 态 显 示YNNYY东 西 方 向 倒 计 时cnt_ew=0?cnt_ew=cnt_e-1东 西 状 态stae_valew+NYstaeale=0? stae_valew=1? stae_vlew=2?东 西
27、交 通 灯 按 序号 1的 状 态 显 示 东 西 交 通 灯 按 序号 2的 状 态 显 示 东 西 交 通 灯按 序 号 3的状 态 显 示YNNYY图 3-8 中断服务程序流程图(4)软硬件调试方案软件调试方案:伟福软件中,在“文件新建文件”中,新建 C 语言源程序文件,编写相应的程序。在“文件新建项目”的菜单中,新建项目并将 C 语言源程序文件包括在项目文件中。在 “项目编译”菜单中将 C 源文件编译,检查语法错误及逻辑错误。在编译成功后,产生以 “*.hex”和“*.bin” 后缀的目标文件。硬件调试方案:在设计平台中,将单片机的 P3.0-P3.5 分别与独立式键盘的相应位通过插线
28、连接起来。在伟福中将程序文件编译成目标文件后,运行“MCU 下载程序” ,选择相应的 flash 数据文件,点击“编程”按钮,将程序文件下载到单片机的 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-红灯亮T1_cnt: 定时器计数溢出数cnt_sn,c
29、nt_ew: 倒计时的数值init_sn3,init_ew3 倒计时led_seg_code:数码管 7 段码*/#include “reg51.h“sbit SN_green=P32 ;/南北方向绿灯sbit SN_yellow=P31 ;/南北方向黄灯sbit SN_red=P30 ;/南北方向红灯sbit EW_green=P35 ;/东西方向绿灯sbit EW_yellow=P34 ;/东西方向黄灯sbit EW_red=P33 ;/东西方向红灯unsigned char data cnt_sn,cnt_ew;unsigned int data T1_cnt;unsigned char data state_val_sn,state_val_ew;char code led_seg_code10=0x3f,0x06,0x05b,0x04f,0x66,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);
Copyright © 2018-2021 Wenke99.com All rights reserved
工信部备案号:浙ICP备20026746号-2
公安局备案号:浙公网安备33038302330469号
本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。