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

    xiaoxiao2022-07-07  177

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

    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,不影响程序的运行。

    最新回复(0)