打印
[通用8051核FLASH系列]

求救,HC0541定时器T0得不到预计的值,遥控器功能完不成

[复制链接]
843|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lankii35|  楼主 | 2019-12-3 15:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 芯圣电子官方QQ 于 2023-7-25 10:20 编辑

#define YK_PORT   P0M4
#define YK_PIN    P0_4

CLKSWR = 0x51;                //选择内部高频RC为系统时钟,内部高频RC 2分频,Fosc=16MHz
CLKDIV = 0x01;                //Fosc 1分频得到Fcpu,Fcpu=16MHz
YK_PORT=0x62;       // 上拉浮动输入有中断

void TIM0_Config(void)//定时器0初始化
{

        T0_MAP = 0x12;                                                //T0映射为P12口
        TCON1 |= 0x01;                                                //T0时钟1分频
        TMOD  = 0x01;
        TH0 = 0;
        TL0 = 0;   
       //TH0 = 0xFA;
       //  TL0 = 0xCB;     //T0定时时间1ms
        TF0=0;  //清除T0中断标识
          ET0=1;//使能T0中断
          IP0|=0x08;//中断优先级二级最高,防止被其他中断打断造成及时不准
          TR0=0;//先关闭定时器T0
}
void EXTINT4_Config(void)  //P0.4外部中断初始化
{
  EA = 0;    //关总中断
  PITS1 |= 0x01;        //INT0下降沿
  PINTE0|= 0x10;   //允许中断int4端口
// IP4|=0x03;   //INT2_7 中断优先级控制位  10为第二高等级中断
  EX2_7=1;
  EA = 1;    //开总中断
}

//T0中断处理
void TIMER0_Rpt(void) interrupt TIMER0_VECTOR
{

        TR0=0;//关闭定时器T0
        Ir_Status=0;
        TF0=0;  //清除T0中断标识
        TH0 = 0;
       TL0 = 0;
}
    //处理外部中断P0.4
void INT4_Rpt() interrupt INT2_7_VECTORT0X12
{
        
               
               
        Ir_Receive_Handle();
         PINTF0&=~ 0x10;                                //清除P4中断标志位        

}
//红外线接收处理
void Ir_Receive_Handle(void)
{

switch(Ir_Status)
  {
    case 0://第一个下降沿,定时器开始计数                    
           Ir_Status=1;
         
           TH0 = 0;
           TL0 = 0;
           TR0=1;
                        //Enable TIM2
                       //定时器计数值清零
         
            break;
                        
    case 1://第二个下降沿,定时器关闭,读取定时器计数值                                             
           
            TR0=0;
            Interval_tim=0;
      
              Interval_tim=TH0;
              Interval_tim=Interval_tim<<8;
              Interval_tim=Interval_tim+TL0;
     
           TH0 = 0;
           TL0 = 0;
           TR0=1;
           // TIM2_Cmd(ENABLE);                   //Enable TIM2
         
            if( (Interval_tim>=12500)&&(Interval_tim<=14500) )//判断引导码是否正确9+4.5ms   
         
            {
                Ir_Status=2;                    //进入下一状态  
                          
            }
            else                                //引导码错误,从新接收
            {
                Ir_Status=0;
                Ir_Receive_Count=0;
            }   

                           
            break;
                        
    case 2://开始32位数据的接收
           
            TR0=0;
            Interval_tim=0;
        
              Interval_tim=TH0;
              Interval_tim=Interval_tim<<8;
              Interval_tim=Interval_tim+TL0;
     
             TH0 = 0;
              TL0 = 0;
              TR0=1;
           

        
          if( (Interval_tim>=1000)&&(Interval_tim<=1300) )        //间隔1.12ms ->0
            {
                  Ir_Receive_Data=Ir_Receive_Data<<1;
                  Ir_Receive_Count++;                                
            }
            else if( (Interval_tim>=2000)&&(Interval_tim<=2600) )   //间隔2.25ms ->1
            {
                  Ir_Receive_Data=Ir_Receive_Data<<1;
                  Ir_Receive_Data=Ir_Receive_Data|0x0001;
                  Ir_Receive_Count++;
                                 
            }
            else//不是0,1 接收错误,从新接收
            {
                  Ir_Status=0;
                  Ir_Receive_Data=0;
                  Ir_Receive_Count=0;
            }
            
            //超出接收数据位数,接收下一个
          while(Ir_Receive_Count>31)
            {         
                Ir_receive_ok=1;//红外接收完成
                Ir_Status=0;
                Ir_Receive_Count=0;
                break;
            }                       
            break;
                        
    default :
            break;
    }
        
        
}
现在这个TH0,TL0数据每次很大18500,没法进入下一步,此程序是在stm8s105上更改,之前换过网上多种方案中断技术方式,也是乱飞的计数值。有点郁闷,搞了好几天 完不成
求官方,高手帮忙,或者在HC0541上有实现的接收遥控器的代码或者准确实现T0定时数据1Us

使用特权

评论回复
沙发
lankii35|  楼主 | 2019-12-3 20:07 | 只看该作者

芯圣 官方也没人理吗??

使用特权

评论回复
板凳
lankii35|  楼主 | 2019-12-5 16:05 | 只看该作者
本帖最后由 lankii35 于 2019-12-5 16:06 编辑

adc做温度采集也遇到问题,求解答

#define AD_PROT   P2M3   //an11 通道11
#define AD_PIN    P2_3


void ADC_IN(void)
{
        AD_PROT=0x40;//P24设置为模拟输入
        ADCC0 = 0x80;                                                //打开ADC转换电源
        delay(20);                                                //延时20us,确保ADC系统稳定
        
        ADCC1 = 0x0B;                                                //选择外部通道11
//        ADCC2 = 0x4B;                                                //转换结果12位数据,数据右对齐,ADC时钟16分频
     ADCC2 = 0xCB;  //转换结果10位数据,右对齐D16   xxxxxx9876543210
        
   //  ADCIF=0;   //0:无 ADC 转换中断标志
        //VREFO=0;    //0:VREF 不输出
        ADCC0|=0x02;//内部参考电压4v//vref脚接vcc5v
        SCANCON=0;  //单次扫描转换
        
        
}

unsigned int  get_adc1_v(void){
  
  
   unsigned int    ad_value=0;
        ADCR=0;
        ADCC0 &= ~0x40;                                        //关闭ADC转换
        ADCC0 |= 0x40;                                        //启动ADC转换
        while(!(ADCC0&0x20));                        //等待ADC转换结束
        ADCC0 &=~ 0x20;                                        //清除标志位
        ad_value = ADCR;                        //获取ADC的值
        
  
     
        return ad_value;                                 
  
}

//二分查找 adc数组 a[]
unsigned char binSearch(unsigned int x, unsigned int a[], unsigned char n)  
{  
   unsigned char low, high, mid;
   unsigned char res=0;
   low = 0;  
   high = n-1;  
   //注意,这里必须用<=, 用<不对,一直返回-1  
   while(low <= high)  
   {  
      mid = (low + high) / 2;  
      if((x < a[mid])){

      high = mid;  
      continue;
      }
      if((x >=a[mid]) && x<=a[mid+1] ){
        
        res= ((a[mid]-x)<(a[mid+1]-x))?mid:mid+1;
        break;
      }
      
      if(x >a[mid]) {
      low = mid;  
      continue;
      }
      
      if((x <=a[mid]) && x>=a[mid-1] ){
        
        res= ((a[mid]-x)<(a[mid-1]-x))?mid:mid-1;
        break;
      }
      
      
   }  
   return res;  
}

12脚是vref 做adc的时候需要外接电压3.v吗,还是不用管直接设定内部vref3v,这个12脚可以直接当io用
我是arm芯片用的多,51的芯片还是第一次

使用特权

评论回复
地板
lankii35|  楼主 | 2019-12-8 13:58 | 只看该作者
本帖最后由 lankii35 于 2019-12-8 14:06 编辑

联系官方后,通过官方技术qq得到帮助解决,adc参考电压用5v,虽然精度还不够,应用没问题。遥控器后面 在fsoc/12下。250us中断一次计数,解码遥控器按键成功。没人回帖,看来大家都不需要,不发最后完成代码了


此贴关闭.

使用特权

评论回复
5
zhaor| | 2020-1-24 10:44 | 只看该作者
需要的,发吧,多谢。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

9

帖子

0

粉丝