找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2007|回复: 1
收起左侧

单片机智能视力保护仪设计 原理图分享 但是程序不完整 求帮助

[复制链接]
ID:934892 发表于 2021-6-8 16:42 | 显示全部楼层 |阅读模式
这是一款智能视力保护仪基单片机的设计
包含了多个模块。有:电源模块、超声波模块、单片机主控模块、蜂鸣器报警模块、光线强度检测模块。
具有时间倒计时、超声波测距、光线强弱测量等功能,以上部分均可调节阈值以及达到阈值后蜂鸣器报警
但是程序不完整 求帮助

电路原理图如下:
51hei.png
本设计是以单片机为核心的主体电路,实现定时、坐姿纠正、光线强度检测和报警功能。首先是对各单元电路进行设计,并选择合适的元器件。在选择元器件时,要注意所选芯片的性价比,对于电阻、电容等常用元件要先进行参数计算后再选择;其次是设计整个电路,并在计算机上对各单元电路进行相应功能的调试仿真。其中单片机选用较为普遍的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)用蜂鸣器实现报警。

单片机源程序如下:
  1. #include <reg52.h>
  2. #define uchar unsigned char  //无符号字符型 宏定义        变量范围0~255
  3. #define uint  unsigned int         //无符号整型 宏定义        变量范围0~65535
  4. #include <intrins.h>

  5. #include "eepom52.h"

  6. sbit SCL=P2^6;                //SCL定义,连接ADC0832SCL脚
  7. sbit DO=P2^5;                //DO定义,连接ADC0832DO脚
  8. sbit CS=P2^4;                //CS定义,连接ADC0832CS脚
  9. sbit beep = P2^7;


  10. //这三个引脚参考资料
  11. sbit rs=P3^2;         //1602数据/命令选择引脚 H:数据              L:命令
  12. sbit rw=P3^3;         //1602读写引脚                 H:数据寄存器          L:指令寄存器
  13. sbit e =P3^4;         //1602使能引脚          下降沿触发

  14. sbit c_send   = P3^7;                //超声波发射
  15. sbit c_recive = P3^6;                //超声波接收
  16. uchar flag_hc_value;        //超声波中间变量
  17. long distance;                    //距离
  18. uint set_d;                        //距离
  19. bit flag_csb_juli;          //超声波超出量程
  20. uint  flag_time0;           //用来保存定时器0的时候的
  21. bit flag_200ms = 1 ;

  22. uchar guangxian;            //光线的显示变量
  23. uchar set_gx;                                        //设置光线的强弱的变量
  24. uchar value;
  25. uchar flag_alarm;       //报警变量

  26. uchar miao = 55,fen = 44,shi;
  27. uchar xuexi_start;   //开始学习标志位
  28. uchar menu_1;

  29. /******************把设置温度数据保存到单片机内部eepom中******************/
  30. void write_eepom_12()
  31. {
  32.         SectorErase(0x2000);
  33.         byte_write(0x2000, set_d % 256);
  34.         byte_write(0x2001, set_d / 256);
  35.         byte_write(0x2002, set_gx);
  36.         byte_write(0x2057, value);        
  37. }

  38. /******************把数据从单片机内部eepom中读出来*****************/
  39. void read_eepom12()
  40. {
  41.         set_d = byte_read(0x2001);
  42.         set_d  =set_d * 256 + byte_read(0x2000);  
  43.         set_gx = byte_read(0x2002);
  44.         value    = byte_read(0x2057);
  45. }

  46. /**************开机自检eepom初始化*****************/
  47. void init_eepom()
  48. {
  49.         read_eepom12();                //先读
  50.         if(value != 2)                //新的单片机初始单片机内问EEPOM
  51.         {
  52.                 set_d = 300;
  53.                 value = 2;
  54.                 set_gx = 50;
  55.                 write_eepom_12();
  56.         }        
  57. }


  58. /********************************************************************
  59. * 名称 : delay()
  60. * 功能 : 延时,延时时间大概为5US。
  61. * 输入 : 无
  62. * 输出 : 无
  63. ***********************************************************************/
  64. void delay_uint(uint q)
  65. {
  66.         while(q--);
  67. }

  68. /********************************************************************
  69. * 名称 : bit Busy(void)
  70. * 功能 : 这个是一个读状态函数,读出函数是否处在忙状态
  71. * 输入 : 输入的命令值
  72. * 输出 : 无
  73. ***********************************************************************/
  74. bit busy(void)
  75. {
  76.         bit busy_flag = 0;
  77.         rs = 0;
  78.         rw = 1;
  79.         e = 1;
  80.         delay_uint(3);
  81.         busy_flag = (bit)(P1 & 0x80);
  82.         e = 0;
  83.         return busy_flag;
  84. }
  85. /********************************************************************
  86. * 名称 : write_com(uchar com)
  87. * 功能 : 1602命令函数
  88. * 输入 : 输入的命令值
  89. * 输出 : 无
  90. ***********************************************************************/
  91. void write_com(uchar com)
  92. {
  93.         while(busy());
  94.         e=0;
  95.         rs=0;
  96.         rw=0;
  97.         P1=com;
  98.         delay_uint(3);
  99.         e=1;
  100.         delay_uint(25);
  101.         e=0;
  102. }

  103. /********************************************************************
  104. * 名称 : write_data(uchar dat)
  105. * 功能 : 1602写数据函数
  106. * 输入 : 需要写入1602的数据
  107. * 输出 : 无
  108. ***********************************************************************/
  109. void write_data(uchar dat)
  110. {
  111.         while(busy());
  112.         e=0;
  113.         rs=1;
  114.         rw=0;
  115.         P1=dat;
  116.         delay_uint(3);
  117.         e=1;
  118.         delay_uint(25);
  119.         e=0;        
  120. }

  121. /***********************lcd1602上显示两位十进制数************************/
  122. void write_sfm2(uchar hang,uchar add,uchar date)
  123. {
  124.         if(hang==1)   
  125.                 write_com(0x80+add);
  126.         else
  127.                 write_com(0x80+0x40+add);                  
  128.         write_data(0x30+date/10%10);
  129.         write_data(0x30+date%10);        
  130. }

  131. /***********************lcd1602上显示超声波距离************************/
  132. void write_sfm_csb(uchar hang,uchar add,uint date)
  133. {
  134.         if(hang==1)   
  135.                 write_com(0x80+add);
  136.         else
  137.                 write_com(0x80+0x40+add);                  
  138.         write_data(0x30+date/100%10);
  139.         write_data('.');
  140.         write_data(0x30+date/10%10);
  141.         write_data(0x30+date%10);        
  142. }


  143. /********************************************************************
  144. * 名称 : init_1602()
  145. * 功能 : 1602初始化,请参考1602的资料
  146. * 输入 : 无
  147. * 输出 : 无
  148. ***********************************************************************/
  149. void init_1602()
  150. {
  151.         write_com(0x38);        //
  152.         write_com(0x0c);
  153.         write_com(0x06);
  154. }

  155. /********************************************************************
  156. * 名称 : write_string(uchar hang,uchar lie,uchar *p)
  157. * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
  158.                   write_string(1,5,"ab cd ef;")
  159. * 输入 : 行,列,需要输入1602的数据
  160. * 输出 : 无
  161. ***********************************************************************/
  162. void write_string(uchar hang,uchar add,uchar *p)
  163. {
  164.         if(hang==1)   
  165.                 write_com(0x80+add);
  166.         else
  167.                 write_com(0x80+0x40+add);
  168.                 while(1)                                                                                                                 
  169.                 {
  170.                         if(*p == '\0')  break;
  171.                         write_data(*p);
  172.                         p++;
  173.                 }        
  174. }

  175. uchar key_can;
  176. /********************独立按键程序*****************/
  177. void key()
  178. {
  179.         static uchar key_new;
  180.         key_can = 20;
  181.         if((P2 & 0x0f) != 0x0f)
  182.         {
  183.                 delay_uint(50);
  184.                 if(((P2 & 0x0f) != 0x0f) && (key_new == 1))
  185.                 {
  186.                         key_new = 0;
  187.                         switch(P2 & 0x0f)
  188.                         {
  189.                                 case 0x0e:  key_can = 1;  break;         //左边第1个
  190.                                 case 0x0d:  key_can = 2;  break;         //左边第2个
  191.                                 case 0x0b:  key_can = 3;  break;         //左边第3个
  192.                                 case 0x07:  key_can = 4;  break;         //左边第4个
  193.                         }
  194. //                        write_sfm2(2,0,key_can);                                
  195.                 }
  196.         }
  197.         else
  198.                 key_new = 1;        
  199. }
复制代码
以上内容word文档51hei下载(程序不完整,大家能帮忙补全一下吗): 智能视力保护器的设计终结稿.doc (755.69 KB, 下载次数: 11)
回复

使用道具 举报

ID:1097513 发表于 2023-11-17 23:41 | 显示全部楼层
可以给一下源程序吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表