单片机----第三届蓝桥杯国赛

第三届蓝桥杯国赛

题目

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

我的解答

DS1302

DS1302.h
#ifndef __DS1302_H__
#define __DS1302_H__
extern unsigned char DS1302_Time[3];
void DS1302_Init();
void SetTime();
void ReadTime();
#endif
DS1302.c
#include <STC15F2K60S2.H>

#define DS1302_Sec 0x80
#define DS1302_Min 0x82
#define DS1302_Hou 0x84
#define DS1302_WP  0x8E

sbit DS1302_SCLK=P1^7;
sbit DS1302_IO=P2^3;
sbit DS1302_CE=P1^3;
unsigned char DS1302_Time[3]={
   
   11,50,59};
void DS1302_Init()
{
   
   
	DS1302_CE=0;
	DS1302_SCLK=0;
}
void DS1302_Write(unsigned char Command,Data)
{
   
   
	unsigned char k;
	DS1302_CE=1;
	for(k=0;k<8;k++)
	{
   
   
		DS1302_IO=Command&(0x01<<k);
		DS1302_SCLK=0;
		DS1302_SCLK=1;
	}
	for(k=0;k<8;k++)
	{
   
   
		DS1302_IO=Data&(0x01<<k);
		DS1302_SCLK=0;
		DS1302_SCLK=1;
	}
	DS1302_CE=0;
}
unsigned char DS1302_Read(unsigned char Command)
{
   
   
	unsigned char k,Data=0x00;
	Command|=0x01;
	DS1302_CE=1;
	for(k=0;k<8;k++)
	{
   
   
		DS1302_IO=Command&(0x01<<k);
		DS1302_SCLK=0;
		DS1302_SCLK=1;
	}
	for(k=0;k<8;k++)
	{
   
   
		DS1302_SCLK=1;
		DS1302_SCLK=0;
		if(DS1302_IO){
   
   Data|=(0x01<<k);};
	}
	DS1302_IO=0;
	DS1302_CE=0;
	
	return Data;
}
void SetTime()
{
   
   
	unsigned char Temp;
	DS1302_Write(DS1302_WP,0x00);
	
	Temp=DS1302_Time[0];
	DS1302_Write(DS1302_Hou,Temp/10*16+Temp%10);
	
	Temp=DS1302_Time[1];
	DS1302_Write(DS1302_Min,Temp/10*16+Temp%10);
	
	Temp=DS1302_Time[2];
	DS1302_Write(DS1302_Sec,Temp/10*16+Temp%10);
	
	DS1302_Write(DS1302_WP,0x80);
}
void ReadTime()
{
   
   
	unsigned char Temp;
	Temp=DS1302_Read(DS1302_Hou);
	DS1302_Time[0]=Temp/16*10+Temp%16;
	Temp=DS1302_Read(DS1302_Min);
	DS1302_Time[1]=Temp/16*10+Temp%16;
	Temp=DS1302_Read(DS1302_Sec);
	DS1302_Time[2]=Temp/16*10+Temp%16;
}
iic.h
#ifndef __IIC_H__
#define __IIC_H__

void IIC_Start(void); 
void IIC_Stop(void);  
bit IIC_WaitAck(void);  
void IIC_SendAck(bit ackbit); 
void IIC_SendByte(unsigned char byt); 
unsigned char IIC_RecByte(void); 
void AT24C02_Write(unsigned char Address,Data);
unsigned char AT24C02_Read(unsigned char Address);
void Delay1ms(unsigned int x);
#endif

iic

iic.c
/*
  程序说明: IIC总线驱动程序
  软件环境: Keil uVision 4.10 
  硬件环境: CT107单片机综合实训平台 8051,12MHz
  日    期: 2011-8-9
*/

#include "reg52.h"
#include "intrins.h"

#define DELAY_TIME 5

#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1

//总线引脚定义
sbit SDA = P2^1;  /* 数据线 */
sbit SCL = P2^0;  /* 时钟线 */

void IIC_Delay(unsigned char i)
{
   
   
    do{
   
   _nop_();}
    while(i--);        
}
//总线启动条件
void IIC_Start(void)
{
   
   
    SDA = 1;
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SDA = 0;
    IIC_Delay(DELAY_TIME);
    SCL = 0;	
}

//总线停止条件
void IIC_Stop(void)
{
   
   
    SDA = 0;
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SDA = 1;
    IIC_Delay(DELAY_TIME);
}

//发送应答
void IIC_SendAck(bit ackbit)
{
   
   
    SCL = 0;
    SDA = ackbit;  					// 0:应答,1:非应答
    IIC_Delay(DELAY_TIME);
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SCL = 0; 
    SDA = 1;
    IIC_Delay(DELAY_TIME);
}

//等待应答
bit IIC_WaitAck(void)
{
   
   
    bit ackbit;
	
    SCL  = 1;
    IIC_Delay(DELAY_TIME);
    ackbit = SDA;
    SCL = 0;
    IIC_Delay(DELAY_TIME
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值