准备制作一个旋转时钟,构思了一下,旋转时钟主要包括以下几个部分:
指针板、基板、电机、耦合线圈,用于电力的无线传输、无线串口,用于调试、显示和控制。
2013-10-10
至今天已经完成:
1.AVR单片机对时钟芯片DS1302的读写等操作
2.串口传输部分代码编写完成
准备完成:
1.红外遥控器编码的解码
2.程序匠人的程序原理深入了解,编写LED显示程序
3.购买旋转时钟配件,完成电源的无线传输电路设计与测试,LED板设计。
存在问题:
设置INT0中断为上升沿触发,每触发一次中断,将触发间隔的时间内累加计数传出来。但是用手触碰接收头时,串口会有数据传出。
项目进展:
1.DS1302时钟芯片的读写。
C语言文件:
#include "common.h"
/*-----------------------------------------------------------------
函数名称: void ds1302_init(void)
函数功能: ds1302总线初始化
参 数: 无
返 回 值: 无
-----------------------------------------------------------------*/
void ds1302_init(void)
{
RST_CLR;
SCK_CLR;
RST_OUT;
SCK_OUT;
}
/*-----------------------------------------------------------------
函数名称: void ds1302_write_byte(unsigned int addr,unsigned int data)
函数功能: 向DS1302目标地址中写入一字节数据
参 数: 目标地址 一字节数据
返 回 值: 无
-----------------------------------------------------------------*/
void ds1302_write_byte(unsigned int addr,unsigned int data)
{
unsigned int i;
RST_CLR;
SCK_CLR;
RST_SET;//启动DS1302总线
//传输目标地址
IO_OUT;
addr&=0xfe;
for(i=0;i<8;i++)
{
if(addr&0x01)
{IO_SET;My_Putchar(0x31);}
else
{IO_CLR;My_Putchar(0x30);}
SCK_CLR;
SCK_SET;
addr=addr>>1;
}
//向目标地址中写入数据
IO_OUT;
My_Putstr("data:");
for(i=0;i<8;i++)
{
if(data&0x01)
{IO_SET;My_Putchar(0x31);}
else
{IO_CLR;My_Putchar(0x30);}
SCK_CLR;
SCK_SET;
data=data>>1;
}
RST_CLR;//禁止DS1302总线
}
/*-----------------------------------------------------------------
函数名称: int ds1302_read_byte(unsigned int addr)
函数功能: 从DS1302目标地址中读取一字节数据
参 数: 目标地址
返 回 值: 一字节数据
-----------------------------------------------------------------*/
unsigned int ds1302_read_byte(unsigned int addr)
{
unsigned int i,temp;
temp=0x00;
RST_CLR;
SCK_CLR;
RST_SET;//启动DS1302总线
//写入目标地址
IO_OUT;
addr=addr|0x01;
for(i=0;i<8;i++)
{
SCK_CLR;
if(addr&0x01)
IO_SET;
else
IO_CLR;
SCK_SET;
addr=addr>>1;
}
//读取目标地址数据
IO_IN;
for(i=0;i<8;i++)
{
if(IO_R)
temp=temp|0x80;
else
temp=temp&0x7f;
SCK_SET;SCK_CLR;
temp=temp>>1;
}
RST_CLR;//禁止DS1302总线
return temp;
}
/*-----------------------------------------------------------------
函数名称: void ds1302_write_time(unsigned int *time_data)
函数功能: 将日期信息写入DS1302中
参 数: 数组中的时间信息
返 回 值: 无
-----------------------------------------------------------------*/
void ds1302_write_time(unsigned int *time_data)
{
ds1302_write_byte(ds1302_control_addr,0x00);//解除写禁止;最高位WP清零
ds1302_write_byte(ds1302_sec_addr,0x10);//暂停时钟;CH位置位
time_data++;
ds1302_write_byte(ds1302_year_addr,*time_data++); //只写入后面两位 08
ds1302_write_byte(ds1302_month_addr,*time_data++); //月
ds1302_write_byte(ds1302_date_addr,*time_data++); //日
ds1302_write_byte(ds1302_hr_addr,*time_data++); //时
ds1302_write_byte(ds1302_min_addr,*time_data++); //分
ds1302_write_byte(ds1302_sec_addr,*time_data++); //秒
ds1302_write_byte(ds1302_day_addr,*time_data); //周
ds1302_write_byte(ds1302_control_addr,0x80); //打开写保护
}
/*-----------------------------------------------------------------
函数名称: void ds1302_read_time(unsigned char *time_data)
函数功能: 从DS1302中读取日期时间信息
参 数: 日期时间信息存放数组的地址
返 回 值: 无
-----------------------------------------------------------------*/
void ds1302_read_time(unsigned int *time_data)
{
time_data++;
*time_data=ds1302_read_byte(ds1302_year_addr); //只读出后面两位08
time_data++;
*time_data=ds1302_read_byte(ds1302_month_addr); //月
time_data++;
*time_data=ds1302_read_byte(ds1302_date_addr); //日
time_data++;
*time_data=ds1302_read_byte(ds1302_hr_addr); //时
time_data++;
*time_d