蓝桥杯单片机第八届省赛真题及代码

 

 

 

代码: 

main.c

#include "key.h"
#include "timer.h"
#include "smg.h"
#include "onewire.h"
#include "ds1302.h"

void System_Init()
{
	Slect_573(0, 0x00);
	Slect_573(4, 0xff);
	Slect_573(5, 0x00);
	SMG_Display_All(0xff);
	Set_time(0x23, 0x59, 0x50);
	temp_init();
	Timer0Init();
}

void main()
{
	System_Init();
	while(1)
	{
		SMG_Display();
		key_scan();
		control();
	}
}

ds1302.c

/*	# 	DS1302代码片段说明
	1. 	本文件夹中提供的驱动代码供参赛选手完成程序设计参考。
	2. 	参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题
		中对单片机时钟频率的要求,进行代码调试和修改。
*/								

//
#include "ds1302.h"

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

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

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

void Set_time(uchar hour, uchar min, uchar sec)
{
	Write_Ds1302_Byte(0x8e, 0x00);
	Write_Ds1302_Byte(0x80, sec);
	Write_Ds1302_Byte(0x82, min);
	Write_Ds1302_Byte(0x84, hour);
	Write_Ds1302_Byte(0x8e, 0x80);
}

char hour=0,min=0,sec=0; 
void Read_time()
{
	hour=Read_Ds1302_Byte(0x85);
	min=Read_Ds1302_Byte(0x83);
	sec=Read_Ds1302_Byte(0x81);
}

uchar F_timeout=0;
extern volatile char hour_param,min_param,sec_param;
extern volatile uint count1;

void control()
{
	if((hour_param==((hour/16)*10+hour%16))&&
		(min_param==((min/16)*10+min%16))&&
		(sec_param==((sec/16)*10+sec%16)))
	{
		F_timeout=1;
		count1=0;
		
	}
}

ds1302.h

#ifndef __DS1302_H
#define __DS1302_H

#include "stc15f2k60s2.h"
#include "intrins.h"
#include "smg.h"

sbit SCK=P1^7;
sbit SDA=P2^3;
sbit RST=P1^3;

#define   uchar  unsigned char
#define   uint   unsigned int

void Write_Ds1302(unsigned  char temp) ;
void Write_Ds1302_Byte( unsigned char address,unsigned char dat );
unsigned char Read_Ds1302_Byte ( unsigned char address );
void Set_time(uchar hour, uchar min, uchar sec);
void Read_time();
void control();

#endif 

onewire.c

/*	# 	单总线代码片段说明
	1. 	本文件夹中提供的驱动代码供参赛选手完成程序设计参考。
	2. 	参赛选手可以自行编写相关代码或以该代码为基础,根据所选单片机类型、运行速度和试题
		中对单片机时钟频率的要求,进行代码调试和修改。
*/

#include "onewire.h"
void Delay_OneWire(unsigned int t)  
{
	unsigned char i;
	while(t--){
		for(i=0;i<12;i++);
	}
}

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

void temp_init()
{
	uchar h,l;
	uint temp;
	
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	
	do{
		init_ds18b20();
		Write_DS18B20(0xcc);
		Write_DS18B20(0xbe);
		l=Read_DS18B20();
		h=Read_DS18B20();
		temp=(h<<8)|l;
	}while(temp==1360);
}

float Read_temp()
{
	uchar h,l;
	uint temp;
	float temp_f;
	
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	l=Read_DS18B20();
	h=Read_DS18B20();
	temp=(h<<8)|l;
	if((temp&0xf800)==0x00)
	{
		temp_f=temp*0.0625;
	}
	
	return temp_f;
	
}

onewire.h

#ifndef __ONEWIRE_H
#define __ONEWIRE_H

#include "stc15f2k60s2.h"
#include "smg.h"

sbit DQ=P1^4;

void Delay_OneWire(unsigned int t) ;
void Write_DS18B20(unsigned char dat);
unsigned char Read_DS18B20(void);
bit init_ds18b20(void);
void temp_init();
float Read_temp();

#endif 

key.c

#include "key.h"

sbit s4=P3^3;
sbit s5=P3^2;
sbit s6=P3^1;
sbit s7=P3^0;

char hour_param=0,min_param=0,sec_param=0;
uchar key7_flag=0,key6_flag=0;
extern volatile uchar display_flag;
extern volatile char hour,min,sec;
extern volatile uchar F_timeout;
void key_scan()
{
	if(s4==0)//"-"
	{
		delay_ms(10);
		if(s4==0)
		{
			F_timeout=0;
			Slect_573(4, 0xff);
			
			if(key6_flag)//闹钟设置
			{
				if(key6_flag==1)//时
				{
					hour_param--;
					if(hour_param<0)
						hour_param=23;
				}
				if(key6_flag==2)//分
				{
					min_param--;
					if(min_param<0)
						min_param=59;
				}
				if(key6_flag==3)//秒
				{
					sec_param--;
					if(sec_param<0)
						sec_param=59;
				}
			}
			
			if(key7_flag)//时间设置
			{
				if(key7_flag==1)//时
				{
					hour=(hour/16)*10+hour%16;
					hour--;
					if(hour<0)
						hour=23;
					hour=(hour/10)*16+hour%10;
				}
				
				if(key7_flag==2)//分
				{
					min=(min/16)*10+min%16;
					min--;
					if(min<0)
						min=59;
					min=(min/10)*16+min%10;
				}
				
				if(key7_flag==3)//秒
				{
					sec=(sec/16)*10+sec%16;
					sec--;
					if(sec<0)
						sec=59;
					sec=(sec/10)*16+sec%10;
				}
				Set_time(hour, min, sec);
				
			}
			while(s4==0)
			{
				if((key6_flag==0)&&(key7_flag==0))
					display_flag=1;
				SMG_Display();
			}
			display_flag=0;
		}
	}
	
	
	if(s5==0)//"+"
	{
		delay_ms(10);
		if(s5==0)
		{
			F_timeout=0;
			Slect_573(4, 0xff);
			
			if(key6_flag)//闹钟设置
			{
				if(key6_flag==1)//时
				{
					hour_param++;
					if(hour_param>23)
						hour_param=0;
				}
				if(key6_flag==2)//分
				{
					min_param++;
					if(min_param>59)
						min_param=0;
				}
				if(key6_flag==3)//秒
				{
					sec_param++;
					if(sec_param>59)
						sec_param=0;
				}
			}
			
			if(key7_flag)//时间设置
			{
				if(key7_flag==1)//时
				{
					hour=(hour/16)*10+hour%16;
					hour++;
					if(hour>23)
						hour=0;
					hour=(hour/10)*16+hour%10;
				}
				
				if(key7_flag==2)//分
				{
					min=(min/16)*10+min%16;
					min++;
					if(min>59)
						min=0;
					min=(min/10)*16+min%10;
				}
				
				if(key7_flag==3)//秒
				{
					sec=(sec/16)*10+sec%16;
					sec++;
					if(sec>59)
						sec=0;
					sec=(sec/10)*16+sec%10;
				}
				Set_time(hour, min, sec);
			}
			while(s5==0)
			{
				SMG_Display();
			}
		}
	}
	
	
	if(s6==0)
	{
		delay_ms(10);
		if(s6==0)
		{
			F_timeout=0;
			Slect_573(4, 0xff);
			
			key6_flag++;
			if(key6_flag>3)
				key6_flag=0;
			while(s6==0)
			{
				SMG_Display();
			}
		}
	}
	
	
	if(s7==0)
	{
		delay_ms(10);
		if(s7==0)
		{
			F_timeout=0;
			Slect_573(4, 0xff);
			
				key7_flag++;
			if(key7_flag>3)
				key7_flag=0;
			
			while(s7==0)
			{
				SMG_Display();
			}
		}
	}
}

key.h

#ifndef __KEY_H
#define __KEY_H

#include "stc15f2k60s2.h"
#include "smg.h"

void key_scan();

#endif 

smg.c

#include "smg.h"

//-------共阳数码管的段码编码表(无小数点)--------
unsigned char code SMG_NoDot[10]={0xc0,0xf9,
    0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//-------共阳数码管的段码编码表(带小数点)--------
unsigned char code SMG_Dot[10]={0x40,0x79,
    0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};

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

	i = 12;
	j = 169;
	do
	{
		while (--j);
	} while (--i);
}

void delay_ms(uint ms)
{
	while(ms--)
	{
		Delay1ms();
	}
}

void Slect_573(uchar channel, uchar dat)
{
	P0=dat;
	switch(channel)
	{
		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;
		case 0:
			P2=(P2&0X1F)|0X00;
		break;
	}
	P2=(P2&0X1F)|0X00;
}

void SMG_Display_Bit(uchar pos, uchar value)
{
	Slect_573(6, 0x01<<pos-1);
	Slect_573(7, value);
	delay_ms(2);
	Slect_573(6, 0x01<<pos-1);
	Slect_573(7, 0xff);
}

void SMG_Display_All(uchar value)
{
	Slect_573(6, 0xff);
	Slect_573(7, value);
}

extern volatile char hour,min,sec;
extern volatile uchar key7_flag,key6_flag;
extern volatile uint count;
extern volatile char hour_param,min_param,sec_param;

uchar display_flag=0;

void SMG_Display()
{
	float temp_f=0;
	uint temp_smg=0;
	
	switch(display_flag)
	{
		case 0:
			if((key6_flag==0)&&(key7_flag==0))
			{
				Read_time();

				SMG_Display_Bit(1, SMG_NoDot[hour/16]);
				SMG_Display_Bit(2, SMG_NoDot[hour%16]);
				SMG_Display_Bit(3, 0xbf);
				SMG_Display_Bit(4, SMG_NoDot[min/16]);
				SMG_Display_Bit(5, SMG_NoDot[min%16]);
				SMG_Display_Bit(6, 0xbf);
				SMG_Display_Bit(7, SMG_NoDot[sec/16]);
				SMG_Display_Bit(8, SMG_NoDot[sec%16]);
			}
			if(key7_flag==1)
			{
				if(count<100)
				{
					SMG_Display_Bit(1, SMG_NoDot[hour/16]);
					SMG_Display_Bit(2, SMG_NoDot[hour%16]);
				}
				SMG_Display_Bit(3, 0xbf);
				SMG_Display_Bit(4, SMG_NoDot[min/16]);
				SMG_Display_Bit(5, SMG_NoDot[min%16]);
				SMG_Display_Bit(6, 0xbf);
				SMG_Display_Bit(7, SMG_NoDot[sec/16]);
				SMG_Display_Bit(8, SMG_NoDot[sec%16]);
			}
			if(key7_flag==2)
			{
				SMG_Display_Bit(1, SMG_NoDot[hour/16]);
				SMG_Display_Bit(2, SMG_NoDot[hour%16]);
				SMG_Display_Bit(3, 0xbf);
				if(count<100)
				{
					SMG_Display_Bit(4, SMG_NoDot[min/16]);
					SMG_Display_Bit(5, SMG_NoDot[min%16]);
				}
				SMG_Display_Bit(6, 0xbf);
				SMG_Display_Bit(7, SMG_NoDot[sec/16]);
				SMG_Display_Bit(8, SMG_NoDot[sec%16]);
			}
			if(key7_flag==3)
			{
				SMG_Display_Bit(1, SMG_NoDot[hour/16]);
				SMG_Display_Bit(2, SMG_NoDot[hour%16]);
				SMG_Display_Bit(3, 0xbf);
				SMG_Display_Bit(4, SMG_NoDot[min/16]);
				SMG_Display_Bit(5, SMG_NoDot[min%16]);
				SMG_Display_Bit(6, 0xbf);
				if(count<100)
				{
					SMG_Display_Bit(7, SMG_NoDot[sec/16]);
					SMG_Display_Bit(8, SMG_NoDot[sec%16]);
				}
			}
			
			if(key6_flag==1)
			{
				SMG_Display_Bit(1, SMG_NoDot[hour_param/10]);
				SMG_Display_Bit(2, SMG_NoDot[hour_param%10]);
				SMG_Display_Bit(3, 0xbf);
				SMG_Display_Bit(4, SMG_NoDot[min_param/10]);
				SMG_Display_Bit(5, SMG_NoDot[min_param%10]);
				SMG_Display_Bit(6, 0xbf);
				SMG_Display_Bit(7, SMG_NoDot[sec_param/10]);
				SMG_Display_Bit(8, SMG_NoDot[sec_param%10]);
			}
			if(key6_flag==2)
			{
				SMG_Display_Bit(1, SMG_NoDot[hour_param/10]);
				SMG_Display_Bit(2, SMG_NoDot[hour_param%10]);
				SMG_Display_Bit(3, 0xbf);
				SMG_Display_Bit(4, SMG_NoDot[min_param/10]);
				SMG_Display_Bit(5, SMG_NoDot[min_param%10]);
				SMG_Display_Bit(6, 0xbf);
				SMG_Display_Bit(7, SMG_NoDot[sec_param/10]);
				SMG_Display_Bit(8, SMG_NoDot[sec_param%10]);
			}
			if(key6_flag==3)
			{
				SMG_Display_Bit(1, SMG_NoDot[hour_param/10]);
				SMG_Display_Bit(2, SMG_NoDot[hour_param%10]);
				SMG_Display_Bit(3, 0xbf);
				SMG_Display_Bit(4, SMG_NoDot[min_param/10]);
				SMG_Display_Bit(5, SMG_NoDot[min_param%10]);
				SMG_Display_Bit(6, 0xbf);
				SMG_Display_Bit(7, SMG_NoDot[sec_param/10]);
				SMG_Display_Bit(8, SMG_NoDot[sec_param%10]);
			}
			
		break;
		
		case 1:
			temp_f=Read_temp();
			temp_smg=temp_f;
			SMG_Display_Bit(6, SMG_NoDot[temp_smg/10]);
			SMG_Display_Bit(7, SMG_NoDot[temp_smg%10]);
			SMG_Display_Bit(8, 0xc6);
		break;
	}
	
}

smg.h

#ifndef __SMG_H
#define __SMG_H

#include "stc15f2k60s2.h"
#include "onewire.h"
#include "ds1302.h"

#define   uchar  unsigned char
#define   uint   unsigned int

void Delay1ms();
void delay_ms(uint ms);
void Slect_573(uchar channel, uchar dat);
void SMG_Display_Bit(uchar pos, uchar value);
void SMG_Display_All(uchar value);
void SMG_Display();

#endif 

timer.c

#include "timer.h"

void Timer0Init(void)		//10毫秒@12.000MHz
{
	AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0xF0;		//设置定时初值
	TH0 = 0xD8;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	
	EA=1;
	ET0=1;
	
}

uchar led_stat=0xff;
uint count=0,count1=0;
extern volatile uchar F_timeout;

void Timer0()  interrupt 1
{
	count++;
	count1++;
	if(count==200)
		count=0;
	if(F_timeout==1)
	{
		if(count1==20)
		{
			count1=0;
			if(led_stat&0x01==0x01)
				led_stat &= ~0x01; 
			else
				led_stat |= 0x01;
			Slect_573(4, led_stat);
		}
	}
	
}

timer.h

#ifndef __TIMER_H
#define __TIMER_H

#include "stc15f2k60s2.h"
#include "smg.h"

void Timer0Init(void);

#endif 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Do My Best

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值