链接:https://pan.baidu.com/s/1r6vFZZg72FnMB_3CSVEb2w
提取码: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.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
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;
}
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
ds1302.c//蓝桥杯底层代码,没有改变
/*
程序说明: DS1302驱动程序
软件环境: Keil uVision 4.10
硬件环境: CT107单片机综合实训平台 8051,12MHz
日 期: 2011-8-9
*/
#include <reg52.h>
#include <intrins.h>
sbit SCK=P1^7;
sbit SDA=P2^3;
sbit RST = P1^3; // DS1302复位
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);
}
11.c//运行代码
#include <reg52.h>
#include "ds1302.h"
#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;
sbit L5=P0^4;
sbit L6=P0^5;
sbit L7=P0^6;
sbit L8=P0^7;
uchar key4_flag1=0;
uchar key5_flag1=0;
uchar key8_flag1=0;
uchar key9_flag1=0;
uint C_data=0;
uint E_data=0;
uchar E_flag1=1;
uchar shuju_flag1=1;//数据界面标志(哪一个界面)
uchar P_flag1=1;//参数界面标志(哪一个界面)
uchar P_data1=17;
uchar P_data2=25;
uchar P_data3=4;
uchar L3_flag1=0;
uint T0_count=0;
uchar code smg_duan[]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xc6,0x86,0x8c};
uchar code DS1302_W[]={0x80,0x82,0x84};
uchar code DS1302_R[]={0x81,0x83,0x85};
uchar DS1302_T[]={0x50,0x59,0x16};//时间16:59:50
void select_138(uchar x);
void close_all();
void delay(uchar x);
void smg_bit(uchar pos,uchar num);
void smg_bit1(uchar pos,uchar num);
void smg_all(uchar x);
void display_T();
void display_C();
void display_E();
void display_P1();
void display_P2();
void display_P3();
void SetDS1302 ();
void ReadDS1302 ();
void rd_temperature();
void read_E();
void key_scan();
void display();
void LED_running();
void T_init();
void main()
{
close_all();
SetDS1302 ();
T_init();
while(1)
{
ReadDS1302 ();
rd_temperature();
read_E();
if(E_flag1==1)
{
TR0=1;
}
if(E_flag1==0)
{
TR0=0;
L3_flag1=0;
}
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;
}
//===========延迟========
void delay(uchar x)
{
while(x--){};
}
//=========数码管=========
void smg_bit(uchar pos,uchar num)
{
select_138(7);
P0=0xff;
select_138(6);
P0=(0x01<<pos);
select_138(7);
P0=smg_duan[num];
}
void smg_bit1(uchar pos,uchar num)//小数
{
select_138(7);
P0=0xff;
select_138(6);
P0=(0x01<<pos);
select_138(7);
P0=(smg_duan[num]&0x7f);
}
void smg_all(uchar x)
{
select_138(6);
P0=0xff;
select_138(7);
P0=x;
}
void display_T()
{
smg_bit(0,DS1302_T[2]/16);
delay(500);
smg_bit(1,DS1302_T[2]%16);
delay(500);
smg_bit(2,10);
delay(500);
smg_bit(3,DS1302_T[1]/16);
delay(500);
smg_bit(4,DS1302_T[1]%16);
delay(500);
smg_bit(5,10);
delay(500);
smg_bit(6,DS1302_T[0]/16);
delay(500);
smg_bit(7,DS1302_T[0]%16);
delay(500);
smg_all(0xff);
}
void display_C()
{
uchar a,b,c;
a=C_data/100;
b=C_data%100/10;
c=C_data%10;
smg_bit(0,11);
delay(500);
smg_bit(5,a);
delay(500);
smg_bit1(6,b);
delay(500);
smg_bit(7,c);
delay(500);
smg_all(0xff);
}
void display_E()
{
smg_bit(0,12);
delay(500);
smg_bit1(2,E_data/100);
delay(500);
smg_bit(3,E_data%100/10);
delay(500);
smg_bit(4,E_data%10);
delay(500);
smg_bit(7,E_flag1);
delay(500);
smg_all(0xff);
}
void display_P1()
{
smg_bit(0,13);
delay(500);
smg_bit(1,1);
delay(500);
smg_bit(6,P_data1/10);
delay(500);
smg_bit(7,P_data1%10);
delay(500);
smg_all(0xff);
}
void display_P2()
{
smg_bit(0,13);
delay(500);
smg_bit(1,2);
delay(500);
smg_bit(6,P_data2/10);
delay(500);
smg_bit(7,P_data2%10);
delay(500);
smg_all(0xff);
}
void display_P3()
{
smg_bit(0,13);
delay(500);
smg_bit(1,3);
delay(500);
smg_bit(7,P_data3);
delay(500);
smg_all(0xff);
}
//============DS1302==========
void SetDS1302 ()
{
uchar i;
Write_Ds1302_Byte(0x8e,0x00);
for (i = 0;i<=2;i++)
{
Write_Ds1302_Byte(DS1302_W[i],DS1302_T[i]);
}
Write_Ds1302_Byte(0x8e,0x80);
}
void ReadDS1302 ()
{
uchar i;
for (i = 0;i<=2;i++)
{
DS1302_T[i] = Read_Ds1302_Byte(DS1302_R[i]);
}
}
//=========DS18B20===========
void rd_temperature()
{
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;
C_data=temp1*10+0.5;
}
//========光敏电阻==========
void read_E()
{
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x41);
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
E_data=IIC_RecByte();
IIC_SendAck(1);
IIC_Stop();
E_data=E_data*1.961;
if(E_data<=250)
{
E_flag1=1;
}
else
{
E_flag1=0;
}
}
//============按键============
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==0)
{
shuju_flag1++;
if(shuju_flag1==4)
{
shuju_flag1=1;
}
}
if(key4_flag1==1)
{
P_flag1++;
if(P_flag1==4)
{
P_flag1=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)%2;
P_flag1=1;
shuju_flag1=1;
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)
{
if(P_flag1==1)
{
P_data1=(P_data1+1)%24;
}
if(P_flag1==2)
{
P_data2=(P_data2+1)%100;
}
if(P_flag1==3)
{
P_data3=P_data3+1;
if(P_data3==9)
{
P_data3=4;
}
}
}
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)
{
if(P_flag1==1)
{
P_data1--;
if(P_data1==-1)
{
P_data1=23;
}
}
if(P_flag1==2)
{
P_data2--;
if(P_data2==-1)
{
P_data2=99;
}
}
if(P_flag1==3)
{
P_data3--;
if(P_data3==-1)
{
P_data3=8;
}
}
}
while(!P3_3){display();LED_running();};
}
}
}
//=====总显示======
void display()
{
if(key4_flag1==0)
{
if(shuju_flag1==1)
{
display_T();
}
if(shuju_flag1==2)
{
display_C();
}
if(shuju_flag1==3)
{
display_E();
}
}
if(key4_flag1==1)
{
if(P_flag1==1)
{
display_P1();
}
if(P_flag1==2)
{
display_P2();
}
if(P_flag1==3)
{
display_P3();
}
}
}
//==========LED=======
void LED_running()
{
uint hour=DS1302_T[2]/16*10+DS1302_T[2]%16;
float temperture=C_data/100*10+C_data%100/10+C_data%10*0.1;
select_138(4);
if(P_data1<8)
{
if((hour>=P_data1)&&(hour<8))
{
L1=0;
}
else
{
L1=1;
}
}
if(P_data1>=8)
{
if(((hour>=P_data1)&&(hour<23))||(hour<8))
{
L1=0;
}
else
{
L1=1;
}
}
if(P_data2>temperture)
{
L2=0;
}
else
{
L2=1;
}
if(P_data3==4)
{
L4=0,L5=L6=L7=L8=1;
}
if(P_data3==5)
{
L5=0,L4=L6=L7=L8=1;
}
if(P_data3==6)
{
L6=0,L5=L4=L7=L8=1;
}
if(P_data3==7)
{
L7=0,L5=L6=L4=L8=1;
}
if(P_data3==8)
{
L8=0,L5=L6=L7=L4=1;
}
if(L3_flag1==1)
{
L3=0;
}
else
{
L3=1;
}
}
//==========定时器=========
void T_init()
{
TMOD=0X01;
EA=1;
ET0=1;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=0;
}
void t0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
T0_count++;
if(T0_count==60)
{
T0_count=0;
TR0=0;
L3_flag1=1;
}
}