百度网盘
链接:https://pan.baidu.com/s/1tdegixZ8Trn-TVWZLQ5TbA
提取码:2022
可以直接从百度网盘下载或者将下列代码复制粘贴,其中有蓝桥杯提供的底层代码,有修改的已经标注在开头。
题目
iic.h蓝桥杯底层代码,没有改变
#ifndef _IIC_H #define _IIC_H void IIC_Start(void); void IIC_Stop(void); bit IIC_WaitAck(void); void IIC_SendAck(bit ackbit); void IIC_SendByte(unsigned char byt); unsigned char IIC_RecByte(void); #endif
iic.c蓝桥杯底层代码,没有改变
#include "reg52.h"
#include "intrins.h"
#define DELAY_TIME 5
#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);
}
//发送应答
void IIC_SendAck(bit ackbit)
{
SCL = 0;
SDA = ackbit; // 0:应答,1:非应答
IIC_Delay(DELAY_TIME);
SCL = 1;
IIC_Delay(DELAY_TIME);
SCL = 0;
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;
}
//从I2C总线上接收数据
unsigned char IIC_RecByte(void)
{
unsigned char i, da;
for(i=0; i<8; i++)
{
SCL = 1;
IIC_Delay(DELAY_TIME);
da <<= 1;
if(SDA) da |= 1;
SCL = 0;
IIC_Delay(DELAY_TIME);
}
return da;
}
onewire.c//蓝桥杯底层代码由于频率不同改变延迟时间,变为原来12倍
#include "reg52.h"
sbit DQ = P1^4; //单总线接口
//单总线延时函数
void Delay_oneWire(unsigned int t) //STC89C52RC
{
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*12);
DQ = 1;
dat >>= 1;
}
Delay_oneWire(5*12);
}
//从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*12);
}
return dat;
}
//DS18B20设备初始化
bit init_ds18b20(void)
{
bit initflag = 0;
DQ = 1;
Delay_oneWire(12*12);
DQ = 0;
Delay_oneWire(80*12);
DQ = 1;
Delay_oneWire(10*12);
initflag = DQ;
Delay_oneWire(5*12);
return initflag;
}
onewire.h//蓝桥杯底层代码加上函数声明,同时去掉 unsigned char rd_temperature(void);
#ifndef __ONEWIRE_H #define __ONEWIRE_H //unsigned char rd_temperature(void); //删除该声明,后面写一个新函数 void Delay_oneWire(unsigned int t); void Write_DS18B20(unsigned char dat); unsigned char Read_DS18B20(void); bit init_ds18b20(void); #endif
12.c//程序运行代码
#include#include "iic.h" #include "onewire.h" #define uchar unsigned char #define uint unsigned int sfr P4=0xC0; sbit P3_2=P3^2; sbit P3_3=P3^3; sbit P4_2=P4^2; sbit P4_4=P4^4; sbit L1=P0^0; sbit L2=P0^1; sbit L3=P0^2; sbit L4=P0^3; uint temp=0;//温度 uchar P_data=25;//温度参数 uint A_data=0;//Vdac数值 uchar DAC_modo=1;//DAC模式 uchar key4_flag1=0; uchar key5_flag1=0; uchar key8_flag1=0; uchar key9_flag1=0; uchar code smg_duan[]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc6,0x8c,0x88}; void select_138(uchar x);//138选择 void close_all();//关闭外设 void delay(uint x);//延迟函数 void rd_temperature(void);//读温度 void smg_bit(uchar pos,uchar num);//数码管显示一位 void smg_bit1(uchar pos,uchar num);//数码管显示一位(带小数点) void all_smg(uchar x);//控制所有数码管 void display_C();//显示温度 void display_P();//显示温度参数 void display_A();//显示电压 void PCF8591();//传DA输出 void key_scan();//按键扫描 void display();//总显示 void LED_running();//LED运行 void main() { close_all(); while(1) { rd_temperature(); key_scan(); display(); LED_running(); } } //==========138选择========== void select_138(uchar x) { switch(x) { case 0:P2=(P2&0x1F)|0x00;break; case 4:P2=(P2&0x1F)|0x80;break; case 5:P2=(P2&0x1F)|0xa0;break; case 6:P2=(P2&0x1F)|0xc0;break; case 7:P2=(P2&0x1F)|0xe0;break; } } //===========关闭外设========== void close_all() { select_138(4); P0=0xFF; select_138(5); P0=0x00; select_138(0); } //==========延迟函数=========== void delay(uint x) { while(x--){}; } //============读取温度======== void rd_temperature(void) { float temp1=0; uchar high=0,low=0; init_ds18b20(); Write_DS18B20(0xcc); Write_DS18B20(0x44); delay(200); init_ds18b20(); Write_DS18B20(0xcc); Write_DS18B20(0xbe); low=Read_DS18B20(); high=Read_DS18B20(); temp1=(high<<8)|low; temp1=temp1*0.0625; temp=temp1*100+0.5;/ a=temp/1000; //十位 b=temp%1000/100; //个位 c=temp%100/10; //第一位小数 d=temp%10; //第二位小数 smg_bit(0,10); delay(500); smg_bit(4,a); delay(500); smg_bit1(5,b); //smg_bit1(uchar pos,uchar num);带小数点 delay(500); smg_bit(6,c); delay(500); smg_bit(7,d); delay(500); all_smg(0xff); } void display_P() { smg_bit(0,11); delay(500); smg_bit(6,P_data/10); delay(500); smg_bit(7,P_data%10); delay(500); all_smg(0xff); } void display_A() { if(DAC_modo==1) { if(temp =2000)&&(temp<4000)) { A_data=(temp*3)/20-200; } if(temp>=4000) { A_data=400; } } smg_bit(0,12); delay(500); smg_bit1(5,A_data/100); delay(500); smg_bit(6,A_data%100/10); delay(500); smg_bit(7,A_data%10); delay(500); all_smg(0xff); } //=============PCF8591======= void PCF8591() { IIC_Start(); IIC_SendByte(0x90); IIC_WaitAck(); IIC_SendByte(0x40); IIC_WaitAck(); IIC_SendByte(A_data); IIC_WaitAck(); IIC_Stop(); } //=============按键============ void key_scan() { P3=0xFF;P4_2=1;P4_4=1; P4_4=0; if(P3_2==0)//5 { delay(100); if(P3_2==0) { if(key4_flag1==2) { DAC_modo++; if(DAC_modo==3) { DAC_modo=1; } } while(!P3_2){display();LED_running();}; } } P3=0xFF;P4_2=1;P4_4=1; P4_4=0; if(P3_3==0)//4 { delay(100); if(P3_3==0) { key4_flag1=(key4_flag1+1)%3; while(!P3_3){display();LED_running();}; } } P3=0xFF;P4_2=1;P4_4=1; P4_2=0; if(P3_2==0)//9 { delay(100); if(P3_2==0) { if(key4_flag1==1) { P_data++; if(P_data==100) { P_data=99; } } while(!P3_2){display();LED_running();}; } } P3=0xFF;P4_2=1;P4_4=1; P4_2=0; if(P3_3==0)//8 { delay(100); if(P3_3==0) { if(key4_flag1==1) { P_data--; if(P_data==-1) { P_data=0; } } while(!P3_3){display();LED_running();}; } } } //========总显示======== void display() { if(key4_flag1==0) { display_C(); } if(key4_flag1==1) { display_P(); } if(key4_flag1==2) { display_A(); } } //===========LED========= void LED_running() { select_138(4); if(DAC_modo==1) { L1=0; } else { L1=1; } if(key4_flag1==0) { L2=0; } else { L2=1; } if(key4_flag1==1) { L3=0; } else { L3=1; } if(key4_flag1==2) { L4=0; } else { L4=1; } select_138(0); }



