蓝桥杯单片机第十三届省赛(第一场)

 

 

 

 main.c文件

#include <STC15F2K60S2.H>
#include "onewire.h"
#include "ds1302.h"
#define Latch(x,y) {P0=y;P2=x;P2=0;}
unsigned char code smgduan[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xbf,0xff,0xc1};
unsigned char smg_1[8]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
unsigned char relay,key_val=0,interface=0,TP=23,count_key,count_led;
unsigned char hor1,min1,sec1,hor,min,sec,L1,L2,L3;
unsigned int tempr,count_temp,count_relay;
bit jiemian=0,mode=0,relay_time;
void Display()
{
	static unsigned char dspcom=0;
	Latch(0xc0,0);
	Latch(0xe0,smg_1[dspcom]);
	Latch(0xc0,1<<dspcom);
	if(++dspcom==8)dspcom=0;
}
void Key_Scan()
{
	static unsigned char state=0;
	unsigned char key_x=0,key_y=0;
	P3=0x0f;P4=0x00;
	if(!P30)key_x=3;
	else if(!P31)key_x=2;
	else if(!P32)key_x=1;
	else if(!P33)key_x=0;
	P3=0xf0;P4=0xff;
	if(!P34)key_y=4;
	else if(!P35)key_y=3;
	else if(!P42)key_y=2;
	else if(!P44)key_y=1;
	key_val=key_x+key_y*4;
	switch(state)
	{
		case 0:if(key_val!=0)state=1;break;
		case 1:if(key_val!=0)
		{
			state=2;
			switch(key_val)
			{
				case 12:
					if(interface==0)interface=1;
					else if(interface==1)interface=2;
					else if(interface==2)interface=0;
					break;
				case 13:mode=~mode;break;
				case 16:
					if(interface==2)
					{
						 if(TP>=99)TP=10;
						 else TP++;
					}
					break;
				case 17:
					if(interface==2)
					{
						 if(TP<=10)TP=99;
						 else TP--;
					}
					break;
			}
		}else if(key_val==0)state=0;break;
		case 2:if(key_val==0)state=0;break;
	}
}
void Timer0Init(void)		//1毫秒@12.000MHz
{
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0x20;		//设置定时初始值
	TH0 = 0xD1;		//设置定时初始值
	ET0=1;EA=1;
	TR0 = 1;		//定时器0开始计时 
}
void Timer0() interrupt 1
{
	Display();
	if(relay)
	{
		if(++count_led<100)L3=1;
		else{L3=0;if(count_led>=200)count_led=0;}
	}
	if(key_val)
	{
		if(key_val==17)
		{
			if(interface==1){if(jiemian==0)jiemian=1;}
		}
	}
	else if(!key_val)
	{
		if(interface==1){if(jiemian==1)jiemian=0;}
	}
	if(relay_time)
	{
		if(++count_relay>=5000)
		{
			count_relay=0;
			relay_time=0;
			relay=0;
			L1=0;
		}
	}
	Latch(0xa0,relay*16);
	Latch(0x80,~(L1+L2*2+L3*4));
	++count_temp;
	++count_key;
}
void InitSystem()
{
	char i=0;
	Latch(0xc0,0);
	Latch(0xa0,0);
	Latch(0x80,0xff);
	Set_Time(23,59,55);
	Timer0Init();
	for(i=0;i<70;i++){tempr=Read_Tempr()*10+0.5;}
}
void main()
{
	InitSystem();
	while(1)
	{
		if(count_key>=10)
		{
			count_key=0;
			Key_Scan();
		}
		if(count_temp>749)
		{
			count_temp=0;
			tempr=Read_Tempr()*10+0.5;
		}
		if(TH0<0xf0)
		{
			sec1=Read_Ds1302_Byte(0x81);
			min1=Read_Ds1302_Byte(0x83);
			hor1=Read_Ds1302_Byte(0x85);
			hor=(hor1/16)*10+hor1%16;
			min=(min1/16)*10+min1%16;
			sec=(sec1/16)*10+sec1%16;
		}
		if(interface==0)
		{
			smg_1[0]=smgduan[12];
			smg_1[1]=smgduan[1];
			smg_1[5]=smgduan[tempr/100];
			smg_1[6]=smgduan[tempr%100/10]&0x7f;
			smg_1[7]=smgduan[tempr%10];
		}
		if(interface==1)
		{
			smg_1[0]=smgduan[12];
			smg_1[1]=smgduan[2];
			if(jiemian==0)
			{
				smg_1[3]=smgduan[hor/10];
				smg_1[4]=smgduan[hor%10];
				smg_1[5]=smgduan[10];
				smg_1[6]=smgduan[min/10];
				smg_1[7]=smgduan[min%10];
			}
			else if(jiemian==1)
			{
				smg_1[3]=smgduan[min/10];
				smg_1[4]=smgduan[min%10];
				smg_1[5]=smgduan[10];
				smg_1[6]=smgduan[sec/10];
				smg_1[7]=smgduan[sec%10];
			}
		}
		if(interface==2)
		{
			smg_1[0]=smgduan[12];
			smg_1[1]=smgduan[3];
			smg_1[2]=smg_1[3]=smg_1[4]=smg_1[5]=smgduan[11];
			smg_1[6]=smgduan[TP/10];
			smg_1[7]=smgduan[TP%10];
		}
		if(mode==0)
		{
			L2=1;
			if(tempr>TP*10)relay=1;
			else {relay=0;L3=0;}
			if(min==0 && sec==0){relay_time=1;L1=1;}
		}
		else if(mode==1)
		{
			L2=0;
			if(relay_time==0){relay=0;L3=0;L1=0;}
			if(min==0 && sec==0){relay=1;relay_time=1;L1=1;}
		}
	}
}

onewire.c文件

#include "onewire.h"
#include "reg52.h"

sbit DQ = P1^4;
//ե؜ПŚҿғʱگ˽
void Delay_OneWire(unsigned int t)  
{
	t*=11;
	while(t--);
}

//ե؜Пдәط
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);
}

//ե؜Пׁәط
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;
}
float Read_Tempr()
{
	float temp;
	unsigned char low,high;
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	Delay_OneWire(200);
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	low=Read_DS18B20();
	high=Read_DS18B20();
	temp=(high<<8|low)*0.0625;
	return temp;
}	

onewire.h文件

#ifndef __ONEWIRE_H
#define __ONEWIRE_H



float Read_Tempr();

#endif

ds1302.c文件

#include "ds1302.h"  									
#include <reg52.h>
#include <intrins.h>

sbit SCK = P1^7;		
sbit SDA = P2^3;		
sbit RST = P1^3; 
//д×Ö½Ú
void Write_Ds1302(unsigned  char temp) 
{
	unsigned char i;
	for (i=0;i<8;i++)     	
	{ 
		SCK = 0;
		SDA = temp&0x01;
		temp>>=1; 
		SCK=1;
	}
}   

//ÏòDS1302¼Ä´æÆ÷дÈëÊý¾Ý
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; 
}

//´ÓDS1302¼Ä´æÆ÷¶Á³öÊý¾Ý
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);			
}
void Set_Time(unsigned char hor,min,sec)
{
	Write_Ds1302_Byte(0x8e,0);
	Write_Ds1302_Byte(0x80,(sec/10)*16+sec%10);
	Write_Ds1302_Byte(0x82,(min/10)*16+min%10);
	Write_Ds1302_Byte(0x84,(hor/10)*16+hor%10);
	Write_Ds1302_Byte(0x8e,0x80);
}

ds1302..h文件

#ifndef __DS1302_H
#define __DS1302_H


void Set_Time(unsigned char hor,min,sec);
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

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值