完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
7.震动触发LED亮
震动开关(震动传感器) 工作原理 弹簧开关,其内部由一根中心金属导电脚和环绕在其外部的弹簧导电脚组成。弹簧震动时会接触到中心导电脚,形成短路闭合状态; 滚珠开关,其内部包含有一颗金属滚珠,当震动时滚珠滚动短路两个导电脚,形成短路闭合状态。 中断触发: 在程序的运行中,我们时常需要监控一些事件的发生,比如对某一传感器的返回数据进行解析。使用轮询的方式检测,效率比较低,而且随着程序功能增加,轮询到指定功能时需要等待的时间变长。而使用中断方式检测,可以到达实时检测的效果。 中断程序可以看作是一段独立于主程序之外的程序,当中断触发时,控制器会暂停当前正在运行的主程序,而跳转去运行中断程序,中断程序运行完后,会再回到之前主程序暂停的位置,继续运行主程序。如此便可做到实时响应处理事件的效果。 ①如下进行连接 ②代码如下 int SensorLED = 9; //定义LED为数字引脚9 int SensorINPUT = 2; //连接震动开关到中断0,也就是数字引脚2 char state = LOW; void setup() { pinMode(SensorLED, OUTPUT); //LED为输出模式 pinMode(SensorINPUT, INPUT_PULLUP); //震动开关为输入模式 //下降沿触发,触发中断0,调用blink函数 attachInterrupt(0, blink, FALLING); } void loop() { if (state == HIGH) { // 如果state为HIGH state = LOW; digitalWrite(SensorLED, HIGH); // 亮灯 delay(500); //延时500ms } else { digitalWrite(SensorLED, LOW); // 否则,关灯 } } void blink() { //中断函数blink() state = !state; //一旦中断触发,state状态反转 } ③解释说明 触发震动LED变亮 当触发震动时,与LED并联的线路,也就是震动触发器那条路,发生短路,导致LED熄灭 一旦发生下降沿中断,那么不论在loop()函数中执行到哪里,都需要执行中断执行函数(这里是blink()) attachInterrupt() attachInterrupt(interrupt, ISR, mode) 外部中断配置函数。 参数: interrupt: 中断号。不同Arduino开发板中断号不同。Uno R3有两个外部中断,分别为数字管脚2(中断0)和数字管脚3(中断1)。 ISR: 中断处理函数。此函数不带参数,没有返回值。 mode: 中断触发方式。 LOW: 低电平触发。 CHANGE:管脚状态改变触发。 RISING:上升沿触发。 FALLING:下降沿触发。 8.将数码管点亮 数码管 ①如下连接 ②代码如下 //设置控制各段的数字IO脚,具体几号引脚对应哪一段,来源为数码管官方引脚图。 int pin_a = 7; int pin_b = 6; int pin_c = 5; int pin_d = 10; int pin_e = 11; int pin_f = 8; int pin_g = 9; int pin_p = 4; //根据共阴极数码管段码表定义0~9显示的各段开关状态 int numTable[10][8] = { //1为点亮,0为关闭 //a b c d e f g dp {1, 1, 1, 1, 1, 1, 0, 0}, //0 {0, 1, 1, 0, 0, 0, 0, 0}, //1 {1, 1, 0, 1, 1, 0, 1, 0}, //2 {1, 1, 1, 1, 0, 0, 1, 0}, //3 {0, 1, 1, 0, 0, 1, 1, 0}, //4 {1, 0, 1, 1, 0, 1, 1, 0}, //5 {1, 0, 1, 1, 1, 1, 1, 0}, //6 {1, 1, 1, 0, 0, 0, 0, 0}, //7 {1, 1, 1, 1, 1, 1, 1, 0}, //8 {1, 1, 1, 1, 0, 1, 1, 0}, //9 }; void setup() { for (int i = 4; i <= 11; i++) { pinMode(i, OUTPUT); //设置4~11引脚为输出模式 } } void loop() { for (int i = 0; i < 10; i++)//以此显示数字0到9 { digitalWrite(pin_a, numTable[0]); //设置a 引脚的电平 digitalWrite(pin_b, numTable[1]); //设置b 引脚的电平 digitalWrite(pin_c, numTable[2]); //设置c 引脚的电平 digitalWrite(pin_d, numTable[3]); //设置d 引脚的电平 digitalWrite(pin_e, numTable[4]); //设置e 引脚的电平 digitalWrite(pin_f, numTable[5]); //设置f 引脚的电平 digitalWrite(pin_g, numTable[6]); //设置g 引脚的电平 digitalWrite(pin_p, numTable[7]); //设置dp引脚的电平 delay(1000); } } ③解释说明 循环输出0-9,i是几输出的就是几 9.随机数字 ①如下图连接 ②代码如下 /* Random 通过Random随机显示0到9的数字 */ //设置控制各段的数字IO脚,具体几号引脚对应哪一段,来源为数码管官方引脚图。 int pin_a = 7; int pin_b = 6; int pin_c = 5; int pin_d = 10; int pin_e = 11; int pin_f = 8; int pin_g = 9; int pin_p = 4; int num; //根据共阴极数码管段码表定义0~9显示的各段开关状态 int numTable[10][8] = { //1为点亮,0为关闭 //a b c d e f g dp {1, 1, 1, 1, 1, 1, 0, 0}, //0 {0, 1, 1, 0, 0, 0, 0, 0}, //1 {1, 1, 0, 1, 1, 0, 1, 0}, //2 {1, 1, 1, 1, 0, 0, 1, 0}, //3 {0, 1, 1, 0, 0, 1, 1, 0}, //4 {1, 0, 1, 1, 0, 1, 1, 0}, //5 {1, 0, 1, 1, 1, 1, 1, 0}, //6 {1, 1, 1, 0, 0, 0, 0, 0}, //7 {1, 1, 1, 1, 1, 1, 1, 0}, //8 {1, 1, 1, 1, 0, 1, 1, 0}, //9 }; void setup() { for (int i = 4; i <= 11; i++) { pinMode(i, OUTPUT); //设置4~11引脚为输出模式 } randomSeed(analogRead(0)); } //根据索引显示数字 void showNum(int index) { digitalWrite(pin_a, numTable[index][0]); //设置a 引脚的电平 digitalWrite(pin_b, numTable[index][1]); //设置b 引脚的电平 digitalWrite(pin_c, numTable[index][2]); //设置c 引脚的电平 digitalWrite(pin_d, numTable[index][3]); //设置d 引脚的电平 digitalWrite(pin_e, numTable[index][4]); //设置e 引脚的电平 digitalWrite(pin_f, numTable[index][5]); //设置f 引脚的电平 digitalWrite(pin_g, numTable[index][6]); //设置g 引脚的电平 digitalWrite(pin_p, numTable[index][7]); //设置dp引脚的电平 } void loop() { num = random(10); //产生随机数 showNum(num); //显示随机数 delay(5000); } ③解释说明 将数字显示作为一个函数,通过random获取函数参数,获取一个随机数,然后调用函数进行显示 10.数码管库的使用 首先进行库的导入,可以进入下面链接查看 https://www.jianshu.com/p/3dbb529bde27 ①如下图连接 ②代码如下 /* * SevSeg * 使用数码管库驱动数码管,根据A0模拟输入显示对应数字 */ #include "SevSeg.h" SevSeg sevseg; byte numDigits = 1; //数码管位数 byte digitPins[] = {3, 2, 2, 2}; //数码管公共极连接Arduino的引脚 byte segmentPins[] = {7, 6, 5, 10, 11, 8, 9, 4}; //数码管a,b,c,d,e,f,g,dp对应引脚 byte hardwareConfig = COMMON_CATHODE ; // 共阴极数码管 int readValue = 0; //保存读到的模拟值 int showValue = 0; //需要显示的数据 void setup() { sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins); //初始化数码管 } void loop() { readValue = analogRead(A0); //读取A0模拟口的数值(0-5V 对应0-1023取值) showValue = map(readValue, 0, 1023, 0, 9); //将0-1023之间的数据映射成0到9之间的数据 sevseg.setNumber(showValue, 1); //数码管显示 sevseg.refreshDisplay(); // 必须重复运行刷新数码管显示 } ③解释说明 sevsrg() sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins) 初始化数码管 参数: hardwareConfig:使用的是共阳极数码管还是共阴极数码管。 COMMON_CATHODE:共阴极。 COMMON_ANODE:共阳极。 numDigits:数码管位数,我们这里使用的是一位数码管,故其值设置为1。 digitPins:数组形式,用来存储数码管公共极连接的引脚号。此库多用来驱动四位数码管,本实验中只用一位,故数组第一个成员为3(对应实际电路连接),其他成员填入未使用的引脚即可。 segmentPins:数组形式,用来存储数码管从a到g所对应连接的引脚号。 sevseg.setNumber(numToShow, decPlaces) 数码管显示 参数: numToShow:要显示的数据,可以为整数、浮点数。 decPlaces:小数点显示的位置,从最低有效位开始计算,若省略或者设置为-1则表示不显示小数点。 sevseg.refreshDisplay() 刷新数码管 此函数需要不断重复执行,反复刷新才能使数码管显示。若程序中有其他延时则会对显示产生影响。 |
|
|
|
只有小组成员才能发言,加入小组>>
3309 浏览 9 评论
2988 浏览 16 评论
3490 浏览 1 评论
9050 浏览 16 评论
4085 浏览 18 评论
1169浏览 3评论
602浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
594浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2331浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1894浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-19 23:09 , Processed in 1.123241 second(s), Total 79, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号