您的位置 首页 基础

AVR128的程序——DS1302时钟芯片

includeiom128vh>includemacrosh>defineucharunsignedchardefineuintunsignedintdefineds1302_rstPE4

#include

#include
#define uchar unsigned char
#define uint unsigned int
#define ds1302_rst PE4 //界说1302的RST接在PE4
#define ds1302_io PE3 //界说1302的IO接在PE3
#define ds1302_sclk PE2 //界说1302的时钟接在PE2
#define set_ds1302_rst_ddr() DDRE|=1< //复位端置为输出
#define set_ds1302_rst() PORTE|=1< //复位端置1
#define clr_ds1302_rst() PORTE&=~(1< //复位端清0
#define set_ds1302_io_ddr() DDRE|=1< //数据端置为输出
#define set_ds1302_io() PORTE|=1< //数据端置1
#define clr_ds1302_io() PORTE&=~(1< //数据端清0
#define clr_ds1302_io_ddr() DDRE&=~(1< //数据端置为输入
#define in_ds1302_io() PINE&(1< //数据端输入数据
#define set_ds1302_sclk_ddr() DDRE|=1< //时钟端置为输出
#define set_ds1302_sclk() PORTE|=1< //时钟端置1
#define clr_ds1302_sclk() PORTE &=~(1<//时钟端清0
#define ds1302_sec_add 0x80 //秒数据地址
#define ds1302_min_add 0x82 //分数据地址
#define ds1302_hr_add 0x84 //时数据地址
#define ds1302_date_add 0x86 //日数据地址
#define ds1302_month_add 0x88 //月数据地址
#define ds1302_day_add 0x8a //星期数据地址
#define ds1302_year_add 0x8c //年数据地址
#define ds1302_control_add 0x8e //操控数据地址
#define ds1302_charger_add 0x90
#define ds1302_clkburst_add 0xbe
uchar TempData[8];
uchar timer[7]={12,2,8,20,31,50,3};
uchar WeiMa[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar led_discode[11]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90,0xff};
void smg_io_init(void)
{
DDRA=0XFF;
PORTA=0XFF;
DDRE=0xff;
PORTE=0X1C;
DDRC=0XFF;
PORTC=0XFF;
DDRF|=0X0E;
PORTF|=0X0E;
PORTF&=0xF7;
DDRB |=0X10;
PORTB|=0X10;
}
void display(uchar FirstBit,uchar Num)
{
unsigned char i;
for(i=0;i
{
PORTC=led_discode[10];
PORTA=WeiMa[i+FirstBit];
PORTC=TempData[i];
Delayms(2);
}
}
void Delayms(uint MS)
{
uint i,j;
for( i=0;i
for(j=0;j<1141;j++);
}
void shi_BCD(void)
{
uchar i,k;
for(i=0;i<7;i++)
{
k=timer[i]/10;
timer[i]=timer[i];
timer[i]=timer[i]+k*16;
}
}
void ds1302_init(void)
{
set_ds1302_rst_ddr();
set_ds1302_sclk_ddr();
clr_ds1302_rst();
clr_ds1302_sclk();
}
void ds1302_write(uchar add,uchar data)
{
uchar i=0;
set_ds1302_io_ddr(); //装备IO为输出
clr_ds1302_rst(); //清复位,中止一切操作
clr_ds1302_sclk(); //清时钟,预备操作
set_ds1302_rst(); //置复位,开端操作
add = add & 0xFE;
for(i=0;i<8;i++) //此循环写入操控码
{
if(add&0x01)
set_ds1302_io(); //当时位为1,置数据位
else
clr_ds1302_io(); //当时位为0,清数据位
set_ds1302_sclk(); //发生时钟脉冲,写入数据
clr_ds1302_sclk();
add>>=1; //移位,预备写入下1位
}
for(i=0;i<8;i++) //此循环写入数据码
{
if(data&0x01)
set_ds1302_io();
else
clr_ds1302_io();
set_ds1302_sclk();
clr_ds1302_sclk();
data>>=1;
}
clr_ds1302_rst();
clr_ds1302_io_ddr();
}
uchar ds1302_read(uchar add)
{
uchar data=0;
uchar i=0;
add+=1;
set_ds1302_io_ddr(); //端口输出
clr_ds1302_rst(); //清复位
clr_ds1302_sclk(); //清时钟
set_ds1302_rst(); //置复位
for(i=0;i<8;i++) //此循环写入地址码
{
if(add&0x01)
{set_ds1302_io();}
else
{clr_ds1302_io();}
set_ds1302_sclk();
clr_ds1302_sclk();
add>>=1;
}
clr_ds1302_io_ddr(); //端口输入
for(i=0;i<8;i++) //此循环读出1302的数据
{
data>>=1;
if(in_ds1302_io())
{data|=0x80;}
set_ds1302_sclk();
clr_ds1302_sclk();
}
clr_ds1302_rst();
return(data);
}
void ds1302_write_time(void)
{
ds1302_write(ds1302_control_add,0x00); //封闭写保护
ds1302_write(ds1302_sec_add,0x80); //暂停
ds1302_write(ds1302_charger_add,0xa9); //涓流充电
ds1302_write(ds1302_year_add,timer[0]); //年
ds1302_write(ds1302_month_add,timer[1]); //月
ds1302_write(ds1302_date_add,timer[2]); //日
ds1302_write(ds1302_day_add,timer[6]); //周
ds1302_write(ds1302_hr_add,timer[3]); //时
ds1302_write(ds1302_min_add,timer[4]); //分
ds1302_write(ds1302_sec_add,timer[5]); //秒
ds1302_write(ds1302_control_add,0x80); //翻开写保护
}
void ds1302_read_time(void)
{
timer[0]=ds1302_read(ds1302_year_add); //年
timer[1]=ds1302_read(ds1302_month_add); //月
timer[2]=ds1302_read(ds1302_date_add); //日
timer[6]=ds1302_read(ds1302_day_add); //周
timer[3]=ds1302_read(ds1302_hr_add); //时
timer[4]=ds1302_read(ds1302_min_add); //分
timer[5]=ds1302_read(ds1302_sec_add); //秒
}
void time_Process(void)
{
TempData[0] = led_discode[timer[3]/16];
TempData[1] = led_discode[timer[3]];
TempData[2] = 0XBF;
TempData[3] = led_discode[timer[4]/16];
TempData[4] = led_discode[timer[4]];
TempData[5] = 0XBF;
TempData[6] = led_discode[timer[5]/16];
TempData[7] = led_discode[timer[5]];
}
void main(void)
{
uchar i;
smg_io_init();
shi_BCD();
ds1302_init();
ds1302_write_time();
while(1)
{
ds1302_read_time();
time_Process();
display(0,8);
}
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/jichu/262333.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部