找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 6709|回復(fù): 17
打印 上一主題 下一主題
收起左側(cè)

光強(qiáng)控制LED燈亮度_單片機(jī)源程序&仿真工程

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:163705 發(fā)表于 2018-2-28 08:26 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
光強(qiáng)控制LED燈亮度_程序&仿真
可配合人體傳感器判斷室內(nèi)是否有人并根據(jù)環(huán)境光自動(dòng)調(diào)整LED燈亮度

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

單片機(jī)源程序如下:

  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轉(zhuǎn)換通道   
  25.                     adNum[0]=        Pcf8591ReadByte()*2;    //獲取AD值
  26.    
  27.                     //--DA輸出--//
  28.                     adNum[4]=adNum[0];
  29.                     Pcf8591DaConversion(adNum[4]/2); //DAC          數(shù)模轉(zhuǎn)換
  30.         }
  31.         else
  32.         {
  33.                     Pcf8591DaConversion(0); //DAC        0  數(shù)模轉(zhuǎn)換
  34.         }
  35.         }
  36.                                  
  37. }

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

  45. unsigned char Pcf8591ReadByte()
  46. {
  47.         unsigned char dat;
  48.         I2cStart();
  49.         I2cSendByte(READADDR);//發(fā)送讀器件地址
  50.         dat=I2cReadByte();//讀取數(shù)據(jù)
  51.         I2cStop();          //結(jié)束總線
  52.   return dat;
  53. }

  54. void Pcf8591DaConversion(unsigned char value)
  55. {
  56.         I2cStart();
  57.         I2cSendByte(WRITEADDR);//發(fā)送寫(xiě)器件地址
  58.         I2cSendByte(0x40);//開(kāi)啟DA寫(xiě)到控制寄存器
  59.         I2cSendByte(value);//發(fā)送轉(zhuǎn)換數(shù)值
  60.         I2cStop();       
  61. }

  62. /*******************************************************************************
  63. * 函數(shù)名         : Delay1us()
  64. * 函數(shù)功能                   : 延時(shí)
  65. * 輸入           : 無(wú)
  66. * 輸出                  : 無(wú)
  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. * 函數(shù)名         : I2cStart()
  76. * 函數(shù)功能                   : 起始信號(hào):在SCL時(shí)鐘信號(hào)在高電平期間SDA信號(hào)產(chǎn)生一個(gè)下降沿
  77. * 輸入           : 無(wú)
  78. * 輸出                  : 無(wú)
  79. * 備注           : 起始之后SDA和SCL都為0
  80. *******************************************************************************/

  81. void I2cStart()
  82. {
  83.         SDA=1;
  84.         Delay10us();
  85.         SCL=1;
  86.         Delay10us();//建立時(shí)間是SDA保持時(shí)間>4.7us
  87.         SDA=0;
  88.         Delay10us();//保持時(shí)間是>4us
  89.         SCL=0;                       
  90.         Delay10us();               
  91. }
  92. /*******************************************************************************
  93. * 函數(shù)名         : I2cStop()
  94. * 函數(shù)功能                   : 終止信號(hào):在SCL時(shí)鐘信號(hào)高電平期間SDA信號(hào)產(chǎn)生一個(gè)上升沿
  95. * 輸入           : 無(wú)
  96. * 輸出                  : 無(wú)
  97. * 備注           : 結(jié)束之后保持SDA和SCL都為1;表示總線空閑
  98. *******************************************************************************/

  99. void I2cStop()
  100. {
  101.         SDA=0;
  102.         Delay10us();
  103.         SCL=1;
  104.         Delay10us();//建立時(shí)間大于4.7us
  105.         SDA=1;
  106.         Delay10us();               
  107. }
  108. /*******************************************************************************
  109. * 函數(shù)名         : I2cSendByte(unsigned char num)
  110. * 函數(shù)功能                   : 通過(guò)I2C發(fā)送一個(gè)字節(jié)。在SCL時(shí)鐘信號(hào)高電平期間,保持發(fā)送信號(hào)SDA保持穩(wěn)定
  111. * 輸入           : num
  112. * 輸出                  : 0或1。發(fā)送成功返回1,發(fā)送失敗返回0
  113. * 備注           : 發(fā)送完一個(gè)字節(jié)SCL=0
  114. *******************************************************************************/

  115. unsigned char I2cSendByte(unsigned char dat)
  116. {
  117.         unsigned char a=0,b=0;//最大255,一個(gè)機(jī)器周期為1us,最大延時(shí)255us。               
  118.         for(a=0;a<8;a++)//要發(fā)送8位,從最高位開(kāi)始
  119.         {
  120.                 SDA=dat>>7;         //起始信號(hào)之后SCL=0,所以可以直接改變SDA信號(hào)
  121.                 dat=dat<<1;
  122.                 Delay10us();
  123.                 SCL=1;
  124.                 Delay10us();//建立時(shí)間>4.7us
  125.                 SCL=0;
  126.                 Delay10us();//時(shí)間大于4us               
  127.         }
  128.         SDA=1;
  129.         Delay10us();
  130.         SCL=1;
  131.         while(SDA)//等待應(yīng)答,也就是等待從設(shè)備把SDA拉低
  132.         {
  133.                 b++;
  134.                 if(b>200)         //如果超過(guò)200us沒(méi)有應(yīng)答發(fā)送失敗,或者為非應(yīng)答,表示接收結(jié)束
  135.                 {
  136.                         SCL=0;
  137.                         Delay10us();
  138.                         return 0;
  139.                 }
  140.         }
  141.         SCL=0;
  142.         Delay10us();
  143.         return 1;               
  144. }
  145. /*******************************************************************************
  146. * 函數(shù)名         : I2cReadByte()
  147. * 函數(shù)功能                   : 使用I2c讀取一個(gè)字節(jié)
  148. * 輸入           : 無(wú)
  149. * 輸出                  : dat
  150. * 備注           : 接收完一個(gè)字節(jié)SCL=0
  151. ……………………

  152. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
光強(qiáng)控制LED燈亮度_程序&amp;仿真.zip (423.37 KB, 下載次數(shù): 194)



評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:288202 發(fā)表于 2018-3-22 15:05 | 只看該作者
為什么我下載下來(lái)的東西打不開(kāi)的?!浪費(fèi)我一個(gè)又一個(gè)的黑幣
回復(fù)

使用道具 舉報(bào)

板凳
ID:1 發(fā)表于 2018-3-22 15:12 | 只看該作者
小白帆 發(fā)表于 2018-3-22 14:05
為什么我下載了卻打不開(kāi)呢?浪費(fèi)我的黑幣

因?yàn)檫@個(gè)文件名里面有特殊字符,你下載后要改名才能打開(kāi) 改為.zip文件
回復(fù)

使用道具 舉報(bào)

地板
ID:288202 發(fā)表于 2018-3-22 15:20 | 只看該作者
admin 發(fā)表于 2018-3-22 15:12
因?yàn)檫@個(gè)文件名里面有特殊字符,你下載后要改名才能打開(kāi) 改為.zip文件

非常感謝您的解答,您的方法可行,開(kāi)心
回復(fù)

使用道具 舉報(bào)

5#
ID:288202 發(fā)表于 2018-3-22 16:29 | 只看該作者
謝謝樓主的資料,對(duì)小白我來(lái)說(shuō)很有用,這段時(shí)間一直找這樣的資料。
但是我之前參考這個(gè)鏈接:
http://www.torrancerestoration.com/bbs/dpj-80134-1.html
為實(shí)現(xiàn)通過(guò)按鍵的方式控制LED的亮度,但是這個(gè)和我想要的效果有誤差,就是在控制LED亮度的時(shí)候,它會(huì)出現(xiàn)閃爍的現(xiàn)象,正常情況是不能出現(xiàn)閃爍的,然而我想了很久都沒(méi)有解決,不知能否請(qǐng)樓主幫忙解決?謝謝!

評(píng)分

參與人數(shù) 1黑幣 +40 收起 理由
admin + 40

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

6#
ID:288202 發(fā)表于 2018-3-22 16:51 | 只看該作者
應(yīng)該是這個(gè)鏈接:http://blog.163.com/asm_c/blog/static/2482031132012716860918/
之前那個(gè)鏈接我的測(cè)試中是存在問(wèn)題的,也問(wèn)過(guò)那個(gè)的樓主
回復(fù)

使用道具 舉報(bào)

7#
ID:163705 發(fā)表于 2018-3-23 10:00 | 只看該作者
小白帆 發(fā)表于 2018-3-22 16:29
謝謝樓主的資料,對(duì)小白我來(lái)說(shuō)很有用,這段時(shí)間一直找這樣的資料。
但是我之前參考這個(gè)鏈接:
http://www ...

DAC輸出控制LED亮度在仿真中不會(huì)有閃爍現(xiàn)象,如果是PWM調(diào)光,在仿真中運(yùn)行會(huì)閃爍是正,F(xiàn)象,只要PWM頻率夠高,實(shí)物運(yùn)行不會(huì)閃爍
回復(fù)

使用道具 舉報(bào)

8#
ID:163705 發(fā)表于 2018-3-23 10:01 | 只看該作者
小白帆 發(fā)表于 2018-3-22 16:29
謝謝樓主的資料,對(duì)小白我來(lái)說(shuō)很有用,這段時(shí)間一直找這樣的資料。
但是我之前參考這個(gè)鏈接:
http://www ...

PWM調(diào)光要想在仿真中看起來(lái)不閃爍可以加濾波電容
回復(fù)

使用道具 舉報(bào)

9#
ID:288202 發(fā)表于 2018-3-26 15:54 | 只看該作者
854100995 發(fā)表于 2018-3-23 10:01
PWM調(diào)光要想在仿真中看起來(lái)不閃爍可以加濾波電容

鏈接:http://blog.163.com/asm_c/blog/static/2482031132012716860918/
下的C6電容是電解電容,和D1并聯(lián),不就相當(dāng)于起到濾波的作用嗎?但是在數(shù)碼管的值未達(dá)到一定值時(shí),D1是會(huì)出現(xiàn)閃爍的現(xiàn)象的。
回復(fù)

使用道具 舉報(bào)

10#
ID:288202 發(fā)表于 2018-3-26 15:56 | 只看該作者
854100995 發(fā)表于 2018-3-23 10:00
DAC輸出控制LED亮度在仿真中不會(huì)有閃爍現(xiàn)象,如果是PWM調(diào)光,在仿真中運(yùn)行會(huì)閃爍是正,F(xiàn)象,只要PWM頻率 ...

pwm調(diào)光在頻率不夠高時(shí),實(shí)物運(yùn)行也不會(huì)閃爍嗎?(抱歉,因?yàn)樽罱疾辉趯W(xué)校,身邊沒(méi)有實(shí)物,無(wú)法測(cè)試)
回復(fù)

使用道具 舉報(bào)

11#
ID:249455 發(fā)表于 2018-5-28 22:58 | 只看該作者
為什么下載下載下來(lái)的是文本文檔
回復(fù)

使用道具 舉報(bào)

12#
ID:456618 發(fā)表于 2018-12-28 16:38 | 只看該作者
飛哥無(wú)敵 發(fā)表于 2018-5-28 22:58
為什么下載下載下來(lái)的是文本文檔

把文件名后綴加一個(gè).zip
回復(fù)

使用道具 舉報(bào)

13#
ID:456618 發(fā)表于 2018-12-28 16:43 | 只看該作者
感謝樓主,讓小白的我可以多多學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

14#
ID:454000 發(fā)表于 2018-12-28 17:01 | 只看該作者
辛苦了!再接再厲!

評(píng)分

參與人數(shù) 2黑幣 +50 收起 理由
找人PK + 15
yoxi + 35

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

15#
ID:457488 發(fā)表于 2018-12-28 17:24 | 只看該作者
不錯(cuò),贊一個(gè)
回復(fù)

使用道具 舉報(bào)

16#
ID:356526 發(fā)表于 2018-12-28 20:05 | 只看該作者
很不錯(cuò),頂一個(gè)
回復(fù)

使用道具 舉報(bào)

17#
ID:311125 發(fā)表于 2019-3-25 09:49 | 只看該作者
下載下來(lái),先學(xué)習(xí)一下!謝謝!
回復(fù)

使用道具 舉報(bào)

18#
ID:580497 發(fā)表于 2019-7-9 10:09 | 只看該作者
大佬,仿真文件打不開(kāi)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表