...显示不了~还有比较郁闷的是在keil仿真时到d2b函数i拆的0j怎么也得...
发布网友
发布时间:2024-05-29 14:35
我来回答
共1个回答
热心网友
时间:2024-06-01 09:44
ds1302程序。调试通过的。time[7]里存放时间数据。你再加上数码管程序就ok了。
ds1302非常容易受干扰,注意接线尽量短,程序中在恰当的地方加NOP以稳定电路。
#define _k0 P2^0
#define _k1 P2^1
#define _k2 P2^2
#define _bella P2^4
#define _bellb P2^5
#define _ds1302clk P3^5
#define _ds1302io P3^6
#define _ds1302rst P3^7
#include<reg52.h>
#include<intrins.h>
#include<delay.h>
#define DS1302_Write_Second0x80// 秒
#define DS1302_Read_Second0x81
#define DS1302_Write_Minite0x82// 分
#define DS1302_Read_Minite0x83
#define DS1302_Write_Hour0x84//小时
#define DS1302_Read_Hour0x85
#define DS1302_Write_Date0x86// 天
#define DS1302_Read_Date0x87
#define DS1302_Write_Month0x88// 月
#define DS1302_Read_Month0x89
#define DS1302_Write_Week0x8A//星期
#define DS1302_Read_Week0x8B
#define DS1302_Write_Year0x8C// 年
#define DS1302_Read_Year0x8D
#define DS1302_Read_Protect0x8E//写保护位
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
sbit k0=_k0;
sbit k1=_k1;
sbit k2=_k2;
sbit bella= _bella;
sbit bellb= _bellb;
sbit ds1302rst= _ds1302rst;
sbit ds1302io= _ds1302io;
sbit ds1302clk= _ds1302clk;
bit k0f,k1f,k2f;
uchar time[7]={13,6,4,27,10,50,59};
//ds1302==============///////////////////////////////////
uchar bcd2hex(uchar bcd)
{
return ((bcd>>4)*10+(bcd&0x0f));
}
uchar hex2bcd(uchar hex)
{
return ((hex/10)*16+(hex%10));
}
//写一个字节
void write_ds1302_byte(uchar dat)
{uchar i;
ACC = dat;
for(i=8; i>0; i--)
{
ds1302clk = 0;
ds1302io= ACC0; ////由低位到高位
ACC = ACC >> 1;
ds1302clk= 1; //上升沿写入数据
// _nop_();
}
}
//读一个字节
uchar read_ds1302_byte(void)
{
uchar i;
for(i=8; i>0; i--)
{
ds1302clk = 0; //下降沿读出DS1302的数据
_nop_();
_nop_();
_nop_();
ACC = ACC >>1; //相当于汇编中的 RRC
ACC7 = ds1302io;
ds1302clk = 1;
}
return(ACC);
}
//在指定地址写入指定的数据
void write_ds1302(uchar addr,uchar dat)//addr为将要写入的地址,dat为精要写入的数据
{
ds1302rst = 0;
_nop_();
ds1302clk = 0;
_nop_();
ds1302rst= 1;
_nop_();
//发送地址
write_ds1302_byte(addr);
//发送数据
write_ds1302_byte(dat);
ds1302rst=0;
}
//读取1302指定地址中的数据
unsigned char Read_DS1302(uchar addr)
{
uchar dat;
ds1302rst = 0;
_nop_();
_nop_();
ds1302clk = 0;
_nop_();
_nop_();
ds1302rst= 1; //RST拉高,启动数据传送
_nop_();
_nop_();
write_ds1302_byte( addr|0x01);//地址,命令
dat = read_ds1302_byte(); //读1Byte数据
ds1302rst =0;
_nop_();//以下为DS1302复位的稳定时间
_nop_();
ds1302rst =0;
ds1302clk = 0;
_nop_();
_nop_();
_nop_();
_nop_();
ds1302clk = 1;
_nop_();
_nop_();
ds1302io=0;
_nop_();
_nop_();
ds1302io=1;//释放数据总线
_nop_();
_nop_();
return(dat);
}
//////////////////////写入时间
void settime()
{
uchar i,addr=0x8c;
write_ds1302(DS1302_Read_Protect,0x00);//取消写保护
for(i=0;i<7;i++)
{
write_ds1302(addr,hex2bcd(time[i]));
addr-=2;
}
write_ds1302(DS1302_Read_Protect,0x80);//启动写保护
}
///////////////////////////////////读取时间
void gettime()
{
uchar i;
uchar addr=0x8d;
for(i=0;i<7;i++)
{
time[i]=bcd2hex(Read_DS1302(addr));
addr-=2;
}
}
void ds1302init(void)
{
uchar temp;
temp = Read_DS1302(DS1302_Read_Second);
if(k0==0&&temp&0x80)//如果时钟正在运行,则不进行初始化//按着设置键重启时。
{
settime();
}
//开写保护
}