蓝桥杯单片机组第六届省赛

main.c

#include<stc15f2k60s2.h>
#include<ds1302.h>
#include<onewire.h>

unsigned char code smgduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};
unsigned char smgbuffer[8];
unsigned char smgcom;
unsigned char keytt;
unsigned int wendutt;
unsigned int smgshantt;
unsigned char mode;
unsigned char gap=1;
unsigned long gaptt=0;
bit shanflag,gapflag;
unsigned char wendu;
unsigned char shuju[10]; unsigned char i;
unsigned char cishu;
bit LEDkaishi,LEDflag;

void display();
void keyscan();

void Timer1Init(void)		//1毫秒@12.000MHz
{
	AUXR |= 0x40;		//定时器时钟1T模式
	TMOD &= 0x0F;		//设置定时器模式
	TL1 = 0x20;		//设置定时初值
	TH1 = 0xD1;		//设置定时初值
	TF1 = 0;		//清除TF1标志
	TR1 = 1;		//定时器1开始计时
	ET1=1;
	EA=1;
}

void Timer1() interrupt 3
{
	unsigned char LEDtt;
	unsigned char P0_kepper=0,P2_kepper=0;
	P0_kepper=P0; P2_kepper=P2; P2=P2&0x1f;

	display();
	keytt++; if(keytt==10) {keytt=0; keyscan();}
	smgshantt++; if(smgshantt==1000) {smgshantt=0; shanflag=~shanflag;}
	if(mode==1)
	{
		gaptt++;
		if(gaptt==gap*1000){gaptt=0; gapflag=1;}
	}
	
	if(LEDkaishi==1)
	{
		LEDtt++; if(LEDtt==100){LEDtt=0; LEDflag=~LEDflag;}
	}
	
	P0=P0_kepper; P2=P2_kepper;	
}

void display()
{
	P0=0xff; P2=P2&0x1f|0xc0; P2=P2&0x1f;
	P0=0xff; P2=P2&0x1f|0xe0; P2=P2&0x1f;
	P0=1<<smgcom; P2=P2&0x1f|0xc0; P2=P2&0x1f;
	P0=smgduan[smgbuffer[smgcom++]]; P2=P2&0x1f|0xe0; P2=P2&0x1f;
	
	if(smgcom==8) smgcom=0;
}

void keyscan()    //独立键盘:普通按键用trg  长按键用dat(松手变为0) cnt有时会失效
{
	unsigned char dat,trg,cnt;
	dat=P3^0xff;
	trg=dat&(dat^cnt);
	cnt=dat;
	
  if(trg&0x01){mode=0;}	
	else if(trg&0x02){LEDflag=0; LEDkaishi=0; cishu++; if(cishu==10) cishu=9;}
	else if(trg&0x04) mode=1;
	else if(trg&0x08 && mode==0)
	{
		if(gap==1)       gap=5;
		else if(gap==5)  gap=30;
		else if(gap==30) gap=60;
		else if(gap==60) gap=1;
	}
}

void wenduwending()
{
	unsigned char Ti;
	for(Ti=0;Ti<70;Ti++)
	{
		temp=tempget()*100+0.5; //不是乘0.0625! 且这玩意要放在while大循环前面
	}
}

void wenduxianshi()
{
	if(gapflag==1)
	{
		temp=tempget()*100+0.5;
		wendu=(temp/1000)*10+(temp/1000%100);
		gapflag=0;
		shuju[i]=wendu;
		i++; if(i==10) mode=2;
		LEDkaishi=1;
	}
}

void xianshi()
{
	if(mode==0)
	{
		smgbuffer[0]=smgbuffer[1]=smgbuffer[2]=smgbuffer[3]=smgbuffer[4]=11;
		smgbuffer[5]=10; 
		smgbuffer[6]=gap/10; smgbuffer[7]=gap%10;
	}
	else if(mode==1)
	{
		DS_get();
		smgbuffer[0]=shijian[2]/10; smgbuffer[1]=shijian[2]%10;
		smgbuffer[3]=shijian[1]/10; smgbuffer[4]=shijian[1]%10;
		smgbuffer[6]=shijian[0]/10; smgbuffer[7]=shijian[0]%10;
		if(shanflag==0) smgbuffer[2]=smgbuffer[5]=10;
		else if(shanflag==1) smgbuffer[2]=smgbuffer[5]=11;
	}
  else if(mode==2)
	{
		smgbuffer[0]=smgbuffer[5]=10;
		smgbuffer[3]=smgbuffer[4]=11;
		smgbuffer[1]=cishu/10; smgbuffer[2]=cishu%10;
		smgbuffer[6]=shuju[cishu]/10;
		smgbuffer[7]=shuju[cishu]%10;
	}
}


void LED()
{
	if(mode==2)
	{
		if(LEDflag==0)      {P00=1; P2=P2&0x1f|0x80; P2=P2&0x1f;}
		else if(LEDflag==1) {P00=0; P2=P2&0x1f|0x80; P2=P2&0x1f;}
	}
}

void main()
{
	P0=0x00; P2=P2&0x1f|0xa0; P2=P2&0x1f;
	P0=0xff; P2=P2&0x1f|0x80; P2=P2&0x1f;
	DS_init();
	wenduwending();
  Timer1Init();
	while(1)
	{
		wenduxianshi();
		xianshi();
		LED();
	}
}

onewire.c

/*
  程序说明: 单总线驱动程序
  软件环境: Keil uVision 4.10 
  硬件环境: CT107单片机综合实训平台(外部晶振12MHz) STC89C52RC单片机
  日    期: 2011-8-9
*/
#include "stc15f2k60s2.h"

sbit DQ = P1^4;  //单总线接口

//单总线延时函数
void Delay_OneWire(unsigned int t);  //STC89C52RC


//通过单总线向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;
}

void Delay_OneWire(unsigned int t)  //STC89C52RC
{
  t=t*12;
	while(t--);
}    //把延迟函数放到最后面  并扩大12倍
/**************************************************************/

float tempget()
{
	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;
}


ds1302.c

/*
  程序说明: DS1302驱动程序
  软件环境: Keil uVision 4.10 
  硬件环境: CT107单片机综合实训平台 8051,12MHz
  日    期: 2011-8-9
*/

#include <stc15f2k60s2.h>
#include <intrins.h>

sbit SCK=P1^7;		
sbit SDA=P2^3;		
sbit RST = P1^3;   // DS1302复位												

unsigned char shijian[]={50,59,23,0,0,0,0}; //倒过来的年 天(1-7) 月 日 时 分 秒
/***********************************************/
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 );修改如下***********************
	Write_Ds1302((dat/10<<4)|(dat%10));
 	RST=0; 
}

unsigned char Read_Ds1302_Byte ( unsigned char address )
{
 	unsigned char i,temp=0x00;
	
	unsigned char dat1,dat2;
/***********************************************************/	
 	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 DS_init()
{
	unsigned char i,add;
	add=0x80; //add=0x81
	Write_Ds1302_Byte(0x8e,0x00);
	for(i=0;i<7;i++)
	{
		Write_Ds1302_Byte(add,shijian[i]);
		add=add+2;
	}
	Write_Ds1302_Byte(0x8e,0x80);
}

void DS_get()
{
	unsigned char i,add;
	add=0x81; //add=0x81
	Write_Ds1302_Byte(0x8e,0x00);
	for(i=0;i<7;i++)
	{
		shijian[i]=Read_Ds1302_Byte(add);
		add=add+2;
	}
	Write_Ds1302_Byte(0x8e,0x80);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值