虽然是在MEGA128上调的但适用于所有AVR芯片,改下管脚设置就行了。
程序不是我原创,我只是把我找到的DS1302程序和星期计算程序做了下修改使他们能适应我的系统能一起工作而已,在此向写这些程序的原作者表示敬意。
struct timechar
{
uchar nowyear;
uchar nowmonth;
uchar nowday;
uchar nowhour;
uchar nowminute;
uchar nowsecond;
uchar nowweek;
};
struct timechar nowtime;///这里存时间
#define ds1302_rst 7 /*!PORTB7 DS1302实时时钟复位线引脚 */
#define ds1302_io 6 /*!PORTB6 DS1302实时时钟数据线引脚 */
#define ds1302_sclk 5 /*!PORTB5 DS1302实时时钟时钟线引脚 */
#define set_ds1302_rst_ddr() DDRB|=1<<ds1302_rst
#define set_ds1302_rst() PORTB|=1<<ds1302_rst
#define clr_ds1302_rst() PORTB&=~(1<<ds1302_rst)
#define set_ds1302_io_ddr() DDRB|=1<<ds1302_io
#define clr_ds1302_io_ddr() DDRB&=~(1<<ds1302_io)
#define set_ds1302_io() PORTB|=1<<ds1302_io
#define clr_ds1302_io() PORTB&=~(1<<ds1302_io)
#define in_ds1302_io() PINB&(1<<ds1302_io)
#define set_ds1302_sclk_ddr() DDRB|=1<<ds1302_sclk
#define set_ds1302_sclk() PORTB|=1<<ds1302_sclk
#define clr_ds1302_sclk() PORTB&=~(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
uchar BcdToBin(uchar val)
{
val = (val >> 4) *10+(val &0x0f); ///将BCD码转换为10进制数
return val; ///返回10进制数
}
uchar BinToBcd(uchar val)
{
return ((val / 10) *16+val % 10);
}
void ds1302_write(uchar reg, uchar data)
{
uchar i = 0;
set_ds1302_io_ddr();
nop();
nop();
clr_ds1302_rst();
nop();
nop();
clr_ds1302_sclk();
nop();
nop();
set_ds1302_rst();
nop();
nop();
for (i = 8; i > 0; i--)
{
if (reg &0x01)
{
set_ds1302_io();
}
else
{
clr_ds1302_io();
}
nop();
nop();
set_ds1302_sclk();
nop();
nop();
clr_ds1302_sclk();
nop();
nop();
reg >>= 1;
}
for (i = 8; i > 0; i--)
{
if (data &0x01)
{
set_ds1302_io();
}
else
{
clr_ds1302_io();
}
nop();
nop();
set_ds1302_sclk();
nop();
nop();
clr_ds1302_sclk();
nop();
nop();
data >>= 1;
}
clr_ds1302_rst();
nop();
nop();
clr_ds1302_io_ddr();
nop();
nop();
}
uchar ds1302_read(uchar reg)
{
uchar data = 0;
uchar i = 0;
reg += 1; ///读标志
set_ds1302_io_ddr();
nop();
nop();
clr_ds1302_rst();
nop();
nop();
clr_ds1302_sclk();
nop();
nop();
set_ds1302_rst();
nop();
nop();
for (i = 8; i > 0; i--)
{
if (reg &0x01)
{
set_ds1302_io();
}
else
{
clr_ds1302_io();
}
nop();
nop();
set_ds1302_sclk();
nop();
nop();
clr_ds1302_sclk();
[1] [2] 下一页
本文关键字:程序 AVR单片机,单片机-工控设备 - AVR单片机