找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2208|回复: 4
收起左侧

51单片机控制ds1302和dht11显示到oled屏问题求指导

[复制链接]
ID:846211 发表于 2020-12-2 01:08 来自手机 | 显示全部楼层 |阅读模式
2黑币
51单片机控制ds1302和dht11显示到oled屏上,但是刚开始的时候显示正常,后面oled上的时间就停止,不刷新了。

回复

使用道具 举报

ID:836944 发表于 2020-12-4 15:30 | 显示全部楼层
大概率是程序有bug吧,能正常显示说明硬件和电路没有走错
回复

使用道具 举报

ID:517466 发表于 2020-12-5 11:37 | 显示全部楼层
开始能显示一段时间,说明显示以及驱动都没有问题。后面显示停止,说明:
1、时间的现实,不是以中断方式显示的。
2、后面的什么处理,进入了某个循环。导致没有退出去执行显示处理。
你检查程序的重点在于,在执行显示处理以后,是不是又有什么处理进入了循环,导致显示处理部分不能被调用。如果没有死循环,那是不是程序跑偏了,需不需要加个看门狗。
我个人怀疑,你后面有键盘处理部分,在这个部分有循环,没有退出。后者因为有其他中断处理导致显示处理被干扰。
回复

使用道具 举报

ID:846211 发表于 2020-12-6 13:17 来自手机 | 显示全部楼层
解决了,就是要把定时函数放入主函数while循环里面,就不会停止了
回复

使用道具 举报

ID:56002 发表于 2020-12-7 16:28 | 显示全部楼层

/*****************************************************************************/
//定义DS1302时钟接口
sbit clock_clk = P1 ^ 4;//ds1302_clk(时钟线)
sbit clock_dat = P1 ^ 3;//ds1302_dat(数据线)
sbit clock_Rst = P1 ^ 2;//ds1302_Rst(复位线)
/*****************************************************************************/
//定义累加器A中的各位
sbit a0   = ACC ^ 0;
sbit a1   = ACC ^ 1;
sbit a2   = ACC ^ 2;
sbit a3   = ACC ^ 3;
sbit a4   = ACC ^ 4;
sbit a5   = ACC ^ 5;
sbit a6   = ACC ^ 6;
sbit a7   = ACC ^ 7;
//常用时钟数据读取
void read_clockS(void)
{
        ss = read_clock(0x81);//读取秒数据
        mm = read_clock(0x83);//读取分钟数据
        hh = read_clock(0x85);//小时
        dd = read_clock(0x87);//日
        mo = read_clock(0x89);//月
        xq = read_clock(0x8b);//星期
        yy = read_clock(0x8d);//年
}
/*****************************************************************************/
//设置1302的初始时间
void Init_1302(void)//(2010年1月1日00时00分00秒星期一)
{
        write_clock(0x8e,0x00);//允许写操作

        write_clock(0x8c,0x10);//年
        write_clock(0x8a,0x01);//星期
        write_clock(0x88,0x01);//月
        write_clock(0x86,0x01);//日
        write_clock(0x84,0x00);//小时
        write_clock(0x82,0x00);//分钟
        write_clock(0x80,0x00);//秒
        write_clock(0x90,0xa5);//充电       
        write_clock(0x8e,0x80);//禁止写操作
}
/*****************************************************************************/
//DS1302写数据(底层协议)
void write_clock(unsigned char ord, unsigned char dd)
{
        clock_clk=0;
        clock_Rst=0;
        clock_Rst=1;
        clock_out(ord);
        clock_out(dd);
        clock_Rst=0;
        clock_clk=1;
}
/*****************************************************************************/
//1302驱动程序(底层协议)
void clock_out(unsigned char dd)
{
        ACC=dd;
        clock_dat=a0; clock_clk=1; clock_clk=0;
        clock_dat=a1; clock_clk=1; clock_clk=0;
        clock_dat=a2; clock_clk=1; clock_clk=0;
        clock_dat=a3; clock_clk=1; clock_clk=0;
        clock_dat=a4; clock_clk=1; clock_clk=0;
        clock_dat=a5; clock_clk=1; clock_clk=0;
        clock_dat=a6; clock_clk=1; clock_clk=0;
        clock_dat=a7; clock_clk=1; clock_clk=0;
}
/*****************************************************************************/
//DS1302写入字节(底层协议)
unsigned char clock_in(void)
{
        clock_dat=1;
        a0=clock_dat;
        clock_clk=1; clock_clk=0; a1=clock_dat;
        clock_clk=1; clock_clk=0; a2=clock_dat;
        clock_clk=1; clock_clk=0; a3=clock_dat;
        clock_clk=1; clock_clk=0; a4=clock_dat;
        clock_clk=1; clock_clk=0; a5=clock_dat;
        clock_clk=1; clock_clk=0; a6=clock_dat;
        clock_clk=1; clock_clk=0; a7=clock_dat;
        return(ACC);
}
/*****************************************************************************/
//DS1302读数据(底层协议)
unsigned char read_clock(unsigned char ord)
{
        unsigned char dd=0;
        clock_clk=0;
        clock_Rst=0;
        clock_Rst=1;
        clock_out(ord);
        dd=clock_in();
        clock_Rst=0;
        clock_clk=1;
        return(dd);
}
//DS1302驱动程序
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表