stm32f103电子钟心得体会_基于stm32f103c8t6、ds1302的电子时钟电路+程序设计

#include "stm32f10x.h" //STM32头文件

#include "sys.h"

#include "delay.h"

#include "usart.h"

#include "flash.h"

#define FLASH_START_ADDR  0x0801f000          //写入的起始地址

//READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};//读取时间的命令地址,已经通过读写操作来直接实现这些地址

//WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};//写时间的命令地址

my_time TIME = {0};  //显示时间的结构体

u8  smgduan[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};

u8 nz[2]={8,20};

u8 b=0,c=0x00,d=0x00;

u8 k1=0,k4=0,w=4,num=0;

u8 key1,key4;

u16 j,i,a;

//---DS1302时钟初始化2016年5月7日星期六12点00分00秒。------DS1302时钟初始化2016年5月7日星期六12点00分00秒。---//

u8 init_time[] = {0,0X18,0x20,0x25,0x11,0x07,0x18}; //初始化时间:秒 分 时 日 月 周 年

u8 write[]= {0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};//写秒void display_real_time(void);

u8 setime[7];

u8 timedata[8];

u8 weixian[8]={0x10,0x20,0x40,0x80,0x01,0x02,0x04,0x08};

static void ds1302_gpio_init(void);

static void ds1302_writebyte(u8 byte_1);//写一个字节; byte是保留字,不能作为变量

static void ds1302_writedata(u8 addr,u8 data_);//给某地址写数据,data是c51内部的关键字,表示将变量定义在数据存储区,故此处用data_;

static u8 ds1302_readbyte(void);//读一个字节

static u8 ds1302_readdata(u8 addr);//读取某寄存器数据;

static void DS1302_delay_us(u16 time);  //简单延时1us

void changetime(void);//改变显示内容

char switchkey1(void);//判断KEY1按下的时间

char switchkey4(void);//判断KEY4按下的时间

void shiftout(u8 num);//595函数

void putOut(char a,char b,char c);//595函数2

void setimeput1(char w);//日期显示

void setimeput(char w);//SETMODE 显示

void setimes(void);//设置时间函数

void clok(void); //闹钟

void nzs(u8 a);//闹钟开关

void fs(char w);

int main()

{

ds1302_gpio_init();

//USART1_Init(115200);

//DS1302_Init();

while(1)

{

//while(!GPIO_ReadInputDataBit(DS1302_PORT,KEY1));

//while(!GPIO_ReadInputDataBit(DS1302_PORT,KEY4));

key1=0;

key4=0;

d=0xff;

c=0xff;

a=FLASH_R(FLASH_START_ADDR);//从指定页的地址读FLASH

b=a&1;

key1=switchkey1();

key4=switchkey4();

display_real_time();

setimeput1(4);

if(key1>=99)

setimes();

if(key1>10&&key1<50)

changetime();

if(key4<90&&key4>=30)

clok();

if(GPIO_ReadInputDataBit(DS1302_PORT,KEY2)==0)

{delay_ms(20);

if( GPIO_ReadInputDataBit(DS1302_PORT,KEY2)==0)

b=!b;

while(!GPIO_ReadInputDataBit(DS1302_PORT,KEY2));

a=nz[0]*1000+nz[1]*10+b;

delay_ms(10);

FLASH_W(FLASH_START_ADDR,a);

}

nzs(b&1);

GPIO_WriteBit(GPIOA,LIGHT,(BitAction)(b));

}

}

void feng()

{

GPIO_WriteBit(DS1302_PORT,DEEP,(BitAction)(0));

delay_ms(100);

GPIO_WriteBit(DS1302_PORT,DEEP,(BitAction)(1));

delay_ms(20);

}

void nzs(u8 b)

{

if(b==1)

{

nz[0]=a/1000;

nz[1]=(a-(nz[0]*1000))/10;

if(setime[4]==nz[0]&&setime[5]==nz[1])

{

while(setime[4]=

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值