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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1833|回復: 2
收起左側

有沒有人你幫忙看看代碼?GSM模塊工作過后紅外遙控功能就不能正常使用了

[復制鏈接]
ID:480386 發表于 2019-5-8 10:29 | 顯示全部樓層 |閱讀模式
要完成的功能是每分鐘發送一次短信,除了發短信的時候,其他時候能夠通過遙控器控制電機。現在出現問題:GSM第一次發短信之前遙控器正常使用,發過短信之后紅外不能使用或者出現亂碼等異常情況

有沒有人能幫我看看代碼!!!(╥╯^╰╥)

  1. #include<reg51.h>
  2. #include <reg51.h>                 //調用單片機頭文件
  3. #define uchar unsigned char  //無符號字符型 宏定義        變量范圍0~255
  4. #define uint  unsigned int         //無符號整型 宏定義        變量范圍0~65535
  5. #include <intrins.h>                 //包含_nop_()函數定義的頭文件
  6. #define FOSC_110592M                 //單片機的晶振大小
  7. typedef unsigned char uint8;
  8. typedef unsigned int uint16;
  9. typedef unsigned int u16;          //對數據類型進行聲明定義
  10. typedef unsigned char u8;

  11. sbit beep=P3^3;
  12. sbit dianji=P1^6;

  13. uint8 irtime;          //接收時間
  14. uint8 startflag;  //開始檢測
  15. uint8 bitnum;          //bit位數
  16. uint8 irdata[33]; //寄存沒有個bit的時間
  17. uint8 irreceok;          //接收完成標志位
  18. uint8 ircode[4];  //將接收的四個字節數據保存
  19. uint8 irprosok;          //接收數據處理標志位

  20. sbit rs=P1^0;         //1602數據/命令選擇引腳 H:數據              L:命令
  21. sbit rw=P1^1;         //1602讀寫引腳                 H:數據寄存器          L:指令寄存器
  22. sbit e =P1^2;         //1602使能引腳          下降沿觸發

  23. //GSM發送短信
  24. uchar text[9]="shidu:00%";
  25. uchar SIM_text[];//GSM接線:5VT==P3.0 5VR==P3.1

  26. /********************************************************************
  27. * 名稱 : Delay_uint()
  28. * 功能 : 小延時。
  29. * 輸入 : 無
  30. * 輸出 : 無
  31. ***********************************************************************/
  32. void Delay_uint(uint q)
  33. {
  34.         while(q--);
  35. }


  36. /***********************1ms延時函數*****************************/
  37. void Delay_1ms(uint q)
  38. {
  39.         uint i,j;
  40.         for(i=0;i<q;i++)
  41.                 for(j=0;j<120;j++);
  42. }

  43. /***********************LCD1602程序*****************************/
  44. /********************************************************************
  45. * 名稱 : LCD_write_com(uchar com)
  46. * 功能 : 1602命令函數
  47. * 輸入 : 輸入的命令值
  48. * 輸出 : 無
  49. ***********************************************************************/
  50. void  LCD_write_com(uchar com)
  51. {
  52.         e=0;
  53.         rs=0;
  54.         rw=0;
  55.         P0=com;
  56.         Delay_uint(3);
  57.         e=1;
  58.         Delay_uint(25);
  59.         e=0;
  60. }

  61. /********************************************************************
  62. * 名稱 : LCD_write_data(uchar dat)
  63. * 功能 : 1602寫數據函數
  64. * 輸入 : 需要寫入1602的數據
  65. * 輸出 : 無
  66. ***********************************************************************/
  67. void  LCD_write_data(uchar dat)
  68. {
  69.         e=0;
  70.         rs=1;
  71.         rw=0;
  72.         P0=dat;
  73.         Delay_uint(3);
  74.         e=1;
  75.         Delay_uint(25);
  76.         e=0;       
  77. }

  78. /********************************************************************
  79. * 名稱 :  LCD_string(uchar hang,uchar add,uchar *p)
  80. * 功能 : 改變液晶中某位的值,如果要讓第一行,第五個字符開始顯示"ab cd ef" ,調用該函數如下
  81.                    LCD_string(1,5,"ab cd ef;")
  82. * 輸入 : 行,列,需要輸入1602的數據
  83. * 輸出 : 無
  84. ***********************************************************************/
  85. void  LCD_string(uchar hang,uchar add,uchar *d)
  86. {
  87.         if(hang==1)   
  88.                 LCD_write_com(0x80+add);
  89.         else
  90.                 LCD_write_com(0x80+0x40+add);
  91.                 while(1)
  92.                 {
  93.                         if(*d == '\0')  
  94.                                 break;
  95.                         LCD_write_data(*d);
  96.                         d++;
  97.                 }       
  98. }

  99. /********************************************************************
  100. * 名稱 : init_1602()
  101. * 功能 : 初始化1602液晶
  102. * 輸入 : 無
  103. * 輸出 : 無
  104. ***********************************************************************/
  105. void init_1602()
  106. {
  107.          LCD_write_com(0x38);          //初始化
  108.          LCD_write_com(0x0c);
  109.          LCD_write_com(0x06);
  110.          LCD_write_com(0x01);
  111.          Delay_uint(100);          //延時

  112. }
  113. void int0init()
  114. {
  115.         EA=1;
  116.         EX0=1;
  117.         IT0=1;
  118. }
  119. void time0init()
  120. {
  121.         TMOD=0X02;        //設置定時器0模式2.該模式為自動裝載模式
  122.         TH0=0X00;
  123.         TL0=0X00;//設定計數初值,每當TL0計數到255時,TH0將把自己的數據給TL0,又重新計數
  124.         TR0=1;
  125.         ET0=1;
  126.         EA=1;       
  127. }
  128. void irpros() //紅外接收數據處理 ,區分是數據0還是1
  129. {
  130.         uint8 i,j,value;
  131.         uint8 k=1;        //引導碼去掉,所以令k=1;
  132.         for(j=0;j<4;j++)  //取出了一幀數據中的四個字節數據
  133.         {
  134.                 for(i=0;i<8;i++)        //取出了一個字節的數據               
  135.                 {
  136.                         value>>=1;
  137.                         if(irdata[k]>6)
  138.                         {
  139.                                 value=value|0x80;
  140.                         }
  141.                         k++;
  142.                 }
  143.                 ircode[j]=value;
  144.         }
  145.         irprosok=1;
  146. }
  147. void motopros()
  148. {
  149.         if(ircode[2]==0x0c)  //按下第一次按鍵開電機
  150.         {                       
  151.                 beep=~beep;
  152.                 dianji=0;
  153.                 Delay_1ms(100);                                                       
  154.         }
  155.         else if(ircode[2]==0x18)        //按下第二次此按鍵時關閉電機
  156.         {
  157.                 beep=1;       
  158.                 dianji=1;               
  159.         }
  160.         if(ircode[2]==0x5e)
  161.         {
  162.                 //Gsm_send(2);
  163.         }                               
  164. }

  165. /*******************GSM*************************/
  166. //注意,無論接收到信號還是發送完信號,都會進中斷服務程序的
  167. /*初始化程序(必須使用,否則無法收發),次程序將會使用定時器1*/
  168. void GSM_inti()//初始化程序(必須使用,否則無法收發)
  169. {
  170.         TMOD=0x20;//定時器1操作模式2:8位自動重載定時器

  171. #ifdef FOSC_12M                   //在這里根據晶振大小設置不同的數值初始化串口
  172.         TH1=0xf3;//裝入初值,波特率2400
  173.         TL1=0xf3;       
  174. #else        
  175.         TH1=0xfd;//裝入初值,波特率9600
  176.         TL1=0xfd;
  177. #endif //end of SOC_12M
  178.        
  179.         TR1=1;//打開定時器
  180.         SM0=0;//設置串行通訊工作模式,(10為一部發送,波特率可變,由定時器1的溢出率控制)
  181.         SM1=1;//(同上)在此模式下,定時器溢出一次就發送一個位的數據
  182.         REN=1;//串行接收允許位(要先設置sm0sm1再開串行允許)
  183.         EA=1;//開總中斷
  184.         ES=1;//開串行口中斷       
  185. }

  186. /*串行通訊中斷,收發完成將進入該中斷*/
  187. void Serial_interrupt() interrupt 4
  188. {
  189. //        a=SBUF;
  190.         P2=SBUF;
  191.         RI=0;//接收中斷信號清零,表示將繼續接收
  192. //        flag=1;//進入中斷的標志符號
  193. }


  194. void Uart1Send(uchar c)
  195. {
  196.         SBUF=c;
  197.         while(!TI);//等待發送完成信號(TI=1)出現
  198.         TI=0;       
  199. }

  200. //串行口連續發送char型數組,遇到終止號/0將停止
  201. void Uart1Sends(uchar *str)
  202. {
  203.         while(*str!='\0')
  204.         {
  205.                 SBUF=*str;
  206.                 while(!TI);//等待發送完成信號(TI=1)出現
  207.                 TI=0;
  208.                 str++;
  209.         }
  210. }

  211. //延時函數大概是1s鐘,不過延時大的話不準...
  212. void DelaySec(int sec)
  213. {
  214.         uint i , j= 0;

  215.         for(i=0; i<sec; i++)
  216.         {
  217.                 for(j=0; j<65535; j++)
  218.                 {       
  219.                 }
  220.         }
  221. }


  222. void Gsm_send()
  223. {
  224.                         Uart1Sends("AT+CSCS=\"GSM\"\r\n");
  225.                         DelaySec(3);//延時3秒
  226.                         Uart1Sends("AT+CMGF=1\r\n");
  227.                         DelaySec(3);//延時3秒
  228.                         Uart1Sends("AT+CMGS=\"17338711000\"\r\n");//此處修改為對方的電話號
  229.                         DelaySec(5);//延時3秒
  230.                         Uart1Sends(text);//修改短信內容
  231.                         Uart1Send(0x1a);
  232.                         //DelaySec(13);//延時20秒
  233. }

  234. void main()
  235. {
  236.         int k;
  237.         init_1602();
  238.         int0init();
  239.         time0init();
  240.         while(1)
  241.         {
  242.                 irpros();
  243.                 motopros();
  244.                 if(k==12000)
  245.                 {
  246.                         LCD_string(1,12,"ing");
  247.                         GSM_inti();
  248.                         Gsm_send();
  249.                         beep=~beep;
  250.                         Delay_1ms(100);
  251.                         k=0;
  252.                 }
  253.                 else
  254.                 {
  255.                         LCD_string(1,12,"no ");
  256.                         k++;
  257.                 }
  258.                        
  259.         }               
  260. }
  261. void time0() interrupt 1
  262. {
  263.         irtime++;//每進來一次就說明定時時間為256us;       
  264. }
  265. void init0() interrupt 0
  266. {
  267.         if(startflag)
  268.         {
  269.                 if(irtime>32)//檢測引導碼,求法是用引導碼時間除以一次計數時間,看看要多少次
  270.                 {
  271.                         bitnum=0;       
  272.                 }
  273.                 irdata[bitnum]=irtime;
  274.                 irtime=0;
  275.                 bitnum++;
  276.                 if(bitnum==33)
  277.                 {
  278.                         bitnum=0;
  279.                         irreceok=1;//一幀紅外數據接收完成標志
  280.                 }
  281.         }
  282.         else
  283.         {
  284.                 startflag=1;//將開始標志位置1,等到下次進入中斷即可進入if語句
  285.                 irtime=0;//將開始之前的計數器時間清零。等到下次進入中斷的時候才是引導碼真正的時間
  286.         }
  287. }
復制代碼



回復

使用道具 舉報

ID:512205 發表于 2019-5-8 12:56 | 顯示全部樓層
自己不懂,沒法幫到你,只能幫你頂上來吧!
回復

使用道具 舉報

ID:497670 發表于 2019-5-10 17:32 | 顯示全部樓層
沒有仔細看程序,感覺應該是串口發送中斷和紅外外部接收中斷有沖突了
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品嫩草影院精东 | 91观看| 久久国产精彩视频 | 欧美色综合天天久久综合精品 | 在线观看av网站永久 | 亚洲最大的成人网 | wwwxxx日本在线观看 | 成人免费一区二区三区牛牛 | 国产精品一区二区三区久久久 | 影视先锋av资源噜噜 | 亚洲天天干 | 亚洲激情一区二区三区 | 精品视频一区二区三区在线观看 | 手机看黄av免费网址 | 国产偷录视频叫床高潮对白 | 国产免费又色又爽又黄在线观看 | 神马福利| 国产精品久久久久久久久 | 天天操夜夜爽 | 精品国产一区二区三区久久影院 | 欧美日韩1区2区 | 日韩成人在线观看 | 伊人网在线看 | 一区二区三区精品视频 | 给我免费的视频在线观看 | 成人黄色电影在线播放 | 亚洲欧美中文日韩在线v日本 | 久久精品一区 | 美女在线国产 | 亚洲一区二区久久 | 国产婷婷色综合av蜜臀av | 亚洲视频一区二区三区四区 | 欧美自拍日韩 | 亚洲免费在线 | 成人精品国产免费网站 | 综合久久综合久久 | 一区二区三区免费在线观看 | av永久免费 | 一区二区三区日韩精品 | 午夜网| 中文字幕免费中文 |