欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3284|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

STC8G1K08單片機(jī)的紅外通信問(wèn)題,求大佬們賜教

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:971983 發(fā)表于 2021-10-14 14:36 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
購(gòu)買(mǎi)了STC 8G1K08-38I-SOP16的最小系統(tǒng)板和紅外接收模塊。想通過(guò)紅外遙控器,控制單片機(jī)P1.0口的輸出,驅(qū)動(dòng)led,這個(gè)紅外接收程序在51單片機(jī)上能正常使用,到STC 8G上按遙控器后,能檢測(cè)到外部中斷,P1.0口輸出沒(méi)反應(yīng),用ISP里建議的延遲函數(shù)和單片機(jī)小精靈里建議的延遲函數(shù)分別試了也是不行。求大佬能賜教下

電路圖在附件中



單片機(jī)程序代碼如下:
  1. #include "STC8.h"
  2. #include "intrins.h"

  3. typedef unsigned int u16;          //對(duì)數(shù)據(jù)類(lèi)型進(jìn)行聲明定義
  4. typedef unsigned char u8;

  5. sbit one=P1^0;  //定義I/O口別名
  6. sbit IRIN=P3^2;

  7. u8 IrValue[6];
  8. u8 Time;


  9. void Delay7ms()                //@11.0592MHz
  10. {
  11.         unsigned char a,b;
  12.     for(b=199;b>0;b--)
  13.     for(a=193;a>0;a--);
  14. }


  15. void Delay10us()                //@11.0592MHz
  16. {
  17.         unsigned char a,b;
  18.     for(b=1;b>0;b--)
  19.     for(a=52;a>0;a--);
  20. }

  21. void Delay100us()                //@11.0592MHz
  22. {
  23.     unsigned char a,b;
  24.     for(b=58;b>0;b--)
  25.     for(a=8;a>0;a--);
  26. }


  27. void Delay80ms()                //@11.0592MHz
  28. {
  29.     unsigned char a,b,c;
  30.     for(c=58;c>0;c--)
  31.         for(b=151;b>0;b--)
  32.             for(a=49;a>0;a--);
  33.     _nop_();  
  34. }



  35. void IrInit()  //初始化函數(shù)
  36. {
  37.         IT0=1;//下降沿觸發(fā)
  38.         EX0=1;//打開(kāi)中斷0允許
  39.         EA=1;        //打開(kāi)總中斷
  40.         IRIN=1;//初始化端口

  41.         P1M0=0xff;
  42.         P1M1=0x00;
  43.         P3M0=0x00;
  44.         P3M1=0x00;

  45.         one=0;
  46. }


  47. void main()
  48. {        
  49.         IrInit();
  50.         while(1)
  51.         {        
  52.                
  53.                 while(IrValue[2]==0x45)//燈開(kāi)
  54.                 {
  55.                         one=1;
  56.                         Delay80ms();
  57.                         one=0;
  58.                         Delay80ms();
  59.                 }                                          


  60.                 while(IrValue[2]==0x46)//燈關(guān)
  61.                 {
  62.                          one=0;
  63.                 }

  64.         }
  65. }


  66. void ReadIr() interrupt 0 // 讀取紅外數(shù)值的中斷函數(shù)
  67. {
  68.         u8 j,k;
  69.         u16 err;
  70.         Time=0;                                         
  71.         Delay7ms();        //7ms  
  72.         if(IRIN==0)                //確認(rèn)是否真的接收到正確的信號(hào)
  73.         {         
  74.                
  75.                 err=1000;                                //1000*10us=10ms,超過(guò)說(shuō)明接收到錯(cuò)誤的信號(hào)
  76.                 /*當(dāng)兩個(gè)條件都為真是循環(huán),如果有一個(gè)條件為假的時(shí)候跳出循環(huán),免得程序出錯(cuò)的時(shí)
  77.                 侯,程序死在這里*/        
  78.                 while((IRIN==0)&&(err>0))        //等待前面9ms的低電平過(guò)去                  
  79.                 {                        
  80.                         Delay10us();
  81.                         err--;
  82.                 }
  83.                 if(IRIN==1)                        //如果正確等到9ms低電平
  84.                 {
  85.                         err=500;
  86.                         while((IRIN==1)&&(err>0))                 //等待4.5ms的起始高電平過(guò)去
  87.                         {
  88.                                 Delay10us();
  89.                                 err--;
  90.                         }
  91.                         for(k=0;k<4;k++)                //共有4組數(shù)據(jù)
  92.                         {                                
  93.                                 for(j=0;j<8;j++)        //接收一組數(shù)據(jù)
  94.                                 {

  95.                                         err=60;               
  96.                                         while((IRIN==0)&&(err>0))//等待信號(hào)前面的560us低電平過(guò)去
  97.                                         {
  98.                                                 Delay10us();
  99.                                                 err--;
  100.                                         }
  101.                                         err=500;
  102.                                         while((IRIN==1)&&(err>0))         //計(jì)算高電平的時(shí)間長(zhǎng)度。
  103.                                         {
  104.                                                 Delay100us();         //0.1ms
  105.                                                 Time++;
  106.                                                 err--;
  107.                                                 if(Time>30)
  108.                                                 {
  109.                                                         return;
  110.                                                 }
  111.                                         }
  112.                                         IrValue[k]>>=1;         //k表示第幾組數(shù)據(jù)
  113.                                         if(Time>=8)                        //如果高電平出現(xiàn)大于565us,那么是1
  114.                                         {
  115.                                                 IrValue[k]|=0x80;
  116.                                         }
  117.                                         Time=0;                //用完時(shí)間要重新賦值
  118.                                                                                        
  119.                                 }                  
  120.                         }
  121.                
  122.                 }
  123.                 if(IrValue[2]!=~IrValue[3])
  124.                 {
  125.                         return;
  126.                 }
  127.         }                        
  128. }

復(fù)制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:136485 發(fā)表于 2021-10-15 15:07 | 只看該作者
#include<STC15W408AS.H>
#include<intrins.h>                 //包含_nop_()函數(shù)定義的頭文件
#define uchar unsigned char
#define uint  unsigned int
//#define CCP_S0 0x10               //P_SW1.4
//#define CCP_S1 0x20               //P_SW1.5
#define LED_Port P1
#define CMD_IDLE    0               //空閑模式
#define CMD_READ    1               //IAP字節(jié)讀命令
#define CMD_PROGRAM 2               //IAP字節(jié)編程命令
#define CMD_ERASE   3               //IAP扇區(qū)擦除命令

//#define ENABLE_IAP 0x80           //if SYSCLK<30MHz
//#define ENABLE_IAP 0x81           //if SYSCLK<24MHz
//#define ENABLE_IAP 0x82           //if SYSCLK<20MHz
#define ENABLE_IAP 0x83             //if SYSCLK<12MHz
//#define ENABLE_IAP 0x84           //if SYSCLK<6MHz
//#define ENABLE_IAP 0x85           //if SYSCLK<3MHz
//#define ENABLE_IAP 0x86           //if SYSCLK<2MHz
//#define ENABLE_IAP 0x87           //if SYSCLK<1MHz

#define IAP_ADDRESS 0x0000          //測(cè)試地址
sbit led1 = P1^4;
sbit led2 = P1^3;
sbit led3 = P1^2;
//sbit led4 = P3^3;
//sbit led5 = P1^3;                 //p1.3
//sbit led6 = P3^1;
//sbit led7 = P3^0;
//sbit led8 = P1^7;
//sbit led9 = P5^5;
//sbit led10= P5^4;
//sbit IRIN=P3^2;                   //紅外接收器數(shù)據(jù)線(xiàn)
sbit IR_Out = P3^2;
uchar num,sum,mode;
sbit IR_Flag = P1^1;  
unsigned char dat[4] = {0,0,0,0};
void led();
void key();
void IapIdle();
uchar IapReadByte(uint addr);
void IapProgramByte(uint addr, uchar dat);
void IapEraseSector(uint addr);

void delay(uint z)
{
uint x,y;
for(x=0;x<50;x++)
for(y=z;y>0;y--);
}

void main()
{
P1M0=0xFF;
P1M1=0x00;
P3M0=0x00;
P3M1=0x00;
P5M0=0xFF;
P5M1=0x00;
ACC = P_SW1;
//ACC &= ~(CCP_S0|CCP_S1);  //CCP_S0=0 CCP_S1=0
P_SW1 = ACC;               //(P1.2/ECI, P1.1/CCP0, P1.0/CCP1, P3.7/CCP2)
CCON = 0;                  //初始化PCA控制寄存器
                            //PCA定時(shí)器停止
                            //清除CF標(biāo)志
                            //清除模塊中斷標(biāo)志
CL = 0;                    //復(fù)位PCA寄存器
CH = 0;
CMOD = 0x02;               //設(shè)置PCA時(shí)鐘源
                            //禁止PCA定時(shí)器溢出中斷
PCA_PWM0 = 0x00;           //PCA模塊0工作于8位PWM
CCAP0H = CCAP0L = 0xFF;    //PWM0的占空比為87.5% ((100H-20H)/100H)
CCAPM0 = 0x42;             //PCA模塊0為8位PWM模式
CR = 1;                    //PCA定時(shí)器開(kāi)始工作
//EA =1;
//EX0=1;                  
//IT0=1;
//IRIN=1;
IR_Out = 1;
TMOD = 0x01;              // 定時(shí)器0,方式1  
IT0 = 1;                  // 外部中斷0,下降沿觸發(fā)  
EX0 = 1;                  // 準(zhǔn)許外部中斷  
EA = 1;                   // CPU準(zhǔn)許中斷  

led1=led2=led3=0;
//sum=IapReadByte(0x0010);
//num=IapReadByte(0x0020);
mode=IapReadByte(0x0030);
while(1)
  {
   key();
   switch(mode)
    {
         case 0x01:led1=led2=led3=0;break;
         case 0x02:CCAP0H = CCAP0L = 0x00;led();key();break;
     case 0x03:CCAP0H = CCAP0L = 0x96;led();key();break;
         case 0x04:CCAP0H = CCAP0L = 0xD2;led();key();break;
     default :led1=led2=led3=0;break;
        }
  }
}



void Int0() interrupt 0  
{  
unsigned char i,j;  
EX0 = 0;            // 關(guān)閉外部中斷0  
IR_Flag = 0;        // 執(zhí)行中斷程序時(shí),LED燈亮  
i = 10;             // 0.793ms延時(shí),運(yùn)行10次  
while( --i )  
  {  
   TH0 = 0xfc;       // 定時(shí)0.793ms,延時(shí)0.793ms*10=7.93ms
   TL0 = 0xe7;  
   TR0 = 1;  
   while( !TF0 );  
   TF0 = 0;  
   TR0 = 0;          // 這7.93ms期間只要IR_Out變高電平,就非合法的紅外信號(hào),跳出  
   if( IR_Out )  
    {  
         EX0 = 1;        // 準(zhǔn)許中斷  
         return ;  
    }  
  }  
      
                      // 程序進(jìn)行到這里,表明是合法的紅外信號(hào)(利用9ms判斷)  
  while( !IR_Out );   // 等待9ms低電平過(guò)去  
                      // 程序進(jìn)行到這里,表明經(jīng)過(guò)9ms低電平  
  TH0 = 0xf6;  
  TL0 = 0xff;  
  TR0 = 1;  
  while( !TF0 );  
  TF0 = 0;  
  TR0 = 0;            // 延時(shí)2.305ms  
      
                      // IR_Out 為低表明是連發(fā)碼,不予理睬,跳出  
  if( !IR_Out )  
   {  
    EX0=1;  
    return;  
   }  
  
                        // 程序進(jìn)行到這里,表明是引導(dǎo)碼,等待4.5ms高電平的過(guò)去  
  while( IR_Out );      
                       
  for(i=0; i<4; i++)    // 開(kāi)始接收用戶(hù)碼
   {  
    for(j=0; j<8; j++)  
     {  
      while( !IR_Out ); // 等待低電平過(guò)去  
      dat[i] >>= 1;     // 把上次的數(shù)據(jù)位右移一位  
      TH0 = 0xfc;  
      TL0 = 0xe7;  
      TR0 = 1;  
      while( !TF0 );  
      TR0=0;  
      TF0=0;            //延時(shí)0.793ms   
              
                        // 若為數(shù)據(jù)"1",則延時(shí)后IR_Out為高電平  
      if( IR_Out )   
       {  
        dat[i] |= 0x80; // 所有數(shù)據(jù)位1放最高位  
        while( IR_Out );// 等待高電平過(guò)去  
        }  
      }  
    }     
                        //LED_Port = dat[2];  
  num = dat[2];
  EX0=1;                // 開(kāi)中斷  
  return;  
}  
給一個(gè)給你參考下,最近我弄的,芯片是用STC15W408AS   內(nèi)部頻率110.592M
回復(fù)

使用道具 舉報(bào)

板凳
ID:123289 發(fā)表于 2021-10-15 16:07 | 只看該作者
【到STC 8G上按遙控器后,能檢測(cè)到外部中斷】
既如此,就將紅外接收端接到外部中斷口,中斷后給LED的端口改變一下。不就好了。
幾句就搞定了,不用這么復(fù)雜吧。
回復(fù)

使用道具 舉報(bào)

地板
ID:624769 發(fā)表于 2021-10-15 16:17 | 只看該作者
你直接在線(xiàn)仿真, 然后控制P1.0 看看有沒(méi)有反映, 然后、在線(xiàn)仿真看看紅外到底收到什么碼,比這里問(wèn),我們替你猜,效率高多了。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表