上一节,我们利用C语言编程单片机仿制了达文西的“古怪手电筒”,达成了“在有光的时候就会亮,在没有光的情况下绝对不会亮!”的目标。

其实在此基础上,C语言还能做些更好玩的东西。例如,制作一个小灯,这个小灯的亮度能够随着环境光线自我调整改变,如下图:

可以看出,当环境光线较强时,LED 小灯的亮度较暗,用塑料板遮住一部分光,使环境光线较暗时,LED 小灯则变亮了。或者稍作修改,也能实现相反的效果:环境光线越强,LED 小灯越亮,环境光线越弱,LED 小灯越暗。

设计能够自我调整亮度的 LED 小灯

和上一节一样,这里计划仍然使用C语言编程 51 单片机实现能够自我调整亮度的 LED 小灯,那么,51 单片机就是负责控制 LED 小灯的亮度的大脑。

使用 51 单片机控制 LED 小灯的亮度,可以参考第三节介绍的“呼吸灯”。

此外,单片机还需要能够感知环境光线的“眼睛”,光敏电阻就非常适合做单片机的眼睛,因为光敏电阻的阻值会随着照射在其上的光照强度改变而改变:

这样一来,我们可以将光敏电阻串入电路,再利用 51 单片机的 ADC 功能采集电阻两端的电压值。

因为光敏电阻的阻值随着环境光照改变,电阻两端的电压值也会随着环境光照改变,所以单片机就能够通过ADC模块采样值变化,获取环境光照情况。

让单片机“看到”环境光线

先来实现单片机的“眼睛”,即单片机的 ADC 模块。ADC的初始化是简单的,请看C语言代码如下:

void adc_init(){ P1ASF = 0x01;  ADC_RES = 0; ADC_CONTR = ADC_POWER|ADC_SPEEDLL; delay_about_100ms(2);}

P1ASF = 0x01;表示将ADC的通道0打开,也即使用单片机的 P1.0 作为 ADC 输入口。获取一次 ADC 采样值的C语言代码如下:

// 获取 10 位 adcWORD get_adc_res(BYTE ch){ WORD res = 0; res = get_adc_h8bit(ch); res <<= 2; res |= ADC_LOW2; return res;}

能够看出,因为 51 单片机是 8 位的单片机,所以若想采集 10 位的 ADC 值,需要两次组合。

这里的ADC相关代码比较简要,详细介绍可参考第9节文章。

使单片机具有控制 LED 小灯发光强度的能力

现在单片机能够“看到”环境光线强度了,再来看看单片机如何控制 LED 小灯的亮度。在第 3 节介绍“呼吸灯”时提到,可以控制一个周期内LED 小灯的亮灭持续时间长短,来实现控制 LED 小灯的亮度,核心 C 语言代码如下:

void delay(unsigned int n){ unsigned int x; while(n--){ x = 50; while(x--); }}void twinkle_once(unsigned char darkTime){ P20 = 0; delay(100-darkTime); P20 = 1; delay(darkTime);}

这里使用单片机的 P2.0 口控制 LED 小灯的发光周期。“呼吸灯”的C语言程序的设计思路是不断修改 darkTime 的值,使 LED 小灯亮暗逐渐缓慢变化。如果只是想实现控制 LED 小灯的亮度,可以将 twinkle_once() 函数放入 while 循环,通过修改传递给它的参数值来控制 LED 小灯的亮度。

C语言编程单片机,实现能够自我调整亮度的 LED 小灯

现在单片机既能“看到”环境光线,又能控制 LED 小灯的发光亮度了,现在将二者组合,使单片机能够根据环境光线的强度,自主改变 LED 小灯的发光强度。请看C语言代码如下:

void main(){ float vol; int dark_time = 0; adc_init(); while(1){ vol = 5.0*((float)get_adc_res(0))/1024.0; dark_time = (char)(110.0 *(vol/5.0)); if(dark_time>100) dark_time = 100; twinkle_once(dark_time) ; }}

以上C语言代码还是非常简单的,因为ADC采集的电压值 vol 介于 0~5V 之间,并且会随着环境光线的改变而改变。

dark_time 的最大值本应该是 100,但是 LED 小灯的发光强度与 dark_time 并不是线性的关系,这里为了获得更佳的效果,让最大值等于 110 了。

现在编译 C语言程序并烧写到单片机,会发现我们的设计成功了!当环境光线较强时,LED 小灯的亮度较暗,用塑料板遮住一部分光,使环境光线较暗时,LED 小灯则变亮了。

思考

本节介绍的能够自主根据环境光线强弱调整自己亮度的 LED 小灯,在某种程度上已经算是比较“智能”的小灯了,加上适当的调整,还能实现超过一定的亮度就关闭小灯,这就很有用了:黑夜里小灯较亮,能够照明环境,当天慢慢变亮时,灯就无需太亮,因为人们还可以借助自然光看清周围环境。当天大亮时,就不再需要小灯发光了,因此小灯就被自主关闭了。

通过这一节也能看出,传感器(如本节的光敏电阻)真的是“智能机器”的基础,离开传感器,中央处理器就很难感知环境参数的变化,也就很难做出自我调整了。

欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦。

c语言delay_利用C语言编程单片机,制作可以根据环境光照调整亮度的智能灯相关推荐

  1. 体重计c语言程序,利用MSP430F149和HX711模块制作体重秤?

    已结贴√ 问题点数:20 回复次数:1 利用MSP430F149和HX711模块制作体重秤? 以下代码是我从另一个论坛大拿那里看来的,如何改动才能只保留数码管显示体重呢?不需要蓝牙模块等等.救救毕设做 ...

  2. 单片机c语言数字计数程序,如何使用单片机制作一个手动计数器

    1.实验任务 利用AT89S51单片机来制作一个手动计数器,在AT89S51单片机的P3.7管脚接一个轻触开关,作为手动计数的按钮,用单片机的P2.0-P2.7接一个共阴数码管,作为00-99计数的个 ...

  3. clustMD r语言_利用R语言实现微阵列数据分析-聚类分析

    原文见:http://www.biostat.ucsf.edu/jean/Presentation/IMSLAB.pdf 为了方便大家学习,我将该文翻译成中文加上一些相关的简单介绍,经验尚浅,还请大家 ...

  4. c语言两位数码管程序,单片机制作—两位数码管显示 c语言 汇编程序+电路图

    程序清单(汇编): ;2011 04 05 D:\DPJ\数码管段显\数码管段显2.asm S0 BIT P3.7 ORG 00H AJMP MAIN ORG 0BH AJMP T0INT ORG 3 ...

  5. 硬件描述语言与c语言函数,计算机硬件描述语言(VHDL)与编程语言(C语言)的区别及关系,...

    计算机硬件描述语言(VHDL)与编程语言(C语言)的区别及关系,以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 计算机硬 ...

  6. 学单片机需要多少C语言基础,C语言单片机编程教程

    很多学员和朋友经常找我给他们推荐C语言的书,他们可能想和我当年一样,闷头大干一场,学个几个月的C语言,把C语言吃透,再开始单片机程序开发! 别!别!别! 大家千万别这么干,我当年自学了3个月的C语言, ...

  7. c语言编程能控制热风炉,利用C语言设计热风炉悬链线拱顶研究.pdf

    j|il ll_ ll梅 诋 融 技 j 萎 |.每薯tj n叠宣鞲s瓿 利用C语言设计热风炉悬链线拱顶 鄢 明 吴建霖 冯 飞 (柳钢设计院) 摘 要 :介绍 了利用 C语言求解两段 圆弧拟合悬链线 ...

  8. at89c2051 定时器用法 c语言编程资料,用AT89C2051单片机制作的数字电容表.doc

    用AT89C2051单片机制作的数字电容表 用AT89C2051单片机制作的数字电容表 吴汉清 AT89C2051作为AT89C51的简化版虽然去掉了P0.P2等端口,使I/O口减少了,但是却增加了一 ...

  9. 利用Python语言编程,完成猜数游戏,系统随机产生一个1到100的数字num1,用户输入一个数字guess,如果没有猜对,根据系统给出的提示重新猜数,直到才对为止。

    利用Python语言编程,完成猜数游戏,系统随机产生一个1到100的数字num1,用户输入一个数字guess,如果没有猜对,根据系统给出的提示重新猜数,直到才对为止. 要求:(1)系统每次都要给出新的 ...

最新文章

  1. PLUICameraViewController 拍照页面崩溃
  2. EOS净流入超3亿,比特币继续震荡盘整
  3. 使用Dockerfile构建SpringBoot应用镜像
  4. A good debug parameter - sap-ds-debug=true
  5. git入门与实践【转】
  6. 黑科技抗疫,Python 开发者大集结!
  7. fastreport按条件查询_查询代价的
  8. python算法基础教程_Python程序设计与算法基础教程(第2版)-微课版
  9. 解决idea工具下tomcat中文乱码问题
  10. 使命、愿景、价值观到底有什么区别
  11. 我们所知道的压电材料参数及压电方程式ZJ-3型压电测试仪
  12. matlab相关性分析(皮尔逊,肯德尔,斯皮尔曼)
  13. 中公教育python教师_为什么中公教育、华图的老师不自己去考公务员?
  14. 服务器连接数据库mysql
  15. 数据分析——R语言中ggplot2用法(1)
  16. cf edu #132 Div.2
  17. 前端js获取系统更新刷新页面
  18. html支付选择银行卡,JQ电脑手机通用银行选择下拉框 提现银行卡绑定
  19. 教你如何赚钱-白手起家项目
  20. 【Houdini Vex】代码高亮、可查看帮助文档的编辑器Sublime_Text

热门文章

  1. android wheelview 字体颜色,百行代码实现Android WheelView
  2. 手把手教你将pyqt程序打包成exe(1)
  3. LD(Levenshtein distance)莱文斯坦距离----编辑距离
  4. 7张图揭晓RocketMQ存储设计的精髓
  5. 【2021云边协同大会】阿里云周哲畅聊边缘云基础设施创新发展及场景化实践
  6. Serverless在游戏运营行业进行数据采集分析的最佳实践 链接:
  7. php mysql 字段备注_MySQL下读取 表/字段 的说明备注信息
  8. Cocos2d-x 寻路算法解析(二): 离目的地的距离优先
  9. 剑与远征的最新公告,玩家能获得什么?除了资源,体验怎么样?
  10. MySQL用中间件ProxySQL实现读写分离和主节点故障应用无感应