打印
[国产单片机]

基于EM78P153K的遥控器,求指导

[复制链接]
1726|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huasanshao0206|  楼主 | 2013-12-23 08:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、想要在学习的时候随机生成一个数据发送给接收机,生成的数据不能重复且生成后不变,类似滚动码,有哪些方法?
二、程序问题:下面的程序运行结果是64位数据的前56位正常,最后8位却全为0。我定义4个unsigned int变量用来发送,结果是编译时出现警告,说unsigned short转unsigned int溢出,示波器测到的结果是每次发的数据只有前8位,定义8个unsigned char变量后每次发送8位结果又正常,感觉是编译器有问题,可是又不知道怎么改,请大家指导指导,感激不尽!
#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,j;
        if(key1==0)
        {
                delay(20);
                if(key1==0)
                {
                        P60=0;                             //LED闪烁
                        delay(200);
                        P60=1;        
                        for(j=0;j<6;j++)                   //发送6次
                        {
                                data1=0x38D6FC62;          //将发送的数据
                                data2=0xBB680040;
                                P50=1;                     //报头
                                delay(9);
                                P50=0;
                                delay(1);
                                P50=1;
                                delay(1);
                                for(i=0;i<32;i++)          //发送64位数据,P50作TX
                                {
                                        P50=0;
                                        PORT5|=data1;                        
                                        data1>>=1;
                                        delay(1);
                                }
                                for(i=0;i<32;i++)
                                {
                                        P50=0;
                                        PORT5|=data2;                        
                                        data2>>=1;
                                        delay(1);
                                }
                        }
                                         //发送另一个64位数据
                        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);        
                                }
                        }
                }
                P50=0;        
        }
}
void main()
{
        init();
        while(1)
        {
                keyscan();
                delay(200);
        }
}

相关帖子

沙发
老鱼探戈| | 2013-12-23 14:06 | 只看该作者
data1、data2都是long型的,而MCU的IO口是8位的,不能直接这样运算。
定义成BYTE型发射就可以了。

使用特权

评论回复
板凳
huasanshao0206|  楼主 | 2013-12-24 09:50 | 只看该作者
老鱼探戈 发表于 2013-12-23 14:06
data1、data2都是long型的,而MCU的IO口是8位的,不能直接这样运算。
定义成BYTE型发射就可以了。 ...

可是为什么前面56位是对的呢?记得以前用PIC的单片机这样操作就不会有问题,会直接取long型的后8位操作。更奇怪的是我把后八位拿出来单独发,结果变成了后32位都不正常,无语了

使用特权

评论回复
地板
旭日东起| | 2013-12-31 16:15 | 只看该作者
EM78P153K应该是有滚动码设置的吧??台系列的都有滚动码设置

使用特权

评论回复
5
lpzailushang| | 2014-1-1 20:27 | 只看该作者
是否是EMC内部RAM不够的问题

使用特权

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

本版积分规则

7

主题

36

帖子

0

粉丝