第16届蓝桥杯单片机模拟试题Ⅱ

试题

代码

sys.h

cpp 复制代码
#ifndef __SYS_H__
#define __SYS_H__

#include <STC15F2K60S2.H>
//ds1302.c
extern unsigned char time[3];
void w_ds1302();
void r_ds1302();
//iic.c
float v_adc(unsigned char addr);
//sys.c
extern float light_v;
extern float rb2_v;
extern unsigned char UI;
extern unsigned char UI_keep;
extern unsigned char ui2_son;
extern unsigned char ui2_son_flag;
extern unsigned char flag_touch[3];
extern unsigned char time_touch[3][3];
extern bit flag_happen;
void init74hc138(unsigned char addr);
void init();
void led_ui();
void rb2_or_light();
//seg_key.c
extern unsigned char Seg_Buff[8];
void Seg_Loop();
void Key_Loop();
void seg_ui();
#endif

main.c

cpp 复制代码
#include "sys.h"
bit flag_seg=0;
bit flag_key=0;
bit flag_ds=0;
bit flag_rb2=0;
bit flag_light=0;
void Timer0_Init(void)		//100微秒@12.000MHz
{
	AUXR |= 0x80;			//定时器时钟1T模式
	TMOD &= 0xF0;			//设置定时器模式
	TL0 = 0x50;				//设置定时初始值
	TH0 = 0xFB;				//设置定时初始值
	TF0 = 0;				//清除TF0标志
	TR0 = 1;				//定时器0开始计时
	ET0 = 1;				//使能定时器0中断
	EA = 1;
}
void main(){
	init();
	Timer0_Init();
	w_ds1302();
	while(1){
		led_ui();
		if(flag_seg){
			flag_seg=0;
			Seg_Loop();
		}
		if(flag_key){
			flag_key=0;
			Key_Loop();
			seg_ui();
		}
		if(flag_ds){
			flag_ds=0;
			r_ds1302();
		}
		if(flag_light){
			flag_light=0;
			light_v=v_adc(3);
			seg_ui();
		}
		if(flag_rb2){
			flag_rb2=0;
			rb2_v=v_adc(1);
			seg_ui();
		}
		rb2_or_light();
	}
}
void Timer0_Isr(void) interrupt 1
{
	static unsigned char count1=0,count2=0;
	static unsigned int count3=0,count4=0,count5=0;
	count1++;count2++;count3++;count5++;
	if(count1==2){
		count1=0;
		flag_seg=1;
	}
	if(count2==50){
		count2=0;
		flag_key=1;
	}
	if(count3==1000){
		flag_light=1;
	}else if(count3==2000){
		count3=0;
		flag_rb2=1;
	}
	if(flag_happen){
		count4++;
		if(count4==30000){
			count4=0;
			flag_happen=0;
			UI=UI_keep;
		}
	}
	if(count5==5000){
		count5=0;
		flag_ds=1;
	}
}

【第十六届蓝桥杯单片机省赛赛前贴士-哔哩哔哩】 https://b23.tv/rFzFcL2

根据up主的建议,暂且将电压读取方式改为连续读取两次,否则光敏和rb2读取的数值正好相反。

sys.c

cpp 复制代码
#include "sys.h"
unsigned char UI=0;
unsigned char UI_keep;
unsigned char ui2_son=0;
unsigned char ui2_son_flag=0;
unsigned char flag_touch[3]={0,0,0};
unsigned char time_touch[3][3]={0,0,0,0,0,0,0,0,0};
bit flag_happen=0;
float light_v;
float rb2_v;
void init74hc138(unsigned char addr){
	P2=(P2&0x1f)|(addr<<5);
	P2&=0x1f;
}
void init(){
	P0=0x00;
	init74hc138(5);
	P0=0xff;
	init74hc138(4);
}
void led(unsigned char addr){
	P0=~(0x01<<(addr-1));
	init74hc138(4);
}
void led_ui(){
	switch(UI){
		case 0:led(1);break;
		case 1:led(2);break;
		case 2:led(3);break;
		case 4:led(8);break;
	}
}
void rb2_or_light(){
	EA = 0;
	if(light_v<rb2_v&&flag_happen==0){
		flag_happen=1;
		flag_touch[ui2_son_flag]=1;
		ui2_son_flag++;
		if(ui2_son_flag==3)ui2_son_flag=0;
		time_touch[2][0]=time_touch[1][0];
		time_touch[2][1]=time_touch[1][1];
		time_touch[2][2]=time_touch[1][2];
		time_touch[1][0]=time_touch[0][0];
		time_touch[1][1]=time_touch[0][1];
		time_touch[1][2]=time_touch[0][2];
		time_touch[0][0]=time[0];
		time_touch[0][1]=time[1];
		time_touch[0][2]=time[2];
		UI_keep=UI;
		UI=4;
	}
	EA =1;
}

seg_key.c

cpp 复制代码
#include "sys.h"
sbit ROW3=P3^2;
sbit ROW4=P3^3;
sbit COL1=P4^4;
sbit COL2=P4^2;
code unsigned char Seg_Table[] = 
{
0xc0, //0
0xf9, //1
0xa4, //2
0xb0, //3
0x99, //4
0x92, //5
0x82, //6
0xf8, //7
0x80, //8
0x90, //9
0x88, //A 10
0xc6, //C 11
0x8c, //P 12
0xbf, //- 13
0xff, //熄灭 14
0xc1  //U 15
};
unsigned char Seg_Buff[8]={14,14,14,14,14,14,14,14};
unsigned char keyval,keyold,keyup,keydown;
void seg(unsigned char addr,unsigned char num){
	P0=0xff;
	init74hc138(7);
	P0=0x01<<addr;
	init74hc138(6);
	P0=Seg_Table[num];
	if(UI==1&&(addr==1||addr==5))
		P0&=0x7f;
	init74hc138(7);
}
void Seg_Loop(){
	static unsigned char i=0;
	seg(i,Seg_Buff[i]);
	i++;
	if(i==8) i=0;
}
unsigned char key_scan(){
	COL1=0;COL2=1;
	if(ROW3==0) return 5;
	if(ROW4==0) return 4;
	COL1=1;COL2=0;
	if(ROW4==0) return 8;
	return 0;
}
void Key_Loop(){
	keyval=key_scan();
	keydown=keyval&(keyold^keyval);
	keyup=~keyval&(keyold^keyval);
	if(keyval==4&&keyold!=4){
		UI++;
		if(UI==3) UI=0;
		ui2_son=0;
	}
	if(UI==2){
		if(keyval==5&&keyold!=5){
			ui2_son++;
			if(ui2_son==3) ui2_son=0;
		}
		if(keyval==8&&keyold!=8){
			ui2_son_flag=0;
			flag_touch[0]=0;
			flag_touch[1]=0;
			flag_touch[2]=0;
		}
	}
	keyold=keyval;
	keyval=0;
}
void ui0(){
	Seg_Buff[7]=time[0]%10;
	Seg_Buff[6]=time[0]/10;
	Seg_Buff[5]=13;
	Seg_Buff[4]=time[1]%10;
	Seg_Buff[3]=time[1]/10;
	Seg_Buff[2]=13;
	Seg_Buff[1]=time[2]%10;
	Seg_Buff[0]=time[2]/10;
}
void ui1(){
	Seg_Buff[7]=(unsigned char)(rb2_v*100+0.5)%10;
	Seg_Buff[6]=(unsigned char)(rb2_v*100+0.5)/10%10;
	Seg_Buff[5]=(unsigned char)(rb2_v*100+0.5)/100%10;
	Seg_Buff[4]=15; //U
	Seg_Buff[3]=(unsigned char)(light_v*100+0.5)%10;
	Seg_Buff[2]=(unsigned char)(light_v*100+0.5)/10%10;
	Seg_Buff[1]=(unsigned char)(light_v*100+0.5)/100%10;
	Seg_Buff[0]=12; //p	
}
void ui2(){
	Seg_Buff[0]=10;
	Seg_Buff[1]=ui2_son+1;
	if(flag_touch[ui2_son]){
		Seg_Buff[7]=time_touch[ui2_son][0]%10;
		Seg_Buff[6]=time_touch[ui2_son][0]/10;
		Seg_Buff[5]=time_touch[ui2_son][1]%10;
		Seg_Buff[4]=time_touch[ui2_son][1]/10;
		Seg_Buff[3]=time_touch[ui2_son][2]%10;
		Seg_Buff[2]=time_touch[ui2_son][2]/10;
	}else{
		Seg_Buff[7]=13;
		Seg_Buff[6]=13;
		Seg_Buff[5]=13;
		Seg_Buff[4]=13;
		Seg_Buff[3]=13;
		Seg_Buff[2]=13;
	}
}
void ui4(){
	Seg_Buff[7]=time_touch[0][0]%10;
	Seg_Buff[6]=time_touch[0][0]/10;
	Seg_Buff[5]=time_touch[0][1]%10;
	Seg_Buff[4]=time_touch[0][1]/10;
	Seg_Buff[3]=time_touch[0][2]%10;
	Seg_Buff[2]=time_touch[0][2]/10;
	Seg_Buff[1]=11;
	Seg_Buff[0]=11;
}
void seg_ui(){
	switch(UI){
		case 0:ui0();break;
		case 1:ui1();break;
		case 2:ui2();break;
		case 4:ui4();break;
	}
}

iic.c

cpp 复制代码
#include "sys.h"
#include "intrins.h"
#define DELAY_TIME	10
sbit sda=P2^1;
sbit scl=P2^0;
static void I2C_Delay(unsigned char n)
{
    do
    {
        _nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();		
    }
    while(n--);      	
}
void I2CStart(void)
{
    sda = 1;
    scl = 1;
	I2C_Delay(DELAY_TIME);
    sda = 0;
	I2C_Delay(DELAY_TIME);
    scl = 0;    
}
void I2CStop(void)
{
    sda = 0;
    scl = 1;
	I2C_Delay(DELAY_TIME);
    sda = 1;
	I2C_Delay(DELAY_TIME);
}
void I2CSendByte(unsigned char byt)
{
    unsigned char i;
	
    for(i=0; i<8; i++){
        scl = 0;
		I2C_Delay(DELAY_TIME);
        if(byt & 0x80){
            sda = 1;
        }
        else{
            sda = 0;
        }
		I2C_Delay(DELAY_TIME);
        scl = 1;
        byt <<= 1;
		I2C_Delay(DELAY_TIME);
    }
	
    scl = 0;  
}
unsigned char I2CReceiveByte(void)
{
	unsigned char da;
	unsigned char i;
	for(i=0;i<8;i++){   
		scl = 1;
		I2C_Delay(DELAY_TIME);
		da <<= 1;
		if(sda) 
			da |= 0x01;
		scl = 0;
		I2C_Delay(DELAY_TIME);
	}
	return da;    
}
unsigned char I2CWaitAck(void)
{
	unsigned char ackbit;
	
    scl = 1;
	I2C_Delay(DELAY_TIME);
    ackbit = sda; 
    scl = 0;
	I2C_Delay(DELAY_TIME);
	
	return ackbit;
}
void I2CSendAck(unsigned char ackbit)
{
    scl = 0;
    sda = ackbit; 
	I2C_Delay(DELAY_TIME);
    scl = 1;
	I2C_Delay(DELAY_TIME);
    scl = 0; 
	sda = 1;
	I2C_Delay(DELAY_TIME);
}
unsigned char adc(unsigned char addr){
	unsigned char temp;
	EA = 0;
	I2CStart();
	I2CSendByte(0x90);
	I2CWaitAck();
	I2CSendByte(addr);
	I2CWaitAck();
	
	I2CStart();
	I2CSendByte(0x91);
	I2CWaitAck();
	temp=I2CReceiveByte();
	I2CSendAck(1);
	I2CStop();
	EA = 1;
	return temp;
}
float v_adc(unsigned char addr){
	return (float)(adc(addr)/256.0*5.0);
}

ds1302.c

cpp 复制代码
#include "sys.h"
#include "intrins.h"
sbit SCK=P1^7;
sbit SDA=P2^3;
sbit RST=P1^3;
unsigned char time[3]={50,59,23};
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/10*16|dat%10);		
 	RST=0; 
}
unsigned char Read_Ds1302_Byte ( unsigned char address )
{
 	unsigned char i,temp=0x00;
	unsigned char dat1,dat2;
 	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_();
	dat1=temp/16;
	dat2=temp%16;
	temp=dat1*10+dat2;
	return (temp);			
}
void w_ds1302(){
	unsigned char i,addr=0x80;
	Write_Ds1302_Byte(0x8e,0x00);
	for(i=0;i<3;i++){
		Write_Ds1302_Byte(addr,time[i]);
		addr+=2;
	}
	Write_Ds1302_Byte(0x8e,0x80);
}
void r_ds1302(){
	unsigned char i,addr=0x81;
	for(i=0;i<3;i++){
		time[i]=Read_Ds1302_Byte(addr);
		addr+=2;
	}
}
相关推荐
nuo5342022 分钟前
第十六届蓝桥杯 省赛C/C++ 大学B组
c语言·c++·算法·蓝桥杯·图论
ん贤1 小时前
2021第十二届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组
c语言·c++·蓝桥杯
南梦也要学习2 小时前
STM32江科大-----SPI
stm32·单片机·嵌入式硬件
willhu20082 小时前
Keil调试STM32:未定义OS_EVENT以及停在“BEAB BKPT 0xAB”处等问题
stm32·单片机·嵌入式硬件
卡尔曼的BD SLAMer2 小时前
问题 | 对于初学者来说,esp32和stm32哪个比较适合?
stm32·单片机·嵌入式硬件
lzb7594 小时前
蓝桥杯单片机刷题——通过按键触发串口传输电压值
单片机·蓝桥杯
想成为配环境大佬4 小时前
P10899 [蓝桥杯 2024 省 C] 劲舞团
蓝桥杯·模拟
cqbzcsq6 小时前
2025蓝桥杯省赛C/C++研究生组游记
c语言·c++·蓝桥杯
一只鱼^_6 小时前
第十六届蓝桥杯大赛软件赛省赛 C/C++ 大学B组
c语言·c++·算法·贪心算法·蓝桥杯·深度优先·图搜索算法
田甲8 小时前
【STM32】ST7789屏幕驱动
stm32·单片机·嵌入式硬件