第六屆藍橋杯單片機設計與開發項目省賽試題

第六屆藍橋杯單片機設計與開發項目省賽試題:
“溫度記錄器”設計任務書
在這裏插入圖片描述
在這裏插入圖片描述

  • ds1302.h

#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
  • ds1302.c
#include <reg52.h>
#include <intrins.h>
#include<ds1302.h>
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);

}

  • ds18b20.h
#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
  • ds18b20.c
#include "reg52.h"
#include<ds18b20.h>
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<stc15f2k60s2.h>
#include<ds18b20.h>
#include<ds1302.h>
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) ;
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章