久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1686|回復: 1
收起左側

基于51單片機傾角MPU6050老人跌倒遠程GSM短信報警器+源程序

[復制鏈接]
ID:190577 發表于 2023-11-24 15:11 | 顯示全部樓層 |閱讀模式
一、系統方案
1、本設計采用這51單片機作為主控器。
2、MPU6050角度值送到液晶1602顯示。
3、紅外傳感器檢測心率。
4、跌倒遠程GSM報警。
1.jpg

二、硬件設計
原理圖如下:
2.png

三、單片機軟件設計
  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 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:774081 發表于 2024-1-5 12:40 | 顯示全部樓層
你這到底是什么?GPS\GSM\濕度都出現了,太不認真。關鍵還不知道你mpu050代碼是否好用.脈搏次數又是通過什么傳感器獲得的?最最最關鍵的GetData函數呢?沒它還整個P?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美性影院 | 国产美女自拍视频 | 91在线免费视频 | 在线伊人网| 蜜桃视频在线观看www社区 | 欧美性生交大片免费 | 色本道| 欧美综合国产精品久久丁香 | 91色视频在线观看 | 成人免费网站www网站高清 | 欧美成人在线网站 | 一区二区电影网 | 久久综合av | 国产真实精品久久二三区 | 日本三级全黄三级三级三级口周 | 国产精品久久久久久久久久久久久久 | 精品国产精品国产偷麻豆 | 日韩喷潮 | 日韩在线视频免费观看 | 成人免费精品 | 亚洲一区影院 | 91麻豆精品一区二区三区 | 成人影院在线视频 | www.成人免费视频 | 夜夜爽99久久国产综合精品女不卡 | 2020国产在线| 国产精品国产 | 国产小视频自拍 | 国产羞羞视频在线观看 | 欧美做暖暖视频 | 精品久久久久久亚洲精品 | 日本高清中文字幕 | 日韩免费视频 | 中文字幕一区二区三区不卡在线 | 97影院在线午夜 | 天天宗合网 | 日韩亚洲视频在线 | 中文字幕亚洲精品 | 久久精品一区二区三区四区 | 美女福利视频 | 亚洲视频在线免费观看 |