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

#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;
}相关推荐
《模式识别与数据挖掘》配套PPT课件
《模式识别与数据挖掘》配套PPT课件
科技成果转化项目进场交易前,评估备案环节需要准备哪些材料?_8.docx
科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。
人工智能通识教育(中职版)课程标准+PPT课件+部分素材+电子活页+在线考核
人工智能通识教育(中职版)课程标准+PPT课件+部分素材+电子活页+在线考核
跨境电商供应链管理(AIGC版)课件+教案+参考答案
跨境电商供应链管理(AIGC版)课件+教案+参考答案
110KV单电源电网三段式电流保护+距离继电保护整定计算说明报告(23页+6000字)
内容概要:本文是一份关于110kV单电源电网继电保护整定计算的综合性技术报告,全文共23页、约6000字,系统阐述了三段式电流保护与距离保护的设计原理及其整定计算方法。报告深入分析了电力系统在短路故障条件下的电流与阻抗特性,详细推导了电流保护Ⅰ、Ⅱ、Ⅲ段的动作范围、整定原则、灵敏度校验及时间配合机制,确保满足继电保护的选择性、速动性、灵敏性和可靠性“四性”要求。同时,针对长距离或重要输电线路,补充介绍了距离保护的阻抗整定计算方法,并可能结合Matlab进行仿真验证与辅助计算,提升整定结果的准确性与工程实用性。; 适合人群:适用于电气工程及其自动化相关专业的高年级本科生、研究生,以及从事电力系统继电保护设计、运行维护的工程技术人员;要求读者具备电力系统分析、短路计算及继电保护的基础理论知识。; 使用场景及目标:①掌握110kV单电源辐射型电网中三段式电流保护的整定流程与实际计算步骤;②理解距离保护的工作原理及其在复杂工况下的应用优势;③完成实际工程项目的保护配置与整定计算任务,或作为课程设计、毕业设计及科研课题的技术参考资料;④结合Matlab工具实现整定计算的程序化处理与动作特性仿真验证。; 阅读建议:建议读者结合《电力系统继电保护原理》等相关教材同步学习,重点研读整定公式的推导过程与典型算例的计算细节,注意区分电流保护与距离保护的适用场景与配置逻辑,有条件时应利用Matlab等工具对保护动作行为进行建模与仿真,以深化对保护协调配合机制的理解。


单片机/工控
