久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2479|回復: 1
打印 上一主題 下一主題
收起左側

單片機小臺燈程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:384734 發表于 2018-8-9 18:38 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
小臺燈的程序,可以看看

單片機源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. #define uchar unsigned char                // 以后unsigned char就可以用uchar代替
  4. #define uint  unsigned int                // 以后unsigned int 就可以用uint 代替

  5. sbit LED     = P1^0;                        // 模式指示燈,亮是自動模式,滅是手動模式
  6. sbit Lamp    = P1^4;                         // 臺燈控制引腳
  7. sbit Key1    = P1^1;                        // 按鍵1,模式切換按鍵
  8. sbit Key2    = P1^2;                         // 按鍵2,亮度減少按鍵      
  9. sbit Key3    = P1^3;                        // 按鍵3,亮度增加按鍵
  10. sbit ADC_CS  = P2^3;                         // ADC0832的CS引腳
  11. sbit ADC_CLK = P2^0;                         // ADC0832的CLK引腳
  12. sbit ADC_DAT = P2^1;                         // ADC0832的DI/DO引腳
  13. sbit Module  = P2^2;                        // 人體紅外檢測模塊

  14. uchar gCount=0;                                // 全局計數變量
  15. uchar gIndex;                                        // 亮度變量,0是最暗,9是最亮,一共10檔
  16. uint  gTime=0;                                // 計時變量,用于計時多久沒檢測到有人

  17. /*********************************************************/
  18. // 毫秒級的延時函數,time是要延時的毫秒數
  19. /*********************************************************/
  20. void DelayMs(uint time)
  21. {
  22.         uint i,j;
  23.         for(i=0;i<time;i++)
  24.                 for(j=0;j<112;j++);
  25. }

  26. /*********************************************************/
  27. // ADC0832的時鐘脈沖
  28. /*********************************************************/
  29. void WavePlus()
  30. {
  31.         _nop_();
  32.         ADC_CLK = 1;
  33.         _nop_();
  34.         ADC_CLK = 0;
  35. }

  36. /*********************************************************/
  37. // 獲取指定通道的A/D轉換結果
  38. /*********************************************************/
  39. uchar Get_ADC0832()
  40. {
  41.         uchar i;
  42.         uchar dat1=0;
  43.         uchar dat2=0;
  44.         ADC_CLK = 0;                        // 電平初始化
  45.         ADC_DAT = 1;
  46.         _nop_();
  47.         ADC_CS = 0;
  48.         WavePlus();                        // 起始信號
  49.         ADC_DAT = 1;
  50.         WavePlus();                        // 通道選擇的第一位
  51.         ADC_DAT = 0;      
  52.         WavePlus();                        // 通道選擇的第二位
  53.         ADC_DAT = 1;
  54.         for(i=0;i<8;i++)                // 第一次讀取
  55.         {
  56.                 dat1<<=1;
  57.                 WavePlus();
  58.                 if(ADC_DAT)
  59.                         dat1=dat1|0x01;
  60.                 else
  61.                         dat1=dat1|0x00;
  62.         }
  63.         for(i=0;i<8;i++)                // 第二次讀取
  64.         {
  65.                 dat2>>= 1;
  66.                 if(ADC_DAT)
  67.                         dat2=dat2|0x80;
  68.                 else
  69.                         dat2=dat2|0x00;
  70.                 WavePlus();
  71.         }
  72.         _nop_();                                // 結束此次傳輸
  73.         ADC_DAT = 1;
  74.         ADC_CLK = 1;
  75.         ADC_CS  = 1;   

  76.         if(dat1==dat2)                        // 返回采集結果
  77.                 return dat1;
  78.         else
  79.                 return 0;
  80. }

  81. /*********************************************************/
  82. // 定時器初始化
  83. /*********************************************************/
  84. void TimerInit()
  85. {
  86.         TMOD = 0x01;                        // 使用定時器0,工作方式1         
  87.         TH0  = 252;                        // 給定時器0的TH0裝初值
  88.         TL0  = 24;                        // 給定時器0的TL0裝初值       
  89.         ET0  = 1;                                // 定時器0中斷使能
  90.         EA   = 1;                        // 打開總中斷
  91.         TR0         = 1;                                // 啟動定時器0
  92. }

  93. /*********************************************************/
  94. // 手動控制
  95. /*********************************************************/
  96. void ManualControl()
  97. {
  98.         // 亮度減少
  99.         if(Key2==0)                                // 如果按鍵2被按下去
  100.         {
  101.                 if(gIndex>0)                        // 只要當前亮度不為最低才能減少亮度
  102.                 {
  103.                         gIndex--;                        // 亮度降低一檔
  104.                         DelayMs(300);                // 延時0.3秒
  105.                 }
  106.         }
  107.         // 亮度增加
  108.         if(Key3==0)                                // 如果按鍵3被按下去
  109.         {
  110.                 if(gIndex<9)                        // 只要當前亮度不為最高才能增加亮度
  111.                 {
  112.                         gIndex++;                        // 亮度增加一檔
  113.                         DelayMs(300);                // 延時0.3秒
  114.                 }
  115.         }
  116. }

  117. /*********************************************************/
  118. // 自動控制
  119. /*********************************************************/
  120. void AutoControl(uchar num)
  121. {
  122.         if(num<59)                                                // 最亮
  123.                 gIndex=9;
  124.         else if((num>65)&&(num<81))                // 第二亮
  125.                 gIndex=8;
  126.         else if((num>87)&&(num<103))                // 第三亮
  127.                 gIndex=7;
  128.         else if((num>109)&&(num<125))
  129.                 gIndex=6;
  130.         else if((num>131)&&(num<147))
  131.                 gIndex=5;
  132.         else if((num>153)&&(num<169))
  133.                 gIndex=4;
  134.         else if((num>175)&&(num<191))
  135.                 gIndex=3;
  136.         else if((num>197)&&(num<213))
  137.                 gIndex=2;
  138.         else if((num>219)&&(num<235))
  139.                 gIndex=1;
  140.         else if(num>241)                                         // 最暗
  141.                 gIndex=0;
  142. }

  143. /*********************************************************/
  144. // 主函數
  145. /*********************************************************/
  146. void main()
  147. {
  148.         uchar ret;
  149.        
  150.         TimerInit();                                 // 定時器初始化
  151.         LED=0;                                        // 指示燈點亮(自動模式指示燈)
  152.         ret=Get_ADC0832();                // 獲取AD采集結果(環境光照強度)
  153.         AutoControl(ret);                        // 上電先進行一次自動亮度控制       
  154.         AutoControl(ret+7);
  155.        
  156.         while(1)
  157.         {
  158.                 /* 模式切換控制 */
  159.                 if(Key1==0)                                        // 如果按鍵1被按下去
  160.                 {
  161.                         LED=~LED;                                // 切換LED燈狀態
  162.                         if(LED==0)                                // 如果切換后是自動模式的話
  163.                         {
  164.                                 ret=Get_ADC0832();        // 獲取AD采集結果(環境光照強度)
  165.                                 AutoControl(ret);                // 進行一次自動亮度調整       
  166.                         }
  167.                         DelayMs(10);                                // 延時消除按鍵按下的抖動
  168.                         while(!Key1);                                // 等待按鍵釋放
  169.                         DelayMs(10);                                // 延時消除按鍵松開的抖動
  170.                 }
  171.                        
  172.                 /* 亮度控制 */
  173.                 if(LED==1)                                        // 如果LED是滅的
  174.                 {
  175.                         ManualControl();                        // 則進行手動控制
  176.                 }
  177.                 else                                                        // 如果LED是亮的
  178.                 {
  179.                         if(gTime<60000)                        // 如果最近60秒內檢測到有人
  180.                         {
  181.                                 ret=Get_ADC0832();        // 獲取AD采集結果(環境光照強度)
  182.                                 AutoControl(ret);                // 進行自動控制       
  183.                                 DelayMs(200);
  184.                         }
  185.                 }
  186.                
  187.                 /*檢測是否有人*/
  188.                 if(Module==1)
  189.                 {
  190.                         gTime=0;                                        // 檢測到有人,則把60秒計時清零
  191.                 }
  192.                 if(gTime>60000)                                // 如果gTime的值超過了60000
  193.                 {
  194.                         gTime=60000;                                // 把gTime的值重新賦值為60000,避免過大溢出
  195.                         gIndex=0;                                        // 如果60秒檢測不到有人,則把臺燈熄滅
  196.                 }
  197.         }
  198. }

  199. /*********************************************************/
  200. // 定時器0服務程序,1毫秒
  201. /*********************************************************/
  202. void Timer0(void) interrupt 1
  203. {
  204.         TH0  = 252;                                                // 給定時器0的TH0裝初值
  205.         TL0  = 24;                                                // 給定時器0的TL0裝初值       
  206.        
  207.         gTime++;                                                        // 每1毫秒,gTime變量加1
  208.         gCount++;                                                // 每1毫秒,gCount變量加1
  209.         if(gCount==10)                                        // 如果gCount加到10了
  210.         {
  211.                 gCount=0;                                        // 則將gCount清零,進入新一輪的計數
  212.                 if(gIndex!=0)                                        // 如果說臺燈不是最暗的(熄滅)
  213.                 {
  214.                         Lamp=0;                                        // 則把臺燈點亮
  215.                 }
  216.         }

  217.         if(gCount==gIndex)                                        // 如果gCount計數到和gIndex一樣了
  218.         {
  219.                 if(gIndex!=9)                                        // 如果說臺燈不是最亮的
  220.                 {
  221.                         Lamp=1;                                        // 則把臺燈熄滅
  222.                 }
  223.         }
  224. }
復制代碼

所有資料51hei提供下載:
小臺燈程序.doc (34.5 KB, 下載次數: 15)


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

使用道具 舉報

沙發
ID:1074947 發表于 2023-5-2 11:09 | 只看該作者
檔位代碼怎么計算出來的啊
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线中文字幕视频 | 精品久久成人 | 美女爽到呻吟久久久久 | 免费观看一区二区三区毛片 | 国产三区在线观看视频 | 成人在线精品视频 | 国产视频第一页 | 一区二区三区电影网 | www97影院 | 国产一区二区视频免费在线观看 | 色久影院 | 日韩成人av在线 | 成年精品 | 亚洲福利电影网 | 精久久久 | 国产精品亚洲一区二区三区在线 | 天天射夜夜操 | 精品久久香蕉国产线看观看亚洲 | 一区二区电影网 | 国产综合精品 | 在线精品国产 | 亚洲欧美视频 | 欧美日韩中文在线观看 | 亚洲综合大片69999 | 色婷婷av99xx | 中文亚洲视频 | 午夜小电影 | 亚洲精品视频在线看 | 国产免费一区二区三区最新6 | 一级毛片大全免费播放 | 视频1区 | 午夜精品福利视频 | 91成人免费看片 | 欧美精品 在线观看 | h片在线看 | 精品日韩一区 | 天天操夜夜操 | 美女天天操 | 91成人免费观看 | 欧美99| 一区二区三区四区国产 |