这是一款智能视力保护仪基单片机的设计
包含了多个模块。有:电源模块、超声波模块、单片机主控模块、蜂鸣器报警模块、光线强度检测模块。
具有时间倒计时、超声波测距、光线强弱测量等功能,以上部分均可调节阈值以及达到阈值后蜂鸣器报警
但是程序不完整 求帮助
电路原理图如下:
本设计是以单片机为核心的主体电路,实现定时、坐姿纠正、光线强度检测和报警功能。首先是对各单元电路进行设计,并选择合适的元器件。在选择元器件时,要注意所选芯片的性价比,对于电阻、电容等常用元件要先进行参数计算后再选择;其次是设计整个电路,并在计算机上对各单元电路进行相应功能的调试仿真。其中单片机选用较为普遍的STC89C52,坐姿传感器选用超声波传感器,光线报警选用光敏电阻来实现,报警发声选用蜂鸣器发声硬件电路。
它具备以下功能和特点:
(1)当使用者脸部与读物之间的距离小于设定距离时,电路将发出声音提示;
(2)当读写环境光线强度低于设定值时,电路将发出声音提示;
(3)当使用时间达到45分钟时,电路自动发出提示,提醒使用者注意休息;
(4)电路可靠,做出实物能够实现相应的功能。真正帮助学生做到规定:学生在读写时,应在一定亮度下,眼离读物一尺,身离书桌一拳。
2 总体方案设计
系统采用STC89C52单片机作为多功能视力保护器的核心控制单元,本系统通过光敏电阻采集光线信号,通过AD采集光线信号的强弱,把光线强度等级化,通过设定报警等级来实现报警;利用超声波测距传感器测出人脸部与桌面的距离,当小于设定距离时发出报警声提醒;通过单片机内部定时器计时,当使用达到45分钟时电路自动发出声音提示,提醒使用者注意休息;系统采用的报警电路由三极管驱动蜂鸣器组成。系统总体的设计方框图如图2.1所示。
光强检测系统采用光敏电阻。光敏电阻的工作原理是当有光线照射时,电阻内原本处于稳定状态的电子受到激发,成为自由电子,所以光线越强,产生的自由电子也就越多,电阻就会越小。光敏电阻的优点有内部的光电效应和电极无关,即可以使用直流电源。灵敏度和半导体材料、以及入射光的波长有关,价格低廉,性价比高。
2.1.4 报警提示模块
报警系统采用蜂鸣器报警。蜂鸣器,体积小,重量轻,装配简单,使用方便。价格实惠,对推动视力保护器的普及有很好的优势,能够较好的满足设计的要求。
2.1.5 坐姿检测模块
坐姿检测系统采用超声波传感器测距,通过测量人脸与桌面的距离来确定坐姿。当距离小于设定距离时就发出警报提醒。超声波传感器体积小,重量轻,使用方便。价格实惠,是一种较为理想的方案。
2.1.6 显示模块
显示界面采用LCD1602液晶进行显示。LCD1602由于其显示清晰,显示内容丰富、清晰,显示信息量大,使用方便,显示快速而得到了广泛的应用。在本设计中很好的发挥其优势。
2.2 最终方案
经过反复论证,我们最终确定了如下方案:
(1)电源采用6节5号电池。
(2)采用STC89C52单片机作为主控制器。
(3)用光敏电阻检测光照强度。
(4)用超声波传感器检测坐姿。
(5)用LCD1602液晶显示。
(6)用蜂鸣器实现报警。
单片机源程序如下:
- #include <reg52.h>
- #define uchar unsigned char //无符号字符型 宏定义 变量范围0~255
- #define uint unsigned int //无符号整型 宏定义 变量范围0~65535
- #include <intrins.h>
- #include "eepom52.h"
- sbit SCL=P2^6; //SCL定义,连接ADC0832SCL脚
- sbit DO=P2^5; //DO定义,连接ADC0832DO脚
- sbit CS=P2^4; //CS定义,连接ADC0832CS脚
- sbit beep = P2^7;
- //这三个引脚参考资料
- sbit rs=P3^2; //1602数据/命令选择引脚 H:数据 L:命令
- sbit rw=P3^3; //1602读写引脚 H:数据寄存器 L:指令寄存器
- sbit e =P3^4; //1602使能引脚 下降沿触发
- sbit c_send = P3^7; //超声波发射
- sbit c_recive = P3^6; //超声波接收
- uchar flag_hc_value; //超声波中间变量
- long distance; //距离
- uint set_d; //距离
- bit flag_csb_juli; //超声波超出量程
- uint flag_time0; //用来保存定时器0的时候的
- bit flag_200ms = 1 ;
- uchar guangxian; //光线的显示变量
- uchar set_gx; //设置光线的强弱的变量
- uchar value;
- uchar flag_alarm; //报警变量
- uchar miao = 55,fen = 44,shi;
- uchar xuexi_start; //开始学习标志位
- uchar menu_1;
- /******************把设置温度数据保存到单片机内部eepom中******************/
- void write_eepom_12()
- {
- SectorErase(0x2000);
- byte_write(0x2000, set_d % 256);
- byte_write(0x2001, set_d / 256);
- byte_write(0x2002, set_gx);
- byte_write(0x2057, value);
- }
- /******************把数据从单片机内部eepom中读出来*****************/
- void read_eepom12()
- {
- set_d = byte_read(0x2001);
- set_d =set_d * 256 + byte_read(0x2000);
- set_gx = byte_read(0x2002);
- value = byte_read(0x2057);
- }
- /**************开机自检eepom初始化*****************/
- void init_eepom()
- {
- read_eepom12(); //先读
- if(value != 2) //新的单片机初始单片机内问EEPOM
- {
- set_d = 300;
- value = 2;
- set_gx = 50;
- write_eepom_12();
- }
- }
- /********************************************************************
- * 名称 : delay()
- * 功能 : 延时,延时时间大概为5US。
- * 输入 : 无
- * 输出 : 无
- ***********************************************************************/
- void delay_uint(uint q)
- {
- while(q--);
- }
- /********************************************************************
- * 名称 : bit Busy(void)
- * 功能 : 这个是一个读状态函数,读出函数是否处在忙状态
- * 输入 : 输入的命令值
- * 输出 : 无
- ***********************************************************************/
- bit busy(void)
- {
- bit busy_flag = 0;
- rs = 0;
- rw = 1;
- e = 1;
- delay_uint(3);
- busy_flag = (bit)(P1 & 0x80);
- e = 0;
- return busy_flag;
- }
- /********************************************************************
- * 名称 : write_com(uchar com)
- * 功能 : 1602命令函数
- * 输入 : 输入的命令值
- * 输出 : 无
- ***********************************************************************/
- void write_com(uchar com)
- {
- while(busy());
- e=0;
- rs=0;
- rw=0;
- P1=com;
- delay_uint(3);
- e=1;
- delay_uint(25);
- e=0;
- }
- /********************************************************************
- * 名称 : write_data(uchar dat)
- * 功能 : 1602写数据函数
- * 输入 : 需要写入1602的数据
- * 输出 : 无
- ***********************************************************************/
- void write_data(uchar dat)
- {
- while(busy());
- e=0;
- rs=1;
- rw=0;
- P1=dat;
- delay_uint(3);
- e=1;
- delay_uint(25);
- e=0;
- }
- /***********************lcd1602上显示两位十进制数************************/
- 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);
- }
- /********************************************************************
- * 名称 : init_1602()
- * 功能 : 1602初始化,请参考1602的资料
- * 输入 : 无
- * 输出 : 无
- ***********************************************************************/
- void init_1602()
- {
- write_com(0x38); //
- write_com(0x0c);
- write_com(0x06);
- }
- /********************************************************************
- * 名称 : write_string(uchar hang,uchar lie,uchar *p)
- * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
- write_string(1,5,"ab cd ef;")
- * 输入 : 行,列,需要输入1602的数据
- * 输出 : 无
- ***********************************************************************/
- 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;
- /********************独立按键程序*****************/
- void key()
- {
- static uchar key_new;
- key_can = 20;
- if((P2 & 0x0f) != 0x0f)
- {
- delay_uint(50);
- if(((P2 & 0x0f) != 0x0f) && (key_new == 1))
- {
- key_new = 0;
- switch(P2 & 0x0f)
- {
- case 0x0e: key_can = 1; break; //左边第1个
- case 0x0d: key_can = 2; break; //左边第2个
- case 0x0b: key_can = 3; break; //左边第3个
- case 0x07: key_can = 4; break; //左边第4个
- }
- // write_sfm2(2,0,key_can);
- }
- }
- else
- key_new = 1;
- }
复制代码 以上内容word文档51hei下载(程序不完整,大家能帮忙补全一下吗):
智能视力保护器的设计终结稿.doc
(755.69 KB, 下载次数: 11)
|