下面是DS1302的AVR单片机的C程序,这个程序结构很不错。但是站长没有调试这个AVR单片机的程序。
#define ds1302_rst PC0
#define ds1302_io PC1
#define ds1302_sclk PC2
#define set_ds1302_rst_ddr() DDRC|=1<<ds1302_rst
#define set_ds1302_rst() PORTC|=1<<ds1302_rst
#define clr_ds1302_rst() PORTC&=~(1<<ds1302_rst)
#define set_ds1302_io_ddr() DDRC|=1<<ds1302_io
#define set_ds1302_io() PORTC|=1<<ds1302_io
#define clr_ds1302_io() PORTC&=~(1<<ds1302_io)
#define clr_ds1302_io_ddr() DDRC&=~(1<<ds1302_io)
#define in_ds1302_io() PINC&(1<<ds1302_io)
#define set_ds1302_sclk_ddr() DDRC|=1<<ds1302_sclk
#define set_ds1302_sclk() PORTC|=1<<ds1302_sclk
#define clr_ds1302_sclk() PORTC&=~(1<<ds1302_sclk)
#define ds1302_sec_reg 0x80
#define ds1302_min_reg 0x82
#define ds1302_hr_reg 0x84
#define ds1302_date_reg 0x86
#define ds1302_month_reg 0x88
#define ds1302_day_reg 0x8a
#define ds1302_year_reg 0x8c
#define ds1302_control_reg 0x8e
#define ds1302_charger_reg 0x90
#define ds1302_clkburst_reg 0xbe
void ds1302_write(uchar reg,uchar data)
{
uchar i=0;
set_ds1302_io_ddr();
asm("nop");
asm("nop");
clr_ds1302_rst();
asm("nop");
asm("nop");
clr_ds1302_sclk();
asm("nop");
asm("nop");
set_ds1302_rst();
asm("nop");
asm("nop");
for(i=8;i>0;i--)
{
if(reg&0x01) set_ds1302_io();
else clr_ds1302_io();
asm("nop");
asm("nop");
set_ds1302_sclk();
asm("nop");
asm("nop");
clr_ds1302_sclk();
asm("nop");
asm("nop");
reg>>=1;
}
for(i=8;i>0;i--)
{
if(data&0x01) set_ds1302_io();
else clr_ds1302_io();
asm("nop");
asm("nop");
set_ds1302_sclk();
asm("nop");
asm("nop");
clr_ds1302_sclk();
asm("nop");
asm("nop");
data>>=1;
}
clr_ds1302_rst();
asm("nop");
asm("nop");
clr_ds1302_io_ddr();
asm("nop");
asm("nop");
}
uchar ds1302_read(uchar reg)
{
uchar data=0;
uchar i=0;
reg+=1;//读标志
set_ds1302_io_ddr();
asm("nop");
asm("nop");
clr_ds1302_rst();
asm("nop");
asm("nop");
clr_ds1302_sclk();
asm("nop");
asm("nop");
set_ds1302_rst();
asm("nop");
asm("nop");
for(i=8;i>0;i--)
{
if(reg&0x01) set_ds1302_io();
else clr_ds1302_io();
asm("nop");
asm("nop");
set_ds1302_sclk();
asm("nop");
asm("nop");
clr_ds1302_sclk();
asm("nop");
asm("nop");
reg>>=1;
}
clr_ds1302_io_ddr();
asm("nop");
asm("nop");
for(i=8;i>0;i--)
{
data>>=1;
if(in_ds1302_io()) data|=0x80;
asm("nop");
asm("nop");
set_ds1302_sclk();
asm("nop");
asm("nop");
clr_ds1302_sclk();
asm("nop");
asm("nop");
}
clr_ds1302_rst();
asm("nop");
asm("nop");
return(data);
}
uchar check_ds1302(void)
{
ds1302_write(ds1302_control_reg,0x80);
if(ds1302_read(ds1302_control_reg)==0x80) return 1;
return 0;
}
void ds1302_read_time(void)
{
year=ds1302_read(ds1302_year_reg); //年
month=ds1302_read(ds1302_month_reg);//月
day=ds1302_read(ds1302_date_reg); //日
week=ds1302_read(ds1302_day_reg); //周
hour=ds1302_read(ds1302_hr_reg); //时
minute=ds1302_read(ds1302_min_reg); //分
second=ds1302_read(ds1302_sec_reg); //秒
}
void ds1302_write_time(void)
{
ds1302_write(ds1302_control_reg,0x00); //关闭写保护
ds1302_write(ds1302_sec_reg,0x80); //暂停
ds1302_write(ds1302_charger_reg,0xa9); //涓流充电
ds1302_write(ds1302_year_reg,year); //年
ds1302_write(ds1302_month_reg,month); //月
ds1302_write(ds1302_date_reg,day); //日
ds1302_write(ds1302_day_reg,week); //周
ds1302_write(ds1302_hr_reg,hour); //时
ds1302_write(ds1302_min_reg,minute); //分
ds1302_write(ds1302_sec_reg,second); //秒
ds1302_write(ds1302_control_reg,0x80); //打开写保护
}
┊ 网站导航 ┊ 管理登陆 ┊ 免责声明 ┊ 问题反馈 ┊ 友链说明┊本站部分内容来自网络共享资源,如有冒犯您的权利请来信告之删除或纠正! 不得对本站进行复制、盗链或镜像,转载内容须获得同意或授权;欢迎友情链接、站务合作! Alexa mcusy_cn#126.com (请把#改成@) 交流:522422171 本站学习交流群:138..158(高级群1-满)、77930286(高级群2)、61804809(群3) Copyright© MCUSY All Rights Reserved 本站网警备案号: WZ36040002485 ICP备案证书号:粤ICP备09034963号 |