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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 11060|回復: 7
收起左側(cè)

單片機智能視力保護器(智能臺燈)的仿真和程序源碼

  [復制鏈接]
ID:363148 發(fā)表于 2018-7-2 15:23 | 顯示全部樓層 |閱讀模式
智能臺燈電路原理圖如下:
捕獲.PNG

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

單片機源程序如下:
  1. //宏定義          重命名作用將unsigned int、unsigned char變?yōu)閡nit、uchar
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. #define DUAN P0          //用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}; //帶點的數(shù)字0-9的編碼//gc.debfa         
  11. uchar pdata tt[51];                   //定義空數(shù)組用于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 調(diào)分  2 調(diào)秒
  16. uchar lum;                                        //ad0809讀出值

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

  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;  //接近開關(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);                          //小延時
  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)                 //設置模式下閃爍相應位
  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. /*****************按鍵函數(shù)*****************/
  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發(fā)光比例設置在50%
  135.                         scale=20;
  136.                        
  137.                 }
  138.                 while(!change) display();buzz=1; //按鍵釋放  松開按鍵后關(guān)閉蜂鳴器  display()顯示輸出函數(shù)
  139.         }
  140.         if(jiejin==0&&flag_jiejin==1)         //接近傳感器檢測到障礙時  開啟報警
  141.         {
  142.                 buzz=0;
  143.                 flag_jiejin=0;
  144.         }
  145.         if(jiejin!=flag_jiejin)                          //接近傳感器檢測不到障礙時  關(guān)閉報警
  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;                                 //按下設置 關(guān)閉報警
  160.                        
  161.                 }
  162.                 while(!set) display(); buzz=1;        //按鍵釋放
  163.         }
  164.         if(flag_set==1)                                          //加鍵按鍵只有在設置狀態(tài)(flag_set!=0)時按下才有效
  165.         {                                                                  //調(diào)分時
  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.         {                                                                //調(diào)秒時
  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)                                        //且有人在范圍內(nèi)時
  227.                 {
  228.                         for(b=0;b<49;b++)                         //將空數(shù)組tt【】內(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【】內(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ā)光強度0%
  241.                         else if(lum_mean>=150) scale=41;           //大于150  發(fā)光強度100%
  242.                         else scale=((lum_mean-30)/3)+1;                   //其他值時將其計算得到發(fā)光強度 (計算目的是為了得到一個1-41之間的數(shù)值 控制燈光變化)
  243.                 }
  244.                 else
  245.                 scale=1;                                         //沒有人在范圍內(nèi)時 將燈光亮度調(diào)至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. /*********定時器初始化函數(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;                   //定時器定時開關(guān)
  293. }

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

  301.         while(1)                   //循環(huán)
  302.         {
  303.                 KEY();                 //調(diào)用按鍵函數(shù)
  304.                 display();        //調(diào)用顯示函數(shù)
  305.         }
  306. }
  307. /*****************延時函數(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. /******************定時器T0服務函數(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<設置比例時,打開燈
  322.         {
  323.                 LED=1;
  324.         }
  325.         else if(n<=scale)//n大于等于設置比例時 關(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. /********************定時器T0服務函數(shù):計時和閃爍控制********************/
  336. void time1() interrupt 3
  337. {
  338.         uchar m;
  339.         TH1=0x3c;
  340.         TL1=0xb0;                 //重新賦初值
  341.         m++;                         //50ms  m++
  342.         if((m==10||m==20)&&flag_set!=0)          //每過500ms  并且 在設置狀態(tài)時
  343.         {
  344.                 ss=!ss;                                                  //閃爍變量取反
  345.         }
  346.         if(m==20)                                                  //到達1s時
  347.         {
  348.                 m=0;                                                  //m=0
  349.                 if(rsd==0)                                          //熱釋電無信號時
  350.                 rsd_sec++;                                          //熱釋電計時秒++
  351.                 if(rsd_sec<=30&&rsd==1)                  //熱釋電計時秒小于等于30 并且 熱釋電有信號時
  352.                 {
  353.                         rsd_sec=0;                                  //將熱釋電秒清零
  354.                         flag_rsd=1;                                  //標志位置1 控制AD0809采集數(shù)值 調(diào)節(jié)燈光亮度
  355.                 }
  356.                 else if(rsd_sec>30&&rsd==0)          //熱釋電計時秒大于30 并且 熱釋電無信號時
  357.                 {
  358.                         flag_rsd=0;                                  //標志位置0 停止ad0809轉(zhuǎn)換 關(guān)閉燈光
  359.                         rsd_sec=0;                                  //熱釋電計時秒清零
  360.                 }
  361.                 if(flag_set==0&&flag_bs==0&&((min+sec)!=0))                 //正常模式下&&未報警&&定時時間不為零時
  362.                 {
  363.                         sec--;
  364.                         if(sec<0)                                                                         //定時秒--  小于0時
  365.                         {
  366.                                 sec=59;                                                                         //復位到59秒
  367.                                 min--;                                                                         //分--
  368.                         }
  369.                         if(min<=0&&sec==0)                                                         //分和秒都減到零時
  370.                         {
  371.                                 min=0;
  372.                                 flag_bs=1;
  373.                                 buzz=0;                                                                         //蜂鳴器報警提示時間到
  374.                         }
  375.                 }
  376. //                else buzz=1;       
  377.         }       
  378. }
復制代碼

所有資料51hei提供下載:
智能臺燈.zip (103.2 KB, 下載次數(shù): 305)



評分

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

查看全部評分

回復

使用道具 舉報

ID:239426 發(fā)表于 2019-2-4 14:34 | 顯示全部樓層
感謝樓主,好東西
回復

使用道具 舉報

ID:500244 發(fā)表于 2019-4-2 16:40 | 顯示全部樓層
坑人,沒結(jié)果
回復

使用道具 舉報

ID:532547 發(fā)表于 2019-6-1 20:49 | 顯示全部樓層

好東西
回復

使用道具 舉報

ID:551342 發(fā)表于 2019-6-2 20:08 | 顯示全部樓層
我怎么運行不出來啊
回復

使用道具 舉報

ID:532547 發(fā)表于 2019-6-5 14:54 | 顯示全部樓層

可以描述一下臺燈工作的完整流程嗎?十分感謝!
回復

使用道具 舉報

ID:563999 發(fā)表于 2019-6-16 22:59 | 顯示全部樓層
這個代碼好像用不起欸
回復

使用道具 舉報

ID:1011865 發(fā)表于 2022-3-25 10:14 來自手機 | 顯示全部樓層
樓主,電壓是多少
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线视频 亚洲 | 精品在线观看入口 | 99热国产免费 | 天堂一区二区三区 | 亚洲精品一区二区三区蜜桃久 | 久久aⅴ乱码一区二区三区 91综合网 | 国产免费麻豆视频 | 在线免费国产视频 | 免费在线播放黄色 | 国产精品亚洲精品日韩已方 | 超碰8 | 91精品国产综合久久久久久首页 | 亚洲成人精品在线观看 | 91伦理片| 国产精品永久久久久久久www | 国产精品国产三级国产aⅴ无密码 | 亚洲永久免费 | 亚洲精品久久久久中文字幕二区 | av片在线免费看 | 日本免费小视频 | 国产精品精品视频一区二区三区 | 99久久精品国产一区二区三区 | 一区二区三区免费 | 综合国产 | 亚洲欧美日韩中文字幕一区二区三区 | 在线国产一区二区 | 狠狠操网站 | 久久久国产精品 | 正在播放国产精品 | 91久久久久久久久久久久久 | 成人av一区二区亚洲精 | 亚洲国产精品视频 | 黑人精品欧美一区二区蜜桃 | 国产精品久久久久久久久久久久午夜片 | 91福利网| 在线观看成人免费视频 | 白浆在线| 99久久精品一区二区成人 | 国产欧美一区二区三区在线播放 | 欧美视频一区二区三区 | 国产精品资源在线 |