找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1168|回复: 1
打印 上一主题 下一主题
收起左侧

基于51单片机倾角MPU6050老人跌倒远程GSM短信报警器+源程序

[复制链接]
跳转到指定楼层
楼主
一、系统方案
1、本设计采用这51单片机作为主控器。
2、MPU6050角度值送到液晶1602显示。
3、红外传感器检测心率。
4、跌倒远程GSM报警。


二、硬件设计
原理图如下:

三、单片机软件设计
  1. 1、首先是系统初始化
  2. void LCD_Init()                         //初始化液晶时间显示
  3. {
  4.         write_com(0x38);
  5.         write_com(0x0c);
  6.         write_com(0x06);
  7.         write_com(0x01);
  8.         write_com(0x80+0x10);
  9. }

  10. void LCD_Clear(void)
  11. {
  12. write_com(0x01);
  13. }
  14. 2、液晶显示程序
  15. void delay(uint z)
  16. {
  17.          uint x,y;
  18.         for(x=z;x>0;x--)
  19.                 for(y=110;y>0;y--);
  20. }

  21. void write_com(uchar com)
  22. {
  23.         w=0;
  24.         lcdrs=0;
  25.         P0=com;
  26.         delay(5);
  27.         lcden=1;
  28.         delay(5);
  29.         lcden=0;
  30. }
  31. void write_dat(uchar date)
  32. {
  33.         w=0;
  34.         lcdrs=1;
  35.         P0=date;
  36.         delay(5);
  37.         lcden=1;
  38.         delay(5);
  39.         lcden=0;
  40. }

  41. void write_char(uchar x,uchar y,uchar dat)
  42. {     
  43. if (x == 0)
  44.          {     
  45.          write_com(0x80 + y);     
  46.          }   
  47. else
  48.          {     
  49.          write_com(0xC0 + y);     
  50.          }        
  51. write_dat(dat);  
  52. }

  53. void write_string(uchar x,uchar y,uchar *s)        //显示字符串
  54. {
  55.         if(x==0)
  56.                 write_com(0x80+y);
  57.         else
  58.                 write_com(0xc0+y);
  59.         while(*s)
  60.         {
  61.                 write_dat(*s);
  62.                 s++;
  63.         }
  64. }

  65. void shownum(uchar x,uchar y,int dat,uchar n) //x=行 y=列 dat 数据位
  66. {
  67.         if(n==5)
  68.                 {
  69.                          if(x==0)
  70.                          {
  71.                                                 write_com(0x80+y);  //显示湿度值
  72.                                                 write_dat(dat%100000/10000+0x30);
  73.                                     write_dat(dat%10000/1000+0x30);
  74.                                                 write_dat(dat%1000/100+0x30);
  75.                                                 write_dat(dat%100/10+0x30);
  76.                                                 write_dat(dat%10+0x30);
  77.                          }
  78.                                 if(x==1)
  79.                                 {                                
  80.                                                 write_com(0xc0+y);  //显示湿度值
  81.                                           write_dat(dat%100000/10000+0x30);
  82.                                                 write_dat(dat%10000/1000+0x30);
  83.                                                 write_dat(dat%1000/100+0x30);
  84.                                                 write_dat(dat%100/10+0x30);
  85.                                                 write_dat(dat%10+0x30);
  86.                                 }
  87.                 }

  88.         if(n==4)
  89.                 {
  90.                          if(x==0)
  91.                          {
  92.                                                 write_com(0x80+y);  //显示湿度值
  93.                                     write_dat(dat%10000/1000+0x30);
  94.                                                 write_dat(dat%1000/100+0x30);
  95.                                                 write_dat(dat%100/10+0x30);
  96.                                                 write_dat(dat%10+0x30);
  97.                          }
  98.                                 if(x==1)
  99.                                 {                                
  100.                                                 write_com(0xc0+y);  //显示湿度值
  101.                                                 write_dat(dat%10000/1000+0x30);
  102.                                                 write_dat(dat%1000/100+0x30);
  103.                                                 write_dat(dat%100/10+0x30);
  104.                                                 write_dat(dat%10+0x30);
  105.                                 }
  106.                 }

  107.                         if(n==3)
  108.                 {
  109.                          if(x==0)
  110.                          {
  111.                                                 write_com(0x80+y);  
  112.                                                 write_dat(dat%1000/100+0x30);
  113.                                                 write_dat(dat%100/10+0x30);
  114.                                                 write_dat(dat%10+0x30);
  115.                          }
  116.                                 if(x==1)
  117.                                 {        
  118.                                                 write_com(0xc0+y);  
  119.                                                 write_dat(dat%1000/100+0x30);
  120.                                                 write_dat(dat%100/10+0x30);
  121.                                                 write_dat(dat%10+0x30);
  122.                                 }
  123.                 }               
  124.                         if(n==2)
  125.                 {
  126.                                 if(x==0)
  127.                          {
  128.                                                 write_com(0x80+y);  
  129.                                                 write_dat(dat%100/10+0x30);
  130.                                                 write_dat(dat%10+0x30);
  131.                          }
  132.                                 if(x==1)
  133.                                 {        
  134.                                                 write_com(0xc0+y);  
  135.                                                 write_dat(dat%100/10+0x30);
  136.                                                 write_dat(dat%10+0x30);
  137.                                 }
  138.                 }

  139. }
  140. 3、MPU6050程序
  141. void show_x()
  142. {
  143.           int i;
  144.                 float t;
  145.                 i=GetData(ACCEL_XOUT_H); //X ,16位
  146.                 i/=64;           //转换为10位数据
  147.                 if(i<0)
  148.    {
  149.      i=-i;
  150. //     DisplayOneChar(2,1,'-');      
  151.            write_com(0xC0+8);
  152.              write_dat(0x2D);
  153.    }
  154.    else
  155.          {
  156.   write_com(0xC0+8);
  157.    write_dat(0x2B);
  158.          }
  159.                   t=(float)i*3.9;
  160.             if(t>800)
  161.                         {
  162.                                 beep1();
  163.                         }
  164.                         else
  165.                                 beep=1;
  166.             write_dat((uint)t/1000+0x30);
  167.             write_dat(0x2e);
  168.                   write_dat((uint)t%1000/100+0x30);
  169. }

  170. void show_y()
  171. {
  172.           int i;
  173.                 float t;
  174.                 i=GetData(ACCEL_YOUT_H); //X ,16位
  175.                 i/=64;           //转换为10位数据 1024
  176.                 if(i<0)
  177.    {
  178.      i=-i;
  179. //     DisplayOneChar(2,1,'-');      
  180.             write_com(0xC0+8);
  181.              write_dat(0x2D);
  182.    }
  183.    else
  184.          {
  185.   write_com(0xC0+8);
  186.    write_dat(0x2B);
  187.          }
  188.             t=(float)i*3.9;
  189.             write_dat((uint)t/1000+0x30);
  190.             write_dat(0x2e);
  191.                   write_dat((uint)t%1000/100+0x30);
  192. }

  193. void show_z()
  194. {
  195.           int i;
  196.                 float t;
  197.                 i=GetData(ACCEL_ZOUT_H); //X ,16位
  198.                 i/=64;           //转换为10位数据
  199.                 if(i<0)
  200.    {
  201.      i=-i;
  202. //     DisplayOneChar(2,1,'-');      
  203.             write_com(0x80+2);
  204.              write_dat(0x2D);
  205.    }
  206.    else
  207.          {
  208.     write_com(0x80+2);
  209.    write_dat(0x2B); //+
  210.          }
  211.             t=(float)i*31;  //转化为90度
  212.          angle=(uint)t/100+(uint)t%1000/100;
  213. //         shownum(0,8,angle,4);
  214.     write_dat((uint)t/1000+0x30);
  215. ////            write_dat(0x2e);
  216.           write_dat((uint)t%1000/100+0x30);
  217. }

  218. void show_sx()
  219. {
  220.           int i;
  221.                 float t;
  222.                 i=GetData(GYRO_XOUT_H); //X ,16位
  223.                 i/=64;           //转换为10位数据
  224.                 if(i<0)
  225.    {
  226.      i=-i;
  227.                  flag=0;
  228.                  angle=i;
  229. //     DisplayOneChar(2,1,'-');      
  230.              write_com(0xC0+8);
  231.              write_dat(0x2D);  //-
  232.    }
  233.    else
  234.          {
  235.                   flag=1;
  236.          angle=i;
  237.    write_com(0xC0+8);
  238.    write_dat(0x2B); //+
  239.          }
  240.           if(i>10)
  241.                  beep2();
  242.          else
  243.                  beep=1;
  244.            write_dat(i/1000+0x30);
  245.            write_dat(i%100/10+0x30);
  246.            write_dat(i%10+0x30);
  247. }

  248. void show_sy()
  249. {
  250.           int i;
  251.                 float t;
  252.                 i=GetData(GYRO_YOUT_H); //X ,16位
  253.                 i/=64;           //转换为10位数据
  254.                 if(i<0)
  255.    {
  256. //     DisplayOneChar(2,1,'-');      
  257.                   i=-i;
  258.                   flag=0;
  259.                  angle=i;
  260.                write_com(0xC0+8);
  261.              write_dat(0x2D);
  262.    }
  263.    else
  264.          {
  265.                   flag=1;
  266.                           angle=i;
  267.     write_com(0xC0+8);
  268.    write_dat(0x2B);
  269.          }
  270.          write_dat(i/1000+0x30);
  271.          write_dat(i%100/10+0x30);
  272.          write_dat(i%10+0x30);
  273. }
  274. void show_sz()
  275. {
  276.           int i;
  277.                 float t;
  278.                 i=GetData(GYRO_ZOUT_H); //X ,16位
  279.                 i/=64;           //转换为10位数据
  280.                 if(i<0)
  281.    {
  282.        i=-i;
  283.                   flag=0;
  284.                  angle=i;
  285. //     DisplayOneChar(2,1,'-');      
  286.                    write_com(0xC0+8);
  287.              write_dat(0x2D);
  288.    }
  289.    else
  290.          {
  291.                   flag=1;
  292.                           angle=i;
  293.    write_com(0xC0+8);
  294.    write_dat(0x2B);
  295.          }

  296.          write_dat(i/100+0x30);
  297.          write_dat(i%100/10+0x30);
  298.          write_dat(i%10+0x30);
  299. }

  300. 4、核心算法程序
  301. void main()
  302. {
  303.         LCD_Init()        ;
  304.         InitMPU6050();        //
  305.                 init_uart();
  306. //        Time0_init();
  307.         write_string(0,0,"     Please     ");
  308.         write_string(1,0,"      Wait      ");
  309.         delayms(1000);
  310.         LCD_Clear() ;        
  311.         delayms(500);
  312.         write_string(0,0,"A:");        
  313.         write_char(0,5,0xdf) ;

  314.         while(1)
  315.         {
  316.                 show_z();
  317.                 Alarm(angle);




  318.                 if(displayOK==0)//如果显示关
  319.                 {
  320.                          rate = 0;
  321.                 }
  322.                 else//如果显示开
  323.                 {
  324.                           rate=60000/(time[1]/5+time[2]/5+time[3]/5+time[4]/5+time[5]/5);  //计算脉搏次数
  325.                 }



  326.                  write_com(0x80+7);
  327.            write_dat(rate/100+0x30);
  328.                  write_dat(rate%100/10+0x30);
  329.                  write_dat(rate%10+0x30);
  330.                 write_dat('/');
  331.                 write_dat('m');
  332.                 write_dat('i');
  333.                 write_dat('n');

  334.                 if(Flag_GPS_OK == 1 && RX_Buffer[4] == 'G' && RX_Buffer[6] == ',' && RX_Buffer[13] == '.')                        //确定是否收到"GPGGA"这一帧数据
  335.                 {
  336.                         for( i = 0; i < 68 ; i++)
  337.                         {
  338.                                 Display_GPGGA_Buffer = RX_Buffer;
  339.                         }
  340.                         Flag_Calc_GPGGA_OK = 1;
  341.                 }
  342.                 if(Flag_Calc_GPGGA_OK == 1)
  343.                 {
  344.                         Flag_Calc_GPGGA_OK = 0;
  345.                         write_com(0x80+0x40);                        //设置指针
  346.                         write_dat(Display_GPGGA_Buffer[28]);                        //N 或者 S
  347.                         write_dat(Display_GPGGA_Buffer[17]);                        //纬度
  348.                         write_dat(Display_GPGGA_Buffer[18]);                        //纬度
  349.                         write_dat('.');                                                                //.
  350.                         write_dat(Display_GPGGA_Buffer[19]);                        //纬度
  351.                         write_dat(Display_GPGGA_Buffer[20]);                        //纬度
  352.                         write_dat(' ');               
  353.                         write_dat(Display_GPGGA_Buffer[42]);                        //E 或者 W
  354.                         write_dat(Display_GPGGA_Buffer[30]);                        //经度
  355.                         write_dat(Display_GPGGA_Buffer[31]);        
  356.                         write_dat(Display_GPGGA_Buffer[32]);        
  357.                         write_dat('.');                                                                //.                                                
  358.                         write_dat(Display_GPGGA_Buffer[33]);                        
  359.                         write_dat(Display_GPGGA_Buffer[34]);        
  360.                 }
  361.         }
  362. }
复制代码

四、 proteus仿真设计
Proteus软件是一款应用比较广泛的工具,它可以在没有硬件平台的基础上通过自身的软件仿真出硬件平台的运行情况,这样就可以通过软件仿真来验证我们设计的方案有没有问题,如果有问题,可以重新选择器件,连接器件,直到达到我们设定的目的,避免我们搭建实物的时候,如果当初选择的方案有问题,我们器件都已经焊接好了,再去卸载下去,再去焊接新的方案的器件,测试,这样会浪费人力和物力,也给开发者带来一定困惑,Proteus仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:774081 发表于 2024-1-5 12:40 | 只看该作者
你这到底是什么?GPS\GSM\湿度都出现了,太不认真。关键还不知道你mpu050代码是否好用.脉搏次数又是通过什么传感器获得的?最最最关键的GetData函数呢?没它还整个P?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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