|
51單片機(jī)視力保護(hù)-實(shí)物+原理圖+程序
單片機(jī)源程序如下:
- #include <reg52.h> //調(diào)用單片機(jī)頭文件
- #define uchar unsigned char //無(wú)符號(hào)字符型 宏定義 變量范圍0~255
- #define uint unsigned int //無(wú)符號(hào)整型 宏定義 變量范圍0~65535
- #include <intrins.h>
- sbit CS=P1^4; //CS定義,連接ADC0832CS腳
- sbit SCL=P1^5; //SCL定義,連接ADC0832SCL腳
- sbit DO=P1^6; //DO定義,連接ADC0832DO腳
- //這三個(gè)引腳參考資料
- sbit rs=P1^0; //1602數(shù)據(jù)/命令選擇引腳 H:數(shù)據(jù) L:命令
- sbit rw=P1^1; //1602讀寫(xiě)引腳 H:數(shù)據(jù)寄存器 L:指令寄存器
- sbit e =P1^2; //1602使能引腳 下降沿觸發(fā)
- sbit c_send = P3^2; //超聲波發(fā)射
- sbit c_recive = P3^3; //超聲波接收
- uchar flag_hc_value; //超聲波中間變量
- long distance; //距離
- uint set_d; //距離
- bit flag_csb_juli; //超聲波超出量程
- uint flag_time0; //用來(lái)保存定時(shí)器0的時(shí)候的
- bit flag_200ms = 1 ;
- uchar guangxian; //光線的顯示變量
- uchar qiang_gx; //設(shè)置光線的強(qiáng)的變量
- uchar ruo_gx; //設(shè)置光線的弱的變量
- uchar value;
- uchar flag_alarm; //報(bào)警變量
- uchar miao = 0,fen = 0,shi;
- uchar s_miao = 55,s_fen = 44,s_shi=0;
- bit xuexi_start; //開(kāi)始學(xué)習(xí)標(biāo)志位
- uchar menu_1; //菜單設(shè)置變量
- uchar i;
- uchar flag_gx ; //光線報(bào)警
- uchar flag_juli ; //距離報(bào)警
- uchar flag_time = 0; //時(shí)間報(bào)警
- /***********************語(yǔ)音模塊控制IO口的定義************************/
- sbit VRST = P2^4;
- sbit VBUSY= P2^3;
- sbit VSDA = P2^2;
- sbit VCS = P2^1;
- sbit VSCL = P2^0;
-
- /***********************1ms延時(shí)函數(shù)*****************************/
- void delay_1ms(uint q)
- {
- uint i,j;
- for(i=0;i<q;i++)
- for(j=0;j<120;j++);
- }
- /********************************************************************
- * 名稱(chēng) : delay()
- * 功能 : 延時(shí),延時(shí)時(shí)間大概為5US。
- * 輸入 : 無(wú)
- * 輸出 : 無(wú)
- ***********************************************************************/
- void delay_uint(uint q)
- {
- while(q--);
- }
- /********************************************************************
- * 名稱(chēng) : write_com(uchar com)
- * 功能 : 1602命令函數(shù)
- * 輸入 : 輸入的命令值
- * 輸出 : 無(wú)
- ***********************************************************************/
- void write_com(uchar com)
- {
- e=0;
- rs=0;
- rw=0;
- P0=com;
- delay_uint(3);
- e=1;
- delay_uint(25);
- e=0;
- }
- /********************************************************************
- * 名稱(chēng) : write_data(uchar dat)
- * 功能 : 1602寫(xiě)數(shù)據(jù)函數(shù)
- * 輸入 : 需要寫(xiě)入1602的數(shù)據(jù)
- * 輸出 : 無(wú)
- ***********************************************************************/
- void write_data(uchar dat)
- {
- e=0;
- rs=1;
- rw=0;
- P0=dat;
- delay_uint(3);
- e=1;
- delay_uint(25);
- e=0;
- }
- /***********************lcd1602上顯示兩位十進(jìn)制數(shù)************************/
- void write_sfm2(uchar hang,uchar add,uchar date)
- {
- if(hang==1)
- write_com(0x80+add);
- else
- write_com(0x80+0x40+add);
- write_data(0x30+date/10%10);
- write_data(0x30+date%10);
- }
- /***********************lcd1602上顯示超聲波距離************************/
- void write_sfm_csb(uchar hang,uchar add,uint date)
- {
- if(hang==1)
- write_com(0x80+add);
- else
- write_com(0x80+0x40+add);
- write_data(0x30+date/100%10);
- write_data('.');
- write_data(0x30+date/10%10);
- write_data(0x30+date%10);
- }
- /********************************************************************
- * 名稱(chēng) : init_1602()
- * 功能 : 1602初始化,請(qǐng)參考1602的資料
- * 輸入 : 無(wú)
- * 輸出 : 無(wú)
- ***********************************************************************/
- void init_1602()
- {
- write_com(0x38); //
- write_com(0x0c);
- write_com(0x06);
- }
- /********************************************************************
- * 名稱(chēng) : write_string(uchar hang,uchar lie,uchar *p)
- * 功能 : 改變液晶中某位的值,如果要讓第一行,第五個(gè)字符開(kāi)始顯示"ab cd ef" ,調(diào)用該函數(shù)如下
- write_string(1,5,"ab cd ef;")
- * 輸入 : 行,列,需要輸入1602的數(shù)據(jù)
- * 輸出 : 無(wú)
- ***********************************************************************/
- void write_string(uchar hang,uchar add,uchar *p)
- {
- if(hang==1)
- write_com(0x80+add);
- else
- write_com(0x80+0x40+add);
- while(1)
- {
- if(*p == '\0') break;
- write_data(*p);
- p++;
- }
- }
- uchar key_can;
- /********************獨(dú)立按鍵程序*****************/
- void key()
- {
- static uchar key_new;
- key_can = 20;
- if((P3 & 0xf0) != 0xf0)
- {
- delay_uint(50);
- if(((P3 & 0xf0) != 0xf0) && (key_new == 1))
- {
- key_new = 0;
- switch(P3 & 0xf0)
- {
- case 0xe0: key_can = 3; break; //左邊第1個(gè)
- case 0xb0: key_can = 2; break; //左邊第2個(gè)
- case 0x70: key_can = 1; break; //左邊第3個(gè)
- }
- }
- }
- else
- key_new = 1;
- }
- /***********讀數(shù)模轉(zhuǎn)換數(shù)據(jù)********************************************************/
- //請(qǐng)先了解ADC0832模數(shù)轉(zhuǎn)換的串行協(xié)議,再來(lái)讀本函數(shù),主要是對(duì)應(yīng)時(shí)序圖來(lái)理解,本函數(shù)是模擬0832的串行協(xié)議進(jìn)行的
- unsigned char ad0832read(bit SGL,bit ODD)
- {
- unsigned char i=0,value=0,value1=0;
- SCL=0;
- DO=1;
- CS=0; //開(kāi)始
- SCL=1; //第一個(gè)上升沿
- SCL=0;
- DO=ODD;
- SCL=1; //第二個(gè)上升沿
- SCL=0;
- DO=SGL;
- for(i=0;i<8;i++)
- {
- SCL=0; //開(kāi)始從第四個(gè)下降沿接收數(shù)據(jù)
- value<<=1;
- SCL=1;
- if(DO)
- value++;
- }
- return value;
- }
- /*********************小延時(shí)函數(shù)*****************************/
- void delay()
- {
- _nop_(); //執(zhí)行一條_nop_()指令就是1us
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- /*********************超聲波測(cè)距程序*****************************/
- void send_wave()
- {
- c_send = 1; //10us的高電平觸發(fā)
- delay();
- c_send = 0;
- TH0 = 0; //給定時(shí)器0清零
- TL0 = 0;
- TR0=1;
- while(c_recive) //當(dāng)c_recive為1計(jì)數(shù)并等待
- {
- flag_time0 = TH0 * 256 + TL0;
- if((flag_time0 > 40000)) //當(dāng)超聲波超過(guò)測(cè)量范圍時(shí),顯示3個(gè)888
- {
- TR0 = 0;
- flag_csb_juli = 2;
- distance = 888;
- break ;
- }
- else
- {
- flag_csb_juli = 1;
- }
- }
- if(flag_csb_juli == 1)
- {
- TR0=0; //關(guān)定時(shí)器0定時(shí)
- distance =flag_time0; //讀出定時(shí)器0的時(shí)間
- distance *= 0.017; // 0.017 = 340M / 2 = 170M = 0.017M 算出來(lái)是米
- if((distance > 500)) //距離 = 速度 * 時(shí)間
- {
- distance = 888; //如果大于3.8m就超出超聲波的量程
- }
- }
- }
- /*********************定時(shí)器0、定時(shí)器1初始化******************/
- void time_init()
- {
- EA = 1; //開(kāi)總中斷
- TMOD = 0X11; //定時(shí)器0、定時(shí)器1工作方式1
- ET0 = 1; //開(kāi)定時(shí)器0中斷
- TR0 = 1; //允許定時(shí)器0定時(shí)
- ET1 = 1; //開(kāi)定時(shí)器1中斷
- TR1 = 1; //允許定時(shí)器1定時(shí)
- }
- /*******************按鍵執(zhí)行函數(shù)******************/
- void key_with()
- {
- if(menu_1 == 0)
- {
- if(key_can == 2) //暫停學(xué)習(xí)
- {
- xuexi_start = ~xuexi_start;
- }
- if(key_can == 3)
- {
- xuexi_start = 1; //開(kāi)始學(xué)習(xí)
- miao = 0;
- fen = 0;
- shi = 0;
- }
- }
- if(key_can == 1)
- {
- menu_1 ++;
- if(menu_1 == 1)
- {
- write_string(1,0,"1.xsb: m ");
- write_string(2,0,"2. : : ");
- write_sfm_csb(1,6,set_d);
- write_sfm2(2,3,s_shi); // 顯示
- write_sfm2(2,6,s_fen); // 顯示
- write_sfm2(2,9,s_miao); // 顯示
- write_com(0x80+0); //將光標(biāo)移動(dòng)到
- write_com(0x0f); //顯示光標(biāo)并且閃爍
- }
- if(menu_1 == 2)
- {
- write_com(0x80+0x40+0); //將光標(biāo)移動(dòng)到
- write_com(0x0f); //顯示光標(biāo)并且閃爍
- }
- if(menu_1 == 5)
- {
- write_string(1,0,"3.H-gx: % ");
- write_string(2,0,"4.L-gx: % ");
- write_sfm2(1,7,qiang_gx);
- write_sfm2(2,7,ruo_gx); //設(shè)置光線的參數(shù)
- write_com(0x80+6); //將光標(biāo)移動(dòng)到
- write_com(0x0f); //顯示光標(biāo)并且閃爍
- }
- if(menu_1 >= 7)
- {
- menu_1 = 0;
- write_string(1,0," csb: m gx: ");
- write_string(2,0," : : ");
- write_com(0x0c); //關(guān)閉顯示
- }
- }
- if(menu_1 == 1) //設(shè)置超聲波參數(shù)
- {
- if(key_can == 2) //
- {
- set_d ++; //加超聲波距離報(bào)警數(shù)據(jù)
- if(set_d >= 200)
- set_d = 200;
- }
- if(key_can == 3) //
- {
- set_d --; //減超聲波距離報(bào)警數(shù)據(jù)
- if(set_d <= 10)
- set_d = 10;
- }
- write_sfm_csb(1,6,set_d); // 顯示設(shè)置的距離
- write_com(0x85); //將光標(biāo)移動(dòng)到
- write_com(0x0f); //顯示光標(biāo)并且閃爍
- }
- if(menu_1 == 2) //設(shè)置時(shí)鐘參數(shù)
- {
- if(key_can == 2) //
- {
- s_shi ++; //加時(shí)鐘報(bào)警數(shù)據(jù)
- if(s_shi >= 24)
- s_shi = 0;
- }
- if(key_can == 3) //
- {
- if(s_shi <= 0)
- s_shi = 24;
- s_shi --; //減時(shí)鐘報(bào)警數(shù)據(jù)
- }
- write_sfm2(2,3,s_shi); // 顯示時(shí)
- write_sfm2(2,6,s_fen); // 顯示分
- write_sfm2(2,9,s_miao); // 顯示秒
- write_com(0x80+0x40+3); //將光標(biāo)移動(dòng)到
- write_com(0x0f); //顯示光標(biāo)并且閃爍
- }
- if(menu_1 == 3) //設(shè)置分鐘參數(shù)
- {
- if(key_can == 2) //
- {
- s_fen ++; //加分鐘報(bào)警數(shù)據(jù)
- if(s_fen >= 60)
- s_fen = 0;
- }
- if(key_can == 3) //
- {
- if(s_fen <= 0)
- s_fen = 60;
- s_fen --; //減分鐘報(bào)警數(shù)據(jù)
- }
- write_sfm2(2,3,s_shi); // 顯示時(shí)
- write_sfm2(2,6,s_fen); // 顯示分
- write_sfm2(2,9,s_miao); // 顯示秒
- write_com(0x80+0x40+6); //將光標(biāo)移動(dòng)到
- write_com(0x0f); //顯示光標(biāo)并且閃爍
- }
- if(menu_1 == 4) //設(shè)置秒鐘參數(shù)
- {
- if(key_can == 2) //
- {
- s_miao ++; //加秒鐘報(bào)警數(shù)據(jù)
- if(s_miao >= 60)
- s_miao = 0;
- }
- if(key_can == 3) //
- {
- if(s_miao <= 0)
- s_miao = 60;
- s_miao --; //減秒鐘報(bào)警數(shù)據(jù)
- }
- write_sfm2(2,3,s_shi); // 顯示時(shí)
- write_sfm2(2,6,s_fen); // 顯示分
- write_sfm2(2,9,s_miao); // 顯示秒
- write_com(0x80+0x40+9); //將光標(biāo)移動(dòng)到
- write_com(0x0f); //顯示光標(biāo)并且閃爍
- }
- if(menu_1 == 5) //設(shè)置強(qiáng)光報(bào)警
- {
- if(key_can == 2) //
- {
- qiang_gx ++; //加強(qiáng)光報(bào)警數(shù)據(jù)
- if(qiang_gx >= 100)
- qiang_gx = 100;
- }
- if(key_can == 3) //
- {
- qiang_gx --; //減強(qiáng)光報(bào)警數(shù)據(jù)
- if(qiang_gx <= ruo_gx)
- qiang_gx = ruo_gx;
- }
- write_sfm2(1,7,qiang_gx);
- write_com(0x80+6); //將光標(biāo)移動(dòng)到
- write_com(0x0f); //顯示光標(biāo)并且閃爍
- }
- if(menu_1 == 6) //設(shè)置弱光報(bào)警
- {
- if(key_can == 2) //
- {
- ruo_gx ++; //加弱光報(bào)警數(shù)據(jù)
- if(ruo_gx >= qiang_gx)
- ruo_gx = qiang_gx;
- }
- if(key_can == 3) //
- {
- ruo_gx --; //減強(qiáng)光報(bào)警數(shù)據(jù)
- if(ruo_gx <= 1)
- ruo_gx = 1;
- }
- write_sfm2(2,7,ruo_gx);
- write_com(0x80+0x40+6); //將光標(biāo)移動(dòng)到
- write_com(0x0f); //顯示光標(biāo)并且閃爍
- }
- }
- /***********************語(yǔ)音子程序************************/
- void Send_threelines(unsigned char addr)
- {
- unsigned char i;
- VRST=0;
- delay_1ms(5);
- VRST=1;
- delay_1ms(10); /* 復(fù)位拉高10ms*/
- VCS=0;
- delay_1ms(5); /* 片選拉低5ms */
- for(i=0;i<8;i++)
- {
- VSCL=1;
- if(addr&0x01 == 0x01)
- {
- VSDA=1;
- }
- else
- VSDA=0;
- addr<<=1;
- VSCL=0;
- }
- VCS=1;
- while(VBUSY == 0); //忙等待
- }
- /*********************報(bào)警函數(shù)***************************/
- void clock_beep()
- {
- if((guangxian >= qiang_gx) || (guangxian <= ruo_gx)) //光線報(bào)警
- {
- flag_gx = 1; //光線報(bào)警
- }else
- {
- flag_gx = 0;
- }
- if(xuexi_start == 1) //已經(jīng)開(kāi)始學(xué)習(xí)了
- {
- if(distance <= set_d) //距離報(bào)警
- {
- flag_juli = 1;
- Send_threelines(42) ; //距離太近,請(qǐng)坐直
- }else
- {
- flag_juli = 0;
- }
- if((shi == s_shi) && (fen == s_fen) && (miao == s_miao)) //時(shí)間報(bào)警
- {
- flag_time = 1;
- }
- }
- if(flag_time == 1) //時(shí)間提示報(bào)警
- {
- Send_threelines(41) ; //時(shí)間到了,休息一會(huì)兒
- }
- else
- {
- if(xuexi_start == 1) //已經(jīng)開(kāi)始學(xué)習(xí)了
- {
- if((flag_gx == 1) || (flag_juli == 1))
- {
- if(guangxian >= qiang_gx)
- Send_threelines(44) ; //光線太強(qiáng)
- if(guangxian <= ruo_gx)
- Send_threelines(43) ; //光線太暗
- }
- }
- }
- }
- /********************************************************************
- * 名稱(chēng) : Main()
- * 功能 : 主函數(shù)
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
程序.zip
(67.02 KB, 下載次數(shù): 39)
2020-9-7 22:35 上傳
點(diǎn)擊文件名下載附件
元件清單.zip
(6.95 KB, 下載次數(shù): 22)
2020-9-7 22:35 上傳
點(diǎn)擊文件名下載附件
原理圖.zip
(85.98 KB, 下載次數(shù): 29)
2020-9-7 22:35 上傳
點(diǎn)擊文件名下載附件
|
評(píng)分
-
查看全部評(píng)分
|