赞
踩
在第十四届蓝桥杯中,比赛更换了底层驱动代码,不再提供 onewire iic ds1302的头文件,需要自行编写,同时在.c文件中也进行了一些改动(如引脚的缺失)。需要提前注意。
老版代码:
- /*
- 程序说明: 单总线驱动程序
- 软件环境: Keil uVision 4.10
- 硬件环境: CT107单片机综合实训平台(外部晶振12MHz) STC89C52RC单片机
- 日 期: 2011-8-9
- */
- #include "reg52.h"
-
- sbit DQ = P1^4; //单总线接口(新代码已经删除,需对照原理图补充)
-
- //单总线延时函数
- void Delay_OneWire(unsigned int t) //STC89C52RC
- {
- while(t--);//在老板代码中,为满足要求需要t*=12;
- }
-
- //通过单总线向DS18B20写一个字节
- void Write_DS18B20(unsigned char dat)
- {
- unsigned char i;
- for(i=0;i<8;i++)
- {
- DQ = 0;
- DQ = dat&0x01;
- Delay_OneWire(5);
- DQ = 1;
- dat >>= 1;
- }
- Delay_OneWire(5);
- }
-
- //从DS18B20读取一个字节
- unsigned char Read_DS18B20(void)
- {
- unsigned char i;
- unsigned char dat;
-
- for(i=0;i<8;i++)
- {
- DQ = 0;
- dat >>= 1;
- DQ = 1;
- if(DQ)
- {
- dat |= 0x80;
- }
- Delay_OneWire(5);
- }
- return dat;
- }
-
- //DS18B20设备初始化
- bit 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的定义)可以先编译一下看缺少什么东西以便进行补充(注意大小写)
-
- /* # 单总线代码片段说明
- 1. 本文件夹中提供的驱动代码供参赛选手完成程序设计参考。
- 2. 参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题
- 中对单片机时钟频率的要求,进行代码调试和修改。
- */
-
- //
- #include <REGX52.H>//自行添加头文件
- sbit DQ=P1^4;//对照原理图DS18B20接口补充
- void Delay_OneWire(unsigned int t)
- {
- unsigned char i;
- while(t--){
- for(i=0;i<12;i++);
- }
- }
-
- //
- void Write_DS18B20(unsigned char dat)
- {
- unsigned char i;
- for(i=0;i<8;i++)
- {
- DQ = 0;
- DQ = dat&0x01;
- Delay_OneWire(5);
- DQ = 1;
- dat >>= 1;
- }
- Delay_OneWire(5);
- }
-
- //
- unsigned char Read_DS18B20(void)
- {
- unsigned char i;
- unsigned char dat;
-
- for(i=0;i<8;i++)
- {
- DQ = 0;
- dat >>= 1;
- DQ = 1;
- if(DQ)
- {
- dat |= 0x80;
- }
- Delay_OneWire(5);
- }
- return dat;
- }
-
- //
- bit 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;
- }
onewire.h
- #ifndef __ONEWIRE_H_
- #define __ONEWIRE_H_
-
- void Delay_OneWire(unsigned int t);
- void Write_DS18B20(unsigned char dat);
- unsigned char Read_DS18B20(void);
- bit init_ds18b20(void);
-
- #endif
为节省篇幅以下代码只给出新代码及其改动.
- /* # DS1302代码片段说明
- 1. 本文件夹中提供的驱动代码供参赛选手完成程序设计参考。
- 2. 参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题
- 中对单片机时钟频率的要求,进行代码调试和修改。
- */
- #include <REGX52.H>//自行添加
- #include <intrins.h>//由于使用nop,所以需要额外添加该头文件
- sbit SCK=P1^7;//对照原理图补充
- sbit SDA=P2^3;
- sbit RST=P1^3;
- //
- void Write_Ds1302(unsigned char temp)
- {
- unsigned char i;
- for (i=0;i<8;i++)
- {
- SCK = 0;
- SDA = temp&0x01;
- temp>>=1;
- SCK=1;
- }
- }
-
- //
- void Write_Ds1302_Byte( unsigned char address,unsigned char dat )
- {
- RST=0; _nop_();
- SCK=0; _nop_();
- RST=1; _nop_();
- Write_Ds1302(address);
- Write_Ds1302(dat);
- RST=0;
- }
-
- //
- unsigned char Read_Ds1302_Byte ( unsigned char address )
- {
- unsigned char i,temp=0x00;
- RST=0; _nop_();
- SCK=0; _nop_();
- RST=1; _nop_();
- Write_Ds1302(address);
- for (i=0;i<8;i++)
- {
- SCK=0;
- temp>>=1;
- if(SDA)
- temp|=0x80;
- SCK=1;
- }
- RST=0; _nop_();
- SCK=0; _nop_();
- SCK=1; _nop_();
- SDA=0; _nop_();
- SDA=1; _nop_();
- return (temp);
- }
ds1302.h
- #ifndef __DS1302_H
- #define __DS1302_H
-
- void Write_Ds1302(unsigned char temp);
- void Write_Ds1302_Byte( unsigned char address,unsigned char dat );
- unsigned char Read_Ds1302_Byte( unsigned char address );
- #endif
iic.c
iic的代码我觉得是在名称方面改动最大的代码,所以在新老代码更替的时候需要特别注意,但如果编写新的主函数照旧即可
- /* # I2C代码片段说明
- 1. 本文件夹中提供的驱动代码供参赛选手完成程序设计参考。
- 2. 参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题
- 中对单片机时钟频率的要求,进行代码调试和修改。
- */
- #include <REGX52.H>
- #include "intrins.h"//代码中有nop代码
- #define DELAY_TIME 5
-
- sbit scl=P2^0;//对照原理图补充引脚
- sbit sda=P2^1;
- //老代码中还有读写地址的宏定义,但可以对照手册直接写出,加不加实际无所谓
- //
- static void I2C_Delay(unsigned char n)
- {
- do
- {
- _nop_();_nop_();_nop_();_nop_();_nop_();
- _nop_();_nop_();_nop_();_nop_();_nop_();
- _nop_();_nop_();_nop_();_nop_();_nop_();
- }
- while(n--);
- }
-
- //
- void I2CStart(void)
- {
- sda = 1;
- scl = 1;
- I2C_Delay(DELAY_TIME);
- sda = 0;
- I2C_Delay(DELAY_TIME);
- scl = 0;
- }
-
- //
- void I2CStop(void)
- {
- sda = 0;
- scl = 1;
- I2C_Delay(DELAY_TIME);
- sda = 1;
- I2C_Delay(DELAY_TIME);
- }
-
- //
- void I2CSendByte(unsigned char byt)
- {
- unsigned char i;
-
- for(i=0; i<8; i++){
- scl = 0;
- I2C_Delay(DELAY_TIME);
- if(byt & 0x80){
- sda = 1;
- }
- else{
- sda = 0;
- }
- I2C_Delay(DELAY_TIME);
- scl = 1;
- byt <<= 1;
- I2C_Delay(DELAY_TIME);
- }
-
- scl = 0;
- }
-
- //
- unsigned char I2CReceiveByte(void)
- {
- unsigned char da;
- unsigned char i;
- for(i=0;i<8;i++){
- scl = 1;
- I2C_Delay(DELAY_TIME);
- da <<= 1;
- if(sda)
- da |= 0x01;
- scl = 0;
- I2C_Delay(DELAY_TIME);
- }
- return da;
- }
-
- //
- unsigned char I2CWaitAck(void)
- {
- unsigned char ackbit;
-
- scl = 1;
- I2C_Delay(DELAY_TIME);
- ackbit = sda;
- scl = 0;
- I2C_Delay(DELAY_TIME);
-
- return ackbit;
- }
-
- //
- void I2CSendAck(unsigned char ackbit)
- {
- scl = 0;
- sda = ackbit;
- I2C_Delay(DELAY_TIME);
- scl = 1;
- I2C_Delay(DELAY_TIME);
- scl = 0;
- sda = 1;
- I2C_Delay(DELAY_TIME);
- }
-
iic.h
- #ifndef _IIC_H
- #define _IIC_H
-
- void I2CStart(void);
- void I2CStop(void);
- unsigned char I2CWaitAck(void);
- void I2CSendAck(unsigned char ackbit);
- void I2CSendByte(unsigned char byt);
- unsigned char I2CReceiveByte(void);
-
- #endif
在比赛中更换了驱动代码,但最具体实现还是由官方给出,只需对照原理图和已给出的代码进行补充和头文件的编写即可。
第十四届蓝桥杯大赛个人赛省赛(电子类)选手资源数据包
链接: https://pan.baidu.com/s/1cDqH-5il_ca5lCBzMpnCEg 提取码:lq14
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。