蓝桥杯单片机组第十届国赛

main.c

#include"stc15f2k60s2.h"
#include"onewire.h"
#include"iic.h"
#include"intrins.h"

sbit TX=P1^0;
sbit RX=P1^1;

unsigned char code smgduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc0&0x7f,0xf9&0x7f,0xa4&0x7f,0xb0&0x7f,0x99&0x7f,0x92&0x7f,0x82&0x7f,0xf8&0x7f,0x80&0x7f,0x90&0x7f,~0x39,~0x38,~0x37,~0x73,0xff};
unsigned char smgbuffer[8];
unsigned char smgcom,keytt,wendutt;

unsigned int a=0,b=0,c=0; 
unsigned int cishu;
//
unsigned char chaott;
unsigned int t,dis;
//
bit mode;
unsigned char moshi;
unsigned char wenducanshu=30,julicanshu=35;
unsigned char wenducanshu0,julicanshu0;
                      
bit xieflag=0,duflag=0;
bit ttflag=0,tttflag=0;
bit DACflag=1;

bit qingchuflag=0;

unsigned int ttttt=0,tttttt=0;
unsigned char DAtt;
/********************************************************************/
unsigned char txbuffer1[] = "IAP15F2 USART TEST PROGRAM\r\n";
unsigned char jieshou;
bit flag=0;

void distance_get();
void display();
void keyscan();

void Delay12us()		//@12.000MHz
{
	unsigned char i;

	_nop_();
	_nop_();
	i = 33;
	while (--i);
}

void Delay2ms()		//@12.000MHz
{
	unsigned char i, j;

	i = 24;
	j = 85;
	do
	{
		while (--j);
	} while (--i);
}

/********************************************************/
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 Timer0Init(void)		//100微秒@12.000MHz
{
	AUXR |= 0x80;		//定时器时钟1T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0x00;		//设置定时初值
	TH0 = 0x00;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 0;		//定时器0开始计时
	ET0=0;
}



void Timer1() interrupt 3
{
	unsigned char P0_keeper=0,P2_keeper=0;
	P0_keeper=P0; P2_keeper=P2; P2=P2&0x1f|0x80;

	DAtt++;
	wendutt++;
	if(mode==0 && moshi==1)chaott++; 
	keytt++; if(keytt==10) {keyscan(); keytt=0;}
	
	if(ttflag==1)     ttttt++;
	else if(ttflag==0)ttttt=0;
	
	if(tttflag==1)    tttttt++;
	else if(tttflag==0)tttttt=0;

	
	
	display();

	P0=P0_keeper; P2=P2_keeper;
}

void UartInit(void)		//4800bps@12.000MHz
{
	SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x01;		//串口1选择定时器2为波特率发生器
	AUXR |= 0x04;		//定时器2时钟为Fosc,即1T
	T2L = 0x8F;		//设定定时初值
	T2H = 0xFD;		//设定定时初值
	AUXR |= 0x10;		//启动定时器2
	ES=1;///
}


void ser() interrupt 4   //串口中断
{
	RI=0;
	jieshou=SBUF;
	if(jieshou=='$')
	{
		P2=0X80; P0=0X55;
	}
}

void send(unsigned char *p)
{
	unsigned char index=0;
	do
	{
		SBUF=p[index++];
		while(TI == 0);
		TI = 0;
	}
	while(p[index]!=0);
}

void chuankou()
{
	if(flag==1)
	{
		send(txbuffer1);
		flag=0;
	}
}


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()
{
  static unsigned char keystat;
	unsigned char key_x=0,key_y=0,key_z=0;

	P4=0x00; P37=0; P36=0; P35=0; P34=0; P33=1; P32=1;  
//	if(!P30)        key_x=3;
//	else if(!P31)   key_x=2;
	if(!P32)		    key_x=1;
	else if(!P33)		key_x=0;

	P4=0xff; P3=0xf0;
	if(!P34)   			key_y=4;
	else if(!P35)   key_y=3;
	else if(!P42)   key_y=2;
	else if(!P44)		key_y=1;

	key_z=key_x+key_y*4;
	switch(keystat)
	{
		case 0:if(key_z!=0) keystat=1; break;
		case 1:if(key_z==0) keystat=0;
						else
						{
							keystat=2;
							switch(key_z)
							{
								case 13: tttflag=1;
													break;
								case 12:ttflag=1;
													break;	
								case 16:if(mode==1)
												{ 
													if(moshi==0)
													{
														wenducanshu=wenducanshu-2;
														if(wenducanshu==-2)wenducanshu=0;
													}
													else if(moshi==1)
													{
														julicanshu=julicanshu-5;
														if(julicanshu==-5)julicanshu=0;
													}
											 }break;
								case 17:if(mode==1)
												{ 
													if(moshi==0)
													{
														wenducanshu=wenducanshu+2;
														if(wenducanshu==100)wenducanshu=98;    //????????99
													}
													else if(moshi==1)
													{
														julicanshu=julicanshu+5;
														if(julicanshu==100)julicanshu=95;
													}
											 }break;						 
							}
						}break;
		case 2:if(key_z==0)
						{
							if(ttflag==1)
							{
						  	if(ttttt<1000)
								{
									if(mode==0){moshi++; if(moshi==1) duflag=1; if(moshi==3)moshi=0;}
									else if(mode==1){moshi++; if(moshi==2)moshi=0;}
								}
								else if(ttttt>1000) {qingchuflag=1; cishu=0;}
								ttflag=0;
						}
						else if(tttflag)
						{
							if(tttttt<1000)
							{
						  	if(mode==0)
								{
									mode=1;
									moshi=0;
								  wenducanshu0=wenducanshu;
									julicanshu0=julicanshu;
								}
								else if(mode==1)
								{
									mode=0;
									moshi=0;
									if(wenducanshu!=wenducanshu0 || julicanshu!=julicanshu0) {cishu++; xieflag=1;}
								}												
							}
							else if(tttttt>1000)
							{
								DACflag=~DACflag;
							}
							tttflag=0;
						}
						keystat=0;	
						} break;
	}
}
/**********************************************************************/
void sendwave()
{
	unsigned char i;
	for(i=0;i<16;i++)
	{
		TX=~TX;
		Delay12us();
	}
}

void distance_get()
{
	TH0=TL0=0;
	sendwave();
	TR0=1;
	while((RX==1)&&(TF0==0));
	TR0=0;	
	if(TF0==1){TF0=0; dis=999;}
	else dis=((TH0<<8)|TL0)*0.0018;    //000厘米~999厘米
}
/**********************************************************************/

void wenduwending()
{
	unsigned char Ti;
	for(Ti=0;Ti<70;Ti++)
	{
		temp=tempget()*100+0.5;
	}
}

void wenduhuoqu()
{
	if(wendutt==200)
	{
		temp=tempget()*100+0.5;
		wendutt=0;
	}
}

void wavehuoqu()
{
	if(chaott>200){distance_get(); chaott=0;}
}

void xianshi()
{
	if(mode==0)
	{
		if(moshi==0)
		{
			smgbuffer[0]=20;
			smgbuffer[1]=smgbuffer[2]=smgbuffer[3]=24;
			smgbuffer[4]=temp/1000;
			smgbuffer[5]=temp%1000/100+10;
			smgbuffer[6]=temp%1000%100/10;
			smgbuffer[7]=temp%10;
		}
		else if(moshi==1)
		{
			smgbuffer[0]=21;
			smgbuffer[1]=smgbuffer[2]=smgbuffer[3]=smgbuffer[4]=smgbuffer[5]=24;
			smgbuffer[6]=dis%100/10;
			smgbuffer[7]=dis%10;
		}
		else if(moshi==2)
		{
			smgbuffer[0]=22;
			smgbuffer[1]=smgbuffer[2]=24;
			if(cishu<10){smgbuffer[3]=smgbuffer[4]=smgbuffer[5]=smgbuffer[6]=24; smgbuffer[7]=cishu;}
			else if(10<=cishu<100){smgbuffer[3]=smgbuffer[4]=smgbuffer[5]=24;smgbuffer[6]=cishu/10; smgbuffer[7]=cishu%10;}
			else if(100<=cishu<1000){smgbuffer[3]=smgbuffer[4]=24; smgbuffer[5]=cishu/100;smgbuffer[6]=cishu%100/10;smgbuffer[7]=cishu%10;}
			else if(1000<=cishu<10000){smgbuffer[3]=24; smgbuffer[4]=cishu/1000;smgbuffer[5]=cishu%1000/100;smgbuffer[6]=cishu%1000%100/10;smgbuffer[7]=cishu%10;}
		  else if(10000<=cishu){smgbuffer[3]=cishu/10000;smgbuffer[4]=cishu%10000/1000;smgbuffer[5]=cishu%10000%1000/100;smgbuffer[6]=cishu%10000%1000%100/10;smgbuffer[7]=cishu%10;}
		}
	}
	else if(mode==1)
	{
		if(moshi==0)
		{
			smgbuffer[0]=23;
			smgbuffer[1]=smgbuffer[2]=smgbuffer[4]=smgbuffer[5]=24;
			smgbuffer[3]=1;
			smgbuffer[6]=wenducanshu/10;
			smgbuffer[7]=wenducanshu%10;
		}
		else if(moshi==1)
		{
			smgbuffer[0]=23;
			smgbuffer[1]=smgbuffer[2]=smgbuffer[4]=smgbuffer[5]=24;
			smgbuffer[3]=2;
			smgbuffer[6]=julicanshu/10;
			smgbuffer[7]=julicanshu%10;
		}
	}
}

void EEPROM()
{															  
	if(xieflag==1)
	{
		EEPROM_write(0x00,cishu/10000); Delay2ms();
		EEPROM_write(0x01,cishu%10000/100); Delay2ms();
		EEPROM_write(0x02,cishu%100); Delay2ms(); 
		xieflag=0;
	}
	if(duflag==1)
	{
		a=EEPROM_read(0x00); Delay2ms();
		b=EEPROM_read(0x01); Delay2ms();
		c=EEPROM_read(0x02); Delay2ms();
		cishu=a*10000+b*100+c; 
		duflag=0;		
	}
	if(qingchuflag==1)
	{
		EEPROM_write(0x00,0); Delay2ms();
		EEPROM_write(0x01,0); Delay2ms();
		EEPROM_write(0x02,0); Delay2ms();
		qingchuflag=0; 
	}
}

void DAC()
{
	if(DACflag==1)
	{
		if(dis<julicanshu)
		{
			if(DAtt==200)
			{

				AD_write(0x40,102);
				
				DAtt=0;
			}
		}													
		else if(dis>=julicanshu)
		{
			if(DAtt==200)
			{
				AD_write(0x40,204);					
				DAtt=0;
			}			
		}	
	}
	else if(DACflag==0)
	{
		if(DAtt==200)
		{
			AD_write(0x40,26);					
			DAtt=0;
		}
	}
}




void main()
{
	P0=0x00; P2=P2&0x1f|0xa0; P2=P2&0x1f;
	P0=0xff; P2=P2&0x1f|0x80; P2=P2&0x1f;
	config(0x3f);
	wenduwending();
	UartInit();	
	Timer0Init();
	Timer1Init();
	while(1)
	{
		DAC();
		EEPROM();
		wavehuoqu();
		wenduhuoqu();
		chuankou();
		xianshi();	
	}
}

onwire.c

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

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;
}

void config(unsigned char jingdu)
{
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x4e);
	Write_DS18B20(0x5f);
	Write_DS18B20(0x00);
	Write_DS18B20(jingdu);		
}





iic.c

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

#include "reg52.h"
#include "intrins.h"

#define DELAY_TIME 5

#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1

//总线引脚定义
sbit SDA = P2^1;  /* 数据线 */
sbit SCL = P2^0;  /* 时钟线 */

void IIC_Delay(unsigned char i)
{
    do{_nop_();}
    while(i--);        
}
//总线启动条件
void IIC_Start(void)
{
    SDA = 1;
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SDA = 0;
    IIC_Delay(DELAY_TIME);
    SCL = 0;	
}

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

发送应答
//void IIC_SendAck(bit ackbit)
//{
//    SCL = 0;
//    SDA = ackbit;  					// 0:应答,1:非应答
//    IIC_Delay(DELAY_TIME);
//    SCL = 1;
//    IIC_Delay(DELAY_TIME);
//    SCL = 0; 
//    SDA = 1;
//    IIC_Delay(DELAY_TIME);
//}

//等待应答
bit IIC_WaitAck(void)
{
    bit ackbit;
	
    SCL  = 1;
    IIC_Delay(DELAY_TIME);
    ackbit = SDA;
    SCL = 0;
    IIC_Delay(DELAY_TIME);
    return ackbit;
}

//通过I2C总线发送数据
void IIC_SendByte(unsigned char byt)
{
    unsigned char i;

    for(i=0; i<8; i++)
    {
        SCL  = 0;
        IIC_Delay(DELAY_TIME);
        if(byt & 0x80) SDA  = 1;
        else SDA  = 0;
        IIC_Delay(DELAY_TIME);
        SCL = 1;
        byt <<= 1;
        IIC_Delay(DELAY_TIME);
    }
    SCL  = 0;  
		IIC_WaitAck();
}

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

void AD_write(unsigned char add,dat)
{
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_SendByte(add);
	IIC_SendByte(dat);
	IIC_Stop();
}

void EEPROM_write(unsigned char add,dat)
{
	IIC_Start();
	IIC_SendByte(0xa0);
	IIC_SendByte(add);
	IIC_SendByte(dat);
	IIC_Stop();
}

unsigned char EEPROM_read(unsigned char add)
{
	unsigned char EEPROM_temp;

	IIC_Start();
	IIC_SendByte(0xa0);
	IIC_SendByte(add);

	IIC_Start();
	IIC_SendByte(0xa1);
	EEPROM_temp=IIC_RecByte();
	IIC_Stop();

	return EEPROM_temp;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值