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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機智能臺燈源程序

[復制鏈接]
跳轉到指定樓層
樓主


單片機源程序如下:
  1. /**********************************************************************
  2. * 名稱 : 智能調光臺燈
  3. * 功能 : (1)亮度不夠且有人靠近時臺燈自動亮;
  4.          (2)靠的太近會提醒坐姿不正(蜂鳴器)
  5.          (3)附近無人時臺燈自動熄滅(30秒)  時間可調
  6.          (4)根據環境亮度調節等亮度
  7.                                  (5)可手動調節臺燈亮度
  8.                                  (6)設定學習時間
  9. * 備注 :

  10. ***********************************************************************/

  11. //頭函數
  12. #include <reg52.h>                                                                                                                                                                                                  
  13. #include <ADC0809.H>

  14. //宏定義
  15. #define uint unsigned int
  16. #define uchar unsigned char
  17. #define DUAN P0                                  //數碼管段位

  18.                                                                                                                                                                                                                        
  19. unsigned char code tab[]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28,0xff};       //0-9的顯示碼表      gc.debfa         
  20. unsigned char code tab_dian[]={0x80,0x9b,0x42,0x0a,0x19,0x0c,0x04,0x9a,0x00,0x08,0xdf};  //帶點0-9的顯示碼表           
  21. uchar pdata tt[51];                    //定義空數組用于AD0809取平均值

  22. uchar scale=20,rsd_sec;                //定義占空比比例,熱釋電計時秒變量
  23. char min,sec;                                //定義計時分秒

  24. //位定義
  25. bit bdata flag_auto,                //自動切換標志位
  26.           ss,                                //閃爍標志位
  27.                   flag_bs,                        //報警位標志位
  28.                   flag_rsd,                        //熱釋電動作標志位
  29.                   flag_jiejin=1;    //接近傳感器標志位

  30. uchar flag_set=0;                        //設置變量:0 正常  1 調分  2 調秒
  31. uchar lum;                                        //ad0809讀出值

  32. //函數聲明
  33. void delay(uchar i);

  34. //管腳聲明
  35. sbit LED = P3^4;        //PWM輸出
  36. sbit change= P2^3;        //自動模式切換按鍵
  37. sbit set = P2^2;        //設置按鍵
  38. sbit add = P2^1;        //加按鍵
  39. sbit sub = P2^0;        //減按鍵
  40. sbit rsd = P3^6;    //熱釋電
  41. sbit jiejin=P3^5;   //接近開關
  42. sbit buzz=P3^7;

  43. sbit W0=P2^7;                //數碼管位端
  44. sbit W1=P2^6;
  45. sbit W2=P2^5;
  46. sbit W3=P2^4;

  47. /**********************************************************************
  48. * 名稱 : display();
  49. * 功能 : 數碼管顯示
  50. * 輸入 : 無
  51. * 輸出 : 無
  52. ***********************************************************************/          
  53. void display()
  54. {
  55.         if(flag_set==0)                           //正常模式下
  56.         {
  57.                 DUAN=tab[min/10];           //送入段碼,秒數高位
  58.                 W0=0;                                   //打開位地址
  59.                 delay(1);                           //小延時
  60.                 W0=1;                                   //關閉位地址
  61.                 DUAN=tab_dian[min%10]; //送入段碼,秒數低位
  62.                 W1=0;
  63.                 delay(1);
  64.                 W1=1;
  65.                 DUAN=tab[sec/10];           //送入段碼,分鐘數高位
  66.                 W2=0;
  67.                 delay(1);
  68.                 W2=1;
  69.                 DUAN=tab[sec%10];           //送入段碼,分鐘數高位
  70.                 W3=0;
  71.                 delay(1);
  72.                 W3=1;
  73.         }
  74.         else if(flag_set==1)           //設置模式下閃爍相應位
  75.         {
  76.                 if(ss==1)                           //閃爍標志  ss=1 正常顯示
  77.                 {
  78.                         DUAN=~tab[min/10];
  79.                         W0=0;
  80.                         delay(1);
  81.                         W0=1;
  82.                         DUAN=~tab_dian[min%10];
  83.                         W1=0;
  84.                         delay(1);
  85.                         W1=1;
  86.                 }
  87.                 else                                   //閃爍標志  ss=0 熄滅相應位 達到閃爍效果         ss在定時器里500ms取反一次
  88.                 {
  89.                         DUAN=~tab[10];           //
  90.                         W0=0;
  91.                         delay(1);
  92.                         W0=1;
  93.                         DUAN=~tab_dian[10];
  94.                         W1=0;
  95.                         delay(1);
  96.                         W1=1;
  97.                 }
  98.                 DUAN=~tab[sec/10];
  99.                 W2=0;
  100.                 delay(1);
  101.                 W2=1;
  102.                 DUAN=~tab[sec%10];
  103.                 W3=0;
  104.                 delay(1);
  105.                 W3=1;
  106.         }
  107.         else
  108.         {
  109.                
  110.                 DUAN=~tab[min/10];
  111.                 W0=0;
  112.                 delay(1);
  113.                 W0=1;
  114.                 DUAN=~tab_dian[min%10];
  115.                 W1=0;
  116.                 delay(1);
  117.                 W1=1;
  118.                 if(ss==1)
  119.                 {
  120.                         DUAN=~tab[sec/10];
  121.                         W2=0;
  122.                         delay(1);
  123.                         W2=1;
  124.                         DUAN=~tab[sec%10];
  125.                         W3=0;
  126.                         delay(1);
  127.                         W3=1;
  128.                 }
  129.                 else
  130.                 {
  131.                         DUAN=~tab[10];
  132.                         W2=0;
  133.                         delay(1);
  134.                         W2=1;
  135.                         DUAN=~tab[10];
  136.                         W3=0;
  137.                         delay(1);
  138.                         W3=1;
  139.                 }
  140.         }
  141. }

  142. /**********************************************************************
  143. * 名稱 : KEY();
  144. * 功能 : 按鍵控制
  145. * 輸入 : 無
  146. * 輸出 : 無
  147. ***********************************************************************/
  148. void KEY()
  149. {
  150.         uint lum_mean,lum_all;
  151.         uchar b,c;
  152.         if(change==0)                                  //自動切換按鍵按下
  153.         {
  154.                 delay(10);                                  //去抖
  155.                 if(change==0)                          //再次判斷按鍵按下
  156.                 {
  157.                         buzz=0;                                  //蜂鳴器鳴響
  158.                         flag_auto=!flag_auto; //自動模式標志位取反
  159.                         if(flag_auto==1)          //當切換到手動模式時  首先將LED發光比例PWM設置在50%
  160.                         scale=20;
  161.                        
  162.                 }
  163.                 while(!change) display();buzz=1; //等待按鍵釋放  松開按鍵后關閉蜂鳴器、刷新顯示
  164.         }
  165.         if(jiejin==0&&flag_jiejin==1) //接近傳感器檢測到障礙時  開啟報警
  166.         {
  167.                 buzz=0;
  168.                 flag_jiejin=0;
  169.         }
  170.         if(jiejin!=flag_jiejin)              //接近傳感器檢測不到障礙時  關閉報警
  171.         {
  172.                 buzz=1;
  173.                 flag_jiejin=1;
  174.         }
  175.         if(set==0)                                      //設置鍵按下時
  176.         {
  177.                 delay(10);
  178.                 if(set==0)
  179.                 {
  180.                         buzz=0;
  181.                         flag_set++;                          //設置變量++
  182.                         if(flag_set==3)                  //加到3時回復回正常模式
  183.                         flag_set=0;
  184.                         flag_bs=0;                          //按下設置 關閉報警
  185.                        
  186.                 }
  187.                 while(!set) display(); buzz=1;//等待按鍵釋放  松開按鍵后關閉蜂鳴器、刷新顯示
  188.         }
  189.         if(flag_set==1)                                          //加鍵按鍵只有在設置狀態(flag_set!=0)時按下才有效          調分
  190.         {                                                                 
  191.                 if(add==0)                                          //加按鍵按下時
  192.                 {
  193.                         delay(10);                                  //消抖
  194.                         if(add==0)
  195.                         {
  196.                                 buzz=0;                                  //蜂鳴器響
  197.                                 min++;                                  //分++
  198.                                 if(min>=60)
  199.                                 min=0;
  200.                                
  201.                         }
  202.                         while(!add) display(); buzz=1;         //等待按鍵釋放  松開按鍵后關閉蜂鳴器、刷新顯示
  203.                 }
  204.                 if(sub==0)                                          //減按鍵按下時
  205.                 {
  206.                         delay(10);                                  //消抖
  207.                         if(sub==0)
  208.                         {
  209.                                 buzz=0;                                  //蜂鳴器響
  210.                                 min--;                                  //分--
  211.                                 if(min>0)
  212.                                 min=59;
  213.                                
  214.                         }
  215.                         while(!sub) display(); buzz=1;         //等待按鍵釋放  松開按鍵后關閉蜂鳴器、刷新顯示
  216.                 }
  217.         }
  218.         if(flag_set==2)                                        //調秒
  219.         {                                                               
  220.                 if(add==0)                                        //加鍵按下
  221.                 {                                               
  222.                         delay(10);                                //消抖
  223.                         if(add==0)
  224.                         {
  225.                                 buzz=0;                                //蜂鳴器響
  226.                                 sec++;                                //秒++
  227.                                 if(sec>=60)
  228.                                 sec=0;
  229.                                
  230.                         }
  231.                         while(!add) display(); buzz=1;          //等待按鍵釋放  松開按鍵后關閉蜂鳴器、刷新顯示
  232.                 }
  233.                 if(sub==0)                                         //減鍵按下
  234.                 {
  235.                         delay(10);
  236.                         if(sub==0)                                 //消抖
  237.                         {
  238.                                 buzz=0;                                 //蜂鳴器響
  239.                                 sec--;                                 //秒--
  240.                                 if(sec<0)
  241.                                 sec=59;
  242.                                
  243.                         }
  244.                         while(!sub) display();        buzz=1;          //等待按鍵釋放  松開按鍵后關閉蜂鳴器、刷新顯示
  245.                 }
  246.                 while(!sub);
  247.         }
  248.                
  249.         if(flag_auto==0)                                        //自動模式
  250.         {
  251.                 if(flag_rsd==1)                                        //且有人在范圍內時        環境發光強度控制燈光變化
  252.                 {
  253.                         for(b=0;b<49;b++)                         //將空數組tt[]內數值整體左移一位
  254.                         {
  255.                                 tt[b]=tt[b+1];                        //將后一數值放到前一位置
  256.                         }
  257.                         tt[49]=ADC0809();                        //將讀出的ad0809數值放入tt[49]
  258.                         for(c=0;c<50;c++)                        //將tt[]內數值相加
  259.                         {
  260.                                 lum_all=lum_all+tt[c];
  261.                         }
  262.                         lum_mean=lum_all/50;                //將總數/50取出平均值
  263. //                        lum_all=0;                                        //將總數清零
  264.                                
  265.                         if(lum_mean<=30) scale=1;                           //判斷取出平均值大小  小于30  發光強度0%
  266.                         else if(lum_mean>=150) scale=41;           //大于150  發光強度100%
  267.                         else scale=((lum_mean-30)/3)+1;                   //其他值時將其計算得到發光強度 (計算目的是為了得到一個1-41之間的數值 控制燈光變化)
  268.                 }
  269.                 else
  270.                 scale=1;                                         //沒有人在范圍內時 將燈光亮度調至0%
  271.         }
  272.         else                                                           //手動模式下
  273.         {
  274.                 if(flag_set==0)                                 //正常模式下
  275.                 {
  276.                         if(add==0)                                 //加鍵按下
  277.                         {
  278.                                 delay(10);
  279.                                 if(add==0)
  280.                                 {
  281.                                 //        buzz=0;           //蜂鳴器響
  282.                                         scale++;                  //燈光比例++
  283.                                         if(scale>=41)
  284.                                         scale=41;
  285.                                         display();
  286.                                 }
  287.                         //        while(!add) display();        buzz=1;
  288.                         }
  289.                         if(sub==0)                                  //減鍵按下時
  290.                         {
  291.                                 delay(10);
  292.                                 if(sub==0)
  293.                                 {
  294.                                 //        buzz=0;                           //蜂鳴器響
  295.                                         scale--;                   //燈光比例--
  296.                                         if(scale>1)
  297.                                         scale=1;
  298.                                         display();
  299.                                 }
  300.                 //                while(!sub) display(); buzz=1;
  301.                         }
  302.                 }
  303.         }
  304. }

  305. /**********************************************************************
  306. * 名稱 : init();
  307. * 功能 : 初始化定時器
  308. * 輸入 : 無
  309. * 輸出 : 無
  310. ***********************************************************************/

  311. void init()
  312. {
  313.         TMOD=0x11;           //工作方式1
  314.         TH1=0x3c;
  315.         TL1=0xb0;           //T1賦初值50ms
  316.         TH0=0xff;
  317.         TL0=0xe7;           //T0賦初值25us          
  318.         ET0=1;
  319.         ET1=1;                   //打開中斷允許開關
  320.         EA=1;                   //中斷總開關
  321.         TR0=1;                   //開定時器0 開關
  322.         TR1=0;                   //關定時器0 開關
  323. }

  324. /**********************************************************************
  325. * 名稱 : main();
  326. * 功能 : 主函數
  327. * 輸入 : 無
  328. * 輸出 : 無
  329. ***********************************************************************/
  330. void main()
  331. {
  332.         init();                  //調用初始化函數
  333.         flag_auto=1;  //初始化手動模式
  334.         rsd=0;                  //熱釋電引腳置低(有信號時時高電平)
  335.         delay(500);          //延時500ms后開機

  336.         while(1)          //大循環
  337.         {
  338.                 KEY();                 //調用按鍵函數
  339.                 display();         //調用顯示函數
  340.         }
  341. }

  342. /**********************************************************************
  343. * 名稱 : delay();
  344. * 功能 : 延時函數:大約1ms
  345. * 輸入 : 無
  346. * 輸出 : 無
  347. ***********************************************************************/
  348. void delay(uchar i)
  349. {
  350.   uchar j,k;
  351.   for(j=i;j>0;j--)
  352.     for(k=125;k>0;k--);
  353. }

  354. /**********************************************************************
  355. * 名稱 : void time0() interrupt 1
  356. * 功能 : 定時器T0 中斷服務函數:PWM脈沖發生函數
  357. * 輸入 : 無
  358. * 輸出 : 無
  359. ***********************************************************************/
  360. void time0() interrupt 1
  361. {
  362.         uchar n;
  363.         TH0=0xff;
  364.         TL0=0xe7;                 //重新賦初值
  365.         n++;                         //每25us  n++
  366.         if(n>scale)                 //n<設置比例時,打開燈
  367.         {
  368.                 LED=1;
  369.         }
  370.         else if(n<=scale)//n大于等于設置比例時 關閉燈
  371.         {
  372.                 LED=0;
  373.         }
  374.         if(n==40)                 //n==40  :25us*40=1ms   1kHZ
  375.         {
  376.                 n=0;                 //n=0
  377.         }
  378.         else ;       
  379. }

  380. /**********************************************************************
  381. ……………………

  382. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
智能臺燈.rar (246.46 KB, 下載次數: 81)


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

使用道具 舉報

沙發
ID:171111 發表于 2020-5-5 11:32 | 只看該作者
程序里的 碼表代碼 沒看懂是用共陰還是共陽的數碼管呢? 請教下
回復

使用道具 舉報

板凳
ID:797466 發表于 2020-8-11 20:52 來自手機 | 只看該作者
接5伏,是共陽
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产一区二区精品在线观看 | 国产精品我不卡 | 亚洲成人av一区二区 | 亚洲女人的天堂 | 国产精品视频网 | 我要看黄色录像一级片 | 国产精品欧美精品 | 伦理二区 | 中文字幕啪啪 | 欧美久久一级特黄毛片 | 日本在线一区二区 | 一区二区三区亚洲视频 | 国产一区视频在线 | 国产精品美女久久久 | 国产精品网址 | 亚洲在线日韩 | xxx.在线观看 | 欧美日产国产成人免费图片 | 久久国内精品 | 国产成人精品在线播放 | 国产一区二区在线免费播放 | 日本一二三区在线观看 | 日韩一区二区三区视频在线播放 | 精品一区二区三区在线观看 | 久久精品亚洲精品 | 亚洲欧美bt| 国产一区二区精品在线观看 | 成人免费在线视频 | 亚洲精选一区 | 91免费在线看 | 激情五月综合网 | 美女国产精品 | 日本视频一区二区 | 欧美视频二区 | 国产亚洲欧美另类一区二区三区 | 久久久久网站 | 日韩精品一区二区三区视频播放 | 手机av在线 | 欧洲色综合 | 中文一区 | 久久蜜桃精品 |