接下来写一些官方驱动的改变
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;
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) //9600bps@11.0592MHz
{
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,不影响程序的运行。