蓝桥单片机电子类DS1302的使用

        具体原理参考博客:这位老哥写得非常详细:一看就会!DS1302实时时钟原理和程序_seaeress的博客-优快云博客_ds1302时钟芯片工作原理

        本次我用这个DS1302在数码管上显示时钟的时 分 秒,配合按键串口打印年周月日时分秒已经温度(按键6打印时间,按键4配合按键5打印温度,更多详细见代码)。

注意DS1302读和写的数据都是BCD码,一个字节高四位表示10位,低四位的数值即为剩余的数值。

比如 0x15 BCD码为  0001  0101  =1*10+5;

转换函数如下:

u8 DatToBcd(u8 dat)//数据转BCD码
{
	u8 dat1,dat2;
	dat1 = dat / 10;
	dat2 = dat % 10;
	dat2 = dat2 + dat1 * 16;
	return dat2;
}

u8 BcdToDat(u8 dat)//BCD码转数据
{
	u8 dat1,dat2;
	dat1 = (dat >>4)*10;
	dat2 = (dat&0x0f) % 16;
	dat2 = dat2 + dat1;
	return dat2;
}

读取时间函数:

void Read_Time(){
				MyDst[0]=BcdToDat(Read_Ds1302_Byte(0x8d));//年
				MyDst[1]=BcdToDat(Read_Ds1302_Byte(0x8b));//周
				MyDst[2]=BcdToDat(Read_Ds1302_Byte(0x89));//月
				MyDst[3]=BcdToDat(Read_Ds1302_Byte(0x87));//日
				MyDst[4]=BcdToDat(Read_Ds1302_Byte(0x85));//时
				MyDst[5]=BcdToDat(Read_Ds1302_Byte(0x83));//分
				MyDst[6]=BcdToDat(Read_Ds1302_Byte(0x81));//秒
	
}

main.c如下



#include "sys.h"

u8 s=0;
u8 smgtime=0;
u8 keytime=0;
 u8 temp=0;
 u16 time=0;
 xdata u8 Tempbuf[20]={0};
 void 	UIPlay(){ 
			DT[0]=MyDst[4]/10;
			DT[1]=MyDst[4]%10;
			DT[2]=10;
			DT[3]=MyDst[5]/10;
			DT[4]=MyDst[5]%10;
			DT[5]=10;
			DT[6]=MyDst[6]/10;
			DT[7]=MyDst[6]%10;
 }
void main()
{
	
	sys_init();
	Timer0Init();
	
	
	while(1){
		
		if(keytime==20){
			keytime=0;
			key_scan();
			switch(rkey){
				case 4:
					 temp=(u8)Read_temp();
					break;
				case 5:
					 Tempbuf[0]=temp/10+0x30;
						Tempbuf[1]=temp%10+0x30;
						Tempbuf[2]='\r';
						Tempbuf[3]='\n';
						Tempbuf[4]='\0';
						SendString(Tempbuf);
						break;
					case 6:
						  Tempbuf[0]=MyDst[0]/10+0x30;//年
							Tempbuf[1]=MyDst[0]%10+0x30;//
							Tempbuf[2]='y';
							Tempbuf[3]=MyDst[1]/10+0x30;
							Tempbuf[4]=MyDst[1]%10+0x30;
							Tempbuf[5]='z';
							Tempbuf[6]=MyDst[2]/10+48;
							Tempbuf[7]=MyDst[2]%10+48;
							Tempbuf[8]='m';
							Tempbuf[9]=MyDst[3]/10+48;
							Tempbuf[10]=MyDst[3]%10+48;
							Tempbuf[11]='d';
							Tempbuf[12]=MyDst[4]/10+48;
							Tempbuf[13]=MyDst[4]%10+48;
							Tempbuf[14]='h';
							Tempbuf[15]=MyDst[5]/10+48;
							Tempbuf[16]=MyDst[5]%10+48;
							Tempbuf[17]='m';
							Tempbuf[18]=MyDst[6]/10+48;
							Tempbuf[19]=MyDst[6]%10+48;
							Tempbuf[20]='s';
							Tempbuf[21]='\r';
							Tempbuf[22]='\n';
							Tempbuf[23]='\0';
						SendString(Tempbuf);
						break;
					case 7:
					 //to do
							break;
					default :
							break;
			}
			rkey=0;
		}
	  if(smgtime==50){
			smgtime=0;
			UIPlay();
		}
 if(time==1000){
	 time=0;
	 Read_Time();
 }
 
	}
}
void TIME0() interrupt 1{
	smg_play(DT[s],s);
	if(++s>7)s=0;
	smgtime++;
	keytime++;
	
 time++;
}

串口打印 

 附上Demo链接

链接:https://pan.baidu.com/s/1A3Y9G-Ckk0eFJX9lXSKOlQ 
提取码:yzh1

### 蓝桥嵌入式系统中DS18B20温度传感器的使用方法 #### 初始化配置 为了使能DS18B20,在初始化阶段需设置好单片机IO口与之匹配,确保两者能够通过1-Wire协议正常通信。由于1-Wire总线特性,当不被主动控制时,默认保持高电平状态[^2]。 #### 数据交互流程 在进行实际的数据交换之前,必须向DS18B20发出启动温度转换指令。这之后,设备依据设定好的分辨率(9至12位之间),耗费一定的时间完成一次完整的测量过程;其中,更高的位宽意味着更精细的结果但也伴随着相对较慢的速度[^3]。 #### 获取并解析温度值 一旦温度采集结束,就可以按照规定的顺序读取寄存器内的数值了——先是低位字节随后才是高位字节。值得注意的是,这些二进制串是以补码的形式保存着摄氏度的信息,因此解码过程中需要注意正负号以及小数点位置处理[^4]。 ```c // 示例C语言代码片段用于演示如何操作DS18B20获取当前环境温度 void read_temperature(void){ uint8_t temp_l, temp_h; // 发送复位脉冲并等待响应 one_wire_reset(); // 向器件发送跳过ROM命令 write_byte(SKIP_ROM); // 请求开始新的温度变换周期 write_byte(CONVERT_T); delay_ms(750); // 延迟足够长时间让转换完毕 // 再次发起一轮对话准备接收数据 one_wire_reset(); write_byte(SKIP_ROM); // 设置接下来要执行的操作为读取刮板中的内容 write_byte(READ_SCRATCHPAD); // 接收两个连续传输过来的字节数组代表完整温度编码 temp_l = read_byte(); temp_h = read_byte(); int16_t raw_temp = (temp_h << 8) | temp_l; float temperature_celsius = ((float)(raw_temp)) / 16.0f; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值