用DS12C887在LCD1602上显示时间为什么会出现乱码,求大神指导下?

地球不再转 2016-05-11 06:07:06


#include<reg52.h>
#include "boardinit.h"
#include "1602led.h"
#include "keyscan.h"
#include "delay.h"
#include "74hc595.h"
#include "ds12c887.h"
#define uchar unsigned char
#define uint unsigned int

sbit data_595si =P1^0; //595数据输入口
sbit clk_595srck =P1^4; //595数据写进移位寄存器时钟输入口
sbit e_595rck =P2^3; //595移位寄存器,数据送输出的时钟
sbit rs_1602=P2^5; //1602rs信号 数据1/指令0选择
sbit rw_1602=P2^6; //1602rw信号
sbit e=P2^4;
sbit data_595si =P1^0; //595数据输入口
sbit clk_595srck =P1^4; //595数据写进移位寄存器时钟输入口
sbit e_595rck =P2^3; //595移位寄存器,数据送输出的时钟
sbit duanxuan=P2^5; // 数码管,的段选使能,1 通 0关
sbit weixuan=P2^6; // 数码管,的位选使能,1 通 0关
sbit dsds_ds12c887=P1^0;
sbit dsrw_ds12c887=P1^1;
sbit dsas_ds12c887=P1^2;
//sbit dscs_ds12c887=P1^4; //该板卡的dscs 信号是通过74hc595提供 该使能信号需在下面子函数处理
sbit dsirq_ds12c887=P3^2; //中断

uchar num,time,moshi,moshi1,flag,kaiqi,c;
char shi,fen,miao,shiji,nian,yue,ri,xingqi,ashi,afen,amiao,kaiz;

char code table[]=" 20 - - "; // 20 - -
uchar code table1[]=" : : "; // : :

void write_ds(uchar add,uchar date);
void set_alarm(uchar nshi,uchar nfen,uchar nmiao);
uchar read_ds(uchar add);



void didi()
{
write_byte_74hc595(0x02); //蜂鸣器关
delay(500);
write_byte_74hc595(0x06); //蜂鸣器响
delay(500);
}

void main()
{
boardinit(); //XK-2板卡初始化
lcdinit_1602(); //1602液晶初始化
init_ds12c887();//ds12c887 初始化

EA=1;
IT0=1;
EX0=1;

c=read_ds_ds12c887(0x0c);
write_ds_ds12c887(0x0b,0x26);//如果开启设置 控制器B,数据为BCD码,时间为24小时制,产生闹钟中断
num=0;time=0;moshi=0;moshi1=0;flag=0;kaiqi=0;
write_order_1602(0x80);

//**************************************************************************
/* 该部分是调试程序时候使用,当出现时间日期乱码时候,可以尝试重新写入给定数据
判断是否是内部保存数据长时间未用导致出现乱码。
write_ds_ds12c887(4,9); //小时寄存器 写 9点
write_ds_ds12c887(2,27); //分钟寄存器 写 27分
write_ds_ds12c887(0,25); //秒钟寄存器 写 25秒
write_ds_ds12c887(6,7); //星期寄存器写 7 星期天
write_ds_ds12c887(9,11); //年寄存器 写 11年
write_ds_ds12c887(8,8); //月份寄存器 写 8月
write_ds_ds12c887(7,7); //日期寄存器 写 7号
// */
//***************************************************************************
//在1602上写时间的框架
Disp_1602(1,1," 20 - - ",16);
Disp_1602(1,2," 00 - - ",16);
while(1)
{

keyscan();
if(flag==1)
{
didi();
}

if(kaiqi==0)
{
//****************************************************************************************
//读出DS12C887芯片里的 时间,日期 数据


miao = read_ds_ds12c887(0); //读 秒
fen = read_ds_ds12c887(2); //读 分
shi = read_ds_ds12c887(4); //读 时
ri = read_ds_ds12c887(0x07); //读 日
yue = read_ds_ds12c887(0x08); //读 月
nian = read_ds_ds12c887(0x09); //读 年
xingqi= read_ds_ds12c887(0x06); //读 星期
shiji = read_ds_ds12c887(0x10); //读 实际 保存实际数据,内部不自加,只是当做存储器用
kaiz = read_ds_ds12c887(0x0e); //读 闹钟 标志位
ashi = read_ds_ds12c887(0x05); //读 闹钟 时
afen = read_ds_ds12c887(0x03); //读 闹钟 分
amiao = read_ds_ds12c887(0x01); //读 闹钟 秒

//****************************************************************************************
//把读出的时间,日期数据, 写到1602液晶显示
write_twoline_1602(5,shi); //写 时
write_twoline_1602(8,fen); //写 分
write_twoline_1602(11,miao); //写 秒
write_oneline_1602(10,ri); //写 日
write_oneline_1602(7,yue); //写 月
write_oneline_1602(4,nian); //写 年
write_oneline_1602(14,xingqi);//写 星期
write_oneline_1602(2,shiji); //写 世纪
write_twoline_1602(2,kaiz); //写 闹钟开启位
//*****************************************************************************************

}
}

}

void exter() interrupt 0
{

flag=1; //开外部中断 0

}
void write_byte_74hc595(uchar dat) //74hc164芯片写一字节数据函数
{
uchar i;
e_595rck=0; //给595RCK低电平
for(i=0;i<8;i++)
{
clk_595srck=0; //给595SRCK低电平
data_595si=(dat<<i)&0x80; //把我们要使用的数据进行左移处理,保证最终输出的数据与 我们 uchar dat 对应
clk_595srck=1; //给595SRCK高电平
}
e_595rck=1; //给595SRCK高电平,既把 DAT数据数据送到输出
data_595si=1; //因该数据口和别的电路共用,因此当74hc595使用完后,置“1”解除冲突
}
void write_order_1602(uchar order_data)//写指令地址
{
e=0;
rs_1602=0;
P0=order_data;
_nop_();
e=1;
delay(1);
e=0;
_nop_();
}

void write_data_1602(uchar data_1602)//
{
e=0;
rs_1602=1;
P0=data_1602;
_nop_();
e=1;
delay(1);
e=0;
_nop_();
}
void Disp_1602(unsigned char x_1602,unsigned char y_1602,unsigned char *p_1602,unsigned char count_1602)
{
unsigned char i;
for(i=0;i<count_1602;i++)
{
if (1 == y_1602) x_1602 |= 0x80;
else x_1602 |= 0xC0;
write_order_1602(x_1602-1);
write_data_1602(*p_1602);
x_1602++;
p_1602++;
}
}


void write_oneline_1602(uchar add_1602,uint date_1602)
{
uchar ge,shi;
shi=date_1602/10;
ge=date_1602%10;
write_order_1602(0x80+add_1602-1);
write_data_1602(0x30+shi);
write_order_1602(0x80+add_1602);
write_data_1602(0x30+ge);
}

void write_twoline_1602(uchar add_1602,uint date_1602)
{
uchar shi,ge;
shi=date_1602/10;
ge=date_1602%10;
// write_order_1602(0x80+0x40+add_1602-1);
write_order_1602(0xc0+add_1602);
write_data_1602(0x30+shi);
//write_order_1602(0x80+0x40+add_1602);
write_data_1602(0x30+ge);
}

void lcdinit_1602()
{
rw_1602=0;
e=0;
//write_byte_74hc595(0X02);
delay(15);
write_order_1602(0x38);
write_order_1602(0x0c);
write_order_1602(0x06);
write_order_1602(0x01);
delay(5);
}
void boardinit()
{
duanxuan=1;
weixuan=1;
P0=0x00;
duanxuan=0;
weixuan=0;
/write_byte_74hc595(0x40);
P1=0xff;
write_byte_74hc595(0x00);
}

void init_ds12c887() //初始化函数
{
write_ds_ds12c887(0x0a,0x20);
write_ds_ds12c887(0x0b,0x26);

amiao=read_ds_ds12c887(1);
afen=read_ds_ds12c887(3);
ashi=read_ds_ds12c887(5);

}

void set_alarm_ds12c887(uchar ashi,uchar afen,uchar amiao)
{
write_ds_ds12c887(1,amiao);
write_ds_ds12c887(3,afen);
write_ds_ds12c887(5,ashi); //在DS12C887闹钟寄存器中写入 闹钟时间 函数
}

void write_ds_ds12c887(uchar add_ds12c887,uchar data_ds12c887)
{
delay(1);
write_byte_74hc595(0X02);// ds12c887de 使能端 cs=0 1602背光打开
delay(1);
dsas_ds12c887=1;
dsds_ds12c887=1;
dsrw_ds12c887=1;
delay(1);
P0=add_ds12c887;
delay(1);
dsas_ds12c887=0;
dsrw_ds12c887=0;
P0=data_ds12c887;
dsrw_ds12c887=1;
dsas_ds12c887=1;
delay(1);
write_byte_74hc595(0X12);// ds12c887de 使能端 cs=1 1602背光打开
delay(1);
}

//ds12c887 写数据子函数
//------------------------------------------------------------------------------
uchar read_ds_ds12c887(uchar add_ds12c887)
{

uchar ds_date;
dsas_ds12c887=1;
dsds_ds12c887=1;
dsrw_ds12c887=1;
delay(1);
write_byte_74hc595(0X02);// ds12c887de 使能端 cs=0 1602背光打开
delay(1);
P0=add_ds12c887;
delay(1);
dsas_ds12c887=0;
dsds_ds12c887=0;
P0=0XFF;
ds_date=P0;
dsds_ds12c887=1;
dsas_ds12c887=1;
write_byte_74hc595(0X12); // ds12c887de 使能端 cs=1 1602背光打开
return ds_date;
}
...全文
1225 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
farmanlinuxer 2017-06-11
  • 打赏
  • 举报
回复
在测试仿真软件吗?
arm杀手 2017-05-31
  • 打赏
  • 举报
回复
玩啥仿真呀,板子都对了,还仿真干啥
jiqiang01234 2016-06-16
  • 打赏
  • 举报
回复
开发板都已经成功了,还怕什么?
zhujinqiang 2016-06-09
  • 打赏
  • 举报
回复
换仿真软件的高版本去试试
毕健 2016-05-14
  • 打赏
  • 举报
回复
很少用那个仿真软件。
侦探蜡笔小新 2016-05-12
  • 打赏
  • 举报
回复
我看只有时间是乱码,把uchar改成char看看呢?
地球不再转 2016-05-11
  • 打赏
  • 举报
回复
代码已经在开发板上测试过了,可以正常显示时间的,但是在仿真电路中就出现了乱码的问题,不知道要怎么解决,求支招!
dceacho 2016-05-11
  • 打赏
  • 举报
回复
时间表示方法有两种:一种用二进制数表示,一种用BCD码表示 你确定你弄对了编码方式?
内容概要:本文围绕不确定环境下的多式联运路径优化问题展开研究,提出并实现了基于AFO算法、遗传算法(GA)和粒子群优化算法(PSO)的三种智能优化方法,并借助Matlab平台完成算法编程与仿真。研究构建了考虑时间、成本、转运风险等多重不确定因素的路径优化模型,系统比较了AFO、GA、PSO三种算法在收敛速度、全局寻优能力和稳定性方面的表现,同时引入Matlab自带的全局优化搜索器作为基准对照,深入分析各算法在复杂物流网络中的适用边界与性能差异。研究表明,AFO算法在解决此类组合优化问题时展现出更快的收敛效率和更强的局部规避能力。; 适合人群:具备一定Matlab编程基础与运筹优化知识,从事物流工程、交通运输规划、智能算法开发等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于多式联运、综合货运网络中的路径决策支持系统构建;②为不确定性条件下复杂路径规划问题提供智能算法选型依据与技术实现方案;③支持科研人员复现主流优化算法并开展横向性能对比实验,推动算法改进与实际落地。; 阅读建议:建议读者结合提供的Matlab代码逐模块分析算法实现流程,重点理解目标函数设计、约束条件处理及参数敏感性分析部分,可通过调整问题规模与算法参数进行对比实验,进一步拓展至动态路径规划或大规模网络优化等延伸场景。
内容概要:本文研究了基于QLearning自适应强化学习的PID控制器在自主水下航行器(AUV)运动控制中的应用,通过Matlab代码实现了控制算法的仿真验证。该方法融合强化学习的在线自适应能力与传统PID控制的稳定性优势,利用QLearning算法动态优化PID控制器的比例、积分、微分参数,以应对水下复杂流体环境、模型不确定性及外部干扰等挑战,从而提升AUV轨迹跟踪的精度、鲁棒性与动态响应性能。文中系统阐述了AUV的六自由度非线性动力学建模过程、QLearning算法的状态空间与动作空间设计、奖励函数构造及训练机制,并详细说明了PID参数自整定的闭环控制架构。仿真结果表明,相较于传统固定参数PID控制器,该智能控制策略在多种工况下均展现出更优的控制效果,有效抑制了超调,加快了响应速度,并增强了抗干扰能力。; 适合人群:具备自动控制理论、强化学习基础及Matlab/Simulink仿真能力,从事水下机器人、智能控制、海洋工程、自动化等领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于AUV、UUV等无人水下平台的高精度自主导航与运动控制;②为解决非线性、强耦合、时变系统的控制器参数自适应整定问题提供智能化解决方案;③作为强化学习与经典控制理论深度融合的技术范例,推动智能控制算法在海洋装备中的工程化应用。; 阅读建议:建议读者结合提供的Matlab代码深入理解算法实现细节,重点剖析QLearning的状态-动作-奖励机制设计、PID参数更新逻辑及仿真对比实验结果,有条件者可在更复杂的动力学模型或实际硬件平台上进一步验证与优化算法性能。

27,522

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧