打印
[国产单片机]

求助:EM78P153K遥控器问题

[复制链接]
2196|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一个简单的遥控器程序:
#include "EM78P153K.H"
#define DISI()    _asm{disi}
#define ENI()    _asm{eni}
#define SLEP()    _asm{slep}
#define NOP()    _asm{nop}
#define WDTC()  _asm{wdtc}
#define uchar unsigned char
#define uint unsigned int
#define key1  P65
#define key2  P64
#define key3  P63
#define key4  P61
unsigned long int data1;
unsigned long int data2;

void init()
{
        P5CR=0;                                                  //P5口全为输出
        P6CR=0X3A;                                           //P61、63、64、65为输入,其他为输出
        PORT5=0;                                              //PORT5全0
        PORT6=0XFF;                                        //PORT6全1
        WDTCR=0;                                           //WDT控制寄存器,禁止WDT,P60作I/O口
        IMR=0;                                                 //中断屏蔽寄存器,禁止全部中断
        DISI();                                                    //关总中断
}
void delay(uint z)                                         //ms级延时
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=120;y>0;y--);
}
void keyscan()
{
        uchar i;
        if(key1==0)
        {
                delay(20);
                if(key1==0)
                {
                        P60=0;                                            //LED闪烁
                        delay(100);
                        P60=1;
                        data1=0x463F6B1A;                       //发送的数据
                        data2=0x020016DD;                     //发送的数据
                        P50=1;                                          //报头
                        delay(5);
                        P50=0;
                        delay(1);
                        P50=1;
                        delay(1);
                        for(i=0;i<32;i++)                          //发送64位数据,P50为TX
                        {
                                PORT5|=data1;                       
                                data1>>=1;
                                delay(1);       
                        }
                        for(i=0;i<32;i++)
                        {
                                PORT5|=data2;                       
                                data2>>=1;
                                delay(1);       
                        }
                        P50=0;
                }       
        }
}
void main()
{
        init();
        while(1)
        {
                keyscan();
                delay(200);
        }
}
void _intcall interrupt(void) @ int
{

  // Write your code (inline assembly or C) here

  //restore ACC
  _asm
   {
      reti            //tell Compiler to recover common registers here
      SWAP 0X1F    ;restore A
      SWAPA 0X1F
   }
}
void _intcall interrupt_l(void) @ 0x08:low_int 0
{
   _asm
   {
      //save A --> 0x1F
      MOV 0X1F,A   ;backup A to 0x1F
   }         
}


出现的问题是:用示波器检测P50脚,报头是对的,可是后面的发送数据一直是高电平,真的不懂怎么回事了,希望能得到回复,谢谢!


相关帖子

沙发
McuPlayer| | 2013-12-20 12:21 | 只看该作者
这2个小循环中,PORT5的bit0只能从0跳变为1,而没有机会从1跳变为0
怎么修改,方法有几个,这就是你自己的事了

                        for(i=0;i<32;i++)                          //发送64位数据,P50为TX
                        {
                                PORT5|=data1;                       
                                data1>>=1;
                                delay(1);      
                        }
                        for(i=0;i<32;i++)
                        {
                                PORT5|=data2;                       
                                data2>>=1;
                                delay(1);      
                        }

使用特权

评论回复
板凳
McuPlayer| | 2013-12-20 12:23 | 只看该作者
另外,你在对整个PORT5做操作,实际做产品的时候要注意
只对发射的管脚操作,要避免对其他IO的影响,加入PORT5的bit2挂着LED,你这个程序也会叫他忽闪忽闪的

使用特权

评论回复
地板
huasanshao0206|  楼主 | 2013-12-20 13:56 | 只看该作者
McuPlayer 发表于 2013-12-20 12:21
这2个小循环中,PORT5的bit0只能从0跳变为1,而没有机会从1跳变为0
怎么修改,方法有几个,这就是你自己的 ...

哦哦,懂了,谢谢!另再请教一下EMC SIMULATOR这个软件怎么用啊,我把程序加载进去,单步看不到程序运行到哪了,也没有什么指针啥的,而且出现warning D010:address 000 dose not match source file。

使用特权

评论回复
5
McuPlayer| | 2013-12-20 18:22 | 只看该作者
那个软件恐怕是太古老了,义隆好像好几年都不维护了,买个硬件仿真器吧

使用特权

评论回复
6
huasanshao0206|  楼主 | 2013-12-22 09:08 | 只看该作者
McuPlayer 发表于 2013-12-20 18:22
那个软件恐怕是太古老了,义隆好像好几年都不维护了,买个硬件仿真器吧

你好,我又遇到个新问题想请教一下,还是那个程序,把keyscan()改成这样:
void keyscan()
{
        uchar i,j;
        if(key1==0)
        {
                delay(20);
                if(key1==0)
                {
                        P60=0;
                        delay(200);
                        P60=1;       
                        for(j=0;j<6;j++)
                        {
                                data1=0x38D6FC62;
                                data2=0xBB680040;
                                P50=1;
                                delay(9);
                                P50=0;
                                delay(1);
                                P50=1;
                                delay(1);
                                for(i=0;i<32;i++)
                                {
                                        P50=0;
                                        PORT5|=data1;                       
                                        data1>>=1;
                                        delay(1);
                                }
                                for(i=0;i<32;i++)
                                {
                                        P50=0;
                                        PORT5|=data2;                       
                                        data2>>=1;
                                        delay(1);
                                        NOP();
                                }
                        }
                        P50=0;
                        delay(9);
                        for(j=0;j<6;j++)
                        {
                                data1=0x38D6FC62;
                                data2=0xF0920040;
                                P50=1;
                                delay(9);
                                P50=0;
                                delay(1);
                                P50=1;
                                delay(1);
                                for(i=0;i<32;i++)
                                {
                                        P50=0;
                                        PORT5|=data1;                       
                                        data1>>=1;
                                        delay(1);       
                                }
                                for(i=0;i<32;i++)
                                {
                                        P50=0;
                                        PORT5|=data2;                       
                                        data2>>=1;
                                        delay(1);
                                        NOP();       
                                }
                        }
                }
                P50=0;       
        }
}
出现的情况是发的64位数据最后8位全变成了0,前面56位都正常,实在是不知道为什么会这样。还有前面你说不要对整个PORT5操作,我改成P50|=data1;后出现错误。多谢你的耐心解答!

使用特权

评论回复
7
huasanshao0206|  楼主 | 2013-12-22 09:13 | 只看该作者
McuPlayer 发表于 2013-12-20 18:22
那个软件恐怕是太古老了,义隆好像好几年都不维护了,买个硬件仿真器吧


使用特权

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

本版积分规则

7

主题

36

帖子

0

粉丝