windsuncloud 发表于 2025-4-22 23:07:33

将89C52 代码转8051U 还需要注意什么

大家好,上篇帖子大家建议将89C52 芯片转换为8051U (或者AI8051U),目前已经换了芯片,但是代码烧录入新的电路系统后无法工作。通过查阅规格书,在89C52 代码中做了如下代换:

1. 代码加入8051U 芯片 的头文件,将8051U 设置工作于8位模式。
2.P0 定义为开漏模式, 外接上拉电阻 驱动LCD,P1,P2,P3,P4口均定义位准双向口,
3. 使用片内RC震荡模式,烧录时输入12Mhz 频率,
4. 请问上述设置是否正确?是否还有别的寄存器需要设置?89C52 代码工作是正常的 但是烧录入8051U 电路后 LCD不能点亮,电路只能检测到有工作电流,按键都无反应。。。。。。
请大家不吝指教,谢谢大家

神农鼎 发表于 2025-4-22 23:16:49

https://www.stcaimcu.com/data/do ... /STC89C52RC-RD+.pdf
看最新数据手册










DebugLab 发表于 2025-4-22 23:25:36

除IO外设程序兼容外还要注意:
AI8051U速度过快,LCD可能反应不过来,用逻辑分析仪或示波器测一下IO是否有信号
P0开漏,外部10K上拉,可能无法高速通信,上升沿不够快
建议直接使用内部4K上拉(接收),不需要外部上拉
只发送可以直接设置为推挽

windsuncloud 发表于 2025-4-22 23:27:02

谢谢,再学习一下

DebugLab 发表于 2025-4-22 23:31:45

点1602、12864、TFT及其他I8080/M6800兼容接口屏幕,建议直接学习、使用AI8051U的LCM_DMA:
https://www.stcaimcu.com/thread-11351-1-1.html
https://www.stcaimcu.com/thread-10402-1-1.html




mdmikdqm 发表于 2025-5-3 21:35:26

windsuncloud 发表于 2025-4-22 23:27
谢谢,再学习一下

原电脑没有带,重新注册一个号来更新一下。

mdmikdqm 发表于 2025-5-3 22:30:53

mdmikdqm 发表于 2025-5-3 21:35
原电脑没有带,重新注册一个号来更新一下。

现在能点亮LCD,程序的设计是先进入初始化设置,现在按设置键无法进入时间设置子程序对DS1302进行初始时间的写入数据,LCD屏幕显示也有闪烁现象,将主频设置为12MHz也是一样,按闹钟设置键后进入设置闹钟子程序LCD显示可以稳定不闪烁,按键功能也能部分实现比如数字的增减,分 秒 时的切换也可以实现,但是部分字符出现乱码。现在不知道是不是DS1302数据读取还是LCD1302写入部分出现问题。请大家指点一下这到底是什么原因。以下是初始化代码。                                                                                                         
--------------------------------------------------------------------------------                                                                                                                              void write_1602com(uchar com)//****液晶写入指令函数****
{
        rs=0;//数据/指令选择置为指令
        rw=0; //读写选择置为写
        P0=com;//送入数据
        delay(1);
        en=1;//拉高使能端,为制造有效的下降沿做准备
        delay(1);
        en=0;//en由高变低,产生下降沿,液晶执行命令
}


void write_1602dat(uchar dat)//***液晶写入数据函数****
{
        rs=1;//数据/指令选择置为数据
        rw=0; //读写选择置为写
        P0=dat;//送入数据
        delay(1);
        en=1; //en置高电平,为制造下降沿做准备
        delay(1);
        en=0; //en由高变低,产生下降沿,液晶执行命令
}
void Lcd_ram()      
{
        uintj,k=0,temp=0x40;

           for(j=0;j<8;j++)
           {
          write_1602com(temp+j);
          write_1602dat(num);
          k++;
           }
          
}

void lcd_init()//***液晶初始化函数****
{
        write_1602com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据
        write_1602com(0x0c);//开显示不显示光标
        write_1602com(0x06);//整屏不移动,光标自动右移
        write_1602com(0x01);//清显示

        write_1602com(yh+1);//日历显示固定符号从第一行第1个位置之后开始显示
        for(a=0;a<14;a++)
        {
        write_1602dat(tab1);//向液晶屏写日历显示的固定符号部分
        //delay(3);
        }
        write_1602com(er);//时间显示固定符号写入位置,从第2个位置后开始显示
        for(a=0;a<8;a++)
        {
        write_1602dat(tab2);//写显示时间固定符号,两个冒号
        //delay(3);
        }

}

/*********************over***********************/


/***************DS1302有关子函数********************/


//----------------------------------------
void write_1302(uchar addr, uchar dat)//向1302芯片写函数,指定写入地址,数据
{
    uchar n;
        RST = 0;
        _nop_();

        SCLK = 0;//先将SCLK置低电平。
        _nop_();
        RST = 1; //然后将RST(CE)置高电平。
        _nop_();

        for (n=0; n<8; n++)//开始传送八位地址命令
        {
                DSIO = addr & 0x01;//数据从低位开始传送
                addr >>= 1;
                SCLK = 1;//数据在上升沿时,DS1302读取数据
                _nop_();
                SCLK = 0;
                _nop_();
        }
        for (n=0; n<8; n++)//写入8位数据
        {
                DSIO = dat & 0x01;
                dat >>= 1;
                SCLK = 1;//数据在上升沿时,DS1302读取数据
                _nop_();
                SCLK = 0;
                _nop_();       
        }       
               
        RST = 0;//传送数据结束
        _nop_();
}
uchar read_1302(uchar addr )//从1302读数据函数,指定读取数据来源地址
{
        uchar n,dat,dat1;
        RST = 0;
        _nop_();

        SCLK = 0;//先将SCLK置低电平。
        _nop_();
        RST = 1;//然后将RST(CE)置高电平。
        _nop_();

        for(n=0; n<8; n++)//开始传送八位地址命令
        {
                DSIO = addr & 0x01;//数据从低位开始传送
                addr >>= 1;
                SCLK = 1;//数据在上升沿时,DS1302读取数据
                _nop_();
                SCLK = 0;//DS1302下降沿时,放置数据
                _nop_();
        }
        _nop_();
        for(n=0; n<8; n++)//读取8位数据
        {
                dat1 = DSIO;//从最低位开始接收
                dat = (dat>>1) | (dat1<<7);
                SCLK = 1;
                _nop_();
                SCLK = 0;//DS1302下降沿时,放置数据
                _nop_();
        }

        RST = 0;
        _nop_();        //以下为DS1302复位的稳定时间,必须的。
        SCLK = 1;
        _nop_();
        DSIO = 0;
        _nop_();
        DSIO = 1;
        _nop_();
        return dat;
}

uchar BCD_Decimal(uchar bcd)//BCD码转十进制函数,输入BCD,返回十进制
{
       uchar Decimal;
        Decimal=bcd/16*10+bcd%16;
       return(Decimal );
}

haiyang201 发表于 2025-5-5 10:06:58

mdmikdqm 发表于 2025-5-3 22:30
现在能点亮LCD,程序的设计是先进入初始化设置,现在按设置键无法进入时间设置子程序对DS1302进行初始时 ...

有数据,能显示,说明时钟芯片通讯和液晶显示程序基本没有问题

windsuncloud 发表于 2025-5-6 22:05:58

感觉就是这里描述的运行速度过快的问题,改变延时子程序之后可以实现不闪烁,但是没有头绪如何对相应的指令运行时间进行调整。。。
页: [1]
查看完整版本: 将89C52 代码转8051U 还需要注意什么