蓝桥杯51省赛(6)

#include<stc15f2k60s2.h>
#include"ds1302.h"
#include"onewire.h"
unsigned char wei[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
unsigned char duan[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xbf,0xff};
unsigned char tab[8]={0};
unsigned char temp[10]={0};
unsigned char shuzi[10]={0,1,2,3,4,5,6,7,8,9};
unsigned char key_set=0;
unsigned char key_mode=0;
unsigned char n=0;
unsigned int jiange=0;
bit flag_jiange=0;
bit flag_show=0;
bit flag_led=0;
bit flag_start=0;
2020-04-04  13:01~14:36	 weiwei 
void delayms(unsigned int ms)
{
	int i,j;
	for(i=0;i<ms;i++)
	for(j=0;j<845;j++);
}

void HC_138(unsigned char m)
{
	switch(m)
	{
		case(4):P2|=0X80;P2&=0X9F;break;
		case(5):P2|=0XA0;P2&=0XBF;break;
		case(6):P2|=0XC0;P2&=0XDF;break;
		case(7):P2|=0XE0;P2&=0XFF;break;
	}
}

void allinit()
{
	HC_138(4);P0=0XFF;
	HC_138(5);P0=0X00;
	HC_138(6);P0=0X00;
	HC_138(7);P0=0XFF;
	DS1302_init();
//	DS1302get();
}

void timer0init()
{
	TMOD=0X01;
	TH0=(65536-1000)/256;
	TL0=(65536-1000)%256;
	EA=1;
	TR0=1;
	ET0=1;
}

void timer0() interrupt 1
{
	static char i=0;
	static int m=0,k=0,u=0,t=0;
	TH0=(65536-1000)/256;
	TL0=(65536-1000)%256;
	HC_138(6);
	P0=wei[i];
	HC_138(7);
	P0=duan[tab[i]];
	i++;
	if(i==8)
	i=0;
	if(key_mode==1)
	{
		m++;
		k++;
		if(m==1000)
		{
			flag_jiange=~flag_jiange;
			m=0;
		}
		if(k==jiange)
		{
			temp[n]=tempget();
			n++;
			k=0;
		}
		if(n==10)
		{
			key_mode=2;
		    flag_led=1;
			n=0;
		}
	}
	if(key_mode==2)
	{

			t++;
			if(t==1000)
			{
				flag_led=~flag_led;
				t=0;
			}
	}

	if(key_mode==3)
	{
		u++;
		if(u==1000)
		{
			flag_show=~flag_show;
			if(flag_show==1)
			n++;
			u=0;
		}
		if(n>=10)
		n=9;
	}
	
}

void keyscan()
{
    if(P33==0) //S4间隔设置界面(上电)
	{
		delayms(10);
		if(P33==0)
		{
			key_set++;
			key_mode=0;
			if(key_set==4)
			key_set=0;
		}
		while(!P33);
	}

	if(P32==0)	//按下S5进入数据采集界面
	{
		delayms(10);
		if(P32==0)
		{
			key_mode=1;
			n=0;
		}
		while(!P32);
	}

	if(P30==0)
	{
		delayms(10);
		if(P30==0)
		{
			if(key_mode==3)
			{
			key_mode=0;
			n=0;
			}
		}
		while(!P30);
	}
    if(P31==0)
	{
		delayms(10);
		if(P31==0)
		{
			if(key_mode==2)
			{

                key_mode=3;
			}
            
		}
		while(!P31);
	}

}

void keyshow()
{
	if(key_mode==0)
	{
		tab[0]=11;
		tab[1]=11;
		tab[2]=11;
		tab[3]=11;
		tab[4]=11;
		tab[5]=10;
		if(key_set==0)
		{
			tab[6]=0;
			tab[7]=1;
			jiange=1000;
		}
		if(key_set==1)
		{
			tab[6]=0;
			tab[7]=5;
			jiange=5000;
		}			
		if(key_set==2)
		{
			tab[6]=3;
			tab[7]=0;
			jiange=30000;
		}			
		if(key_set==3)
		{
			tab[6]=6;
			tab[7]=0;
			jiange=60000;
		}						
	}

	if(key_mode==1)
	{
		tab[0]=shijian[2]/10;
		tab[1]=shijian[2]%10;
		tab[3]=shijian[1]/10;
		tab[4]=shijian[1]%10;
		tab[6]=shijian[0]/10;
		tab[7]=shijian[0]%10;
		if(flag_jiange==1)
		{
			tab[2]=10;
			tab[5]=10;
		}
		else if(flag_jiange==0)
		{
			tab[2]=11;
			tab[5]=11;
		}
	}

	if(key_mode==2)
	{
		tab[0]=10;
		tab[1]=0;
		tab[3]=11;
		tab[4]=11;
		tab[5]=10;
		tab[2]=shuzi[0];
		tab[6]=temp[0]/10;
		tab[7]=temp[0]%10;

		if(flag_led==1)
		{
			HC_138(4);
			P0=~0x01;
		}
		else if(flag_led==0)
		{
			HC_138(4);
			P0=0xff;
		}
	}
	if(key_mode==3)
	{
	 
		tab[0]=10;
		tab[1]=0;
		tab[3]=11;
		tab[4]=11;
		tab[5]=10;
		if(flag_show==1)
		{
			tab[2]=shuzi[n];
			tab[6]=temp[n]/10;
			tab[7]=temp[n]%10;
		}
		HC_138(4);
		P0=0xff;
	}
}


void main()
{
allinit();
timer0init();
while(1)
{
keyscan();
keyshow();
DS1302get();
}
}














 ds1302和ds18b20自己写的部分(含对给出的驱动代码的修改)

//向DS1302寄存器写入数据
void Write_Ds1302_Byte( unsigned char address,unsigned char dat )     
{
 	unsigned char dat1,dat2;
	RST=0;	_nop_();
 	SCK=0;	_nop_();
 	RST=1; 	_nop_();  
 	Write_Ds1302(address);
	dat1=dat/10;
	dat2=dat%10;
	dat=(dat1<<4)|dat2;	
 	Write_Ds1302(dat);		
 	RST=0; 
}

//从DS1302寄存器读出数据
unsigned char Read_Ds1302_Byte ( unsigned char address )
{
 	unsigned char dat1,dat2;
	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_();
	dat1=temp/16;
	dat2=temp%16;
	temp=dat1*10+dat2;
	return (temp);			
}

void DS1302_init()
{
	unsigned char i=0;
	unsigned char add=0x80;
	Write_Ds1302_Byte(0x8e,0x00);
	for(i=0;i<8;i++)
	{
		Write_Ds1302_Byte(add,shijian[i]);
		add=add+2;
	}
	Write_Ds1302_Byte(0x8e,0x80);
}

void DS1302get()
{
	unsigned char i=0;
	unsigned char add=0x81;
	Write_Ds1302_Byte(0x8e,0x00);
	for(i=0;i<8;i++)
	{
		shijian[i]=Read_Ds1302_Byte(add);
		add=add+2;
	}
	Write_Ds1302_Byte(0x8e,0x80);
}
unsigned int tempget()
{
	unsigned int temp;
	unsigned char low,high;
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	Delay_OneWire(200);
	low=Read_DS18B20();
	high=Read_DS18B20();
	temp=(high<<4)|(low>>4);
	return temp;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值