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

QQ登錄

只需一步,快速開始

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

51單片機(jī)視力保護(hù)臺(tái)燈源程序與電路圖

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
視力保護(hù)臺(tái)燈電路原理圖如下:


單片機(jī)源程序如下:
  1. //宏定義
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. #define DUAN P0
  5. //頭函數(shù)
  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}; //數(shù)字0-9的編碼//gc.debfa         
  10. unsigned char code tab_dian[]={0x80,0x9b,0x42,0x0a,0x19,0x0c,0x04,0x9a,0x00,0x08,0xdf}; //帶點(diǎn)的數(shù)字0-9的編碼//gc.debfa         
  11. uchar pdata tt[51];                   //定義空數(shù)組用于AD0809取平均值

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

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

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

  19. //管腳聲明
  20. sbit LED = P3^4;        //燈光控制輸出
  21. sbit change= P2^3;          //自動(dòng)模式切換按鍵
  22. sbit set = P2^2;         //設(shè)置按鍵
  23. sbit add = P2^1;        //加按鍵
  24. sbit sub = P2^0;        //減按鍵
  25. sbit rsd = P3^6;   //熱釋電
  26. sbit jiejin=P3^5;  //接近開關(guān)
  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;          //數(shù)碼管位端
  32. /***********顯示函數(shù)*************/
  33. void display()
  34. {
  35.         if(flag_set==0)                         //正常模式下
  36.         {
  37.                 DUAN=tab[min/10];          //送入段碼
  38.                 W0=0;                                  //打開位地址
  39.                 delay(1);                          //小延時(shí)
  40.                 W0=1;                                  //關(guān)閉位地址
  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)                 //設(shè)置模式下閃爍相應(yīng)位
  55.         {
  56.                 if(ss==1)                                 //閃爍標(biāo)志  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                                           //閃爍標(biāo)志  ss=0 熄滅相應(yīng)位 達(dá)到閃爍效果         ss在定時(shí)器里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. /*****************按鍵函數(shù)*****************/
  123. void KEY()
  124. {
  125.         uint lum_mean,lum_all;
  126.         uchar b,c;
  127.         if(change==0)                                  //自動(dòng)切換按鍵按下
  128.         {
  129.                 delay(10);                                  //去抖
  130.                 if(change==0)                          //再次判斷按鍵按下
  131.                 {
  132.                         buzz=0;                                  //蜂鳴器鳴響
  133.                         flag_auto=!flag_auto; //自動(dòng)模式標(biāo)志位取反
  134.                         if(flag_auto==1)          //當(dāng)切換到手動(dòng)模式時(shí)  首先將LED發(fā)光比例設(shè)置在50%
  135.                         scale=20;
  136.                         
  137.                 }
  138.                 while(!change) display();buzz=1; //按鍵釋放  松開按鍵后關(guān)閉蜂鳴器
  139.         }
  140.         if(jiejin==0&&flag_jiejin==1)         //接近傳感器檢測(cè)到障礙時(shí)  開啟報(bào)警
  141.         {
  142.                 buzz=0;
  143.                 flag_jiejin=0;
  144.         }
  145.         if(jiejin!=flag_jiejin)                          //接近傳感器檢測(cè)不到障礙時(shí)  關(guān)閉報(bào)警
  146.         {
  147.                 buzz=1;
  148.                 flag_jiejin=1;
  149.         }
  150.         if(set==0)                                                  //設(shè)置鍵按下時(shí)
  151.         {
  152.                 delay(10);
  153.                 if(set==0)
  154.                 {
  155.                         buzz=0;
  156.                         flag_set++;                                  //設(shè)置變量++
  157.                         if(flag_set==3)                          //加到3時(shí)回復(fù)回正常模式
  158.                         flag_set=0;
  159.                         flag_bs=0;                                 //按下設(shè)置 關(guān)閉報(bào)警
  160.                         
  161.                 }
  162.                 while(!set) display(); buzz=1;        //按鍵釋放
  163.         }
  164.         if(flag_set==1)                                          //加鍵按鍵只有在設(shè)置狀態(tài)(flag_set!=0)時(shí)按下才有效
  165.         {                                                                  //調(diào)分時(shí)
  166.                 if(add==0)                                          //加按鍵按下時(shí)
  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)                                          //減按鍵按下時(shí)
  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.         {                                                                //調(diào)秒時(shí)
  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)                                        //自動(dòng)模式時(shí)
  225.         {
  226.                 if(flag_rsd==1)                                        //且有人在范圍內(nèi)時(shí)
  227.                 {
  228.                         for(b=0;b<49;b++)                         //將空數(shù)組tt【】?jī)?nèi)數(shù)值整體左移一位
  229.                         {
  230.                                 tt[b]=tt[b+1];                        //將后一數(shù)值放到前一位置
  231.                         }
  232.                         tt[49]=ADC0809();                        //將讀出的ad0809數(shù)值放入tt【49】
  233.                         for(c=0;c<50;c++)                        //將tt【】?jī)?nèi)數(shù)值相加
  234.                         {
  235.                                 lum_all=lum_all+tt[c];
  236.                         }
  237.                         lum_mean=lum_all/50;                //將總數(shù)/50取出平均值
  238. //                        lum_all=0;                                        //將總數(shù)清零
  239.                                 
  240.                         if(lum_mean<=30) scale=1;                           //判斷取出平均值大小  小于30  發(fā)光強(qiáng)度0%
  241.                         else if(lum_mean>=150) scale=41;           //大于150  發(fā)光強(qiáng)度100%
  242.                         else scale=((lum_mean-30)/3)+1;                   //其他值時(shí)將其計(jì)算得到發(fā)光強(qiáng)度 (計(jì)算目的是為了得到一個(gè)1-41之間的數(shù)值 控制燈光變化)
  243.                 }
  244.                 else
  245.                 scale=1;                                         //沒有人在范圍內(nèi)時(shí) 將燈光亮度調(diào)至0%
  246.         }
  247.         else                                                        //手動(dòng)模式下
  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)                                  //減鍵按下時(shí)
  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. /*********定時(shí)器初始化函數(shù)**********/
  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;                   //打開中斷允許開關(guān)
  290.         EA=1;                   //中斷總開關(guān)
  291.         TR0=1;
  292.         TR1=0;                   //定時(shí)器定時(shí)開關(guān)
  293. }

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

  301.         while(1)                   //循環(huán)
  302.         {
  303.                 KEY();                 //調(diào)用按鍵函數(shù)
  304.                 display();        //調(diào)用顯示函數(shù)
  305.         }
  306. }
  307. /*****************延時(shí)函數(shù):大約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. /******************定時(shí)器T0服務(wù)函數(shù):脈沖發(fā)生函數(shù)*******************/
  315. void time0() interrupt 1
  316. {
  317.         uchar n;
  318.         TH0=0xff;
  319.         TL0=0xe7;                 //重新賦初值
  320.         n++;                         //每25us  n++
  321.         if(n>scale)                 //n<設(shè)置比例時(shí),打開燈
  322.         {
  323.                 LED=1;
  324.         }
  325.         else if(n<=scale)//n大于等于設(shè)置比例時(shí) 關(guā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. /********************定時(shí)器T0服務(wù)函數(shù):計(jì)時(shí)和閃爍控制********************/
  336. void time1() interrupt 3
  337. {
  338. ……………………

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

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


評(píng)分

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

查看全部評(píng)分

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

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

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

51hei.png

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

51hei.png
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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