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

標(biāo)題: 有沒有人你幫忙看看代碼?GSM模塊工作過后紅外遙控功能就不能正常使用了 [打印本頁]

作者: 繁弱    時間: 2019-5-8 10:29
標(biāo)題: 有沒有人你幫忙看看代碼?GSM模塊工作過后紅外遙控功能就不能正常使用了
要完成的功能是每分鐘發(fā)送一次短信,除了發(fā)短信的時候,其他時候能夠通過遙控器控制電機。現(xiàn)在出現(xiàn)問題:GSM第一次發(fā)短信之前遙控器正常使用,發(fā)過短信之后紅外不能使用或者出現(xiàn)亂碼等異常情況

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

  1. #include<reg51.h>
  2. #include <reg51.h>                 //調(diào)用單片機頭文件
  3. #define uchar unsigned char  //無符號字符型 宏定義        變量范圍0~255
  4. #define uint  unsigned int         //無符號整型 宏定義        變量范圍0~65535
  5. #include <intrins.h>                 //包含_nop_()函數(shù)定義的頭文件
  6. #define FOSC_110592M                 //單片機的晶振大小
  7. typedef unsigned char uint8;
  8. typedef unsigned int uint16;
  9. typedef unsigned int u16;          //對數(shù)據(jù)類型進(jìn)行聲明定義
  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位數(shù)
  16. uint8 irdata[33]; //寄存沒有個bit的時間
  17. uint8 irreceok;          //接收完成標(biāo)志位
  18. uint8 ircode[4];  //將接收的四個字節(jié)數(shù)據(jù)保存
  19. uint8 irprosok;          //接收數(shù)據(jù)處理標(biāo)志位

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

  23. //GSM發(fā)送短信
  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延時函數(shù)*****************************/
  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命令函數(shù)
  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寫數(shù)據(jù)函數(shù)
  64. * 輸入 : 需要寫入1602的數(shù)據(jù)
  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" ,調(diào)用該函數(shù)如下
  81.                    LCD_string(1,5,"ab cd ef;")
  82. * 輸入 : 行,列,需要輸入1602的數(shù)據(jù)
  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;        //設(shè)置定時器0模式2.該模式為自動裝載模式
  122.         TH0=0X00;
  123.         TL0=0X00;//設(shè)定計數(shù)初值,每當(dāng)TL0計數(shù)到255時,TH0將把自己的數(shù)據(jù)給TL0,又重新計數(shù)
  124.         TR0=1;
  125.         ET0=1;
  126.         EA=1;       
  127. }
  128. void irpros() //紅外接收數(shù)據(jù)處理 ,區(qū)分是數(shù)據(jù)0還是1
  129. {
  130.         uint8 i,j,value;
  131.         uint8 k=1;        //引導(dǎo)碼去掉,所以令k=1;
  132.         for(j=0;j<4;j++)  //取出了一幀數(shù)據(jù)中的四個字節(jié)數(shù)據(jù)
  133.         {
  134.                 for(i=0;i<8;i++)        //取出了一個字節(jié)的數(shù)據(jù)               
  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)        //按下第二次此按鍵時關(guān)閉電機
  156.         {
  157.                 beep=1;       
  158.                 dianji=1;               
  159.         }
  160.         if(ircode[2]==0x5e)
  161.         {
  162.                 //Gsm_send(2);
  163.         }                               
  164. }

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

  171. #ifdef FOSC_12M                   //在這里根據(jù)晶振大小設(shè)置不同的數(shù)值初始化串口
  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;//設(shè)置串行通訊工作模式,(10為一部發(fā)送,波特率可變,由定時器1的溢出率控制)
  181.         SM1=1;//(同上)在此模式下,定時器溢出一次就發(fā)送一個位的數(shù)據(jù)
  182.         REN=1;//串行接收允許位(要先設(shè)置sm0sm1再開串行允許)
  183.         EA=1;//開總中斷
  184.         ES=1;//開串行口中斷       
  185. }

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


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

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

  211. //延時函數(shù)大概是1s鐘,不過延時大的話不準(zhǔn)...
  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);//修改短信內(nèi)容
  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++;//每進(jìn)來一次就說明定時時間為256us;       
  264. }
  265. void init0() interrupt 0
  266. {
  267.         if(startflag)
  268.         {
  269.                 if(irtime>32)//檢測引導(dǎo)碼,求法是用引導(dǎo)碼時間除以一次計數(shù)時間,看看要多少次
  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;//一幀紅外數(shù)據(jù)接收完成標(biāo)志
  280.                 }
  281.         }
  282.         else
  283.         {
  284.                 startflag=1;//將開始標(biāo)志位置1,等到下次進(jìn)入中斷即可進(jìn)入if語句
  285.                 irtime=0;//將開始之前的計數(shù)器時間清零。等到下次進(jìn)入中斷的時候才是引導(dǎo)碼真正的時間
  286.         }
  287. }
復(fù)制代碼




作者: QZQ1973    時間: 2019-5-8 12:56
自己不懂,沒法幫到你,只能幫你頂上來吧!
作者: 小貓要吃魚    時間: 2019-5-10 17:32
沒有仔細(xì)看程序,感覺應(yīng)該是串口發(fā)送中斷和紅外外部接收中斷有沖突了




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 亚洲激情综合 | 91精品中文字幕一区二区三区 | 欧美一级免费看 | 视频在线一区二区 | 亚洲精品一区二区三区蜜桃久 | 亚洲精品久久久 | 亚洲成年人免费网站 | 涩涩操 | 成人免费视频观看视频 | 综合色播 | 欧美日韩在线播放 | 麻豆av一区二区三区久久 | 欧美在线观看网站 | 成人免费大片黄在线播放 | 91社区在线观看高清 | 欧美日韩精品久久久免费观看 | 欧美日韩在线一区二区 | 视频一区在线 | 日韩精品999| 99国产精品99久久久久久 | 在线伊人 | 视频二区在线观看 | 色呦呦网站 | 国产成人影院 | 综合色久| av网站在线看 | 91九色porny首页最多播放 | 91素人| 国产欧美精品一区二区色综合 | 国内精品伊人久久久久网站 | 欧美日韩视频在线第一区 | 亚洲免费一区 | 日本久久黄色 | 欧产日产国产精品99 | 久久99精品久久久 | 日韩一区不卡 | 一区二区三区四区不卡视频 | 欧美一级淫片免费视频黄 | 亚洲成人久久久 | 精品一区二区久久久久久久网站 | 国产精华一区 |