蓝桥杯第13届省赛题代码

先是题目

代码部分

#include <STC12C5A60S2.H>
#include <onewire.h>
#include <ds1302.h>
#include <iic.h>

sbit R3=P3^2;
sbit R4=P3^3;
sbit C3=P3^5;
sbit C4=P3^4;
sbit L3=P0^2;
sbit L2=P0^1;
sbit L1=P0^0;

unsigned char j=0;
unsigned char l=0;
unsigned char m=0;
unsigned int temp;
unsigned char k=0;
unsigned char time1=0;
unsigned char time2=0;
unsigned char time3=0;
unsigned char canshu=23;
unsigned char sec=20;
unsigned char min=53;
unsigned char hour=23;
unsigned char mode=0;
unsigned char count=0;
unsigned char flag=0;
unsigned char state=0x00;
unsigned char state_led=0x00;

void display(unsigned char m);
void Init_DS1302_Param();
void read();
void Read_DS1302_Time();
void way();

unsigned char SMGnodot[10]=
              {0xc0,0xf9,0xa4,0xb0,0x99,0x92,
							 0x82,0xf8,0x80,0x90};

unsigned char SMGdot[10]=
							 {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
							 
unsigned char code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
unsigned char TIME[7] = {0x50, 0x59, 0x22, 0x23, 0x02, 0x24, 0x20};
							 							 
void InitHC138(unsigned char n)
{
    switch(n)
		{
		    case 4:
				    P2=(P2&0x1f)|0x80;
						break;
				case 5:
				    P2=(P2&0x1f)|0xa0;
						break;
				case 6:
				    P2=(P2&0x1f)|0xc0;
						break;
				case 7:
				    P2=(P2&0x1f)|0xe0;
						break;
		}
}

void quiet()
{
    InitHC138(5);
		P0=0x00;
		InitHC138(4);
		P0=0xff;
		Init_DS1302_Param();
}

void delay(unsigned char t)
{
    while(t--);
}

void delaySMG(unsigned char t)
{
    while(t--);
}

void SMGshow(unsigned char pos,unsigned char dat)
{
		InitHC138(6);
		P0=0xff;
    InitHC138(6);
		P0=0x01<<pos;
		InitHC138(7);
		P0=dat;
		delaySMG(500);
}

//#=================================

void start()
{
    TMOD=0x01;
		TH0=(65535-50000)/256;
		TL0=(65535-50000)%256;
		ET0=1;
		EA=1;
		TR0=1;
}


void service() interrupt 1
{
		TH0=(65535-50000)/256;
		TL0=(65535-50000)%256;
		Read_DS1302_Time();
		read();
		if(state==0x10)
		{
				l++;
				if(l==2)
				{
				    l=0;
						InitHC138(4);
				    L3=~L3;
				}
		}
		if(flag==1)
		{
		    j++;
				if(mode%2==0)
				{
				    state=0x10;
				}
				InitHC138(5);
				P0=state;
		    if(j==100)
				{
				    flag=0;
						j=0;
						InitHC138(4);
						L1=1;
						L3=1;
				}
				InitHC138(5);
				state=0x00;
				P0=state;
		}
}

void read()
{
    unsigned char LSB,MSB;
		init_ds18b20();
		Write_DS18B20(0xcc);   
		Write_DS18B20(0x44);
		delay(1000);
		init_ds18b20();
		Write_DS18B20(0xcc);
		Write_DS18B20(0xbe);		
		LSB=Read_DS18B20();
		MSB=Read_DS18B20();
		temp=MSB;
		temp=(temp<<8)|LSB;
		if((temp&0xf800)==0x0000)
		{
		    temp>>=4;
				temp=temp*10;
				temp=temp+(LSB&0x0f)*0.625;
		}
		if(mode%2==1)
		{
				if((10*canshu)<=temp)
				{
						InitHC138(5);
						state=0x10;
						P0=state;
				}
				else
				{
						InitHC138(5);
						state=0x00;
						P0=state;
						InitHC138(4);
						L3=1;
				}
		}
}

void Init_DS1302_Param()
{
    unsigned char i;
    Write_Ds1302_Byte(0x8E,0x00); 
    for(i = 0; i < 7; i++)        
    {
      Write_Ds1302_Byte(WRITE_RTC_ADDR[i],TIME[i]);
    }
    Write_Ds1302_Byte(0x8E,0x80); 
}

void Read_DS1302_Time()
{
    sec = Read_Ds1302_Byte(0x81);
    min = Read_Ds1302_Byte(0x83);
    hour = Read_Ds1302_Byte(0x85); 
		if(min==0&&sec==0)
		{
				InitHC138(4);
				L1=0;
				flag=1;
		}
}

void way()
{
		if(m==1)
		{
				read();
				display(1);
		}
		if(m==2)
		{
				Read_DS1302_Time();
				display(21);
		}
		if(m==3)
		{
		    display(3);
		}
}

void display(unsigned char m)
{
    switch(m)
		{
		    case 1:
		        SMGshow(1,SMGnodot[1]);
						SMGshow(5,SMGnodot[temp/100]);
						SMGshow(6,SMGdot[(temp/10)%10]);
						SMGshow(7,SMGnodot[temp%10]);
						break;
			  case 21:
		        SMGshow(1,SMGnodot[2]);
						SMGshow(3,SMGnodot[hour >> 4]);
						SMGshow(4,SMGnodot[hour & 0x0f]);
						SMGshow(5,SMGnodot[0]);
						SMGshow(6,SMGnodot[min >> 4]);
						SMGshow(7,SMGnodot[min & 0x0f]);
						break;
				case 22:
		        SMGshow(1,SMGnodot[2]);
						SMGshow(3,SMGnodot[min >> 4]);
						SMGshow(4,SMGnodot[min & 0x0f]);
						SMGshow(5,SMGnodot[0]);
						SMGshow(6,SMGnodot[(sec >> 4) & 0x07]);
						SMGshow(7,SMGnodot[sec & 0x0f]);
						break;		
				case 3:
		        SMGshow(1,SMGnodot[3]);
						SMGshow(6,SMGnodot[canshu/10]);
						SMGshow(7,SMGnodot[canshu%10]);
						break;
		}
}


void scankey()
{
    C3=0;C4=1;
		R3=1;R4=1;
		if(R4==0)//S12
		{
		    delay(100);
				if(R4==0)
				{
				    m++;
						while(R4==0)
						{
						    display(m);
						}
						if(m==4)
						{
						    m=1;
						}
				}
		}
		if(R3==0)//s13
		{
		    delay(100);
				if(R3==0)
				{
				    mode++;
						if(mode%2==1){
						    InitHC138(4);
						    L2=0;
						}
						else
						    InitHC138(4);
						    L2=1;
				}
		}
		C3=1;C4=0;
		if(R4==0)//s16
		{
		    delay(100);
				if(R4==0)
				{
				    canshu++;
						while(R4==0)
						{
						    display(3);
						}
						if(canshu>=99)
						{
						    canshu=99;
						}
				}
		}
		if(R3==0)//s17
		{
		    delay(100);
				if(R3==0)
				{
				    if(m==3){
									canshu--;
				    		  if(canshu<=10)
				    		  {
				    		      canshu=10;
				    		  }
				    		  while(R3==0)
				    		  {
				    		      display(3);
				    		  }
				    }
						else if(m==2)
						{
						    while(R3==0)
								{
										Read_DS1302_Time();
										display(22);
								}
								display(21);
						}
						
				}
		}
		
}

void main()
{
    quiet();
		init_ds18b20();
		start();
    while(1)
		{
		    scankey();
				way();
		}
}

这是onewire.c的代码,因为做了点调整,所以发出来,其他的比如iic.c没有做调整就不发出来占空间了

#include "onewire.h"
 
void Delay_OneWire(unsigned int t)  //STC89C52RC
{
  unsigned int n;          //?????????
  n = t * 10;              //??10?????
  //IAP15F2K61S2?1T?8051?????
  while(n--);
}//这里记得乘以10或12
 
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);
}
 
unsigned char Read_DS18B20(void)
{
	unsigned char i;
	unsigned char dat;
  
	for(i=0;i<8;i++)
	{
		DQ = 0;
		dat >>= 1;
		Delay_OneWire(1);//这块加了个延时函数
		DQ = 1;
		if(DQ)
		{
			dat |= 0x80;
		}	    
		Delay_OneWire(5);
	}
	return dat;
}
 
 
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;
}
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值