蓝桥杯之临时抱佛脚(2)

接下来写一些官方驱动的改变

1.DS1302

大家实在记不住的话就用数码管搞一个假的。

/*ds1302.h相关程序*/
#ifndef __DS1302_H
#define __DS1302_H

#include "system.h"


void Write_Ds1302_Byte(unsigned  char temp);
void Write_Ds1302( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302 ( unsigned char address );
void ds1302_init();
void readtime();

#endif

/*ds1302官网驱动改编*/
#include "ds1302.h"

sbit SCK=P1^7;		
sbit SDA=P2^3;		
sbit RST = P1^3;   // DS1302复位	

u8 time_init[]={50,59,23,20,3,2,18};//增加部分
u8 time[7];	//增加部分									

void Write_Ds1302_Byte(unsigned  char temp) 
{
	unsigned char i;
	for (i=0;i<8;i++)     	
	{ 
		SCK=0;
		SDA=temp&0x01;
		temp>>=1; 
		SCK=1;
	}
}   

void Write_Ds1302( unsigned char address,unsigned char dat )     
{
 	RST=0;
	_nop_();
 	SCK=0;
	_nop_();
 	RST=1;	
   	_nop_();  
 	Write_Ds1302_Byte(address);	
 	Write_Ds1302_Byte(dat);		
 	RST=0; 
}

unsigned char Read_Ds1302 ( unsigned char address )
{
 	u8 i,temp=0x00,dat,dat1,dat2;
 	RST=0;
	_nop_();
 	SCK=0;
	_nop_();
 	RST=1;
	_nop_();
 	Write_Ds1302_Byte(address);
 	for (i=0;i<8;i++) 	
 	{		
		SCK=0;
		temp>>=1;	
 		if(SDA)
 		temp|=0x80;	
 		SCK=1;
	} 
	SDA=0;
/*这部分是增加的*/
	dat1=dat/16;
	dat2=dat%16;
	dat=dat1*10+dat2;
	return dat;
// 	RST=0;
//	_nop_();
// 	RST=0;
//	SCK=0;
//	_nop_();
//	SCK=1;
//	_nop_();
//	SDA=0;
//	_nop_();
//	SDA=1;
//	_nop_();
//	return (temp);			
}
/*这部分以下也是增加的*/
void ds1302_init()
{
	u8 i,add=0x80;
	Write_Ds1302(0x8e,0x00);
	for(i=0;i<7;i++)
	{
		Write_Ds1302(add,time_init[i]);
		add=add+2;
	}
	Write_Ds1302(0x8e,0x80);
}

void readtime()
{
	u8 i,add=0x81;
	Write_Ds1302(0x8e,0x00);
	for(i=0;i<7;i++)
	{
		time[i]=Read_Ds1302(add);
		add=add+2;
	}
	Write_Ds1302(0x8e,0x80);
}

2.IIC相关程序

/*iic.h 相关程序*/
#ifndef _IIC_H
#define _IIC_H

#include "system.h"


sbit SDA = P2^1;  /* 数据线 */
sbit SCL = P2^0;  /* 时钟线 */
//函数声明
void IIC_Start(void); 
void IIC_Stop(void);  
void IIC_Ack(bit ackbit); 
void IIC_SendByte(unsigned char byt); 
bit IIC_WaitAck(void);  
unsigned char IIC_RecByte(void); 
u8 AD_read(u8 add);//AD
u8 EEPROM_read(u8 add);//read_eeprom
void EEPROM_write(u8 add,u8 dat);//write eeprom

#endif

/*iic.c相关程序*/

#include "iic.h"
#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();}    


#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1

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


//总线启动条件
void IIC_Start(void)
{
	SDA = 1;
	SCL = 1;
	somenop;
	SDA = 0;
	somenop;
	SCL = 0;	
}

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

//应答位控制
void IIC_Ack(bit ackbit)
{
	if(ackbit) 
	{	
		SDA = 0;
	}
	else 
	{
		SDA = 1;
	}
	somenop;
	SCL = 1;
	somenop;
	SCL = 0;
	SDA = 1; 
	somenop;
}

//等待应答
bit IIC_WaitAck(void)
{
	SDA = 1;
	somenop;
	SCL = 1;
	somenop;
	if(SDA)    
	{   
		SCL = 0;
		IIC_Stop();
		return 0;
	}
	else  
	{ 
		SCL = 0;
		return 1;
	}
}

//通过I2C总线发送数据
void IIC_SendByte(unsigned char byt)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{   
		if(byt&0x80) 
		{	
			SDA = 1;
		}
		else 
		{
			SDA = 0;
		}
		somenop;
		SCL = 1;
		byt <<= 1;
		somenop;
		SCL = 0;
	}
}

//从I2C总线上接收数据
unsigned char IIC_RecByte(void)
{
	unsigned char da;
	unsigned char i;
	
	for(i=0;i<8;i++)
	{   
		SCL = 1;
		somenop;
		da <<= 1;
		if(SDA) 
		da |= 0x01;
		SCL = 0;
		somenop;
	}
	return da;
}
/*以下是增加部分*/

void EEPROM_write(u8 add,u8 dat)
{
	IIC_Start();
	IIC_SendByte(0xa0);
	IIC_WaitAck();
	IIC_SendByte(add);
	IIC_WaitAck();
	IIC_SendByte(dat);
	IIC_WaitAck();
	IIC_Stop();
}

u8 EEPROM_read(u8 add)
{
	u8 dat;
	IIC_Start();
	IIC_SendByte(0xa0);
	IIC_WaitAck();
	IIC_SendByte(add);
	IIC_WaitAck();
	IIC_Stop();
	
	IIC_Start();
	IIC_SendByte(0xa1);
	IIC_WaitAck();
	dat = IIC_RecByte();
	IIC_WaitAck();
	IIC_Stop();
	return dat;
}

u8 AD_read(u8 add)//0x03读滑动变阻器
{
	u8 dat;
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(add);
	IIC_WaitAck();
	IIC_Stop();
	
	IIC_Start();
	IIC_SendByte(0x91);
	IIC_WaitAck();
	dat = IIC_RecByte();
	IIC_WaitAck();
	IIC_Stop();
	return dat;
}

3.DS18b20

官方驱动给了两个onewire.h和ds18b20.h都是同一个只是换了一个名字
/*onewire.h相关程序*/
#ifndef __ONEWIRE_H
#define __ONEWIRE_H
#include "system.h"
sbit DQ = P1^4;  //单总线接口


void Delay_OneWire(u8 t); //STC89C52RC
//通过单总线向DS18B20写一个字节(未改)
void Write_DS18B20(u8 dat);
//从DS18B20读取一个字节(未改)
u8 Read_DS18B20(void);
//DS18B20设备初始化
void init_ds18b20(void);
u8 Date_Handing();//增加的代码

#endif
/*onewire.c相关程序*/
#include "onewire.h"


//单总线延时函数
void Delay_OneWire(u8 t)  //STC89C52RC
{
	u8 i;//**********
	while(t--)
	{
		for(i=0;i<8;i++);//*********
	}
}


//通过单总线向DS18B20写一个字节(未改)
void Write_DS18B20(u8 dat)
{
	u8 i;
	for(i=0;i<8;i++)
	{
		DQ = 0;
		DQ = dat&0x01;
		Delay_OneWire(5);
		DQ = 1;
		dat >>= 1;
	}
	Delay_OneWire(5);
}

//从DS18B20读取一个字节(未改)
u8 Read_DS18B20(void)
{
	u8 i;
	u8 dat;
  
	for(i=0;i<8;i++)
	{
		DQ = 0;
		dat >>= 1;
		DQ = 1;
		if(DQ)
		{
			dat |= 0x80;
		}	    
		Delay_OneWire(5);
	}
	return dat;
}

//DS18B20设备初始化更改版
void init_ds18b20(void)
{
//  	bit initflag = 0;(官方给的)
//  	
//  	DQ = 1;
//  	Delay_OneWire(12);
//  	DQ = 0;
//  	Delay_OneWire(80);
//  	DQ = 1;
//  	Delay_OneWire(10); 
//    initflag = DQ;     
//  	Delay_OneWire(5);
//  
//  	return initflag;
			DQ = 0;
			Delay_OneWire(40);
			DQ = 1;
			Delay_OneWire(40);
}

u8 Date_Handing()//增加的代码
{
	u8 high,low;
	u8 temp;
	
	init_ds18b20();
	
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	low=Read_DS18B20();
	high=Read_DS18B20();
	temp=high<<4;
	temp|=(low>>4);
	return temp;
}

4.URAT

/*uart.h相关程序
#ifndef __UART_H
#define __UART_H
#include"system.h"
void UartInit(void)	;
void send(u8 a);
void sendstring(u8 *str);//串口发送字符串


#endif
/*uart.c相关程序*/
#include "uart.h"

u8 Rec_Buf = 0;

void UartInit(void)		//[email protected]
{
	SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x40;		//定时器1时钟为Fosc,即1T
	AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
	TMOD &= 0x0F;		//设定定时器1为16位自动重装方式
	TL1 = 0xE0;		//设定定时初值
	TH1 = 0xFE;		//设定定时初值
	ET1 = 0;		//禁止定时器1中断
	TR1 = 1;		//启动定时器1
	ES=1;
	EA=1;
}

void send(u8 a)
{
	SBUF = a;
	while(!TI);
	TI=0;
}
void sendstring(u8 *str)//串口发送字符串
{
	while(*str)
	{
		send(*str++);
	}
}

void uart() interrupt 4
{
	if(RI)
	{
		RI=0;
		Rec_Buf = SBUF;
	}
	if(TI)
	{
		TI=0;
	}
}

注意:

1.如果data区域数据满了可以在下图里更改为PDATA,不影响程序的运行。

蓝桥杯之临时抱佛脚(2)_第1张图片

你可能感兴趣的:(蓝桥杯抱佛脚)