收藏 分享(赏)

单片机开发工程案例分析与解析.doc

上传人:精品资料 文档编号:8661008 上传时间:2019-07-07 格式:DOC 页数:41 大小:1.41MB
下载 相关 举报
单片机开发工程案例分析与解析.doc_第1页
第1页 / 共41页
单片机开发工程案例分析与解析.doc_第2页
第2页 / 共41页
单片机开发工程案例分析与解析.doc_第3页
第3页 / 共41页
单片机开发工程案例分析与解析.doc_第4页
第4页 / 共41页
单片机开发工程案例分析与解析.doc_第5页
第5页 / 共41页
点击查看更多>>
资源描述

1、电子行业网址大全您工作和学习的好帮手 http:/ 单片机开发工程案例分析与解析3.1 定时报警器设计一个单片机控制的简易定时报警器。要求根据设定的初始值(1-59 秒)进行倒计时,当计时到 0时数码管闪烁“00” (以 1Hz闪烁) ,按键功能如下:(1)设定键:在倒计时模式时,按下此键后停止倒计时,进入设置状态;如果已经处于设置状态则此键无效。(2)增一键:在设置状态时,每按一次递增键,初始值的数字增 1。(3)递一键:在设置状态时,每按一次递减键,初始值的数字减 1。(4)确认键:在设置状态时,按下此键后,单片机按照新的初始值进行倒计时及显示倒计时的数字。如果已经处于计时状态则此键无效。

2、3.1.2 模块 1:系统设计(1)任务分析与整体设计思路根据题目的要求,需要实现如下几个方面的功能。计时功能:要实现计时功能则需要使用定时器来计时,通过设置定时器的初始值来控制溢出中断的时间间隔,再利用一个变量记录定时器溢出的次数,达到定时 1秒中的功能。然后,当计时每到 1秒钟后,倒计时的计数器减 1。当倒计时计数器到 0时,触发另一个标志变量,进入闪烁状态。显示功能:显示倒计时的数字要采用动态扫描的方式将数字拆成“十位”和“个位”动态扫描显示。如果处于闪烁状态,则可以不需要动态扫描显示,只需要控制共阴极数码管的位控线,实现数码管的灭和亮。键盘扫描和运行模式的切换:主程序在初始化一些变量和

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

4、.3为高电平,当有键按下时,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 1U5LED4SC

5、HC9A2 B6D11 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_COM

6、3L_COM4L_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 25P2

7、5 26P26 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,处于闪烁状态,在这种状态下,根据按键的情况分别又切换到计时和设置状态。程序流程主程序首先需要初始化定时器的参数和一些变量,然后进入一个循环结构,在循环中始终只Stae_val=0 计 数Stae_val=1 设 置 Stae_val=2 闪 烁按 下设 置 键 按 下确 认 键按 下递 增 键 按 下递 减 键 倒 计

11、 数 减 到 0按 下确 认 键按 下设 置 键主 程 序Mian()初 始 化 变 量和 定 时 器扫 描 按 键Key_old=Key_nw保 存 键 值Key_nw=eldN动 态 扫 描Key_nw=1? Key_nw=2? Key_nw=3?NN设 置 模 式关 定 时 器 设 置 模 式初 始 值 -1设 置 模 式初 始 值 +1Key_nw=4?计 数 模 式开 定 时 器YYYYY做两件事,一是键盘的扫描,二是数码管的动态扫描。在扫描键盘后,根据前一次按键的结果是否与本次键值相同。如果不同,表示有键按下或弹起,同时用本次按键值更新上一次的按键值。这样设计旨在避免一个按键长时间

12、按下时被重复判为有新键按下,使得当前按下的键只有松开后,下一次按下时才算为一次新的按键。根据按键的值分别改变变量(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) cnt_val-;elses

13、tate_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 位自动装载定时模式TH1=0x19; /25

14、0微秒溢出一次; 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; /停止计时show_val=init_va

15、l; /显示原来的倒计数初始值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_val3999) /如果计数3999, 计时 1s T1_cnt=0;if (cnt_sn!=0) /南北方向计时 cnt_sn-; else state_val_sn+;if (state_v

16、al_sn2) state_val_sn=0;cnt_sn=init_snstate_val_sn; switch (state_val_sn) /根据状态值,刷新各信号灯的状态 case 0: SN_green=0 ;/南北方向绿灯SN_yellow=1 ;/南北方向黄灯SN_red=1 ;/南北方向红灯break;case 1: SN_green=1 ;/南北方向绿灯SN_yellow=0 ;/南北方向黄灯SN_red=1 ;/南北方向红灯break;case 2:SN_green=1 ;/南北方向绿灯SN_yellow=1 ;/南北方向黄灯SN_red=0 ;/南北方向红灯break;

17、if (cnt_ew!=0) /东西方向计时 cnt_ew-; else state_val_ew+;if (state_val_ew2) state_val_ew=0;cnt_ew=init_ewstate_val_ew;switch (state_val_ew) /根据状态值,刷新各信号灯的状态 case 0: EW_green=1 ;/东西方向绿灯EW_yellow=1;/东西方向黄灯EW_red=0 ;/东西方向红灯break;case 1: EW_green=0 ;/东西方向绿灯EW_yellow=1 ;/东西方向黄灯EW_red=1 ;/东西方向红灯break;case 2: EW

18、_green=1 ;/东西方向绿灯EW_yellow=0 ;/东西方向黄灯EW_red=1 ;/东西方向红灯break;/-main()/初始化各变量cnt_sn=init_sn0;cnt_ew=init_ew0;T1_cnt=0;state_val_sn=0; /启动后,默认工作在序号为 1的状态state_val_ew=0;/初始化各灯的状态SN_green=0 ;/南北方向绿灯亮SN_yellow=1 ;/南北方向黄灯灭SN_red=1 ;/南北方向红灯灭EW_green=1 ;/东西方向绿灯灭EW_yellow=1;/东西方向黄灯灭EW_red=0 ;/东西方向红灯亮/初始化 51的寄

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

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

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

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

23、程序根据密码判断结果来决定。1A12 1A241A36 1A482A111 2A2132A315 2A4171Y1 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 7COM

24、3 4COM2 5COM4 1U6LED4SCHLED_ALED_BLED_CLED_DLED_ELED_FLED_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_COM7

25、L_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 27P27 28PSEN 29AL

26、E/P 30TXD 11RXD 10U2AT89S52VCCP30P31LED_J0LED_J1LED_J2LED_J3LED_ALED_BLED_CLED_DLED_ELED_FLED_GLED_HY111.0592C130PC230PR1110KR1100C322UVCCS1RESETRSTRSTP32P33D4LEDD3LED D5LED D6LEDR16500R15500R14500R13500VCCP30P31P32P33LED_J5LED_J6LED_J7LED_J4KEY1KEY2KEY3KEY4KEY5KEY6KEY7KEY8SB0SB1SB2SB3SB4SB5SB6SB7R5

27、 10KR12 10KR19 10KR22 10KR20 10KR17 10KR18 10KVCCR21 10KSB0SB1SB2SB3SB4SB5SB6SB7X0X1X1X2U7BELLVCCR161KP34P34位位位Q1PNP主 程 序 开 始初 始 化 变 量设 置 定 时 器 与 中 断扫 描 键 盘 , 若 有 按 键 , 则 开定 时 器 , 启 动 待 机 计 时Key_val=key_valod?Key_val!=25switch (cnt_state) case 0: /待机,需要计时 5sif(cnt_val_5s x=19TL1=0x19;EA=1; /开中断ET1=1

28、;TR1=0; /开定时器 T1while(1) key_val=scan_key(); /按键输入,有键按下 key_val 为 0-7,无键按下 key_val 为 255。if (key_val!=key_val_old) key_val_old=key_val;if (key_val!=255delay(100); /延时去抖动audio_out=1;switch (key_val) case 0:case 1:case 2:case 3:case 4:case 5:if(key_index40中 断 次 数 =0达 到 30秒 的 计 时 ?30秒 的 计 时 +30秒 的 计 时

29、=0途 中 等 待 超 30秒计 价NYYNkey_val: 返回按键的值 255-无键T1_cnt: 定时器溢出数计数cnt_30: 30秒钟的计时cnt_distance: 计算路程cnt_cost: 总金额state_val: 状态:0-白天 1 夜晚cost_val3: 收费标准:白天单价 cost_val0=1元/公里;晚上单价 cost_val1=2元/公里;等待单价 cost_val2=1元/30s led_seg_code:数码管 7段码 */-#include “reg51.h“unsigned char data cnt_30,cnt_distance,cnt_cost;u

30、nsigned int data T1_cnt,D_cnt;unsigned char data key_val,key_val_old;unsigned char data state_val;char code cost_val3=1,2,1;char code led_seg_code10=0x3f,0x06,0x05b,0x04f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;/led_seg_code0-9代表 0-9/-延时-void delay(unsigned int i)/延时 while(-i); /-初始化变量-void init_variant() /初始

31、化一些变量的内容unsigned char i;cnt_30=0; /30秒的计时D_cnt=0; /脉冲的个数cnt_distance=0; /距离的计数 cnt_cost=0; /保存总价格/-扫描键盘-unsigned char scan_key() unsigned char i,k;i=P1;if (i=0xff) k=255; /无键按下else /有键按下 delay(10); /延时去抖动if(i!=P1)k=255;else switch (i) case 0xfe: k=0; break; /P1.0按下,启动键case 0xfd: k=1; break; /P1.1按下,

32、清除键case 0xfb: k=2; break; /P1.2按下,切换键return k;/-数码管动态扫描-void led_show()unsigned char i,k;/-显示单价-k=cost_valstate_val;i=k%10; /暂存个位P0=led_seg_codei;P2=0xbf;delay(10);i=k%100/10;P0=led_seg_codei;P2=0x7f;delay(10);/-显示距离-k=cnt_distance;i=k%10; /暂存个位P0=led_seg_codei;P2=0xf7;delay(10);i=k%100/10;P0=led_se

33、g_codei;P2=0xef;delay(10);/-显示总价格-k=cnt_cost;i=k%10; /暂存个位P0=led_seg_codei;P2=0xfe;delay(10);i=k%100/10;P0=led_seg_codei;P2=0xfd;delay(10);/-计时-void timer1() interrupt 3 /T1中断 T1_cnt+;if(T1_cnt3999) /如果计数3999, 计时 1s T1_cnt=0;if(cnt_30 x= 230.4TL1=0x19;EA=1; /开中断ET1=1; TR1=0; /定时器 T0TCON=0x01; /Int0中

34、断取边沿触发模式while(1) key_val=scan_key(); / 255;/if (key_val!=key_val_old) key_val_old=key_val;if (key_val!=255) switch (key_val) case 0: /启动键TR1=1; /启动计时,TR1=1 为启动了的标志break;case 1: /清除键init_variant(); /清除变量TR1=0; /关闭定时器break;case 2: /白天/黑夜的切换if(state_val=0)state_val=1;elsestate_val=0;break;if(IE0=1cnt_3

35、0=0; /30秒的计时清零if(D_cnt100) D_cnt+;else /计数 100次,每次 10米,表示一公里D_cnt=0;cnt_distance=cnt_distance+1;cnt_cost=cnt_cost+cost_valstate_val;led_show();/-出租车计价器程序结束-3.5频率可调的方波信号发生器用单片机产生频率可调的方波信号。输出方波的频率范围为 1Hz-200Hz,频率误差比小于0.5%。要求用“增加” 、 “减小”2 个按钮改变方波给定频率,按钮每按下一次,给定频率改变的步进步长为 1Hz,当按钮持续按下的时间超过 2秒后,给定频率以 10次/

36、秒的速度连续增加(减少) ,输出方波的频率要求在数码管上显示。用输出方波控制一个发光二极管的显示,用示波器观察方波波形。开机默认输出频率为 5Hz。3.5.1模块 1:系统设计(1)分析任务要求,写出系统整体设计思路任务分析:方波信号的产生实质上就是在定时器溢出中断次数达到规定次数时,将输出 I/O管脚的状态取反。由于频率范围最高为 200Hz,即每个周期为 5ms(占空比 1:1,即高电平 2.5ms,低电平 2.5 ms) ,因此,定时器可以工作在 8位自动装载的工作模式。涉及以下几个方面的问题:按键的扫描、功能键的处理、计时功能以及数码管动态扫描显示等。 问题的难点在按键连续按下超过 2

37、S的计时问题,如何实现计时功能。系统的整体思路:主程序在初始化变量和寄存器之后,扫描按键,根据按键的情况执行相应的功能,然后在数码显示频率的值,显示完成后再回到按键扫描,如此反复执行。中断程序负责方波的产生、按键连续按下超过 2S后频率值以 10Hz/s递增(递减) 。(2)选择单片机型号和所需外围器件型号,设计单片机硬件电路原理图采用 MCS51 系列单片机 At89S51 作为主控制器,外围电路器件包括数码管驱动、独立式键盘、方波脉冲输出以及发光二极管的显示等。数码管驱动采用 2 个四联共阴极数码管显示,由于单片机驱动能力有限,采用 74HC244 作为数码管的驱动。在 74HC244 的

38、 7 段码输出线上串联 100 欧姆电阻起限流作用。独立式按键使用上提拉电路与电源连接,在没有键按下时,输出高电平。发光二极管串联 500欧姆电阻再接到电源上,当输入为低电平时,发光二极管导通发光。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 2G19U4HC244C9A

39、2 B6D11 E12 F3G8 H10 COM1 7COM3 4COM2 5COM4 1U5LED4SCHC9A2 B6D11 E12 F3G8 H10 COM1 7COM3 4COM2 5COM4 1U6LED4SCHLED_ALED_BLED_CLED_DLED_ELED_FLED_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

40、_A1LED_B1LED_C1LED_D1LED_E1LED_F1LED_G1LED_H1L_COM1L_COM2L_COM3L_COM4L_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 37

41、P03 36P04 35P05 34P06 33P07 32P20 21P21 22P22 23P23 24P24 25P25 26P26 27P27 28PSEN 29ALE/P30TXD 11RXD 10U289S52VCCLED_J0LED_J1LED_J2LED_J3LED_ALED_BLED_CLED_DLED_ELED_FLED_GLED_HY111.0592C130PC230PR1110KR1100C322UVCCS1RESETRSTRSTKEY1KEY2 P10P11LED_J4LED_J5LED_J6LED_J7位位位位R5 10KR1210KVCCP30位位位位位位D1LE

42、DR13500VCC图 3-14 方波信号发生器的硬件电路原理图(3)分析软件任务要求,写出程序设计思路,分配单片机内部资源,画出程序流程图软件任务要求包括按键扫描、定时器的控制、按键连续按下的判断和计时、数码管的动态显示。程序设计思路:根据定时器溢出的时间,将频率值换算为定时器溢出的次数(T1_over_num) 。使用变量(T1_cnt)暂存定时器 T1的溢出次数,当达到规定的次数(T1_over_num)时,将输出管脚的状态取反达到方波的产生。主程序采用查询的方式实现按键的扫描和数码管的显示,中断服务程序实现方波的产生和连续按键的计时功能。单片机内部资源分配:定时器 T1用来实现方波的产

43、生和连续按键的计时功能,内部变量的定义: hz_shu:设定的频率数; T1_over_num: 根据设定频率计算后的定时器溢出的次数值; T1_cnt:定时器溢出次数;sec_over_num: 计时 1s的定时器溢出的次数;second:连续按键的计时;state_val:连续按下的标志 0=按键已经弹起;1=按键一直按下;led_seg_code:0-9 数字的数码管 7段码。主程序和中断服务程序如图 3-15,3-16 所示。图 3-15 主程序的流程图主 程 序 开 始初 始 化 变 量设 置 定 时 器 T1的 参 数扫 描 键 盘按 键 弹 起 或 按 下 ?按 键 是 按 下

44、?将 当 前 的 键 值 暂 存(Key_valold)频 率 数 值 增 1、 算定 时 器 溢 出 次 数增 键 减 1键频 率 数 值 增 、 算定 时 器 溢 出 次 数数 码 管 动 态 扫 描 显 示NNYY初 始 化 连 续 按 键 标 志 一 直 按 下 ?设 置 连 续按 键 标 志 说 明 一 直 处 于 弹 起清 除 连 续 按 键 标 志结 束 中 断中 断 服 务程 序 开 始中 断 次 数 +1计 时 到 半 周 期 中 断 次 数 =0输 出 端 取 反 , 产 生 方 波连 续 按 键 ?继 续 1S计 时 继 续 2秒 计 时YYN计 时 到 1S ? 连 续 按 键 超 2秒 ?频 率 数 值 增 10、 算定 时 器 溢 出 次 数增 键 减 1键频 率 数 值 增 0、 算定 时 器 溢 出 次 数YNNY Y

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报