第六届蓝桥杯单片机设计与开发项目省赛试题:
“温度记录器”设计任务书
#ifndef __DS1302_H
#define __DS1302_H
void Write_Ds1302_Byte(unsigned char temp);
void Write_Ds1302( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302 ( unsigned char address );
extern unsigned char shi[3];
void ds1302xie();
void ds1302du();
#endif
#include
#include
#include
sbit SCK=P1^7;
sbit SDA=P2^3;
sbit RST = P1^3; // DS1302复位
unsigned char shizhong[3]={50,59,23};
unsigned char shi[3];
void Write_Ds1302_Byte(unsigned char temp)
{
unsigned char i;
for (i=0;i<8;i++)
{
SCK=0;
SDA=temp&0x01;
temp>>=1;
SCK=1;
}
}
void Write_Ds1302( unsigned char address,unsigned char dat )
{
RST=0;
_nop_();
SCK=0;
_nop_();
RST=1;
_nop_();
Write_Ds1302_Byte(address);
Write_Ds1302_Byte((dat/10<<4)|(dat%10));
RST=0;
}
unsigned char Read_Ds1302 ( unsigned char address )
{
unsigned char i,temp=0x00,dat1,dat2;
RST=0;
_nop_();
SCK=0;
_nop_();
RST=1;
_nop_();
Write_Ds1302_Byte(address);
for (i=0;i<8;i++)
{
SCK=0;
temp>>=1;
if(SDA)
temp|=0x80;
SCK=1;
}
SDA=0;
dat1=temp/16;
dat2=temp%16;
temp=dat1*10+dat2;
RST=0;
_nop_();
RST=0;
SCK=0;
_nop_();
SCK=1;
_nop_();
SDA=0;
_nop_();
SDA=1;
_nop_();
return temp;
}
void ds1302xie()
{
unsigned char add=0x80;
int i;
Write_Ds1302(0x8e,0x00);
for(i=0;i<3;i++)
{
Write_Ds1302(add,shizhong[i]);
add=add+2;
}
Write_Ds1302(0x8e,0x80);
}
void ds1302du()
{
unsigned char add=0x81;
int i;
Write_Ds1302(0x8e,0x00);
for(i=0;i<3;i++)
{
shi[i]=Read_Ds1302(add);
add=add+2;
}
Write_Ds1302(0x8e,0x80);
}
#ifndef __DS18B20_H
#define __DS18B20_H
//单总线延时函数
void Delay_OneWire(unsigned int t);
void Write_DS18B20(unsigned char dat);
unsigned char Read_DS18B20(void);
bit init_ds18b20(void);
int getwendu();
#endif
#include "reg52.h"
#include
sbit DQ = P1^4; //单总线接口
//单总线延时函数
void Delay_OneWire(unsigned int t)
{
unsigned char i;
while(t--){
for(i=0; i<8; i++);
}
}
//通过单总线向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;
}
int getwendu()
{
int low,high,temp;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
low=Read_DS18B20();
high=Read_DS18B20();
temp=high<<4;
temp=temp|(low>>4);
// temp=temp*6.25; //20.0625
//
return temp;
}
#include
#include
#include
typedef unsigned char uchar;
typedef unsigned int uint;
sbit s7=P3^0;
sbit s6=P3^1;
sbit s5=P3^2;
sbit s4=P3^3;
uchar code smg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};
int yi,er,san=10,si,wu,liu=10,qi,ba,t,jiange=1,tt,ttt,tttt,shijian,shuju,flag=0,jiemian=1,shanshuo,shan=1;
int temp;
uchar wendu[12];
void shangdian();
void delay1ms(int ms);
void display1();
void display2();
void Timer0Init(void); //1毫秒@11.0592MHz
void Timer1Init(void); //1毫秒@11.0592MHz
void keypros();
main()
{
shangdian();
temp=getwendu();
Timer1Init();
Timer0Init();
ds1302xie();
while(1)
{ keypros();
ds1302du();
temp=getwendu();
if(jiemian==1)
{yi=er=san=si=wu=11;
liu=10;qi=jiange/10;ba=jiange%10;
}
else if(jiemian==2)
{
TR1=1;
yi=shi[2]/10;
er=shi[2]%10;
si=shi[1]/10;
wu=shi[1]%10;
qi=shi[0]/10;
ba=shi[0]%10;
}
else if(jiemian==3)
{
yi=10;er=flag/10;san=flag%10;si=wu=11;liu=10;qi=wendu[flag]/10;
ba=wendu[flag]%10;
}
display1();
display2();
}
}
void Timer0Init(void) //1毫秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xCD; //设置定时初值
TH0 = 0xD4; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1;
EA=1;
}
void time() interrupt 1
{
t++;
tttt++;
if(t==1000)
{
t=0;
if((san==10)&&(liu==10))
{
san=liu=11;
}
else if((san==11)&&(liu==11))
{
san=liu=10;
}}
if(tttt==400)
{ tttt=0;
if(shanshuo==1)
{
if(shan==1)
{
P2=0X80;
P0=0XFE;
shan=2;
}
else if(shan==2)
{
P2=0X80;P0=0Xff;
shan=1;
}
}
}
}
void Timer1Init(void) //1毫秒@11.0592MHz
{
AUXR |= 0x40; //定时器时钟1T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0xCD; //设置定时初值
TH1 = 0xD4; //设置定时初值
TF1 = 0; //清除TF1标志
TR1 = 0; //定时器1开始计时
ET1=1;
EA=1;
}
void time1() interrupt 3 //记录数据
{
ttt++;
if(ttt==1000)
{ ttt=0;
shijian++;//1s
if(shijian==jiange)
{ shijian=0;
wendu[shuju]=temp;
shuju++;
if(shuju==10) //L1闪烁
{ shuju=0;
jiemian=3;
TR1=0;
shanshuo=1;
} }
}
}
void shangdian()
{
P2=0XA0;P0=0X00;
P2=0X80;P0=0XFF;
P2=0XC0;P0=0XFF;
P2=0XE0;P0=0XFF;
}
void delay1ms(int ms)
{
int i;
for(;ms>0;ms--)
{
for(i=845;i>0;i--) ;
}
}
void display1()
{
P2=0XC0;P0=0X01;
P2=0XE0;P0=smg[yi];
delay1ms(1);
P2=0XC0;P0=0X02;
P2=0XE0;P0=smg[er];// P2=0XE0;P0=smg[er]&0x7f;
delay1ms(1);
P2=0XC0;P0=0X04;
P2=0XE0;P0=smg[san];
delay1ms(1);
P2=0XC0;P0=0X08;
P2=0XE0;P0=smg[si];
delay1ms(1);
}
void display2()
{
P2=0XC0;P0=0X10;
P2=0XE0;P0=smg[wu];
delay1ms(1);
P2=0XC0;P0=0X20;
P2=0XE0;P0=smg[liu];
delay1ms(1);
P2=0XC0;P0=0X40;
P2=0XE0;P0=smg[qi];
delay1ms(1);
P2=0XC0;P0=0X80;
P2=0XE0;P0=smg[ba];
delay1ms(1);
P2=0XC0;P0=0X80;
P2=0XE0;P0=0xff;
}
void keypros()
{ if(jiemian==3){
if(s7==0)
{
delay1ms(5);
if(s7==0)
{
jiemian=1;
}
while(!s7) ;
}
if(s6==0)
{
delay1ms(5);
if(s6==0)
{ shanshuo=0;
P2=0X80;P0=0XFF;
flag++;
if(flag==10)
flag=0;
}
while(!s6) ;
}}
if(jiemian==1){
if(s5==0)
{
delay1ms(5);
if(s5==0)
{
TR1=1;
jiemian=2;flag=0;
san=liu=10;
}
while(!s5) ;
}
if(s4==0)
{
delay1ms(5);
if(s4==0)
{
tt++;
if(tt==1)
jiange=5;
else if(tt==2)
jiange=30;
else if(tt==3)
jiange=60;
else if(tt==4)
{
jiange=1;
tt=0;
}
}
}
while(!s4) ;
}
}