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

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3733|回復(fù): 3
收起左側(cè)

51單片機(jī)視力保護(hù)-實(shí)物+原理圖+程序

[復(fù)制鏈接]
ID:110875 發(fā)表于 2020-9-7 21:53 | 顯示全部樓層 |閱讀模式
51單片機(jī)視力保護(hù)-實(shí)物+原理圖+程序
PCB實(shí)物照片 (1).png PCB實(shí)物照片 (2).png 照片 (1).png 照片 (2).png

單片機(jī)源程序如下:
  1. #include <reg52.h>                         //調(diào)用單片機(jī)頭文件
  2. #define uchar unsigned char  //無(wú)符號(hào)字符型 宏定義        變量范圍0~255
  3. #define uint  unsigned int         //無(wú)符號(hào)整型 宏定義        變量范圍0~65535
  4. #include <intrins.h>

  5. sbit CS=P1^4;                //CS定義,連接ADC0832CS腳
  6. sbit SCL=P1^5;                //SCL定義,連接ADC0832SCL腳
  7. sbit DO=P1^6;                //DO定義,連接ADC0832DO腳


  8. //這三個(gè)引腳參考資料
  9. sbit rs=P1^0;         //1602數(shù)據(jù)/命令選擇引腳 H:數(shù)據(jù)              L:命令
  10. sbit rw=P1^1;         //1602讀寫(xiě)引腳                 H:數(shù)據(jù)寄存器          L:指令寄存器
  11. sbit e =P1^2;         //1602使能引腳          下降沿觸發(fā)

  12. sbit c_send   = P3^2;                //超聲波發(fā)射
  13. sbit c_recive = P3^3;                //超聲波接收
  14. uchar flag_hc_value;        //超聲波中間變量
  15. long distance;                    //距離
  16. uint set_d;                        //距離
  17. bit flag_csb_juli;          //超聲波超出量程
  18. uint  flag_time0;           //用來(lái)保存定時(shí)器0的時(shí)候的
  19. bit flag_200ms = 1 ;

  20. uchar guangxian;            //光線的顯示變量
  21. uchar qiang_gx;                            //設(shè)置光線的強(qiáng)的變量
  22. uchar ruo_gx;                            //設(shè)置光線的弱的變量
  23. uchar value;
  24. uchar flag_alarm;       //報(bào)警變量

  25. uchar miao = 0,fen = 0,shi;
  26. uchar s_miao = 55,s_fen = 44,s_shi=0;
  27. bit xuexi_start;   //開(kāi)始學(xué)習(xí)標(biāo)志位
  28. uchar menu_1;              //菜單設(shè)置變量
  29. uchar i;

  30. uchar flag_gx  ;     //光線報(bào)警
  31. uchar flag_juli ;         //距離報(bào)警
  32. uchar flag_time        = 0;         //時(shí)間報(bào)警

  33. /***********************語(yǔ)音模塊控制IO口的定義************************/
  34. sbit  VRST = P2^4;
  35. sbit  VBUSY= P2^3;       
  36. sbit  VSDA = P2^2;
  37. sbit  VCS  = P2^1;  
  38. sbit  VSCL = P2^0;


  39. /***********************1ms延時(shí)函數(shù)*****************************/
  40. void delay_1ms(uint q)
  41. {
  42.         uint i,j;
  43.         for(i=0;i<q;i++)
  44.                 for(j=0;j<120;j++);
  45. }

  46. /********************************************************************
  47. * 名稱(chēng) : delay()
  48. * 功能 : 延時(shí),延時(shí)時(shí)間大概為5US。
  49. * 輸入 : 無(wú)
  50. * 輸出 : 無(wú)
  51. ***********************************************************************/
  52. void delay_uint(uint q)
  53. {
  54.         while(q--);
  55. }

  56. /********************************************************************
  57. * 名稱(chēng) : write_com(uchar com)
  58. * 功能 : 1602命令函數(shù)
  59. * 輸入 : 輸入的命令值
  60. * 輸出 : 無(wú)
  61. ***********************************************************************/
  62. void write_com(uchar com)
  63. {
  64.         e=0;
  65.         rs=0;
  66.         rw=0;
  67.         P0=com;
  68.         delay_uint(3);
  69.         e=1;
  70.         delay_uint(25);
  71.         e=0;
  72. }

  73. /********************************************************************
  74. * 名稱(chēng) : write_data(uchar dat)
  75. * 功能 : 1602寫(xiě)數(shù)據(jù)函數(shù)
  76. * 輸入 : 需要寫(xiě)入1602的數(shù)據(jù)
  77. * 輸出 : 無(wú)
  78. ***********************************************************************/
  79. void write_data(uchar dat)
  80. {
  81.         e=0;
  82.         rs=1;
  83.         rw=0;
  84.         P0=dat;
  85.         delay_uint(3);
  86.         e=1;
  87.         delay_uint(25);
  88.         e=0;       
  89. }

  90. /***********************lcd1602上顯示兩位十進(jìn)制數(shù)************************/
  91. void write_sfm2(uchar hang,uchar add,uchar date)
  92. {
  93.         if(hang==1)   
  94.                 write_com(0x80+add);
  95.         else
  96.                 write_com(0x80+0x40+add);                  
  97.         write_data(0x30+date/10%10);
  98.         write_data(0x30+date%10);       
  99. }

  100. /***********************lcd1602上顯示超聲波距離************************/
  101. void write_sfm_csb(uchar hang,uchar add,uint date)
  102. {
  103.         if(hang==1)   
  104.                 write_com(0x80+add);
  105.         else
  106.                 write_com(0x80+0x40+add);                  
  107.         write_data(0x30+date/100%10);
  108.         write_data('.');
  109.         write_data(0x30+date/10%10);
  110.         write_data(0x30+date%10);       
  111. }


  112. /********************************************************************
  113. * 名稱(chēng) : init_1602()
  114. * 功能 : 1602初始化,請(qǐng)參考1602的資料
  115. * 輸入 : 無(wú)
  116. * 輸出 : 無(wú)
  117. ***********************************************************************/
  118. void init_1602()
  119. {
  120.         write_com(0x38);        //
  121.         write_com(0x0c);
  122.         write_com(0x06);
  123. }

  124. /********************************************************************
  125. * 名稱(chēng) : write_string(uchar hang,uchar lie,uchar *p)
  126. * 功能 : 改變液晶中某位的值,如果要讓第一行,第五個(gè)字符開(kāi)始顯示"ab cd ef" ,調(diào)用該函數(shù)如下
  127.                   write_string(1,5,"ab cd ef;")
  128. * 輸入 : 行,列,需要輸入1602的數(shù)據(jù)
  129. * 輸出 : 無(wú)
  130. ***********************************************************************/
  131. void write_string(uchar hang,uchar add,uchar *p)
  132. {
  133.         if(hang==1)   
  134.                 write_com(0x80+add);
  135.         else
  136.                 write_com(0x80+0x40+add);
  137.                 while(1)                                                                                                                 
  138.                 {
  139.                         if(*p == '\0')  break;
  140.                         write_data(*p);
  141.                         p++;
  142.                 }       
  143. }

  144. uchar key_can;
  145. /********************獨(dú)立按鍵程序*****************/
  146. void key()
  147. {
  148.         static uchar key_new;
  149.         key_can = 20;
  150.         if((P3 & 0xf0) != 0xf0)
  151.         {
  152.                 delay_uint(50);
  153.                 if(((P3 & 0xf0) != 0xf0) && (key_new == 1))
  154.                 {
  155.                         key_new = 0;
  156.                         switch(P3 & 0xf0)
  157.                         {
  158.                                 case 0xe0:  key_can = 3;  break;         //左邊第1個(gè)
  159.                                 case 0xb0:  key_can = 2;  break;         //左邊第2個(gè)
  160.                                 case 0x70:  key_can = 1;  break;         //左邊第3個(gè)
  161.                         }
  162.                 }
  163.         }
  164.         else
  165.                 key_new = 1;       
  166. }

  167. /***********讀數(shù)模轉(zhuǎn)換數(shù)據(jù)********************************************************/       
  168. //請(qǐng)先了解ADC0832模數(shù)轉(zhuǎn)換的串行協(xié)議,再來(lái)讀本函數(shù),主要是對(duì)應(yīng)時(shí)序圖來(lái)理解,本函數(shù)是模擬0832的串行協(xié)議進(jìn)行的
  169. unsigned char ad0832read(bit SGL,bit ODD)
  170. {
  171.         unsigned char i=0,value=0,value1=0;               
  172.         SCL=0;
  173.         DO=1;
  174.         CS=0;                //開(kāi)始
  175.         SCL=1;                //第一個(gè)上升沿       
  176.         SCL=0;
  177.         DO=ODD;
  178.         SCL=1;          //第二個(gè)上升沿
  179.         SCL=0;
  180.         DO=SGL;
  181.         for(i=0;i<8;i++)
  182.         {
  183.                 SCL=0; //開(kāi)始從第四個(gè)下降沿接收數(shù)據(jù)
  184.                 value<<=1;
  185.                 SCL=1;
  186.                 if(DO)
  187.                         value++;                                               
  188.         }
  189.         return value;
  190. }


  191. /*********************小延時(shí)函數(shù)*****************************/
  192. void delay()
  193. {
  194.         _nop_();                            //執(zhí)行一條_nop_()指令就是1us
  195.         _nop_();
  196.         _nop_();
  197.         _nop_();
  198.         _nop_();
  199.         _nop_();
  200.         _nop_();  
  201. }

  202. /*********************超聲波測(cè)距程序*****************************/
  203. void send_wave()
  204. {
  205.         c_send = 1;                           //10us的高電平觸發(fā)
  206.         delay();
  207.         c_send = 0;         
  208.         TH0 = 0;                          //給定時(shí)器0清零
  209.         TL0 = 0;
  210.         TR0=1;
  211.         while(c_recive)                      //當(dāng)c_recive為1計(jì)數(shù)并等待
  212.         {
  213.                 flag_time0 = TH0 * 256 + TL0;
  214.                 if((flag_time0 > 40000))      //當(dāng)超聲波超過(guò)測(cè)量范圍時(shí),顯示3個(gè)888
  215.                 {
  216.                         TR0 = 0;
  217.                         flag_csb_juli = 2;
  218.                         distance = 888;
  219.                         break ;               
  220.                 }
  221.                 else
  222.                 {
  223.                         flag_csb_juli = 1;       
  224.                 }
  225.         }
  226.         if(flag_csb_juli == 1)
  227.         {       
  228.                 TR0=0;                                                         //關(guān)定時(shí)器0定時(shí)
  229.                 distance =flag_time0;                         //讀出定時(shí)器0的時(shí)間
  230.                 distance *= 0.017;               // 0.017 = 340M / 2 = 170M = 0.017M 算出來(lái)是米
  231.                 if((distance > 500))                                 //距離 = 速度 * 時(shí)間
  232.                 {       
  233.                         distance = 888;                                 //如果大于3.8m就超出超聲波的量程
  234.                 }
  235.         }  
  236. }

  237. /*********************定時(shí)器0、定時(shí)器1初始化******************/
  238. void time_init()          
  239. {
  240.         EA  = 1;                   //開(kāi)總中斷
  241.         TMOD = 0X11;          //定時(shí)器0、定時(shí)器1工作方式1
  242.         ET0 = 1;                  //開(kāi)定時(shí)器0中斷
  243.         TR0 = 1;                  //允許定時(shí)器0定時(shí)
  244.         ET1 = 1;                  //開(kāi)定時(shí)器1中斷
  245.         TR1 = 1;                  //允許定時(shí)器1定時(shí)       
  246. }

  247. /*******************按鍵執(zhí)行函數(shù)******************/
  248. void key_with()
  249. {
  250.         if(menu_1 == 0)
  251.         {
  252.                 if(key_can == 2)        //暫停學(xué)習(xí)       
  253.                 {
  254.                         xuexi_start = ~xuexi_start;  
  255.                 }
  256.                 if(key_can == 3)
  257.                 {         
  258.                         xuexi_start = 1;  //開(kāi)始學(xué)習(xí)       
  259.                         miao = 0;
  260.                         fen = 0;
  261.                         shi = 0;
  262.                 }
  263.         }
  264.         if(key_can == 1)
  265.         {
  266.                 menu_1 ++;       
  267.                 if(menu_1 == 1)
  268.                 {
  269.                         write_string(1,0,"1.xsb:    m     ");       
  270.                         write_string(2,0,"2.   :  :       ");       
  271.                         write_sfm_csb(1,6,set_d);
  272.                         write_sfm2(2,3,s_shi);                 //        顯示
  273.                         write_sfm2(2,6,s_fen);                 //        顯示
  274.                         write_sfm2(2,9,s_miao);                 //        顯示

  275.                         write_com(0x80+0);              //將光標(biāo)移動(dòng)到
  276.                         write_com(0x0f);                //顯示光標(biāo)并且閃爍       
  277.                 }
  278.                 if(menu_1 == 2)
  279.                 {
  280.                         write_com(0x80+0x40+0);              //將光標(biāo)移動(dòng)到
  281.                         write_com(0x0f);                //顯示光標(biāo)并且閃爍               
  282.                 }
  283.                 if(menu_1 == 5)
  284.                 {
  285.                         write_string(1,0,"3.H-gx:  %        ");       
  286.                         write_string(2,0,"4.L-gx:  %        ");       
  287.                         write_sfm2(1,7,qiang_gx);
  288.                         write_sfm2(2,7,ruo_gx);         //設(shè)置光線的參數(shù)
  289.                         write_com(0x80+6);              //將光標(biāo)移動(dòng)到
  290.                         write_com(0x0f);                //顯示光標(biāo)并且閃爍       
  291.                 }

  292.                 if(menu_1 >= 7)
  293.                 {
  294.                         menu_1 = 0;
  295.                         write_string(1,0," csb:           m gx:   ");
  296.                         write_string(2,0,"     :  :        ");
  297.                         write_com(0x0c);     //關(guān)閉顯示
  298.                 }                               
  299.         }
  300.         if(menu_1 == 1)   //設(shè)置超聲波參數(shù)
  301.         {
  302.                 if(key_can == 2)  //
  303.                 {
  304.                          set_d ++;                                   //加超聲波距離報(bào)警數(shù)據(jù)
  305.                         if(set_d >= 200)
  306.                                 set_d = 200;

  307.                 }       
  308.                 if(key_can == 3)  //
  309.                 {
  310.                          set_d --;                                   //減超聲波距離報(bào)警數(shù)據(jù)
  311.                         if(set_d <= 10)
  312.                                 set_d = 10;
  313.                 }
  314.                 write_sfm_csb(1,6,set_d);                 //        顯示設(shè)置的距離
  315.                 write_com(0x85);              //將光標(biāo)移動(dòng)到
  316.                 write_com(0x0f);                //顯示光標(biāo)并且閃爍               
  317.         }
  318.         if(menu_1 == 2)   //設(shè)置時(shí)鐘參數(shù)
  319.         {
  320.                 if(key_can == 2)  //
  321.                 {
  322.                          s_shi ++;                                   //加時(shí)鐘報(bào)警數(shù)據(jù)
  323.                         if(s_shi >= 24)
  324.                                 s_shi = 0;
  325.                 }       
  326.                 if(key_can == 3)  //
  327.                 {
  328.                         if(s_shi <= 0)
  329.                                 s_shi = 24;
  330.                          s_shi --;                                   //減時(shí)鐘報(bào)警數(shù)據(jù)
  331.                 }
  332.                 write_sfm2(2,3,s_shi);                 //        顯示時(shí)
  333.                 write_sfm2(2,6,s_fen);                 //        顯示分
  334.                 write_sfm2(2,9,s_miao);                 //        顯示秒
  335.                 write_com(0x80+0x40+3);              //將光標(biāo)移動(dòng)到
  336.                 write_com(0x0f);                //顯示光標(biāo)并且閃爍               
  337.         }
  338.         if(menu_1 == 3)   //設(shè)置分鐘參數(shù)
  339.         {
  340.                 if(key_can == 2)  //
  341.                 {
  342.                          s_fen ++;                                   //加分鐘報(bào)警數(shù)據(jù)
  343.                         if(s_fen >= 60)
  344.                                 s_fen = 0;
  345.                 }       
  346.                 if(key_can == 3)  //
  347.                 {
  348.                         if(s_fen <= 0)
  349.                                 s_fen = 60;
  350.                          s_fen --;                                   //減分鐘報(bào)警數(shù)據(jù)
  351.                 }
  352.                 write_sfm2(2,3,s_shi);                 //        顯示時(shí)
  353.                 write_sfm2(2,6,s_fen);                 //        顯示分
  354.                 write_sfm2(2,9,s_miao);                 //        顯示秒
  355.                 write_com(0x80+0x40+6);              //將光標(biāo)移動(dòng)到
  356.                 write_com(0x0f);                //顯示光標(biāo)并且閃爍               
  357.         }
  358.         if(menu_1 == 4)   //設(shè)置秒鐘參數(shù)
  359.         {
  360.                 if(key_can == 2)  //
  361.                 {
  362.                          s_miao ++;                                   //加秒鐘報(bào)警數(shù)據(jù)
  363.                         if(s_miao >= 60)
  364.                                 s_miao = 0;
  365.                 }       
  366.                 if(key_can == 3)  //
  367.                 {
  368.                         if(s_miao <= 0)
  369.                                 s_miao = 60;
  370.                          s_miao --;                                   //減秒鐘報(bào)警數(shù)據(jù)
  371.                 }
  372.                 write_sfm2(2,3,s_shi);                 //        顯示時(shí)
  373.                 write_sfm2(2,6,s_fen);                 //        顯示分
  374.                 write_sfm2(2,9,s_miao);                 //        顯示秒
  375.                 write_com(0x80+0x40+9);              //將光標(biāo)移動(dòng)到
  376.                 write_com(0x0f);                //顯示光標(biāo)并且閃爍               
  377.         }

  378.         if(menu_1 == 5)                                                //設(shè)置強(qiáng)光報(bào)警
  379.         {
  380.                 if(key_can == 2)  //
  381.                 {
  382.                          qiang_gx ++;                                   //加強(qiáng)光報(bào)警數(shù)據(jù)
  383.                         if(qiang_gx >= 100)
  384.                                 qiang_gx = 100;
  385.                 }       
  386.                 if(key_can == 3)  //
  387.                 {
  388.                          qiang_gx --;                                   //減強(qiáng)光報(bào)警數(shù)據(jù)
  389.                         if(qiang_gx <= ruo_gx)
  390.                                 qiang_gx = ruo_gx;
  391.                 }
  392.                 write_sfm2(1,7,qiang_gx);
  393.                 write_com(0x80+6);         //將光標(biāo)移動(dòng)到
  394.                 write_com(0x0f);                //顯示光標(biāo)并且閃爍               
  395.         }
  396.         if(menu_1 == 6)                                                    //設(shè)置弱光報(bào)警
  397.         {
  398.                 if(key_can == 2)  //
  399.                 {
  400.                          ruo_gx ++;                                    //加弱光報(bào)警數(shù)據(jù)
  401.                         if(ruo_gx >= qiang_gx)
  402.                                 ruo_gx = qiang_gx;

  403.                 }       
  404.                 if(key_can == 3)  //
  405.                 {
  406.                          ruo_gx --;                                   //減強(qiáng)光報(bào)警數(shù)據(jù)
  407.                         if(ruo_gx <= 1)
  408.                                 ruo_gx = 1;
  409.                 }
  410.                 write_sfm2(2,7,ruo_gx);
  411.                 write_com(0x80+0x40+6);              //將光標(biāo)移動(dòng)到
  412.                 write_com(0x0f);                //顯示光標(biāo)并且閃爍               
  413.         }
  414. }

  415. /***********************語(yǔ)音子程序************************/
  416. void Send_threelines(unsigned char addr)
  417. {
  418.    unsigned char i;
  419.         VRST=0;
  420.         delay_1ms(5);
  421.         VRST=1;
  422.         delay_1ms(10); /* 復(fù)位拉高10ms*/
  423.         VCS=0;
  424.         delay_1ms(5);  /* 片選拉低5ms */
  425.     for(i=0;i<8;i++)
  426.         {
  427.                 VSCL=1;
  428.                 if(addr&0x01 == 0x01)
  429.                 {
  430.                         VSDA=1;
  431.                 }
  432.                 else
  433.                         VSDA=0;
  434.                 addr<<=1;
  435.                 VSCL=0;
  436.         }
  437.         VCS=1;
  438.         while(VBUSY == 0);          //忙等待
  439. }

  440. /*********************報(bào)警函數(shù)***************************/
  441. void clock_beep()
  442. {
  443.         if((guangxian >= qiang_gx) || (guangxian <= ruo_gx))          //光線報(bào)警
  444.         {
  445.                 flag_gx = 1;      //光線報(bào)警  
  446.         }else
  447.         {
  448.                 flag_gx = 0;
  449.         }
  450.         if(xuexi_start == 1)                  //已經(jīng)開(kāi)始學(xué)習(xí)了
  451.         {
  452.                 if(distance <= set_d)          //距離報(bào)警
  453.                 {
  454.                                 flag_juli = 1;         
  455.                         Send_threelines(42) ;                //距離太近,請(qǐng)坐直
  456.                 }else
  457.                 {
  458.                         flag_juli = 0;         
  459.                 }                  
  460.                 if((shi == s_shi) && (fen == s_fen) && (miao == s_miao))   //時(shí)間報(bào)警
  461.                 {
  462.                         flag_time = 1;       
  463.                 }       
  464.         }        
  465.         if(flag_time == 1)         //時(shí)間提示報(bào)警
  466.         {

  467.                 Send_threelines(41) ;                //時(shí)間到了,休息一會(huì)兒
  468.         }
  469.         else
  470.         {
  471.                 if(xuexi_start == 1)                  //已經(jīng)開(kāi)始學(xué)習(xí)了
  472.                 {
  473.                         if((flag_gx == 1) || (flag_juli == 1))
  474.                         {
  475.                                 if(guangxian >= qiang_gx)
  476.                                         Send_threelines(44) ;                //光線太強(qiáng)       
  477.                                 if(guangxian <= ruo_gx)
  478.                                         Send_threelines(43) ;                //光線太暗
  479.                         }
  480.                 }
  481.         }       
  482. }


  483. /********************************************************************
  484. * 名稱(chēng) : Main()
  485. * 功能 : 主函數(shù)
  486. ……………………

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

所有資料51hei提供下載:
程序.zip (67.02 KB, 下載次數(shù): 39)

元件清單.zip (6.95 KB, 下載次數(shù): 22)

原理圖.zip (85.98 KB, 下載次數(shù): 29)



評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:673647 發(fā)表于 2020-9-8 08:06 | 顯示全部樓層
謝謝分享,但具體干嘛用的?是不是用超聲波探測(cè) 距離和紙?zhí)桶l(fā)聲?
回復(fù)

使用道具 舉報(bào)

ID:110875 發(fā)表于 2020-9-8 20:56 | 顯示全部樓層

全部資料.zip (160.58 KB, 下載次數(shù): 42)
忘記全部壓縮了,這是全部資料,隨便下載
回復(fù)

使用道具 舉報(bào)

ID:819002 發(fā)表于 2020-9-15 18:53 | 顯示全部樓層
13118302007 發(fā)表于 2020-9-8 20:56
忘記全部壓縮了,這是全部資料,隨便下載

干嘛用的呢
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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