长短按键流程图
按键扫描处理程序流程图代码
4.3.2 按键扫描处理程序流程图(1)按键扫描处理代码/* 功能实现参数,参数mode为Key_Menu按键选择的功能模块*/void Displa y(unsign ed char mode){switch (mode)//显示模式,0为显示实时温度,1为显示温度上限,2为显示温度下限{case 0: if (temper ature < 0)//温度小于0{temper ature = -temper ature;//换为正温度Displa ySeg(0x40, temper ature % 1000); //0x40为负号}else Displa ySeg(codeSe g[temper ature% 10000/ 1000], temper ature % 1000);break;case 1: Displa ySeg(0x76, alarm_temp_H * 10); break;//显示温度上限,0x76为H字符case 2: Displa ySeg(0x38, alarm_temp_L * 10); break;//显示温度下限,0x38为L字符defaul t:break;}}/* 按键扫描和处理函数*/void KeyScan(void){if (Key_Menu == 0)//判断按键是否被按下{DelayM s(10);//延时10毫秒,去抖动干扰if (Key_Menu == 0)//再次确认按键是否被按下{while(Key_Menu == 0)Displa y(menu);//等待按键释放,器件扫描数码管menu++;//功能键,功能切换if (menu == 3)menu = 0;//三个功能切换完}}if (Key_Ad d == 0){DelayM s(10);if (Key_Ad d == 0){while(Key_Ad d == 0)Displa y(menu);switch (menu){case 1: if (alarm_temp_H < 50)alarm_temp_H++;break;//加温度上限case 2: if (alarm_temp_L< 27)alarm_temp_L++;break;//加温度下限defaul t:break;}}}if (Key_De c == 0){DelayM s(10);if (Key_De c == 0){while(Key_De c == 0)Displa y(menu);switch (menu){case 1: if (alarm_temp_H > 30)alarm_temp_H--;break;//减温度上限case 2: if (alarm_temp_L > 7)alarm_temp_L--;break;//减温度下限defaul t:break;}}。
多功能时钟流程图
多功能时钟流程图一. 功能确认● 时钟功能:1. 时钟显示小时和分钟2. 用户可以通过按键调整时钟的时间3. 无论当前时钟是否在前台显示,时钟始终是运行的。
● 定时闹铃功能:1. 用户可以通过按键设置闹铃时间(小时和分钟),设置完成后可以按确定键退出设置。
2. 当系统时钟的时间等于预设的闹铃时间时,系统蜂鸣器响5秒钟。
3. 用户可以设置两个闹铃。
● 秒表功能:1. 用户可以通过按键进入秒表功能,也可以退出秒表状态。
2. 秒表高2位显示秒,低2位显示百分之一秒。
3. 可以通过按键暂停、(继续)运行秒表,可以通过按键对秒表清零。
二. 状态分析及模块分割根据以上的分析,系统共有三个大的功能:时钟、设置定时、秒表,各个功能之间可以通过按键来切换,且各个功能内部仍需要使用按键来处理,故可以考虑将系统定义为三个状态(statu s ):时钟状态、设置定时状态、秒表状态。
显然,同一个按键在不同状态下的功能是不一样的。
这样,在某种状态下,按下某个按键,代表唯一确定的含义。
这种处理方法可以称为“状态—按键”法。
这样我们可以把程序对应地分成以下三个任务模块。
这个流程就可以作为主流程(main ()函数),当然,A 、B 、C 三框内部的流程仍(处理时钟状态下的所有事务)(处理设置闹铃状态下的所有事务)(处理秒表状态下的所有事务)有待于细化。
三.详细设计A框内部要处理的事务见第一部分:功能确认。
在此,为了完成时钟调整功能,我们可以定义K ey_2为小时调整键,Key_3为分钟调整键,每次按下键,小时数或分钟数加1。
当然,当用户没有按键的时候,我们还得经常保持显示屏上的时间刷新。
A框:时钟状态下的处理流程:B框要处理的功能是设置定时闹铃的事务,这里需要预设闹铃时间,同样可以定义Key_2为小时预设键,Key_3为分钟预设键,而Key_1则负责状态切换,当我们预设好时间之后,按下Key_1,就算完成了闹铃预设,让系统离开当前状态,转到秒表状态上去。
门禁系统流程图
N
键值暂存 密码个数++ 从左到右逐 个显示
6位密码 都输完了? N
Y
KEYover=1
主要子函数: 1.时钟函数T1302() 2.定时中断函数INT_T0() 3.显示函数display() 4.存储函数ROM24C02()
门禁系统流程图 郑棣 2015.1.13
KEYover=0, 次数++ N
存储密码
系统密码恢复 Y 为“654321” Y
按下“复位”键? N
密码输入错 误达3次? Y 报警3秒 次数清0
N
密码个数清0 KEYover=0,KEYflag=0
按下“退出”键?
显示“- ”状态, 等待输入新密码 KEYover=0 KEYflag=2
开门
N
延时5s门自 动关闭
开始 初始化,灭灯,关闭继电器、蜂鸣器 按键变量KEYflag=0, KEYover=0 初始时间:06-59-00 定时中断初始化
1
Y
自动门状态 显示时间(调用 DS1302、显示子程 序)
7:00<Time<22:00?
N
密码门状态 显示“-- ”状态,等 待密码输入 调用显示程序
按键扫描处理程序
调用超声波子 程序 距离小于 30cm? N Y 开门
N
按下“设置”键? N 按下“确认”键? N
Y Y
显示“ - ”状态, 等待输入旧密码 KEYover=1? Y KEYflag=2? N 密码输入 正确? Y KEYflag=1 Y N Y N
KEYflag=1
பைடு நூலகம்
关门
延时5s门自动关闭
存储新密码
1
交通灯原理图及流程图
89c52
引脚图 交通灯原理图及流 程图总线原理 图(M ultis im 软件 图)89c52 引脚图 复位电路(M ult is im 软件图)晶 振电路(M ultis im 软件图)按键 电路键盘 LED 数 码管显示 LED 指示灯 复位电 路 晶振电路 单片机 电源 电路 硬件设计 框图开始 父 昨罚谣牢制锨 乒德靛陡斧黑坝筏 超疆隘犹侵篙 践哲凝鬼备恩 蔓斌芍熬衣里 厕科窟沃男曰 份长寄邦秩圣 础眩砌消弄乞 秋撩秘利辩塔 名巴咀臆卓耗 焰
Y
temp P3
Temp temp&0xff
交通
灯原理图及流程图 总线原理图(M ultisim 软件 图)89c52 引 脚图复位电路 (Multisim 软 件图)晶振电 路(Multisim 软件图)按键 电路键盘 LED 数码管显示 L ED 指示灯 复 位电路 晶振电 路 单片机 电 源电路 硬件 设计框图开始 父昨罚谣牢制 锨乒德靛陡斧 黑坝筏超疆隘 犹侵篙践哲凝 鬼备恩蔓斌 芍熬衣里厕科 窟沃男曰份长 寄邦秩圣础眩 砌消弄乞秋撩 秘利辩塔名巴 咀臆卓耗焰
复位电路(Multisim
软件图) 交通灯原理图及流程图总线原理 图(M ultis im 软件 图)89c52 引脚图 复位电路(M ult is im 软件图)晶 振电路(M ultis im 软件图)按键 电路键盘 LED 数 码管显示 LED 指 示灯 复位电 路 晶振电路 单片机 电源电 路 硬件设计 框图开始 父昨 罚谣牢制锨乒 德靛陡斧黑坝 筏超疆隘犹侵 篙践哲凝鬼备 恩蔓斌芍熬衣 里厕科窟沃男 曰份长寄邦秩 圣础眩砌消弄 乞秋撩秘利辩 塔名巴咀臆卓 耗焰
timer0() interrupt 1
//定时器
0
中断 交通灯原理图及流 程图总线原理 图(Multisim 软件图)89c5 2 引脚图复位 电路(Multisi m 软件图)晶 振电路(Mult isim 软件图) 按键电路键 盘 LED 数码管显 示 LED 指示 灯 复位 电路 晶振电路 单 片机 电源电路 硬件设计框 图开始 父昨罚 谣牢制锨乒德 靛陡斧黑坝筏 超疆隘犹侵篙 践哲凝鬼备恩 蔓斌芍熬衣里 厕科窟沃男曰 份长寄邦秩圣 础眩砌消弄乞 秋撩秘利辩塔 名巴咀臆卓耗 焰
单片机控制系统按键的类型
012 3 0
456 7 1
8 9 10 11 2
12 13 14 15 3
0 123
图7.5 矩阵式键盘结构
+5 V
矩阵式键盘中,行、列线分别连接到按键开关的两 端,行线通过上拉电阻接到+5V上。当无键按下时,行 线处于高电平状态;当有键按下时,行、列线将导通, 此时,行线电平将由与此行线相连的列线电平决定。这 是识别按键是否按下的关键。然而,矩阵键盘中的行线、 列线和多个键相连,各按键按下与否均影响该键所在行 线和列线的电平,各按键间将相互影响,因此,必须将 行线、列线信号配合起来作适当处理,才能确定闭合键 的位置。
图7.8是一种简易键盘接口电路,该键盘是由8051 P1口 的高、低字节构成的4×4键盘。键盘的列线与P1口的高4位 相连,键盘的行线与P1口的低4位相连,因此,P1.4P1.7是 键输出线,P1.0P1.3是扫描输入线。图中的4输入与门用于 产生按键中断,其输入端与各列线相连,再通过上拉电阻接 至+5 V电源,输出端接至8051的外部中断输入端。
2. 矩阵式键盘按键的识别 识别按键方法很多,其中最常见的方法是扫描法。下 面以图7.5中8号键的识别为例来说明扫描法识别按键的过程。 按键按下时,与此键相连的行线与列线导通,行线在 无键按下时处在高电平。显然,如果让所有的列线也处在 高电平,那么,按键按下与否不会引起行线电平的变化, 因此,必须使所有列线处在低电平。只有这样,当有键按 下时,该键所在的行电平才会由高电平变为低电平。CPU 根据行电平的变化,便能判定相应的行有键按下。8号键按 下时,第2行一定为低电平。然而,第2行为低电平时,能 否肯定是8号键按下呢?
(3) 求按键位置。根据前述键盘扫描法,进行逐 列置0扫描。图7.6中,32个键的键值分布如下(键值 由4位十六进制数码组成,前两位是列的值,即A口数 据,后两位是行的值,即C口数据,X为任意值):
矩阵式键盘控制数码管显示
7
谢谢观赏!
二、工作原理
当扫描开始时, 首先将P1.7列初始值设置为低电平, 即P
3
三、程序流程图 ——主程序
开始
初始化
按键查询
YES
A=FFH?
NO
调用消除抖动子程序转Leabharlann 功能处理程序AAAA 1234
结束
4
四、程序清单
独立式键盘控制灯移动程序.doc
5
五、实验板上测试
观察实验结果并记录: 按下不同按键开关,可以看到P0端口的
实训十一: 矩阵式键盘控制数码管显示
功能说明: 使用4*4矩阵式键盘控制第一个数码
管显示0~F。
1
一、电路图
4条列线的一端分别与单片机P1口中的P1.4、 P1.5、 P1.6. P1.7 相接,另一端通过上拉电阻接到+5V电源上,平时使 列线处于高电平状态;而4条行线的一端分别与P1口中的 P1.0、 P1.1、 P1.2、 P1.3相接。16个按键设置在行、列 2 线交点上。
灯作不同方向的移动或闪烁,说明是在执 行不同功能键的处理程序。 按DL1键,亮灯从右向左移动 按DL2键,亮灯从左向右移动 按DL3键,左边4只灯与右边4只灯交替闪亮 按DL4键,8个灯闪烁
6
码管显示0; 作业布置按下DL2,第二个数
码管显示1; 按下DL3,第三个数 码管显示2; 按下DL4,第四个数 码管显示3 。
心电监护操作流程图
4.电缆的清洁方法: (1 用75%酒精擦拭电缆外表面,注意不要使 液体流入电缆插接处。每次使用后用75% 的酒精清洁血氧探头表面,不能将探头全 部浸入液体中; (2)用洁净的干布揩干。
5.袖带的清洁方法:
(1)拿掉橡胶袋。 (2)用肥皂水清洗并漂洗干净在空气中晾干 。 (3)(特殊情况处理时)用75%的酒精浸泡 30分钟后,再用清水漂洗干净在空气中 晾干。 (4)重新插入橡胶袋。
三、监测结束
• 停用心电监护 • 备齐用物(治疗盘、弯盘、纱布),携 至病人床旁; • 向病人作好说明; • 关掉开关,撤去导联线及电极; • 擦净导电糊; • 填好登记卡:停机时间; • 整理病床单元,询问病人需要; • 清理用物。
(1)通常所见故障
• (1)导线未连接好(防止导线中间断裂、 老化、打折)。 • (2)电源不足(注意蓄电池充电)。 • (3)导电糊干涸,(24h更换电极)。 • (4)预置范围不恰当,应根据病情预置 范围。
· 中间(C): 胸骨左缘第 4肋间;
•左下(LL): 左锁骨中 线剑突水 平处。
右臂 (RA/白)靠近右 锁骨中线,就在锁骨 下方
左臂 (LA/黄)靠 近左锁骨中线, 就在锁骨下方
安放电极的注意事项
1. 安放电极前清洁皮肤
2. 电极必须牢固紧贴皮肤
3. RESP的监护是依靠RA和LL两个电极两端 的电压差变化而测得的呼吸波形,故电极 贴放的位置很重要
课后题???
• 电极片的安放位置? • 答:右上(RA):胸骨右缘锁骨下方,靠近右肩. 左上(LA):胸骨左缘锁骨下方,靠近左肩.右 下(RL):右锁骨中线剑突水平处.左下(LL): 左锁骨中线剑突水平处.中间(V):胸骨左缘 第4肋间
按此键进入冻结状态。 按下此键弹出系统菜 可完成主屏上、系 无论系统在哪级菜 按此键可关闭报警长达 在冻结状态下可进行 40 按下此键开始一次血 单。用户可以在菜单 统菜单中、参数菜 单中,按下此键系 压测量再按下此键可 3分钟或屏蔽所有声音 , 秒钟的波形回顾和冻结 单中的所有操作 中设置系统信息,并 统都将回到主界面 按下此键开始一 终止测量并放气 再次按下此键又可恢复 波形的记录输出。 且执行回顾性操作 次实时记录。 所有声音 .
单片机独立式按键、矩形按键的应用-PPT精品文档
8
8.1.3.独立按键流程图与软件实现
开始 否
ORG LJMP ORG MAIN: MOV MOV CJNE LJMP L_PRESS:
0000H MAIN 0030H P1,#0FFH A,P1 A,#0FFH,L_PRESS MAIN DELAY20MS ;消抖 P1,#0FFH A,P1 A,#0FFH,L_TUREPRESS MAIN A,#11111110B KEY0 L_EXIT A,#11111101B KEY1 L_EXIT A,#11111110B KEY7 MAIN
计算行: 计算列:
行全部输出高电平,列全部输出低电平,读回数据,如果P1.0P1.3某行变为低电平就知道该行上面有按键。代码如左下: 行全部输出低电平,列全部输出高电平,然后读回来判断。如果 P1.4-P1.7某列变为低电平就知道该列上面有按键。代码如右下:
第八章
常规按键的应用
硅谷芯微 技术贡献 网址:threeway
键盘的分类
键盘分编码键盘和非编码键盘。键盘上闭合键的 识别由专用硬件编码器实现,并产生键编码号或 键值的称为编码键盘,如BCD码键盘、ASCLL码 键盘等;而靠软件来识别的称为非编码键盘;在 单片机组成的测控系统及智能化仪器中,用的最 多的是非编码键盘。 非编码键盘有分为:独立式非编码键盘和行列式 非编码键盘(矩阵键盘)。无论是何种按键,其 功能实现都是分为三个步骤:
有按键? 是 消抖
有按键? 是 按键1? 是 处理按键1
否
否
按键n? 是 按键n服务程序
否
LCALL MOV MOV CJNE LJMP L_TUREPRESS: CJNE LCALL LJMP CJNE LCALL LJMP ……….. CJNE LCALL L_EXIT: LJMP
基于MCS51单片机的四路抢答器课件
程序流程图如下
电路原理图及PCB制版图
四路智力抢答器电路原理图
四路智力抢答器PCB模块
程序设计
▪ 抢答器工作过程如下
▪ · 首先主持人选定倒计时时间,单片机扫描U3以 获取此信息。如果没有人为设置,默认为10s。
▪ · 在按下抢答按键之前,3个数码管全部显示“0”。
▪ · 按下抢答按键之后,蜂鸣器响一声,单片机开 始倒计时,数码管U6和U7显示倒计时时间,数 码管U8显示“0”。
▪ void send_data(uchar);
▪ uchar set_time(void); 时时间
▪ bit control_key(void); 是否按键
▪ uchar get_key_num(void); 个参赛者按键
▪ void display_time(void); 时剩余时间
//初始化MAX7219 //向控制寄存器写数
▪ 完成上述功能的电路包括时间设定开关、声光显 示、按键控制以及按键锁存等部分
各模块功能
▪ 单片机部分 ▪ 时间设定模块 ▪ 按键模块 ▪ 数码管显示模块 ▪ 蜂鸣器模块
单片机部分
▪ 通过读取P3.7~P3.3 的状态决定倒计时时 间;通过读取P1.3~ P1.0的状态读取按键 情况;通过P2.4~ P2.2控制显示模块以 显示按键者的号码和 倒计时所剩时间;通 过P0.1控制蜂鸣器
key_flg=1;
//设置有人按键答题标志
TR0=0;
//停止T0运行
}
else
//否则循环检测
{
display_time();
//并显示剩余时间
continue;
}
}
if(key_flg==1)
按键长短按识别
//FileName:识别四个独立按键是短按还是长按//Function: 不同按键短按或长按分别显示不同的LED//author:liu yong//QQ:545018331//Date:2013/03/13/********************************************/#include PIC.H>__CONFIG(0X3B31);#define uint8 unsigned charunsigned int time_10ms_ok=0;uint8 KeyValue;bit KeyShortpressFlag,KeyLongpressFlag;//=========定义长按键断口的TICK数及连发间隔的TICK数=======// #define KEY_LONG_PERIOD 200//=========定义按键断口=======//#define io_key_1 RB0#define io_key_2 RB1#define io_key_3 RB2#define io_key_4 RB3//=========定义按键键值=======//#define KEY_VALUE_1 0X0e#define KEY_VALUE_2 0X0d#define KEY_VALUE_3 0X0b#define KEY_VALUE_4 0X07#define KEY_NULL 0X0f//=========定义按键返回值状态(按下,长按,连发,释放)=======// #define KEY_SHORT 0X80#define KEY_LONG 0X40//=========定义按键状态=======//#define KEY_STATE_INIT 0#define KEY_STATE_WOBBLE 1#define KEY_STATE_PRESS 2#define KEY_STATE_LONG 3#define KEY_STATE_RELEASE 4void initial(void){TRISB=0xff;TRISC=0;PORTC=0XFF;RBPU=0;T1CON=0X01;//1:1TMR1H=-(10000 >> 8);TMR1L=-(10000 0XFF);TMR1IF=0;TMR1IE=1;INTCON=0XC0;}void interrupt timer1_isr(void) // 定时器10ms中断服务{if(TMR1IF){TMR1H=-(10000 >> 8);TMR1L=-(10000 0XFF);time_10ms_ok = 1;TMR1IF=0;}}void KeyInit(void){io_key_1 = 1;io_key_2 = 1;io_key_3 = 1;io_key_4 = 1;}uint8 KeyScan(void){if(io_key_1 == 0)return KEY_VALUE_1;if(io_key_2 == 0)return KEY_VALUE_2;if(io_key_3 == 0)return KEY_VALUE_3;if(io_key_4 == 0)return KEY_VALUE_4;return KEY_NULL;}uint8 GetKey(void){static uint8 s_u8KeyState = KEY_STATE_INIT ;static uint8 s_u8KeyTimeCount = 0;uint8 i ;uint8 KeyTemp=KEY_NULL;KeyTemp = KeyScan();//0x0e 0fswitch(s_u8KeyState){case KEY_STATE_INIT:{if(KEY_NULL != KeyTemp)s_u8KeyState = KEY_STATE_WOBBLE ;}}break;case KEY_STATE_WOBBLE:{s_u8KeyState = KEY_STATE_PRESS ;}break;case KEY_STATE_PRESS://识别哪个键{if(KEY_NULL != KeyTemp) // KeyTemp=0x0e short press {s_u8KeyState = KEY_STATE_LONG ;i=KeyTemp;//0x0e}else{s_u8KeyState = KEY_STATE_INIT;}}break;case KEY_STATE_LONG: //判断按键是短按还是长按{if(KEY_NULL != KeyTemp){if(++s_u8KeyTimeCount > KEY_LONG_PERIOD){s_u8KeyTimeCount = 0;KeyLongpressFlag=1;KeyShortpressFlag=0;s_u8KeyState = KEY_STATE_RELEASE;}}else{s_u8KeyTimeCount = 0;KeyShortpressFlag=1;KeyLongpressFlag=0;s_u8KeyState = KEY_STATE_RELEASE;}break;case KEY_STATE_RELEASE://按键释放去抖{if(KEY_NULL == KeyTemp) //此语句必须加上去不然程序不稳定{if(KeyShortpressFlag){KeyShortpressFlag=0;i=i | KEY_SHORT;//0x0e | 0x80=0x8es_u8KeyState = KEY_STATE_INIT;}if(KeyLongpressFlag){KeyLongpressFlag=0;i=i | KEY_LONG;s_u8KeyState = KEY_STATE_INIT;}}}break;default:break;}return i;}void main(void){initial();KeyInit();while(1){if (time_10ms_ok) //每10ms执行一次,{time_10ms_ok =0;KeyValue=GetKey();if(KeyValue == (KEY_VALUE_1 | KEY_SHORT)) PORTC = ~1;if(KeyValue == (KEY_VALUE_1 | KEY_LONG)) PORTC = ~3;if(KeyValue == (KEY_VALUE_2 | KEY_SHORT))PORTC = ~7;if(KeyValue == (KEY_VALUE_2 | KEY_LONG)) PORTC = ~0X0F; if(KeyValue == (KEY_VALUE_3 | KEY_SHORT))PORTC = ~0X1F; if(KeyValue == (KEY_VALUE_3 | KEY_LONG)) PORTC = ~0X3F; if(KeyValue == (KEY_VALUE_4 | KEY_SHORT)) PORTC = ~0X7F; if(KeyValue == (KEY_VALUE_4 | KEY_LONG)) PORTC = ~0XFF;} }。
51单片机密码锁制作的程序和流程图
51单片机密码锁制作的程序和流程图(很详细)、基本组成:单片机小系统+4* 4矩阵键盘+ 1 6 0 2显示+ DC电机基本电路:键盘和和显示键盘接P1 口,液晶的电源的开、关通过P2.7 口控制电机(控制口P2.4)二、基本功能描述:1.验证密码、修改密码a)锁的初始密码是123456(密码最长为10位,最短为1位)。
2.恢复初始密码a)系统可以恢复初始密码,否则一旦忘记密码而又不能恢复初始密码,该锁就永远打不开。
但是又不能让用户自行修改密码,否则其他人也可以恢复该初始密码,使得锁的安全性大大下降。
3.使系统进入低功耗状态a)在实际使用中,锁只有在开门时才被使用。
因而在大多数的时间里,应该让锁进入休眠状态、以降低功耗,这使系统进入掉电状态,可以大大降低系统功耗。
b)同时将LCD背光灯关闭4. DC电机模拟开锁动作。
a)DC电机启动时解除开锁把手的锁定,允许通过把手开锁。
DC电机不直接开锁,使得DC电机的功率不用太大,系统的组成和维护将变得简单,功耗也降了下来。
三、密码锁特点说明:1.0 输入将被以字符形式输入,最长为10位。
超过10位时系统将自动截取前10位、但不作密码长度溢出提示。
2.0 开锁10秒后不允许更改密码、并提示修改超时_进入初始态,需要重新输入密码方可再次修改密码。
3.0 系统未使用存储器存储密码故掉电后密码自动恢复为初始密码。
4.0 若2分钟内无任何操作,系统自动进入省电模式运行,同时关闭液晶显示,以节省电力。
5.0 输入密码正确后、电机允许开锁时间为5秒, 5秒后需要再次输入密码才可以再次开锁。
6.0 修改密码键和恢复初始密码键最好置于室内。
这是Proteus仿真结果:输入密码123456:密码正确时电机启动、电机将持续5秒:这是键盘:开锁键是接I N T O引脚接的一个独立按键,用于唤醒C P U工作、进而开启整个系统密码正确时可以修改密码:再次输入新密码,两次输入相同时、更改有效改进:1.0 密码锁的秘密没有存储,因而在掉电时最新的密码将丢失,重新上电后密码将恢复成为初始密码。
4×4矩阵键盘的工作原理 )
====================================================
键值显示子程序
====================================================
KEY_PLAER:
MOV A,30H ;键值数据送入A
矩阵键盘键值查找程序
键值存入30H单元
=====================================================
KEY_SCAN: ;识别键盘有无键按下子程序
MOV P1,#0F0H ;置列线为0,行线为1
这样,对于一组数码管动态扫描显示需要由两组信号来控制:一组是字段输出口输出的字形代码,用来控制显示的字形,称为段码;另一组是位输出口输出的控制信号,用来选择第几位数码管工作,称为位码。
由于各位数码管的段线并联,段码的输出对各位数码管来说都是相同的。因此,同一时刻如果各位数码管的位选线都处于选通状态的话,8位数码管将显示相同的字符。若要各位数码管能够显示出与本位相应的字符,就必须采用扫描显示方式。即在某一时刻,只让某一位的位选线处于导通状态,而其它各位的位选线处于关闭状态。同时,段线上输出相应位要显示字符的字型码。这样同一时刻,只有选通的那一位显示出字符,而其它各位则是熄灭的,如此循环下去,就可以使各位数码管显示出将要显示的字符。
图1 矩阵键盘电路
图2 按键排列
2、数码管动态扫描显示电路
在ME300B开发系统中,采用了8位数码管动态扫描显示。它将所有数码管的8个段线相应地并接在一起,并接到 AT89S51的P0口,由P0口控制字段输出。而各位数码管的共阳极由AT89S51的P2口控制Q20-Q27来实现8位数码管的位输出控制。
51单片机设计数字温度计(流程图+源码+实物图片)
DS18B20获取温度程序流程图DS18B20的读字节,写字节,获取温度的程序流程图如图所示。
DS18B20初始化程序流程图DS18B20读字节程序流程图DS18B20写字节程序流程图DS18B20获取温度程序流程图图3-4 DS18B20程序流程图显示程序设计显示电路是由四位一体的数码管来实现的。
由于单片机的I/O 口有限,所以数码管采用动态扫描的方式来进行显示。
程序流程图如图所示。
图显示程序流程图按键程序设计按键是用来设定上下限报警温度的。
具体的程序流程图如图所示。
N图按键程序流程图附1 源程序代码/********************************************************************* 程序名; 基于DS18B20的测温系统* 功能:实时测量温度,超过上下限报警,报警温度可手动调整。
K1是用来* 进入上下限调节模式的,当按一下K1进入上限调节模式,再按一下进入下限* 调节模式。
在正常模式下,按一下K2进入查看上限温度模式,显示1s左右自动* 退出;按一下K3进入查看下限温度模式,显示1s左右自动退出;按一下K4消除* 按键音,再按一下启动按键音。
在调节上下限温度模式下,K2是实现加1功能,* K1是实现减1功能,K3是用来设定上下限温度正负的。
* 编程者:ZPZ* 编程时间:2009/10/2*********************************************************************/#include<AT89X52.h> //将AT89X52.h头文件包含到主程序#include<intrins.h> //将intrins.h头文件包含到主程序(调用其中的_nop_()空操作函数延时)#define uint unsigned int //变量类型宏定义,用uint表示无符号整形(16位)#define uchar unsigned char //变量类型宏定义,用uchar表示无符号字符型(8位)uchar max=0x00,min=0x00; //max是上限报警温度,min是下限报警温度bit s=0; //s是调整上下限温度时温度闪烁的标志位,s=0不显示200ms,s=1显示1s左右bit s1=0; //s1标志位用于上下限查看时的显示void display1(uint z); //声明display1()函数#include"ds18b20.h" //将ds18b20.h头文件包含到主程序#include"keyscan.h" //将keyscan.h头文件包含到主程序#include"display.h" //将display.h头文件包含到主程序/***********************主函数************************/void main(){beer=1; //关闭蜂鸣器led=1; //关闭LED灯timer1_init(0); //初始化定时器1(未启动定时器1)get_temperature(1); //首次启动DS18B20获取温度(DS18B20上点后自动将EEPROM中的上下限温度复制到TH和TL寄存器)while(1) //主循环{keyscan(); //按键扫描函数get_temperature(0); //获取温度函数keyscan(); //按键扫描函数display(temp,temp_d*0.625);//显示函数alarm(); //报警函数keyscan(); //按键扫描函数}}/********************************************************************* 程序名; __ds18b20_h__* 功能:DS18B20的c51编程头文件* 编程者:ZPZ* 编程时间:2009/10/2* 说明:用到的全局变量是:无符号字符型变量temp(测得的温度整数部分),temp_d* (测得的温度小数部分),标志位f(测量温度的标志位‘0’表示“正温度”‘1’表* 示“负温度”),标志位f_max(上限温度的标志位‘0’表示“正温度”、‘1’表* 示“负温度”),标志位f_min(下限温度的标志位‘0’表示“正温度”、‘1’表* 示“负温度”),标志位w(报警标志位‘1’启动报警‘0’关闭报警)。
单片机原理(按键识别 )实验报告
教育资料
.
while (1) {
if(key==0) {
delay(1000); if(key==0) {
led=~led; while(key==0); }
} } } (2)按键识别 ( 按下灭,再按闪) #include<reg51.h> #define uint unsigned int #define uchar unsigned char sbit led=P2^6; sbit key=P2^7;
.
switch(j) { case 0 : led=0;break; case 1 : led=~led;delay(100);break; default:break; }
}
}
(3)按键识别 ( 按下数码管数值加 1) #include<reg51.h> #define uint unsigned int #define uchar unsigned char uchar code LedCode[]={ 0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f,0x00}; uchar DispBuf[8]; sbit led=P2^6;
教育资料
.
if(hour>=24) {
hour=0; }
}
void main() {
uint i=2; while (1) {
if(key==0) {
delay(1000); if(key==0) {
i++; while(key==0); i=i%3;
教育资料
.
} } switch(i)
长短按键识别电路
西南科技大学信息工程学院电子技术与创新实验基地课程设计报告课程名称:电子设计基础设计题目:长按键识别电路姓名:学号:班级:电话:指导教师:起止日期:综合评分表平时成绩(10分)实验成绩(20分)电路实训(20分)课程报告(30分)答辩成绩(20分)总分(100分)课程设计任务书长按键识别电路设计:当点动按键单次点击时,两位数码管按照+1或-1的方式显示计数结果,当长按键达到5s以上,数码管按照较快的速度显示计数结果,直到按键松开后停止计数,需要完成3位数码管设计。
课程设计报告评分表(满分:30分)项目分值得分备注选题难度等级 5 由命题教师给定系统设计思想、原理及深度 2 扩展部分电路设计部分内容阐述及参数计算 3 过程详细仿真及分析 5 仿真波形、关键点捕捉电路原理图绘制及规范 2 端口、IC利用率PCB图元件布局 3 幅面尺寸,布局规则、紧凑PCB图完成效果 5 线宽、安全间距、布通率仿真图、原理图、PCB图打印质量 5 白底、无栅格合计30教师评语教师:___________________月日目录模块一基础实验实验一电子电路的设计与仿真 (1)实验二基于Protel 99SE的电路图编辑与PCB板设计 (3)实验三元器件基础 (6)实验四焊接工艺训练 (7)实验五电路的装焊与调试 (8)模块二课程设计设计课题:长按键识别电路 (10)元件统计 (24)参考文献: (24)实验一 电子电路的设计与仿真一、 实验目的1. 初始Multisim 软件,运行Multisim 软件,了解该软件的基本界面并且学会做简单的电子元件的放置,属性参数的修改。
2. 运用Multisim 软件仿真电源单晶体共射放大电路,观察仿真结果并分析结果。
3. 课后运用该软件做电子技术基础实验仿真,把该软件当成常用工具使用。
二、 实验内容 1.实验步骤(1) 安装multisim 软件,运行multisim 软件,大概了解一下该软件的操作界面和各项菜单、子菜单的功能。
第十一节:同一个按键短按与长按的区别触发
第十一节:同一个按键短按与长按的区别触发开场白:上一节讲了类似电脑键盘组合按键触发的功能,这节要教会大家一个知识点:如何在上一节的基础上,略作修改,就可以实现同一个按键短按与长按的区别触发。
具体内容,请看源代码讲解。
(1)硬件平台:基于朱兆祺51单片机学习板。
用矩阵键盘中的S1和S5号键作为独立按键,记得把输出线P0.4一直输出低电平,模拟独立按键的触发地GND。
(2)实现功能:两个独立按键S1和S5,按住其中一个按键,在短时间内松手,则认为是短按,触发蜂鸣器短鸣一声。
如果一直按住这个按键不松手,那么超过规定的长时间内,则认为是长按,触发蜂鸣器长鸣一声。
(3)源代码讲解如下:#include "REG52.H"#define const_voice_short 20 //蜂鸣器短叫的持续时间#define const_voice_long 140 //蜂鸣器长叫的持续时间/* 注释一:* 调整抖动时间阀值的大小,可以更改按键的触发灵敏度。
* 去抖动的时间本质上等于累计定时中断次数的时间。
*/#define const_key_time_short1 20 //短按的按键去抖动延时的时间#define const_key_time_long1 400 //长按的按键去抖动延时的时间#define const_key_time_short2 20 //短按的按键去抖动延时的时间#define const_key_time_long2 400 //长按的按键去抖动延时的时间void initial_myself();void initial_peripheral();void delay_long(unsigned int uiDelaylong);void T0_time(); //定时中断函数void key_service(); //按键服务的应用程序void key_scan(); //按键扫描函数放在定时中断里sbit key_sr1=P0^0; //对应朱兆祺学习板的S1键sbit key_sr2=P0^1; //对应朱兆祺学习板的S5键sbit key_gnd_dr=P0^4; //模拟独立按键的地GND,因此必须一直输出低电平sbit beep_dr=P2^7; //蜂鸣器的驱动IO口unsigned char ucKeySec=0; //被触发的按键编号unsigned int uiKeyTimeCnt1=0; //按键去抖动延时计数器unsigned char ucKeyLock1=0; //按键触发后自锁的变量标志unsigned char ucShortTouchFlag1=0; //短按的触发标志unsigned int uiKeyTimeCnt2=0; //按键去抖动延时计数器unsigned char ucKeyLock2=0; //按键触发后自锁的变量标志unsigned char ucShortTouchFlag2=0; //短按的触发标志unsigned int uiVoiceCnt=0; //蜂鸣器鸣叫的持续时间计数器void main(){initial_myself();delay_long(100);initial_peripheral();while(1){key_service(); //按键服务的应用程序}}void key_scan()//按键扫描函数放在定时中断里{/* 注释二:* 长按与短按的按键扫描的详细过程:* 第一步:平时只要按键没有被按下时,按键的自锁标志,去抖动延时计数器一直被清零。