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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機視力保護臺燈源程序與電路圖

[復制鏈接]
跳轉到指定樓層
樓主
視力保護臺燈電路原理圖如下:


單片機源程序如下:
  1. //宏定義
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. #define DUAN P0
  5. //頭函數
  6. #include <reg52.h>                                                                                                                                                                                                   
  7. #include <ADC0809.h>
  8.                                                                                                                                                                                                                         
  9. unsigned char code tab[]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28,0xff}; //數字0-9的編碼//gc.debfa         
  10. unsigned char code tab_dian[]={0x80,0x9b,0x42,0x0a,0x19,0x0c,0x04,0x9a,0x00,0x08,0xdf}; //帶點的數字0-9的編碼//gc.debfa         
  11. uchar pdata tt[51];                   //定義空數組用于AD0809取平均值

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

  14. bit bdata flag_auto,ss,flag_bs,flag_rsd,flag_jiejin=1;          //位定義自動切換的,閃爍標志,報警位標志,熱釋電動作標志,接近傳感器標志
  15. uchar flag_set=0;                        //設置變量:0 正常  1 調分  2 調秒
  16. uchar lum;                                        //ad0809讀出值

  17. //函數聲明
  18. void delay(uchar i);

  19. //管腳聲明
  20. sbit LED = P3^4;        //燈光控制輸出
  21. sbit change= P2^3;          //自動模式切換按鍵
  22. sbit set = P2^2;         //設置按鍵
  23. sbit add = P2^1;        //加按鍵
  24. sbit sub = P2^0;        //減按鍵
  25. sbit rsd = P3^6;   //熱釋電
  26. sbit jiejin=P3^5;  //接近開關
  27. sbit buzz=P3^7;

  28. sbit W0=P2^7;
  29. sbit W1=P2^6;
  30. sbit W2=P2^5;
  31. sbit W3=P2^4;          //數碼管位端
  32. /***********顯示函數*************/
  33. void display()
  34. {
  35.         if(flag_set==0)                         //正常模式下
  36.         {
  37.                 DUAN=tab[min/10];          //送入段碼
  38.                 W0=0;                                  //打開位地址
  39.                 delay(1);                          //小延時
  40.                 W0=1;                                  //關閉位地址
  41.                 DUAN=tab_dian[min%10]; //下同
  42.                 W1=0;
  43.                 delay(1);
  44.                 W1=1;
  45.                 DUAN=tab[sec/10];
  46.                 W2=0;
  47.                 delay(1);
  48.                 W2=1;
  49.                 DUAN=tab[sec%10];
  50.                 W3=0;
  51.                 delay(1);
  52.                 W3=1;
  53.         }
  54.         else if(flag_set==1)                 //設置模式下閃爍相應位
  55.         {
  56.                 if(ss==1)                                 //閃爍標志  ss=1 正常顯示
  57.                 {
  58.                         DUAN=~tab[min/10];
  59.                         W0=0;
  60.                         delay(1);
  61.                         W0=1;
  62.                         DUAN=~tab_dian[min%10];
  63.                         W1=0;
  64.                         delay(1);
  65.                         W1=1;
  66.                 }
  67.                 else                                           //閃爍標志  ss=0 熄滅相應位 達到閃爍效果         ss在定時器里500ms取反一次
  68.                 {
  69.                         DUAN=~tab[10];
  70.                         W0=0;
  71.                         delay(1);
  72.                         W0=1;
  73.                         DUAN=~tab_dian[10];
  74.                         W1=0;
  75.                         delay(1);
  76.                         W1=1;
  77.                 }
  78.                 DUAN=~tab[sec/10];
  79.                 W2=0;
  80.                 delay(1);
  81.                 W2=1;
  82.                 DUAN=~tab[sec%10];
  83.                 W3=0;
  84.                 delay(1);
  85.                 W3=1;
  86.         }
  87.         else
  88.         {
  89.                
  90.                 DUAN=~tab[min/10];
  91.                 W0=0;
  92.                 delay(1);
  93.                 W0=1;
  94.                 DUAN=~tab_dian[min%10];
  95.                 W1=0;
  96.                 delay(1);
  97.                 W1=1;
  98.                 if(ss==1)
  99.                 {
  100.                         DUAN=~tab[sec/10];
  101.                         W2=0;
  102.                         delay(1);
  103.                         W2=1;
  104.                         DUAN=~tab[sec%10];
  105.                         W3=0;
  106.                         delay(1);
  107.                         W3=1;
  108.                 }
  109.                 else
  110.                 {
  111.                         DUAN=~tab[10];
  112.                         W2=0;
  113.                         delay(1);
  114.                         W2=1;
  115.                         DUAN=~tab[10];
  116.                         W3=0;
  117.                         delay(1);
  118.                         W3=1;
  119.                 }
  120.         }
  121. }
  122. /*****************按鍵函數*****************/
  123. void KEY()
  124. {
  125.         uint lum_mean,lum_all;
  126.         uchar b,c;
  127.         if(change==0)                                  //自動切換按鍵按下
  128.         {
  129.                 delay(10);                                  //去抖
  130.                 if(change==0)                          //再次判斷按鍵按下
  131.                 {
  132.                         buzz=0;                                  //蜂鳴器鳴響
  133.                         flag_auto=!flag_auto; //自動模式標志位取反
  134.                         if(flag_auto==1)          //當切換到手動模式時  首先將LED發光比例設置在50%
  135.                         scale=20;
  136.                         
  137.                 }
  138.                 while(!change) display();buzz=1; //按鍵釋放  松開按鍵后關閉蜂鳴器
  139.         }
  140.         if(jiejin==0&&flag_jiejin==1)         //接近傳感器檢測到障礙時  開啟報警
  141.         {
  142.                 buzz=0;
  143.                 flag_jiejin=0;
  144.         }
  145.         if(jiejin!=flag_jiejin)                          //接近傳感器檢測不到障礙時  關閉報警
  146.         {
  147.                 buzz=1;
  148.                 flag_jiejin=1;
  149.         }
  150.         if(set==0)                                                  //設置鍵按下時
  151.         {
  152.                 delay(10);
  153.                 if(set==0)
  154.                 {
  155.                         buzz=0;
  156.                         flag_set++;                                  //設置變量++
  157.                         if(flag_set==3)                          //加到3時回復回正常模式
  158.                         flag_set=0;
  159.                         flag_bs=0;                                 //按下設置 關閉報警
  160.                         
  161.                 }
  162.                 while(!set) display(); buzz=1;        //按鍵釋放
  163.         }
  164.         if(flag_set==1)                                          //加鍵按鍵只有在設置狀態(flag_set!=0)時按下才有效
  165.         {                                                                  //調分時
  166.                 if(add==0)                                          //加按鍵按下時
  167.                 {
  168.                         delay(10);
  169.                         if(add==0)
  170.                         {
  171.                                 buzz=0;
  172.                                 min++;                                  //分++
  173.                                 if(min>=60)
  174.                                 min=0;
  175.                                 
  176.                         }
  177.                         while(!add) display(); buzz=1;
  178.                 }
  179.                 if(sub==0)                                          //減按鍵按下時
  180.                 {
  181.                         delay(10);
  182.                         if(sub==0)
  183.                         {
  184.                                 buzz=0;
  185.                                 min--;                                  //分--
  186.                                 if(min>0)
  187.                                 min=59;
  188.                                 
  189.                         }
  190.                         while(!sub) display(); buzz=1;
  191.                 }
  192.         }
  193.         if(flag_set==2)
  194.         {                                                                //調秒時
  195.                 if(add==0)                                        //加鍵按下
  196.                 {
  197.                         delay(10);
  198.                         if(add==0)
  199.                         {
  200.                                 buzz=0;
  201.                                 sec++;                                 //秒++
  202.                                 if(sec>=60)
  203.                                 sec=0;
  204.                                 
  205.                         }
  206.                         while(!add) display(); buzz=1;
  207.                 }
  208.                 if(sub==0)                                         //減鍵按下
  209.                 {
  210.                         delay(10);
  211.                         if(sub==0)
  212.                         {
  213.                                 buzz=0;
  214.                                 sec--;                                 //秒--
  215.                                 if(sec<0)
  216.                                 sec=59;
  217.                                 
  218.                         }
  219.                         while(!sub) display();        buzz=1;
  220.                 }
  221.                 while(!sub);
  222.         }
  223.                
  224.         if(flag_auto==0)                                        //自動模式時
  225.         {
  226.                 if(flag_rsd==1)                                        //且有人在范圍內時
  227.                 {
  228.                         for(b=0;b<49;b++)                         //將空數組tt【】內數值整體左移一位
  229.                         {
  230.                                 tt[b]=tt[b+1];                        //將后一數值放到前一位置
  231.                         }
  232.                         tt[49]=ADC0809();                        //將讀出的ad0809數值放入tt【49】
  233.                         for(c=0;c<50;c++)                        //將tt【】內數值相加
  234.                         {
  235.                                 lum_all=lum_all+tt[c];
  236.                         }
  237.                         lum_mean=lum_all/50;                //將總數/50取出平均值
  238. //                        lum_all=0;                                        //將總數清零
  239.                                 
  240.                         if(lum_mean<=30) scale=1;                           //判斷取出平均值大小  小于30  發光強度0%
  241.                         else if(lum_mean>=150) scale=41;           //大于150  發光強度100%
  242.                         else scale=((lum_mean-30)/3)+1;                   //其他值時將其計算得到發光強度 (計算目的是為了得到一個1-41之間的數值 控制燈光變化)
  243.                 }
  244.                 else
  245.                 scale=1;                                         //沒有人在范圍內時 將燈光亮度調至0%
  246.         }
  247.         else                                                        //手動模式下
  248.         {
  249.                 if(flag_set==0)                                 //正常模式下
  250.                 {
  251.                         if(add==0)                                 //加鍵按下
  252.                         {
  253.                                 delay(10);
  254.                                 if(add==0)
  255.                                 {
  256.                                 //        buzz=0;
  257.                                         scale++;                  //燈光比例++
  258.                                         if(scale>=41)
  259.                                         scale=41;
  260.                                         display();
  261.                                 }
  262.                         //        while(!add) display();        buzz=1;
  263.                         }
  264.                         if(sub==0)                                  //減鍵按下時
  265.                         {
  266.                                 delay(10);
  267.                                 if(sub==0)
  268.                                 {
  269.                                 //        buzz=0;
  270.                                         scale--;                   //燈光比例--
  271.                                         if(scale>1)
  272.                                         scale=1;
  273.                                         display();
  274.                                 }
  275.                 //                while(!sub) display(); buzz=1;
  276.                         }
  277.                 }
  278.         }
  279. }
  280. /*********定時器初始化函數**********/
  281. void init()
  282. {
  283.         TMOD=0x11;           //工作方式
  284.         TH1=0x3c;
  285.         TL1=0xb0;           //T1賦初值50ms
  286.         TH0=0xff;
  287.         TL0=0xe7;                //T0賦初值25us         
  288.         ET0=1;
  289.         ET1=1;                   //打開中斷允許開關
  290.         EA=1;                   //中斷總開關
  291.         TR0=1;
  292.         TR1=0;                   //定時器定時開關
  293. }

  294. /****************主函數**********************/
  295. void main()
  296. {
  297.         init();                  //調用初始化函數
  298.         flag_auto=1;  //初始化手動模式
  299.         rsd=0;                  //熱釋電引腳置低(有信號時時高電平)
  300.         delay(500);          //延時500ms后開機

  301.         while(1)                   //循環
  302.         {
  303.                 KEY();                 //調用按鍵函數
  304.                 display();        //調用顯示函數
  305.         }
  306. }
  307. /*****************延時函數:大約1ms************************/
  308. void delay(uchar i)
  309. {
  310.   uchar j,k;
  311.   for(j=i;j>0;j--)
  312.     for(k=125;k>0;k--);
  313. }
  314. /******************定時器T0服務函數:脈沖發生函數*******************/
  315. void time0() interrupt 1
  316. {
  317.         uchar n;
  318.         TH0=0xff;
  319.         TL0=0xe7;                 //重新賦初值
  320.         n++;                         //每25us  n++
  321.         if(n>scale)                 //n<設置比例時,打開燈
  322.         {
  323.                 LED=1;
  324.         }
  325.         else if(n<=scale)//n大于等于設置比例時 關閉燈
  326.         {
  327.                 LED=0;
  328.         }
  329.         if(n==40)                 //n==40  :25us*40=1ms   1kHZ
  330.         {
  331.                 n=0;                 //n=0
  332.         }
  333.         else ;        
  334. }
  335. /********************定時器T0服務函數:計時和閃爍控制********************/
  336. void time1() interrupt 3
  337. {
  338. ……………………

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

所有資料51hei提供下載:
視力保護臺燈.zip (305.26 KB, 下載次數: 59)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:742860 發表于 2021-3-27 19:49 | 只看該作者
你好?你的程序呢?程序在哪里!
回復

使用道具 舉報

板凳
ID:328014 發表于 2021-3-27 20:32 | 只看該作者
Diviner1227 發表于 2021-3-27 19:49
你好?你的程序呢?程序在哪里!

他的程序在壓縮包里面,用Keil打開程序后是這樣的,如圖

51hei.png (9.09 KB, 下載次數: 52)

51hei.png

51hei.png (44.44 KB, 下載次數: 34)

51hei.png
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久久久久久一区探花 | 国产亚洲一区二区三区在线观看 | 免费av播放 | 国产午夜精品久久久 | 国产一二三视频在线观看 | 欧美在线一二三 | 亚洲精品乱码久久久久久9色 | 精品久| 99久久久久国产精品免费 | 羞羞的视频在线观看 | 日本一区二区不卡 | 久久中文一区二区 | 国产精品国产精品国产专区不卡 | 久综合 | 久久一区二区三区四区 | a级毛片国产 | 中文字幕二区 | 91视频一区二区 | 国产人成精品一区二区三 | 91精品国产色综合久久 | 国产精品99久久久久久www | 欧美在线视频一区二区 | 国产高清视频 | 国产激情视频在线观看 | 久久亚洲天堂 | 亚洲国产看片 | 91久久精品一区二区二区 | 日韩免费成人av | 操人网站| 国产精品久久久久久婷婷天堂 | 精品美女在线观看视频在线观看 | 国产男女猛烈无遮掩视频免费网站 | h片在线看 | 亚洲天堂av在线 | 欧美激情欧美激情在线五月 | 精品国产精品一区二区夜夜嗨 | 日本一区二区影视 | 欧美一区二区 | 天天综合久久网 | 日韩一区二区福利视频 | 精品在线一区 |