74HC573与ds1302基本使用实例代码

板子这样化

在这里插入图片描述
效果
在这里插入图片描述

源代码

ds1302.c

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar sec,min,hour,date,month,week,year;
sbit rst = P3^0;
sbit sda = P3^2;
sbit scl = P3^1;
/*对DS1302初始化*/
void ds1302_init(void)
{
	rst = 0;
	scl = 0;
	rst = 1;
}
/*对DS1302写1字节函数*/
void write_ds1302_onebyte(uchar dat)	   
{
	uchar i;
	for(i = 0;i < 8;i++)
	{
		sda = (bit)(dat & 0x01);
		scl = 0;
		scl = 1;
		dat = dat >> 1;
	}
}
/*从DS1302读一字节函数*/
uchar read_ds1302_onebyte(void)	
{
	uchar i,dat;
	for(i = 0;i < 8;i++)
	{
		scl = 1;
		scl = 0;
		dat = dat >> 1;
		if(sda)dat = dat | 0x80;
	}
	return(dat);	
}
/*对DS1302的某一地址写一字节函数*/
void write_ds1302_add_dat(uchar add,uchar dat)
{
	ds1302_init();
	write_ds1302_onebyte(add);
	write_ds1302_onebyte(dat);
	scl = 1;
		rst = 0;
}
/*从DS1302的某一地址读一字节函数*/
uchar read_ds1302_add(uchar add)				//读1302数据
{
	uchar dat_temp;
	ds1302_init();
	write_ds1302_onebyte(add);
	dat_temp = read_ds1302_onebyte();
	scl = 1;
	rst = 0;
	return(dat_temp);
}
/*8421BCD码到十进制转换*/
uchar BCD_DEC_conv(uchar x)
{
	uchar dec;
	dec =  0x0f & x;
	x = x >> 4;
	dec	= dec + x * 10;
	return(dec);
}
/*十进制到8421BCD码转换*/
uchar DEC_BCD_conv(uchar x)
{
	uchar bcd;
	bcd =  x % 10;
	x = x / 10;
	x = x << 4;
	bcd	= bcd | x ;
	return(bcd);
}
 /*获得时间信息函数*/
void get_ds1302_time(void)    //获取1302的时间数据(时、分、秒),存入time1数组中
{
	uchar d;
	d = read_ds1302_add(0x81);				//读秒
	sec = BCD_DEC_conv(d);				//得到秒	
	d = read_ds1302_add(0x83);				//读分
	min = BCD_DEC_conv(d);  			//得到分
	d = read_ds1302_add(0x85);				//读小时
	hour = BCD_DEC_conv(d);  			//得到小时
	d = read_ds1302_add(0x87);				//读日
	date = BCD_DEC_conv(d);  			//得到日
   	d = read_ds1302_add(0x89);				//读月
	month = BCD_DEC_conv(d);  			//得到月
	d = read_ds1302_add(0x8b);				//读星期
	week = BCD_DEC_conv(d);  			//得到星期
	d = read_ds1302_add(0x8d);				//读年
	year = BCD_DEC_conv(d);  			//得到年		
}
/*结束*/

main.c

#include<reg51.h>
#include "ds1302.c"
uchar cp1,cp2,cp3;
uchar seven_seg[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar flash;
bit conv;
sbit P1_0  =  P2^0;
void time0_isr(void) interrupt 1	 //利用中断对数码管上显示的数据进行刷新
{
	TH0 = (65536-2000)/256;	
	TL0 = (65536-2000)%256;
	cp1++;
	if(cp1 >= 250)//0.5秒
	{
		cp1 = 0;
		flash = ~flash; //产生小数点闪烁变量
		cp2++;
		if(cp2 >= 5)
		{
			conv = !conv;//产生交替显示变量
			cp2 = 0;
		}
		
	}
	P0 = 0xff;//消隐
	if(conv == 1)
	{
	switch(cp3)
		{
			case 0: 	P0 = 0x01;P1_0 = 0; P1_0 = 1; P1_0 = 0;
				P0 = seven_seg[sec % 10];break;
			case 1: 	P0 = 0x02;P1_0 = 0; P1_0 = 1; P1_0 = 0;
				P0 = seven_seg[sec / 10];break;
			case 2: 	P0 = 0x04;P1_0 = 0; P1_0 = 1; P1_0 = 0;
				P0 = 0xfd | flash; break;//显示闪烁的“—”
			case 3: 	P0 = 0x08;P1_0 = 0; P1_0 = 1; P1_0 = 0;
				P0 = seven_seg[min % 10];break;
			case 4: 	P0 = 0x10;P1_0 = 0; P1_0 = 1; P1_0 = 0;
				P0 = seven_seg[min / 10];break;
			case 5: 	P0 = 0x20;P1_0 = 0; P1_0 = 1; P1_0 = 0;
				P0 = 0xfd | flash; break;//显示闪烁的“—”
			case 6: 	P0 = 0x40;P1_0 = 0; P1_0 = 1; P1_0 = 0;
				P0 = seven_seg[hour % 10];break;
			case 7: 	P0 = 0x80;P1_0 = 0; P1_0 = 1; P1_0 = 0;
				P0 = seven_seg[hour / 10];break;
		}
	}
	else
	{	
		switch(cp3)
		{
			case 0: 	P0 = 0x01;P1_0 = 0; P1_0 = 1; P1_0 = 0;
				P0 = seven_seg[date % 10];break;
			case 1: 	P0 = 0x02;P1_0 = 0; P1_0 = 1; P1_0 = 0;
				P0 = seven_seg[date / 10];break;
			case 2: 	P0 = 0x04;P1_0 = 0; P1_0 = 1; P1_0 = 0;
				P0 = 0xfd | flash; break;//显示闪烁的“—”
			case 3: 	P0 = 0x08;P1_0 = 0; P1_0 = 1; P1_0 = 0;
				P0 = seven_seg[month % 10];break;
			case 4: 	P0 = 0x10;P1_0 = 0; P1_0 = 1; P1_0 = 0;
				P0 = seven_seg[month / 10];break;
			case 5: 	P0 = 0x20;P1_0 = 0; P1_0 = 1; P1_0 = 0;
				P0 = 0xfd | flash; break;//显示闪烁的“—”
			case 6: 	P0 = 0x40;P1_0 = 0; P1_0 = 1; P1_0 = 0;
				P0 = seven_seg[year % 10];break;
	                                    case 7: 	P0 = 0x80;P1_0 = 0; P1_0 = 1; P1_0 = 0;
				P0 = seven_seg[hour / 10];break;
		}	}
		cp3++;
	if(cp3 >= 8)cp3 = 0;			
}
void timer0_init(void)			//Timer0初始化
{
	TMOD = 0x01;
	TH0 = (65536 -2000) / 256;	
	TL0 = (65536-2000) % 256;
	TR0 = 1;
	ET0 = 1;
	EA  = 1;
}
void main(void)
{
	uchar i = 46;//举例,比如要调整时间,分钟设定为46分
	i = DEC_BCD_conv(i);
	timer0_init();
	write_ds1302_add_dat(0x8e,0x00);	//写操作,可以对DS1302调整
	write_ds1302_add_dat(0x80,0x30);	//写秒,30秒
	write_ds1302_add_dat(0x82,i);		//写分,46分
	write_ds1302_add_dat(0x84,0x12);	//写时,12时
	write_ds1302_add_dat(0x86,0x28);	//写日,28日
	write_ds1302_add_dat(0x88,0x05);	//写月,5月 
	write_ds1302_add_dat(0x8a,0x03);	//写星期,星期三
	write_ds1302_add_dat(0x8c,0x12);	//写年,(20)12年
	write_ds1302_add_dat(0x8e,0x80);	//写保护
	while(1)
	{
		get_ds1302_time();
	}
}


专业课小作业ds1302了解,代码复制就可使用
单片机怎么也与前端合不来啊,那位大佬也可分享单片机与前端领域的应用结合吗?感谢感谢~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,根据提供的引用内容,没有找到74HC594芯片的相关信息。但是,根据提供的引用内容,可以为您介绍一下74HC165和74HC595芯片的移位驱动方式。 74HC165芯片是一款高速CMOS八位并入串出移位寄存器,可以通过移位寄存器的输入引脚来输入数据,然后通过串行输出引脚将数据输出。移位寄存器的输入时钟SHCP上升沿来临之时,数据被移出。因此,可以通过控制SHCP引脚的电平来实现移位驱动。 74HC595芯片也是一个移位寄存器,其内部包括一个8位移位寄存器、一个存储器以及三态输出门电路。通过移位寄存器的输入引脚来输入数据,然后通过并行输出引脚将数据输出。移位寄存器的输入时钟SHCP上升沿来临之时,数据被移出。因此,可以通过控制SHCP引脚的电平来实现移位驱动。 下面是两个移位驱动的例子: 1. 74HC165移位驱动 ```python import RPi.GPIO as GPIO import time # 定义74HC165芯片的引脚 DS = 17 SHCP = 27 STCP = 22 # 初始化GPIO GPIO.setmode(GPIO.BCM) GPIO.setup(DS, GPIO.IN) GPIO.setup(SHCP, GPIO.OUT) GPIO.setup(STCP, GPIO.OUT) # 移位寄存器输入时钟SHCP上升沿来临之时,数据被移出 def shift_in(): GPIO.output(SHCP, GPIO.LOW) GPIO.output(STCP, GPIO.LOW) for i in range(8): GPIO.output(SHCP, GPIO.LOW) if GPIO.input(DS): GPIO.output(STCP, GPIO.LOW) else: GPIO.output(STCP, GPIO.HIGH) GPIO.output(SHCP, GPIO.HIGH) # 读取移位寄存器中的数据 def read_shift_reg(): GPIO.output(STCP, GPIO.HIGH) GPIO.output(STCP, GPIO.LOW) shift_in() # 读取移位寄存器中的数据并输出 def print_shift_reg(): read_shift_reg() for i in range(8): print(GPIO.input(DS), end=' ') print() # 循环读取移位寄存器中的数据并输出 while True: print_shift_reg() time.sleep(0.1) ``` 2. 74HC595移位驱动 ```python import RPi.GPIO as GPIO import time # 定义74HC595芯片的引脚 DS = 17 SHCP = 27 STCP = 22 # 初始化GPIO GPIO.setmode(GPIO.BCM) GPIO.setup(DS, GPIO.OUT) GPIO.setup(SHCP, GPIO.OUT) GPIO.setup(STCP, GPIO.OUT) # 移位寄存器输入时钟SHCP上升沿来临之时,数据被移出 def shift_out(value): for i in range(8): GPIO.output(SHCP, GPIO.LOW) if value & 0x80: GPIO.output(DS, GPIO.HIGH) else: GPIO.output(DS, GPIO.LOW) GPIO.output(SHCP, GPIO.HIGH) value <<= 1 # 将数据存储到存储器中 def store(): GPIO.output(STCP, GPIO.LOW) GPIO.output(STCP, GPIO.HIGH) # 输出数据 def output(value): shift_out(value) store() # 循环输出数据 while True: for i in range(256): output(i) time.sleep(0.1) ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值