蓝桥杯单片机第十二届

Posted 一心向月

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蓝桥杯单片机第十二届相关的知识,希望对你有一定的参考价值。

临近第十三届比赛,趁着最后一月时间,重新刷一下真题,巩固一下知识。




这些程序参考一下思路就行,最好自己写,所以我就直接上图片,不支持复制。
HEX文件:链接:https://pan.baidu.com/s/18BK6mv5UNse8wZRZe6m3fQ?pwd=azxy
提取码:azxy
主程序






底层驱动文件
iic.c

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

#define DELAY_TIME 27

#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);


bit IIC_WaitAck(void)

    bit ackbit;
	
    SCL  = 1;
    IIC_Delay(DELAY_TIME);
    ackbit = SDA;
    SCL = 0;
    IIC_Delay(DELAY_TIME);
    return ackbit;


//ͨ¹ýI2C×ÜÏß·¢ËÍÊý¾Ý
void IIC_SendByte(unsigned char byt)

    unsigned char i;

    for(i=0; i<8; i++)
    
        SCL  = 0;
        IIC_Delay(DELAY_TIME);
        if(byt & 0x80) SDA  = 1;
        else SDA  = 0;
        IIC_Delay(DELAY_TIME);
        SCL = 1;
        byt <<= 1;
        IIC_Delay(DELAY_TIME);
    
    SCL  = 0;  



void Scan_Dac(unsigned char dat)

	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	
	IIC_SendByte(0x40);
	IIC_WaitAck();
	
	IIC_SendByte(dat);
	IIC_WaitAck();
	IIC_Stop();


iic.h

#ifndef _IIC_H
#define _IIC_H
void Scan_Dac(unsigned char dat);

#endif

onewire.c

#include "onewire.h"
#include "reg52.h"

sbit DQ = P1^4;  //µ¥×ÜÏß½Ó¿Ú

//µ¥×ÜÏßÑÓʱº¯Êý
void Delay_OneWire(unsigned int t)  //STC89C52RC

	t*=12;
	while(t--);


//ͨ¹ýµ¥×ÜÏßÏò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;



long Ds18b20_read()

	unsigned char low, how;
	long temp;
	
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	Delay_OneWire(100);
	
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);

	low=Read_DS18B20();
	how=Read_DS18B20();
	temp=how<<8;
	temp=temp|low;
	temp=temp*6.23;
	
	return temp;


onewire.h

#ifndef __ONEWIRE_H
#define __ONEWIRE_H

long Ds18b20_read();


#endif

以上是关于蓝桥杯单片机第十二届的主要内容,如果未能解决你的问题,请参考以下文章

第十二届蓝桥杯单片机省赛程序设计总结

第十二届蓝桥杯

蓝桥杯单片机第十二届

蓝桥杯单片机第十二届

《蓝桥杯真题》:2021单片机省赛第一场(第十二届第一场)

《蓝桥杯真题》:2.第十二届省赛