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

main.c

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

unsigned char code smgduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,~0x39};
unsigned char smgbuffer[8];
unsigned char smgcom,keytt;
unsigned char mode=1;
bit xianshimode=0;
char shengyu=0;
unsigned char shijianmode=0;
bit wenduflag;
float zhankong;

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 P0_kepper=0,P2_kepper=0;
	float ttt;
	int wendutt;
	
	P0_kepper=P0; P2_kepper=P2; P2=P2&0x1f;
	
	display();
	keytt++; if(keytt==10) {keytt=0; keyscan();}
	wendutt++; if(wendutt==500){wendutt=0; wenduflag=1;}
	
  if(shijianmode==0) shengyu=0;
	else if(shijianmode==1){ttt++;if(ttt==1000){ttt=0;shengyu--;if(shengyu==-1)shengyu=0;}}
  else if(shijianmode==2){ttt++;if(ttt==1000){ttt=0;shengyu--;if(shengyu==-1)shengyu=0;}}	
	
	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()    
{
	unsigned char dat,trg,cnt;
	dat=P3^0xff;
	trg=dat&(dat^cnt);
	cnt=dat;
	
	if(trg&0x01){xianshimode=~xianshimode;}
	else if(trg&0x02){shengyu=0;shijianmode=0;}
	else if(trg&0x04)
	{
		shijianmode++;
		if(shijianmode==3){shijianmode=0;}
	/************************************************/		
		if(shijianmode==0) shengyu=0;
		else if(shijianmode==1) shengyu=60;
		else if(shijianmode==2) shengyu=120;   //按键的好处就是只会赋值一次
  /************************************************/
	}
	else if(trg&0x08){mode++; if(mode==4) mode=1;}
}

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

void wenduhuoqu()
{
	if(wenduflag==1)
	{
		wenduflag=0;
		temp=tempget()*100+0.5; //不是乘0.0625! 且这玩意要放在while大循环前面
	}
}

void xianshi()
{
	if(xianshimode==0)
	{
		smgbuffer[0]=smgbuffer[2]=10;
		smgbuffer[1]=mode;
		smgbuffer[3]=11;smgbuffer[4]=0;
		smgbuffer[5]=shengyu/100;
		smgbuffer[6]=shengyu%100/10;
		smgbuffer[7]=shengyu%10;
	}
	else if(xianshimode==1)
	{
		smgbuffer[0]=smgbuffer[2]=10;
		smgbuffer[1]=4;
		smgbuffer[3]=11;smgbuffer[4]=11;
		smgbuffer[5]=temp/1000;
		smgbuffer[6]=temp%1000/100;
		smgbuffer[7]=12;		
	}
}

void LED()
{
	if(shengyu!=0)
	{
		if(mode==1)      {P0=0xfe; P2=P2&0x1f|0x80; P2=P2&0x1f;}
		else if(mode==2) {P0=0xfd; P2=P2&0x1f|0x80; P2=P2&0x1f;}
		else if(mode==3) {P0=0xfb; P2=P2&0x1f|0x80; P2=P2&0x1f;}
	}
	else if(shengyu==0)
	{
		P0=0xff; P2=P2&0x1f|0x80; P2=P2&0x1f;
	}
}

void PWM
{
	if(mode==1)      zahnkong=0.2;
	else if(mode==2) zhankong=0.3;
	else if(mode==3) zhankong=0.7;
	
}

void main()
{
	P0=0x00; P2=P2&0x1f|0xa0; P2=P2&0x1f;
	P0=0xff; P2=P2&0x1f|0x80; P2=P2&0x1f;
	wenduwending();
  Timer1Init();
	while(1)
	{
		xianshi();
		wenduhuoqu();
		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;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值