链接:https://pan.baidu.com/s/1SfFwhBzYGNrWeZoG306yFg
提取码:2022
可以直接从百度网盘下载或者将下列代码复制粘贴,其中有蓝桥杯提供的底层代码,有修改的已经标注在开头。
题目
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);
}
8.c//运行代码
#include <reg52.h>
#include "ds1302.h"
#include "onewire.h"
#define uchar unsigned char
#define uint unsigned int
sbit ch138_A=P2^5;
sbit ch138_B=P2^6;
sbit ch138_C=P2^7;
sbit S7=P3^0;
sbit S6=P3^1;
sbit S5=P3^2;
sbit S4=P3^3;
sbit L1 = P0^0;
uchar K7=0,K6=0,K5=0,K4=0;
uchar code ds1302_read[]={0x81,0x83,0x85};
uchar code ds1302_write[]={0x80,0x82,0x84};
uchar timer[]={0x55,0x59,0x23};//时间初始化秒、分、时23(点):59:55
uchar clock[]={0,0,0};//秒、分、时
uint count = 0; //定时器计数
uchar code smg_duan[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0x9c,0xc6};//数码管段
bit smg_f=1;//数码管闪烁
bit led_k=0;//led灯开关
bit led_f=0;//led闪烁
uint led_c=0;//定时器计led数
uchar tempeture_final=0;
uchar flag1=0;//温度符号,1为负、0为正
uchar rd_temperature_time=1;//读温度时间
uchar temperature_final=0;//读温度
void select_138(uchar x);
void close_all();
void key_scan();
void delay(uint x);
void SetDS1302 ();
void ReadDS1302 ();
void t0_init();
void smg_display(uchar pos,uchar num);
void display_time();
void display_temperature();
unsigned char rd_temperature(void);
void led_running();
void main()
{
close_all();
SetDS1302 ();
t0_init();
while (1)
{
ReadDS1302 ();
key_scan();
display_time();
led_running();
}
}
//==========138选择=========
void select_138(uchar x)
{
switch(x)
{
case 0:ch138_C=0;ch138_B=0;ch138_A=0;break;
case 4:ch138_C=1;ch138_B=0;ch138_A=0;break;
case 5:ch138_C=1;ch138_B=0;ch138_A=1;break;
case 6:ch138_C=1;ch138_B=1;ch138_A=0;break;
case 7:ch138_C=1;ch138_B=1;ch138_A=1;break;
}
}
//=========关闭外设===========
void close_all()
{
select_138(4);
P0=0XFF;
select_138(5);
P0=0X00;
select_138(0);
}
//========按键处理=============
void key_scan()
{
if(S7==0)
{
delay(100);
if(S7==0)
{
if(led_k==1)
{
led_k = 0;
led_c = 0;
led_f = 0;
}
while(!S7){ReadDS1302 ();display_time();led_running();}
K7=(K7+1)%4;
}
}
if(S6==0)
{
delay(100);
if(S6==0)
{
if(led_k==1)
{
led_k = 0;
led_c = 0;
led_f = 0;
}
while(!S6){ReadDS1302 ();display_time();led_running();}
K6=(K6+1)%4;
}
}
if(S5==0)
{
delay(100);
if(S5==0)
{
if(led_k==1)
{
led_k = 0;
led_c = 0;
led_f = 0;
}
while(!S5){ReadDS1302 ();display_time();led_running();}
if(K7==1)
{
timer[2]++;
}
if(K7==2)
{
timer[1]++;
}
if(K7==3)
{
timer[0]++;
}
if(K6==1)
{
clock[2]++;
}
if(K6==2)
{
clock[1]++;
}
if(K6==3)
{
clock[0]++;
}
SetDS1302 ();
}
}
if(S4==0)
{
delay(100);
if(S4==0)
{
if(led_k==1)
{
led_k = 0;
led_c = 0;
led_f = 0;
}
if((K6!=0)||(K7!=0))
{
while(!S4){ReadDS1302 ();display_time();led_running();}
if(K7==1)
{
timer[2]--;
}
if(K7==2)
{
timer[1]--;
}
if(K7==3)
{
timer[0]--;
}
if(K6==1)
{
clock[2]--;
}
if(K6==2)
{
clock[1]--;
}
if(K6==3)
{
clock[0]--;
}
SetDS1302 ();
}
if(K6==0&&K7==0)
{
while(!S4){display_temperature();led_running();}
}
}
}
}
//=======延迟函数============
void delay(uint x)
{
while(x--);
}
//======DS1302相关===========
void SetDS1302 ()
{
uchar i;
Write_Ds1302_Byte(0x8e,0x00);
for (i = 0;i<=2;i++)
{
Write_Ds1302_Byte(ds1302_write[i],timer[i]);
}
Write_Ds1302_Byte(0x8e,0x80);
}
void ReadDS1302 ()
{
uchar i;
for (i = 0;i<=2;i++)
{
timer[i] = Read_Ds1302_Byte(ds1302_read[i]);
}
}
//==============定时器============
void t0_init()
{
TMOD=0X01;
EA=1;ET0=1;TR0=1;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
}
void t0() interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
count++;
if(count==100)
{
smg_f=~smg_f;
count=0;
}
if (led_k == 1)
{
led_c ++;
if (led_c % 20 == 0)
{
led_f = ~led_f;
if (led_c >= 500)
{
led_k = 0;
led_c = 0;
led_f = 0;
}
}
}
}
//============数码管相关=========
void smg_display(uchar pos,uchar num)
{
ch138_C=1;
ch138_B=1;
ch138_A=0;
P0=(0x01<<pos);
ch138_C=1;
ch138_B=1;
ch138_A=1;
P0=smg_duan[num];
}
void display_time()
{
if(K6==0)
{
if( (K7==0) || ((K7==1)&&(smg_f==1)) || (K7==2) || (K7==3) )
{
smg_display(0,timer[2]/16);
delay(500);
smg_display(1,timer[2]%16);
delay(500);
}
smg_display(2,10);
delay(500);
if( (K7==0) || (K7==1) || ((K7==2)&&(smg_f==1)) || (K7==3) )
{
smg_display(3,timer[1]/16);
delay(500);
smg_display(4,timer[1]%16);
delay(500);
}
smg_display(5,10);
delay(500);
if( (K7==0) || (K7==1) || (K7==2) || ((K7==3)&&(smg_f==1)) )
{
smg_display(6,timer[0]/16);
delay(500);
smg_display(7,timer[0]%16);
delay(500);
}
}
else if(K6!=0)
{
K7=0;
if(clock[0]==60)
{
clock[0]=0;
clock[1]++;
}
if(clock[1]==60)
{
clock[1]=0;
clock[2]++;
}
if(clock[2]==24)
{
clock[2]=0;
}
if(clock[0]==-1)
{
clock[1]--;
clock[0]=59;
}
if(clock[1]==-1)
{
clock[2]--;
clock[1]=59;
}
if(clock[2]==-1)
{
clock[2]=23;
}
if( (K6==0) || ((K6==1)&&(smg_f==1)) || (K6==2) || (K6==3) )
{
smg_display(0,clock[2]/10);
delay(500);
smg_display(1,clock[2]%10);
delay(500);
}
smg_display(2,10);
delay(500);
if( (K6==0) || (K6==1) || ((K6==2)&&(smg_f==1)) || (K6==3) )
{
smg_display(3,clock[1]/10);
delay(500);
smg_display(4,clock[1]%10);
delay(500);
}
smg_display(5,10);
delay(500);
if( (K6==0) || (K6==1) || (K6==2) || ((K6==3)&&(smg_f==1)) )
{
smg_display(6,clock[0]/10);
delay(500);
smg_display(7,clock[0]%10);
delay(500);
}
}
select_138(6);
P0=0x00;
select_138(7);
P0=0xff;
select_138(0);
}
void display_temperature()
{
uchar a=0,b=0;
temperature_final=rd_temperature();
a=temperature_final/100;
b=temperature_final%100/10;
if(flag1==1)
{
smg_display(3,10);
delay(500);
}
smg_display(4,a);
delay(500);
smg_display(5,b);
delay(500);
smg_display(6,11);
delay(500);
smg_display(7,12);
delay(500);
select_138(6);
P0=0x00;
select_138(7);
P0=0xff;
delay(100);
select_138(0);
}
//===============DS18B20========
unsigned char rd_temperature(void)
{
uchar i=0;
unsigned int temp;
float temperature;
unsigned char low,high;
init_ds18b20();
Write_DS18B20(0xCC);
Write_DS18B20(0x44);
i=200;
while(i)
{
i--;
}
init_ds18b20();
Write_DS18B20(0xCC);
Write_DS18B20(0xBE);
low = Read_DS18B20();
high = Read_DS18B20();
temp = high;
temp <<= 8;
temp |= low;
if((high&0xf8)==0xf8)
{
flag1=1;
temp=(~temp)+1;
}
else
{
flag1=0;
}
temperature = temp*0.0625;
temperature*=10;
return temperature;
}
//============led============
void led_running()
{
if( ((timer[0]/16*10+timer[0]%16) ==clock[0]) && ((timer[1]/16*10+timer[1]%16) ==clock[1]) && ((timer[2]/16*10+timer[2]%16) ==clock[2]))
{
led_k=1;
}
if (led_f == 1)
{
select_138(4);
L1 = 0;
select_138(0);
}
else if (led_f == 0)
{
select_138(4);
L1 = 1;
select_138(0);
}
}