完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
一、 实验目的:
(一) 熟悉单片机 I/O 口的输入控制; (二) 熟悉开发板上单片机 I/O 口与数码管、 独立按键的电路连接; (三) 掌握 keil C 软件的使用; (四) 掌握独立按键的应用; (五) 掌握按键的消抖原理。 二、 主要仪器设备及耗材: (一) 电脑一台; (二) 单片机开发板一套。 三、 实验原理 (一) 键盘的分类 键盘分编码键盘和非编码键盘。 键盘上闭合键的识别由专用的硬件编 码器实现, 并产生键编码号或键值的称为编码键盘, 如计算机键盘; 而靠 软件编程来识别的称为非编码键盘。 在单片机组成的各种系统中, 用的最 多的是非编码键盘。 也有用到编码键盘的。 非编码键盘有分为: 独立键盘和行列式(又称为矩阵式) 键盘。 (二) 独立按键 独立按键, 按键一端接地, 另一端与 I/O 引脚相连, 按键按下为低电平, 未按下为高电平, 其电路连接方式如图 3.1 所示。第 11 页 共 58 (三) 按键消抖 按下按键或松手的时候, 单片机 I/O 得到的理想波形与实际波形如图 因此, 按键在闭合和断开时, 触点会存在抖动现象。 1.为什么要消抖? 如图 3.2 所示, 在按键被按下的短暂瞬间, 由于硬件上的抖动, 往往会 产几毫秒的抖动, 在这时候若采集信号, 势必导致误操作, 甚至系统崩溃; 同样, 在释放按键的那一刻, 硬件上会相应的产生抖动, 会产生同样的后 果。 因此, 在模拟或者数字电路中, 我们要避免在最不稳定的时候采集信 号, 进行操作。 2.如何消抖? 一般可以采用延时、 N 次低电平计数、 低通滤波等方式进行消抖。 在单 片机应用中, 一般采用延时进行消抖, 其消抖顺序如下: (1) 检测到信号, 如: if(k0) (2) 延时 5ms, 消抖动, 如: delay(5); (3) 继续检测信号, 确认是否被按下, 如: if(k0) ①是, 则开始等待释放, 如: while(!k); ②否, 则继续检测信号。 四、 实验内容及步骤 (一) 实验内容 利用所学的单片机知识及电路知识编程实现单片机 I/O 口检测按键输 入电平。 1.选中 8 位数码管的其中 1 位数码管, 当独立按键 1 每按下一次, 数码 管加一(按下期间加 1) , 范围为 0—F; 2.选中 8 位数码管的另 1 位数码管, 当独立按键 2 每按下一次, 数码管 减一(松手之后减 1) , 范围为 F—0; 3.按下独立按键 3 期间, 流水灯以 600ms 的速度流动; 4.按下独立按键 4, 松手之后, 8 个 LED 灯作一次花样循环。 注意: 以上 4 个功能需要在同一个程序中完成。 (二) 实验步骤 1.根据电路原理图编写 C 程序, 调试并烧写入单片机; #include /* 1.选中 8 位数码管的其中 1 位数码管, 当独立按键 1 每按下一次, 数码管加一(按下期间加 1) , 范围为 0—F; 2.选中 8 位数码管的另 1 位数码管, 当独立按键 2 每按下一次, 数码管减一(松手之后减 1) , 范围为 F—0; 3.按下独立按键 3 期间, 流水灯以 600ms 的速度流动; 4.按下独立按键 4, 松手之后, 8 个 LED 灯作一次花样循环。 */ #define uint unsigned int ***it a=P2^2; ***it b=P2^3; ***it c=P2^4; #define smg1 c=1;b=1;a=1//选中第一个数码管 #define smg2 c=1;b=1;a=0//选中第二个数码管 char code LED[] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f};//LED流水灯 char code number[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f,0x77, 0x7c, 0x39, 0x7e, 0x79, 0x71};//用于数码管显示0-F code char led[] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xef, 0xdf, 0xbf, 0x7f, //LED花式流水灯 0x7e, 0xbd, 0xdb, 0xe7, 0xdb, 0xdb, 0xe7, 0x7e, 0x00}; char k1_i=0;//用于加法 char k2_i=15;//用于减法 ***it k1 = P3^1; ***it k2 = P3^0; ***it k3 = P3^2; ***it k4 = P3^3; // 延迟函数,单位毫秒 void delay(uint ms) { char i; while(ms--) { for(i=0; i<110; i++); } } void method_1(); //方式一 void method_2(); //方式二 void method_3(); //方式三 void method_4(); //方式四 void main() { while(1) { if(k1==0) { method_1(); } else if(k2==0) { method_2(); } else if(k3==0) { method_3(); } else if(k4==0) { method_4(); } } } void method_1()//选中 8 位数码管的其中 1 位数码管, 当独立按键 1 每按下一次, 数码管加一(按下期间加 1) , 范围为 0—F; { smg1; delay(5); if(k1==0) { P0 = number[k1_i]; while(!k1); k1_i++; if(k1_i == 16) k1_i = 0; } } void method_2()//选中 8 位数码管的另 1 位数码管, 当独立按键 2 每按下一次, 数码管减一(松手之后减 1) , 范围为 F—0; { smg2; delay(5); if(k2==0) { P0 = number[k2_i]; while(!k2); k2_i--; if(k2_i == -1) k2_i = 15; } } void method_3()//按下独立按键 3 期间, 流水灯以 600ms 的速度流动; { char i; delay(5); if(k3==0) { for(i=0; i<8; i++) { while(k3); P2 = LED; delay(600); } } } void method_4()//按下独立按键 4, 松手之后, 8 个 LED 灯作一次花样循环。 { char i; delay(5); if(k4==0) { while(!k4); for(i=0; i<18; i++) { P2 = led; delay(200); } } } 2.观察实验结果, 验证程序是否正确。 五、 思考题: 画图说明矩阵键盘的结构是怎样的? |
|
|
|
只有小组成员才能发言,加入小组>>
2597 浏览 0 评论
794浏览 1评论
241浏览 1评论
559浏览 0评论
305浏览 0评论
518浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-1-25 07:53 , Processed in 0.995264 second(s), Total 47, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号