找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5733|回复: 17
收起左侧

光强控制LED灯亮度_单片机源程序&仿真工程

  [复制链接]
ID:163705 发表于 2018-2-28 08:26 | 显示全部楼层 |阅读模式
光强控制LED灯亮度_程序&仿真
可配合人体传感器判断室内是否有人并根据环境光自动调整LED灯亮度

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

单片机源程序如下:

  1. #include<reg51.h>

  2. #define  WRITEADDR 0x90
  3. #define  READADDR  0x91

  4. #define  uchar unsigned char;
  5. #define  uint unsigned int;

  6. sbit HR=P3^7;

  7. sbit SCL=P2^1;
  8. sbit SDA=P2^0;

  9. void Delay10us();
  10. void I2cStart();
  11. void I2cStop();
  12. unsigned char I2cSendByte(unsigned char dat);
  13. unsigned char I2cReadByte();

  14. void Pcf8591SendByte(unsigned char channel);
  15. unsigned char Pcf8591ReadByte();
  16. void Pcf8591DaConversion(unsigned char value);

  17. void main()
  18. {
  19.         unsigned long int adNum[5];

  20.         while(1)
  21.         {                       
  22.                 if(HR==1)
  23.         {
  24.             Pcf8591SendByte(0);        //选择AD转换通道   
  25.                     adNum[0]=        Pcf8591ReadByte()*2;    //获取AD值
  26.    
  27.                     //--DA输出--//
  28.                     adNum[4]=adNum[0];
  29.                     Pcf8591DaConversion(adNum[4]/2); //DAC          数模转换
  30.         }
  31.         else
  32.         {
  33.                     Pcf8591DaConversion(0); //DAC        0  数模转换
  34.         }
  35.         }
  36.                                  
  37. }

  38. void Pcf8591SendByte(unsigned char channel)
  39. {       
  40.         I2cStart();
  41.         I2cSendByte(WRITEADDR);//发送写器件地址
  42.         I2cSendByte(0x40|channel);//发送控制寄存器
  43.         I2cStop();
  44. }

  45. unsigned char Pcf8591ReadByte()
  46. {
  47.         unsigned char dat;
  48.         I2cStart();
  49.         I2cSendByte(READADDR);//发送读器件地址
  50.         dat=I2cReadByte();//读取数据
  51.         I2cStop();          //结束总线
  52.   return dat;
  53. }

  54. void Pcf8591DaConversion(unsigned char value)
  55. {
  56.         I2cStart();
  57.         I2cSendByte(WRITEADDR);//发送写器件地址
  58.         I2cSendByte(0x40);//开启DA写到控制寄存器
  59.         I2cSendByte(value);//发送转换数值
  60.         I2cStop();       
  61. }

  62. /*******************************************************************************
  63. * 函数名         : Delay1us()
  64. * 函数功能                   : 延时
  65. * 输入           : 无
  66. * 输出                  : 无
  67. *******************************************************************************/

  68. void Delay10us()
  69. {
  70.         unsigned char a,b;
  71.         for(b=1;b>0;b--)
  72.                 for(a=2;a>0;a--);

  73. }
  74. /*******************************************************************************
  75. * 函数名         : I2cStart()
  76. * 函数功能                   : 起始信号:在SCL时钟信号在高电平期间SDA信号产生一个下降沿
  77. * 输入           : 无
  78. * 输出                  : 无
  79. * 备注           : 起始之后SDA和SCL都为0
  80. *******************************************************************************/

  81. void I2cStart()
  82. {
  83.         SDA=1;
  84.         Delay10us();
  85.         SCL=1;
  86.         Delay10us();//建立时间是SDA保持时间>4.7us
  87.         SDA=0;
  88.         Delay10us();//保持时间是>4us
  89.         SCL=0;                       
  90.         Delay10us();               
  91. }
  92. /*******************************************************************************
  93. * 函数名         : I2cStop()
  94. * 函数功能                   : 终止信号:在SCL时钟信号高电平期间SDA信号产生一个上升沿
  95. * 输入           : 无
  96. * 输出                  : 无
  97. * 备注           : 结束之后保持SDA和SCL都为1;表示总线空闲
  98. *******************************************************************************/

  99. void I2cStop()
  100. {
  101.         SDA=0;
  102.         Delay10us();
  103.         SCL=1;
  104.         Delay10us();//建立时间大于4.7us
  105.         SDA=1;
  106.         Delay10us();               
  107. }
  108. /*******************************************************************************
  109. * 函数名         : I2cSendByte(unsigned char num)
  110. * 函数功能                   : 通过I2C发送一个字节。在SCL时钟信号高电平期间,保持发送信号SDA保持稳定
  111. * 输入           : num
  112. * 输出                  : 0或1。发送成功返回1,发送失败返回0
  113. * 备注           : 发送完一个字节SCL=0
  114. *******************************************************************************/

  115. unsigned char I2cSendByte(unsigned char dat)
  116. {
  117.         unsigned char a=0,b=0;//最大255,一个机器周期为1us,最大延时255us。               
  118.         for(a=0;a<8;a++)//要发送8位,从最高位开始
  119.         {
  120.                 SDA=dat>>7;         //起始信号之后SCL=0,所以可以直接改变SDA信号
  121.                 dat=dat<<1;
  122.                 Delay10us();
  123.                 SCL=1;
  124.                 Delay10us();//建立时间>4.7us
  125.                 SCL=0;
  126.                 Delay10us();//时间大于4us               
  127.         }
  128.         SDA=1;
  129.         Delay10us();
  130.         SCL=1;
  131.         while(SDA)//等待应答,也就是等待从设备把SDA拉低
  132.         {
  133.                 b++;
  134.                 if(b>200)         //如果超过200us没有应答发送失败,或者为非应答,表示接收结束
  135.                 {
  136.                         SCL=0;
  137.                         Delay10us();
  138.                         return 0;
  139.                 }
  140.         }
  141.         SCL=0;
  142.         Delay10us();
  143.         return 1;               
  144. }
  145. /*******************************************************************************
  146. * 函数名         : I2cReadByte()
  147. * 函数功能                   : 使用I2c读取一个字节
  148. * 输入           : 无
  149. * 输出                  : dat
  150. * 备注           : 接收完一个字节SCL=0
  151. ……………………

  152. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
0.png

所有资料51hei提供下载:
光强控制LED灯亮度_程序&amp;仿真.zip (423.37 KB, 下载次数: 193)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:288202 发表于 2018-3-22 15:05 | 显示全部楼层
为什么我下载下来的东西打不开的?!浪费我一个又一个的黑币
回复

使用道具 举报

ID:1 发表于 2018-3-22 15:12 | 显示全部楼层
小白帆 发表于 2018-3-22 14:05
为什么我下载了却打不开呢?浪费我的黑币

因为这个文件名里面有特殊字符,你下载后要改名才能打开 改为.zip文件
回复

使用道具 举报

ID:288202 发表于 2018-3-22 15:20 | 显示全部楼层
admin 发表于 2018-3-22 15:12
因为这个文件名里面有特殊字符,你下载后要改名才能打开 改为.zip文件

非常感谢您的解答,您的方法可行,开心
回复

使用道具 举报

ID:288202 发表于 2018-3-22 16:29 | 显示全部楼层
谢谢楼主的资料,对小白我来说很有用,这段时间一直找这样的资料。
但是我之前参考这个链接:
http://www.51hei.com/bbs/dpj-80134-1.html
为实现通过按键的方式控制LED的亮度,但是这个和我想要的效果有误差,就是在控制LED亮度的时候,它会出现闪烁的现象,正常情况是不能出现闪烁的,然而我想了很久都没有解决,不知能否请楼主帮忙解决?谢谢!

评分

参与人数 1黑币 +40 收起 理由
admin + 40

查看全部评分

回复

使用道具 举报

ID:288202 发表于 2018-3-22 16:51 | 显示全部楼层
应该是这个链接:http://blog.163.com/asm_c/blog/static/2482031132012716860918/
之前那个链接我的测试中是存在问题的,也问过那个的楼主
回复

使用道具 举报

ID:163705 发表于 2018-3-23 10:00 | 显示全部楼层
小白帆 发表于 2018-3-22 16:29
谢谢楼主的资料,对小白我来说很有用,这段时间一直找这样的资料。
但是我之前参考这个链接:
http://www ...

DAC输出控制LED亮度在仿真中不会有闪烁现象,如果是PWM调光,在仿真中运行会闪烁是正常现象,只要PWM频率够高,实物运行不会闪烁
回复

使用道具 举报

ID:163705 发表于 2018-3-23 10:01 | 显示全部楼层
小白帆 发表于 2018-3-22 16:29
谢谢楼主的资料,对小白我来说很有用,这段时间一直找这样的资料。
但是我之前参考这个链接:
http://www ...

PWM调光要想在仿真中看起来不闪烁可以加滤波电容
回复

使用道具 举报

ID:288202 发表于 2018-3-26 15:54 | 显示全部楼层
854100995 发表于 2018-3-23 10:01
PWM调光要想在仿真中看起来不闪烁可以加滤波电容

链接:http://blog.163.com/asm_c/blog/static/2482031132012716860918/
下的C6电容是电解电容,和D1并联,不就相当于起到滤波的作用吗?但是在数码管的值未达到一定值时,D1是会出现闪烁的现象的。
回复

使用道具 举报

ID:288202 发表于 2018-3-26 15:56 | 显示全部楼层
854100995 发表于 2018-3-23 10:00
DAC输出控制LED亮度在仿真中不会有闪烁现象,如果是PWM调光,在仿真中运行会闪烁是正常现象,只要PWM频率 ...

pwm调光在频率不够高时,实物运行也不会闪烁吗?(抱歉,因为最近都不在学校,身边没有实物,无法测试)
回复

使用道具 举报

ID:249455 发表于 2018-5-28 22:58 | 显示全部楼层
为什么下载下载下来的是文本文档
回复

使用道具 举报

ID:456618 发表于 2018-12-28 16:38 | 显示全部楼层
飞哥无敌 发表于 2018-5-28 22:58
为什么下载下载下来的是文本文档

把文件名后缀加一个.zip
回复

使用道具 举报

ID:456618 发表于 2018-12-28 16:43 | 显示全部楼层
感谢楼主,让小白的我可以多多学习
回复

使用道具 举报

ID:454000 发表于 2018-12-28 17:01 | 显示全部楼层
辛苦了!再接再厉!

评分

参与人数 2黑币 +50 收起 理由
找人PK + 15
yoxi + 35

查看全部评分

回复

使用道具 举报

ID:457488 发表于 2018-12-28 17:24 | 显示全部楼层
不错,赞一个
回复

使用道具 举报

ID:356526 发表于 2018-12-28 20:05 | 显示全部楼层
很不错,顶一个
回复

使用道具 举报

ID:311125 发表于 2019-3-25 09:49 | 显示全部楼层
下载下来,先学习一下!谢谢!
回复

使用道具 举报

ID:580497 发表于 2019-7-9 10:09 | 显示全部楼层
大佬,仿真文件打不开
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表