蓝桥杯之单片机设计与开发——第八届省赛_基于单片机的电子钟程序设计与调试

目前在准备蓝桥杯,自己写了往届的赛题,调试以后觉得没什么问题。希望大家能给出一些建议,指出其中的错误和不足,也真挚地希望能给大家提供一些方法和思路。共勉!

赛题

蓝桥杯之单片机设计与开发——第八届省赛_基于单片机的电子钟程序设计与调试_第1张图片

蓝桥杯之单片机设计与开发——第八届省赛_基于单片机的电子钟程序设计与调试_第2张图片


main.c

#include 
#include 
#include 
#define uchar unsigned char
#define uint unsigned int

void writedata(uchar gate,uchar mydata);
void display();
void choose(uchar value);
uchar readtab();
void m1c0();
void blink5s();

code uchar tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00,0x40};
uchar disp[]={16,16,17,16,16,17,16,16};

bit flag20ms,flag500ms,flagin,flagblink,flag100ms,flag400ms,flagpush;
uchar tem,shi1,fen1,miao1,shi,fen,miao,mode=1,ii=0,a,b,c,ala=0,alb=0,alc=0,temp80=0xff,count;

void main()
{
	uchar value=0xff;
	TMOD=0x01;
	TH0=(65536-2000)/256;
	TL0=(65536-2000)%256;
	TR0=1;
	ET0=1;
	EA=1;
	writedata(0xa0,0x00);
	set_time(23,59,50);
	while(1)
	{
		miao1=Read_Ds1302(0x81);miao=miao1/16*10+miao1%16;
		fen1=Read_Ds1302(0x83);fen=fen1/16*10+fen1%16;
		shi1=Read_Ds1302(0x85);shi=shi1/16*10+shi1%16;
		tem=rd_tem();
		while(tem>50)
			tem=rd_tem();
		if(flagblink)
			blink5s();
		if(flag20ms)
		{
			flag20ms=0;
			value=readtab();
			if(flagblink&&value!=0xff)
			{
				flagblink=0;flagin=0;
				P0=0xff;temp80=0xff;writedata(0x80,temp80);
			}
			choose(value);
		}
		if(mode==1)
		{
			if(ii==0&&flagpush==0)
			{
				disp[0]=shi/10;disp[1]=shi%10;disp[3]=fen/10;disp[2]=17;
				disp[4]=fen%10;disp[5]=17;disp[6]=miao/10;disp[7]=miao%10;
			}
			if(mode==2&&flagpush==0)
			{
				disp[0]=a/10;disp[1]=a%10;disp[3]=b/10;disp[2]=17;
				disp[4]=b%10;disp[5]=17;disp[6]=c/10;disp[7]=c%10;
			}
			if(ii==0)
			{
				if(!flagin)
				{
					if(shi==ala&&fen==alb&&miao==alc)
					{
						count=0;
						flagin=1;
						flagblink=1;
					}
				}
			}
		}
	}
}

void choose(uchar value)
{
	if(mode==1)
	{
		switch(value)
		{
			case 0:m1c0();break; 
			case 4:
			{
				if(ii==0) 
				{
					a=ala;b=alb;c=alc;mode=2;
					disp[0]=a/10;disp[1]=a%10;disp[3]=b/10;disp[2]=17;
					disp[4]=b%10;disp[5]=17;disp[6]=c/10;disp[7]=c%10;
				}
			}break;
		}
	}
	if(mode==2)
	{
		switch(value)
		{
			case 4:m1c0();break;
		}
	}
	switch(value)
	{
		case 8:
		{
			if(ii!=0)
			{
				switch(ii)
				{
					case 1:{if(++a>=24) a=23;}break;
					case 2:{if(++b>=60) b=59;}break;
					case 3:{if(++c>=60) c=59;}break;
				}
			} 
		}break;
		case 12:
		{
			if(ii!=0)
			{
				switch(ii)
				{
					case 1:{if(a--==0) a=0;};break;
					case 2:{if(b--==0) b=0;};break;
					case 3:{if(c--==0) c=0;};break;
				}
			}
		}break;	
	}
}

void m1c0()
{
	if(mode==1)
	{
		if(ii==0) {a=shi;b=fen;c=miao;}
	}
	if(++ii==4)
		ii=0;
	if(mode==1)
	{
		if(ii==0) set_time(a,b,c);
	}
	if(mode==2)
	{
		if(ii==0) {ala=a;alb=b;alc=c;mode=1;}
	}
}

void blink5s()
{
	flagin=0;
	if(flag100ms)
	{
		flag100ms=0;
		temp80^=0x01;
		P0=0xff;
		writedata(0x80,temp80);
	}
	if(count==50||ii!=0)
	{
		count=100;
		flagblink=0;
		P0=0xff;temp80=0xff;writedata(0x80,temp80);		
	}
}

void writedata(uchar gate,uchar mydata)
{
	P2=(P2&0x1f)|gate;
	P0=mydata;
	P2&=0x1f;
}

void display()
{
	static uchar i;
	if(ii!=0)
	{
		if(flag500ms)
		{
			switch(ii)
			{
				case 1:{disp[0]=16;disp[1]=16;}break;
				case 2:{disp[0]=a/10;disp[1]=a%10;disp[3]=16;disp[4]=16;}break;
				case 3:{disp[3]=b/10;disp[4]=b%10;disp[6]=16;disp[7]=16;}break;
			}
		}
		else
		{
			switch(ii)
			{
				case 1:{disp[0]=a/10;disp[1]=a%10;}break;
				case 2:{disp[0]=a/10;disp[1]=a%10;disp[3]=b/10;disp[4]=b%10;}break;
				case 3:{disp[6]=c/10;disp[7]=c%10;}break;				
			}	
		}	
	}
	if(++i==8)
		i=0;
	writedata(0xe0,0xff);
	writedata(0xc0,1<=100) count=100;
		count++;
		flag100ms=1;
	}
	if(dd++==200)
	{
		dd=0;
		flag400ms=1;
	}
}

ds1302.c

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

#include 
#include 
#define uchar unsigned char
#define uint unsigned int

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

void Write_Ds1302_Byte(unsigned  char temp) 
{
	unsigned char i;
	for (i=0;i<8;i++)     	
	{ 
		SCK=0;
		SDA=temp&0x01;
		temp>>=1; 
		SCK=1;
	}
}   

void Write_Ds1302( unsigned char address,unsigned char dat )     
{
 	RST=0;
	_nop_();
 	SCK=0;
	_nop_();
 	RST=1;	
   	_nop_();  
 	Write_Ds1302_Byte(address);	
 	Write_Ds1302_Byte(dat);		
 	RST=0; 
}

unsigned char Read_Ds1302 ( unsigned char address )
{
 	unsigned char i,temp=0x00;
 	RST=0;
	_nop_();
 	SCK=0;
	_nop_();
 	RST=1;
	_nop_();
 	Write_Ds1302_Byte(address);
 	for (i=0;i<8;i++) 	
 	{		
		SCK=0;
		temp>>=1;	
 		if(SDA)
 		temp|=0x80;	
 		SCK=1;
	} 
 	RST=0;
	_nop_();
 	RST=0;
	SCK=0;
	_nop_();
	SCK=1;
	_nop_();
	SDA=0;
	_nop_();
	SDA=1;
	_nop_();
	return (temp);			
}

void set_time(uchar shi,uchar fen,uchar miao)
{
	Write_Ds1302(0x8e,0x00);
	Write_Ds1302(0x80,miao/10*16+miao%10);
	Write_Ds1302(0x82,fen/10*16+fen%10);
	Write_Ds1302(0x84,shi/10*16+shi%10);
	Write_Ds1302(0x8e,0x80);	
}

onewire.c

/*
  程序说明: 单总线驱动程序
  软件环境: Keil uVision 4.10 
  硬件环境: CT107单片机综合实训平台(外部晶振12MHz) STC89C52RC单片机
  日    期: 2011-8-9
*/
#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
sbit DQ = P1^4;  //单总线接口

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

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

float rd_tem()
{
	uchar low,high;
	float tem;
	uint temp;
	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;
	temp=(temp<<8)|low;
	tem=temp*0.0625;
	return tem;
}

onewire.h

#ifndef __ONEWIRE_H
#define __ONEWIRE_H
#define uchar unsigned char
#define uint unsigned int
unsigned char rd_temperature(void);  //; ;
float rd_tem();
#endif

ds1302.h

#ifndef __DS1302_H
#define __DS1302_H
#define uchar unsigned char
#define uint unsigned int

void Write_Ds1302_Byte(unsigned  char temp);
void Write_Ds1302( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302 ( unsigned char address );
void set_time(uchar shi,uchar fen,uchar miao);

#endif

坐等各位大佬地批评指正,谢谢!

你可能感兴趣的:(蓝桥杯之单片机设计与开发——第八届省赛_基于单片机的电子钟程序设计与调试)