蓝桥杯单片机组第十二届省赛代码

main.c

#include<stc15f2k60s2.h>
#include"seg.h"
#include"ds18b20.h"
#include"iic.h"
sbit L1=P0^0;
sbit L2=P0^1;
sbit L3=P0^2;
sbit L4=P0^3;
long tem;
unsigned char can=25;
unsigned char can1=25;
unsigned char a;
unsigned char valt;
long v;
unsigned char qie=0;
unsigned char mod=0;



void allinit()
{
	P2=0X80;P0=0XFF;
	P2=0XA0;P0=0X00;
	P2=0XC0;P0=0XFF;
	P2=0XE0;P0=0XFF;
}
void display1()
{
	
	SEG(0,tem%10);
	SEG(1,tem/10%10);
	SEG1(2,tem/100%10);
	SEG(3,tem/1000);
	SEG(7,10);
}
void display2()
{
	SEG(0,can1%10);
	SEG(1,can1/10);
	SEG(7,11);
}
void display3()
{
	v=valt*100/51;
	SEG(0,v%10);
	SEG(1,v/10%10);
	SEG1(2,v/100);
	SEG(7,12);
}
void DAC()
{
	if(mod==0)
	{
		if(tem<can*100)
			valt=0;
		else
			valt=255;
	}
	if(mod==1)
	{
		if(tem<2000)
			valt=51;
		if(tem>4000)
			valt=204;
		if(tem>=2000&&tem<=4000)
			valt=(7.65*tem)/100-102;

	}
}
void LED()
{
	if(mod==0)
	{
		P2=0X80;
		L1=0;
	}
	else
	{
		P2=0X80;
		L1=1;
	}
	if(qie==0)
	{
		P2=0X80;
		L2=0;
	}
	else
	{
		P2=0X80;
		L2=1;
	}
	if(qie==1)
	{
		P2=0X80;
		L3=0;
	}
	else
	{
		P2=0X80;
		L3=1;
	}
	if(qie==2)
	{
		P2=0X80;
		L4=0;
	}
	else
	{
		P2=0X80;
		L4=1;
	}
	
	
	
	P2=0X00;
	P0=0xFF;
}

void main()
{
	allinit();
	while(1)
	{
		while(1)
		{
			LED();
			tem=tem_get();
			DAC();
			write_DA(valt);
			if(qie==0)
			display1();
			if(qie==1)
			display2();
			if(qie==2)
			display3();
			
			P44=0;P42=1;P3=0x7f;
			if(P3==0X77||P3==0X7B)//s4s5
				break;
			P44=1;P42=0;P3=0xbf;
			if(P3==0XB7||P3==0XBB)//s8s9
				break;
		}
		a=P3;/
		switch(a)
		{
			case 0x77:qie++;break;//s4
			case 0X7B:mod=!mod;break;//s5
			case 0XB7:if(qie==1)can1--;break;//s8
			case 0XBB:if(qie==1)can1++;break;//s9
		};
		
		
		
		
		if(qie==3)
			qie=0;
		while(a==P3)
		{
			can=can1;
			tem=tem_get();
			DAC();
			write_DA(valt);
			if(qie==0)
			display1();
			if(qie==1)
			display2();
			if(qie==2)
			display3();
		}
	}
}

seg.c

#include<stc15f2k60s2.h>
#include"seg.h"
unsigned char wei[]={0X80,0X40,0X20,0X10,0X08,0X04,0X02,0X01};
unsigned char tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0xc6,0x8c,0x88};
unsigned char tab1[]={0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10};

void delay(int a)
{
	while(a--);
}
void Delay1ms()		//@11.0592MHz
{
	unsigned char i, j;

	i = 22;
	j = 190;
	do
	{
		while (--j);
	} while (--i);
}


void SEG(int a,int b)
{
	P2=0xC0;P0=wei[a];
	P2=0xE0;P0=tab[b];
	Delay1ms();	
	P2=0X00;
	P0 = 0xFF;
	
}
void SEG1(int a,int b)
{
	P2=0xC0;P0=wei[a];
	P2=0xE0;P0=tab1[b];
	Delay1ms()	;
	P2=0X00;
	P0 = 0xFF;
}

seg.h

void SEG(int a,int b);
void SEG1(int a,int b);

ds18b20.c

#include<stc15f2k60s2.h>
#include"ds18b20.h"
//单总线内部延时函数
unsigned char temL;
unsigned char temH;


void Delay_OneWire(unsigned int t)  
{
	while(t--);
}

//单总线写操作
void Write_DS18B20(unsigned char dat)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		DQ = 0;
		DQ = dat&0x01;
		Delay_OneWire(50);
		DQ = 1;
		dat >>= 1;
	}
	Delay_OneWire(50);
}

//单总线读操作
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(50);
	}
	return dat;
}

//DS18B20初始化
void init_ds18b20(void)
{
  DQ=0;
	Delay_OneWire(250);  
	DQ=1;
	Delay_OneWire(250);  
}

long tem_get()
{
	long tem;
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	temL=Read_DS18B20();/
	temH=Read_DS18B20();//
	tem=temH;
	tem<<=8;
	tem|=temL;
	tem=tem*6.25;
	return tem;
	
}

ds18b20.h

#ifndef __ONEWIRE_H
#define __ONEWIRE_H


sbit DQ = P1^4;  

long tem_get();

#endif

iic.c

#include<stc15f2k60s2.h>
#include "iic.h"

sbit SDA = P2^1;  /* 数据线 */
sbit SCL = P2^0;  /* 时钟线 */
long V_Rb2;
long V_Rb1;

void Delay6us()		//@11.0592MHz
{
	unsigned char i;

	i = 14;
	while (--i);
}


//总线启动条件
void IIC_Start(void)
{
	SDA = 1;
	SCL = 1;
	somenop;
	SDA = 0;
	somenop;
	SCL = 0;	
}

//总线停止条件
void IIC_Stop(void)
{
	SDA = 0;
	SCL = 1;
	somenop;
	SDA = 1;
}

//应答位控制
void IIC_Ack(unsigned char ackbit)
{
	if(ackbit) 
	{	
		SDA = 0;
	}
	else 
	{
		SDA = 1;
	}
	somenop;
	SCL = 1;
	somenop;
	SCL = 0;
	SDA = 1; 
	somenop;
}

//等待应答
bit IIC_WaitAck(void)
{
	SDA = 1;
	somenop;
	SCL = 1;
	somenop;
	if(SDA)    
	{   
		SCL = 0;
		IIC_Stop();
		return 0;
	}
	else  
	{ 
		SCL = 0;
		return 1;
	}
}

//通过I2C总线发送数据
void IIC_SendByte(unsigned char byt)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{   
		if(byt&0x80) 
		{	
			SDA = 1;
		}
		else 
		{
			SDA = 0;
		}
		somenop;
		SCL = 1;
		byt <<= 1;
		somenop;
		SCL = 0;
	}
}

//从I2C总线上接收数据
unsigned char IIC_RecByte(void)
{
	unsigned char da;
	unsigned char i;
	
	for(i=0;i<8;i++)
	{   
		SCL = 1;
		Delay6us();
		da <<= 1;
		if(SDA) 
		da |= 0x01;
		SCL = 0;
		Delay6us();
	}
	return da;
}

void write_DA(unsigned char dat)
{
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(0x40);
	IIC_WaitAck();
	IIC_SendByte(dat);
	IIC_WaitAck();
	IIC_Stop();
}

iic.h

#ifndef _IIC_H
#define _IIC_H

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

#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();}
#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1

//总线引脚定义


//函数声明
void IIC_Start(void); 
void IIC_Stop(void);  
void IIC_Ack(unsigned char ackbit); 
void IIC_SendByte(unsigned char byt); 
bit IIC_WaitAck(void);  
unsigned char IIC_RecByte(void); 
void write_DA(unsigned char dat);
	

#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值