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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2420|回復: 1
打印 上一主題 下一主題
收起左側

單片機電動車GSM遙控報警器,程序出現了死循環沒有跳出

[復制鏈接]
跳轉到指定樓層
樓主
ID:684626 發表于 2020-1-10 14:30 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
根據論壇里51單片機GSM報警器的程序,寫的用遙控器來控制GSM報警器開和關,現在遙控可以打開報警器工作,不能關閉。出現問題的原因應該是在報警程序里出現了死循環沒有跳出來,有啥解決思路?單片機源程序如下:

  1. #include<reg52.h>
  2. #include <intrins.h>
  3. #include <absacc.h>                         //頭文件

  4. #define uint unsigned int
  5. #define uchar unsigned char        //宏定義

  6. sbit BUZZ=P2^3;                                   //蜂鳴器
  7. sbit shake=P3^7;                           //震動傳感器
  8. sbit LED_B=P1^3;                           //布防指示燈         藍色
  9. sbit LED_S=P1^6;                           //短信指示燈         綠色
  10. sbit LED_J=P1^0;                           //報警指示燈         紅色

  11. uchar code PhoneNO[]="13151993977";                //接受號碼
  12. uchar code somebody[]="8BF76CE8610FFF0167094EBA8FDB516562A58B66830356F4FF01";        //請注意!有人進入報警范圍!                                                                                                  

  13. uint TIME_50ms=0;                           //計時的最小分辨率50ms
  14. uint time_continue;                           //蜂鳴器鳴響時計時數據暫存
  15. bit flag=0,flag_BF=0;                  //flag:值為0時,是布防計時模式,值為1時,是一分鐘等待模式。flag_BF:布防標志位
  16. bit flag_time_start=0;                 //開始計時標志位
  17. bit again=0;                                   //一分鐘等待標志位(當發送一條短信后,不能馬上發送第二天,所以等待一分鐘后再檢測是否有人,有人再發送短信)
  18. bit flag_alam;                                   //報警標志位
  19. bit flag_continue;                           //繼續計時

  20. sbit IR=P3^2;                          //紅外接口標志
  21. unsigned char  irtime;        //紅外用全局變量
  22. bit irpro_ok,irok;
  23. bit key1,key2;                        //開關鍵
  24. unsigned char IRcord[4];
  25. unsigned char irdata[33];

  26. void delay(uint z)                           //延時函數
  27. {
  28.         uint x,y;
  29.         for(x=z;x>0;x--)
  30.         for(y=222;y>0;y--);
  31. }

  32. void tim0_isr (void) interrupt 1            //定時器0中斷
  33. {
  34.   irtime++;                                                          //用于計數2個下降沿之間的時間
  35. }

  36. void EX0_ISR (void) interrupt 0                 //外部中斷0服務函數           紅外接收信號
  37. {
  38.         static unsigned char  i;             //接收紅外信號處理
  39.         static bit startflag;                //是否開始處理標志位
  40.         if(startflag)                        
  41.         {
  42.                 if(irtime<53&&irtime>=32)                //引導碼 TC9012的頭碼,9ms+4.5ms
  43.             i=0;
  44.                     irdata[i]=irtime;                        //存儲每個電平的持續時間,用于以后判斷是0還是1
  45.                     irtime=0;
  46.                     i++;
  47.                            if(i==33)
  48.                       {
  49.                                   irok=1;
  50.                                 i=0;
  51.                           }
  52.         }
  53.         else
  54.         {
  55.                 irtime=0;
  56.                 startflag=1;
  57.         }
  58. }

  59. void Uart_init()        //中斷初始化
  60. {
  61.         TMOD |= 0X20;                //T1方式2,8位自動重裝   
  62.         TH1=0Xfd;
  63.         TL1=0Xfd;            // 9600波特率
  64.         TR1=1;                     // 定時器1啟動  
  65.         SM0=0;                    // 設置串口的工作模式
  66.         SM1=1;                     // 方式1
  67.         REN=1;                          // 允許串口接收數據          
  68.         ES=1;                        // 串口中斷應許
  69.         EA=1;                    // 開啟中斷
  70.                
  71.         TMOD |= 0X02;
  72.         TH0=0x00; //重載值
  73.         TL0=0x00; //初始化值
  74.         ET0=1;    //開中斷
  75.         TR0=1;

  76.         IT0 = 1;   //指定外部中斷0下降沿觸發,INT0 (P3.2)
  77.         EX0 = 1;   //使能外部中斷
  78. }

  79. void Ir_work(void)                        //紅外鍵值散轉程序
  80. {
  81.        switch(IRcord[2])        //判斷第三個數碼值
  82.                  {
  83.                          case 0x15:key1=0,key2=1;break;//key1 開啟 對應按鍵為+
  84.                          case 0x07:key2=0,key1=1;break;//key2 關閉 對應按鍵為-
  85.              default:break;
  86.                          }
  87. }

  88. void Ircordpro(void)//紅外碼值處理函數
  89. {
  90.         unsigned char i, j, k,cord,value;
  91.         k=1;
  92.         for(i=0;i<4;i++)      //處理4個字節
  93.         {
  94.                 for(j=1;j<=8;j++) //處理1個字節8位
  95.                 {
  96.                         cord=irdata[k];
  97.                         if(cord>7)//大于某值為1,這個和晶振有絕對關系,這里使用12M計算,此值可以有一定誤差
  98.                         value=value|0x80;
  99.                         if(j<8)
  100.                         {
  101.                                 value>>=1;
  102.                         }
  103.                         k++;
  104.                 }
  105.                 IRcord[i]=value;
  106.                 value=0;     
  107.         }
  108.         irpro_ok=1;//處理完畢標志位置1
  109. }

  110. void SendASC(uchar d)        //串口發送字符
  111. {
  112.        
  113.         SBUF=d;                                //數據賦值到緩沖區
  114.         while(!TI);                        //發送完
  115.         TI=0;                                //清零
  116. }

  117. void SendString(uchar *str)          //串口發送字符串
  118. {
  119.         while(*str)                                  //判斷是否發送完,不為\0時繼續發送
  120.         {
  121.                 SendASC(*str) ;                  //發送字符
  122.                 str++;                                  //字符位置加
  123.                 delay(1);
  124.         }
  125. }

  126. void TIME()                                                //計時函數
  127. {
  128.         if(flag==0)                                        //布防計時模式
  129.         {
  130.                 delay(50);                                //50ms
  131.                 TIME_50ms++;                        //50ms變量加1
  132.                 if(TIME_50ms%10==0)                //每500ms(50ms*10)
  133.                 LED_B=!LED_B;                        //布防指示燈取反一次               
  134.                 if(TIME_50ms>20)                //加到20次,也就是50ms*20=5000ms=1s
  135.                 {
  136.                         TIME_50ms=0;                //計時變量清零
  137.                         flag_BF=1;                        //進入布防狀態
  138.                         LED_B=0;                        //布防指示燈長亮
  139.                         flag_time_start=0;        //停止計時
  140.                         again=1;                        //關閉一分鐘等待
  141.                 }       
  142.         }
  143.         else                                                //一分鐘等待模式
  144.         {
  145.                 delay(50);                                //50ms
  146.                 TIME_50ms++;                        //變量加
  147.                 if(TIME_50ms%10==0)                //每加500ms
  148.                 {
  149.                         LED_B=!LED_B;                //布防指示燈閃爍
  150.                         if(flag_alam==1)        //報警
  151.                         {
  152.                                 if(flag_continue==0)                        //進入報警時
  153.                                 {
  154.                                         flag_continue=1;                         //此標志位置一,防止報警時進入
  155.                                         time_continue=TIME_50ms;        //將進入報警時的計時數據暫存
  156.                                 }
  157.                                 BUZZ=!BUZZ;                                                //蜂鳴器取反,也就是閃爍響
  158.                                 LED_J=~LED_J;
  159.                                 if(TIME_50ms>=time_continue+100)//當報警時間達到5s時
  160.                                 {
  161.                                         BUZZ=1;       
  162.                                         LED_J=1;                                        //關閉蜂鳴器
  163.                                         flag_continue=0;                        //標志位清零,等待下次報警
  164.                                         flag_alam=0;                                //報警變量清零,停止報警
  165.                                         time_continue=0;                        //暫存計時數據清零
  166.                                 }       
  167.                         }
  168.                 }
  169.                 if(TIME_50ms>=1200)                   //計時達到60秒
  170.                 {
  171.                         LED_B=0;                           //布防指示燈長亮,準備檢測熱釋電信號
  172.                         TIME_50ms=0;                   //計時變量清零
  173.                         flag_time_start=0;           //停止計時
  174.                         again=1;                           //關閉一分鐘等待
  175.                 }
  176.         }
  177. }

  178. void keyscan()                                                //按鍵掃描函數
  179. {
  180.         if(key1==0&&key2==1&&flag_BF==0)                 //在非布防狀態時布防按鍵按下
  181.         {
  182.                 delay(5);                                        //延時去抖
  183.                 if(key1==0&&key2==1)                                    //再次判斷按鍵是否按下
  184.                 {
  185.                         LED_B=0;                            //點亮布防LED燈
  186.                         flag=0;                                    //變量清零
  187.                         flag_time_start=1;      //開始計時變量置一
  188.                 }
  189.         }
  190.         if(flag_time_start==1)                        //開始計時
  191.         {
  192.                 TIME();                                                //調用計時函數
  193.         }
  194.         if(key1==1&&key2==0)                                                //撤防按鍵按下
  195.         {                          
  196.                 delay(5);                                        //延時去抖
  197.                 if(key1==1&&key2==0)                                    //再次判斷按鍵是否按下
  198.                 {
  199.                         BUZZ=1;                                        //關閉蜂鳴器
  200.                         LED_J=1;
  201.                         flag_alam=0;                        //報警變量清零
  202.                         flag_BF=0;                                //布防變量清零
  203.                         flag=0;                                        //變量清零
  204.                         flag_time_start=0;                //開始計時變量清零
  205.                         LED_S=1;                                //關閉發送短信指示燈
  206.                         LED_B=1;                                //關閉布防指示燈
  207.                 }
  208.         }
  209. }

  210. void GSM_work()                                                //發送GSM短信
  211. {
  212.         unsigned char send_number;                //定義發送手機號的變量
  213.         if(shake==1&&flag_BF==1)                //布防狀態且熱釋電有信號時
  214.         flag_alam=1;                                        //報警變量置一       
  215.         if(shake==1&&flag_BF==1&&again==1)                          //布防狀態且熱釋電有信號時且不在一分鐘等待時間內  或者   手動按下緊急按鍵
  216.         {
  217.                 LED_S=0;                                                                 //打開發送短信指示燈
  218.                 BUZZ=0;                                                                         //打開蜂鳴器
  219.                 LED_J=0;
  220.                 SendString("AT+CMGF=1\r\n");                         //設置文本模式               
  221.                 delay(1000);                                                         //延時,讓GSM模塊有一個反應時間
  222.                 SendString("AT+CSCS=\"UCS2\"\r\n");                 //設置短信格式,發送漢字模式               
  223.                 delay(1000);                                                         //延時       
  224.                 SendString("AT+CSMP=17,167,0,25\r\n");
  225.                 delay(1000);               
  226.                 SendString("AT+CMGS=");                                                         //信息發送指令 AT+CMGS=
  227.                 SendASC('"');                                                                         //引號
  228.                 for(send_number=0;send_number<11;send_number++)         //在每位號碼前加003
  229.                 {
  230.                         SendASC('0');
  231.                         SendASC('0');
  232.                         SendASC('3');
  233.                         SendASC(PhoneNO[send_number]);                                 //接收手機號碼
  234.                 }     
  235.                 SendASC('"');                                                                         //引號
  236.                 SendASC('\r');                                //發送回車指令
  237.                 SendASC('\n');                                //發送換行指令               
  238.                 delay(1000);                                //延時
  239.                 SendString(somebody);                //發送短信內容       
  240.                 delay(1000);                                //延時               
  241.                 SendASC(0x1a);                                //確定發送短信               
  242.                 again=0;                                        //again清零,也就是進入一分鐘等待,當計時到一分鐘后,該變量重新置一
  243.                 flag_time_start=1;                        //開始計時
  244.                 flag_alam=1;                                //報警               
  245.                 LED_S=1;                                        //熄滅發送短信指示燈
  246.                 flag=1;                                                //變量置一
  247.         }
  248. }

  249. void main()                                                                //主函數
  250. {       
  251.         Uart_init();                                                //調用中斷初始化函數
  252.         while(1)                                                        //進入while循環
  253.         {
  254.                 if(irok)                        //如果接收好了進行紅外處理
  255.                 {   
  256.                         Ircordpro();                                //紅外碼值處理函數,處理完成irpro_ok=1
  257.                         irok=0;
  258.                 }
  259.                 if(irpro_ok)                   //如果處理好后進行工作處理
  260.                 {
  261.                         Ir_work();
  262.                          irpro_ok=0;                                        //處理完成標志
  263.                 }       
  264.                 keyscan();                                                //按鍵函數
  265.                 GSM_work();                                                //發送短信函數       
  266.         }          
  267. }
復制代碼




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:404160 發表于 2020-1-13 20:29 | 只看該作者
死循環處,加一段延時程序。簡單的說做10000次加法。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕视频一区 | 成人国产精品久久 | 国产精品综合视频 | 成人精品鲁一区一区二区 | 亚洲精品久久久久久久久久久 | 日本不卡一区二区三区在线观看 | 国产精品一区在线 | 最近中文字幕在线视频1 | 国产麻豆乱码精品一区二区三区 | 观看av| 久久在线 | 黄色国产| 久久久成人网 | 国产精品一区二区久久 | 国产精品视频一区二区三区四蜜臂 | 亚洲国产欧美日韩 | 国产日韩一区二区 | 天天在线操 | 伊人久久国产 | 亚洲精品 在线播放 | 免费在线观看成年人视频 | 午夜小电影 | 91久久| 黑人精品| 国产亚洲欧美日韩精品一区二区三区 | 91免费看片 | 国产不卡一区 | 国产女人叫床高潮大片免费 | 国产精品一区二区久久 | 中文日韩在线视频 | 欧美精品一区在线 | 福利视频一区 | 国产精品视频一区二区三区 | 91精品国产一区二区 | 99re国产视频 | 欧美一级视频 | 欧美国产精品一区二区三区 | 国产激情视频 | 一级片免费网站 | 国产美女高潮 | 国户精品久久久久久久久久久不卡 |