蓝桥杯单片机——第十二届省赛编程题(第一场)

iic.h和iic.c用官方驱动,不做变动

onewire.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
{
	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(50);
		DQ = 1;
		dat >>= 1;
	}
	Delay_OneWire(50);
}

//从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(50);
	}
	return dat;
}

//DS18B20设备初始化
bit init_ds18b20(void)
{
  	bit initflag = 0;
  	
  	DQ = 1;
  	Delay_OneWire(120);
  	DQ = 0;
  	Delay_OneWire(800);
  	DQ = 1;
  	Delay_OneWire(100); 
    initflag = DQ;     
  	Delay_OneWire(50);
  
  	return initflag;
}


onewire.h

#ifndef __ONEWIRE_H
#define __ONEWIRE_H

unsigned char rd_temperature(void);  //; ;
bit init_ds18b20(void);
unsigned char Read_DS18B20(void);
void Write_DS18B20(unsigned char dat);
#endif

 main.c

#include <reg52.h>
#include <iic.h>
#include <onewire.h>
sfr P4=0XC0;
unsigned char  duanma[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char  duanma_x[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
unsigned int  temp=0;
unsigned int  u=0;
unsigned int  t=25;
unsigned int  tt=25;
sbit R1=P3^2;
sbit R2=P3^3;
sbit C1=P4^4;
sbit C2=P4^2;
unsigned char flag_s4=0;
unsigned char flag_s5=0x00;//模式1,取反后变成0xff;或者这样定义:bit flag_s5=0;bit定义的变量只能取0或1,取反后变1
void display_smg(unsigned char pos,unsigned char dat);
void display_temp();//温度显示界面
void display_p();//参数设置界面
void displaySMG_dac();//DAC转换界面
void read_ds18b20_temp();
 
void delay_smg(unsigned int t)
{
	while(t--);
}
void delay(unsigned int t)
{
	while(t--)
	{
		display_temp();	
	}
}
void display_smg(unsigned char pos,unsigned char dat)
{
  P2=0XE0;P0=0XFF;
  P2=0XC0;P0=0X01<<pos;
  P2=0XE0;P0=dat;
}
void display_temp()//温度显示界面
{
 	display_smg(7,duanma[temp%10]);
	delay_smg(200);
	display_smg(6,duanma[(temp/10)%10]);
	delay_smg(200);
	display_smg(5,duanma_x[(temp/100)%10]);
	delay_smg(200);
	display_smg(4,duanma[temp/1000]);
	delay_smg(200);
	display_smg(0,0xc6);
	delay_smg(200);
	display_smg(3,0xff);
	delay_smg(200);
	display_smg(2,0xff);
	delay_smg(200);
	display_smg(1,0xff);
	delay_smg(200);
	P2=0XC0;P0=0XFF;
	P2=0XE0;P0=0XFF;
}
void display_p()//参数设置界面
{
	display_smg(7,duanma[t%10]);
	delay_smg(200);
	display_smg(6,duanma[t/10]);
	delay_smg(200);
	display_smg(0,0x8c);
	delay_smg(200);
	P2=0XC0;P0=0XFF;
	P2=0XE0;P0=0XFF;
}
void displaySMG_dac()//DAC转换界面
{
	display_smg(7,duanma[u%10]);
	delay_smg(200);
	display_smg(6,duanma[(u/10)%10]);
	delay_smg(200);
	display_smg(5,duanma_x[u/100]);
	delay_smg(200);
	display_smg(0,0x88);
	delay_smg(200);
	P2=0XC0;P0=0XFF;
	P2=0XE0;P0=0XFF;
}
void display()
{
	switch(flag_s4) //界面切换
	{
	 	case 0:
		read_ds18b20_temp();
		display_temp();break;
		case 1:
		display_p();break;
		case 2:
		displaySMG_dac();break;
	}
}
void read_ds18b20_temp()//读取温度
{
	unsigned char LSB,MSB;
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	delay(10);//设置合适的延时时间,避免影响按键操作
	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*100;//显示两位小数,放大十倍,这样做的目的将小数点后第二位数字也转换为可显示数字
		temp=temp+(LSB&0x0f)*0.625;
	}
}
 
void read_dac(unsigned char dat)
{
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(0x40);//DA转换,数模转换,数字温度转换成模拟电压输出0100 0000
	IIC_WaitAck();
	IIC_Stop();
	
	IIC_Start();
	IIC_SendByte(dat);//写入对应转换的电压值
	IIC_WaitAck();
	IIC_SendAck(1);
	IIC_Stop();
}
void key()
{
 	R1=1;//s4界面切换
	R2=0;
	C1=C2=1;
	if(C1==0)
	{
		delay_smg(100);
		if(C1==0)
		{
			while(C1==0)
			{
				display();
			}
			flag_s4++;
			if(flag_s4==3)
			{
				flag_s4=0;
			}
			if(flag_s4==1)
			{
				t=tt;//进入参数界面时,获取当前参数
			}
			else if(flag_s4==2)
			{
				tt=t;//退出参数界面时,参数生效
			}
		}
	}
	R1=0;//s5参数设置
	R2=1;
	C1=C2=1;
	if(C1==0)
	{
		delay_smg(100);
		if(C1==0)
		{
			while(C1==0)
			{
				display();
			}
			flag_s5=~flag_s5;
		}
	}
	R1=1;//s8 温度参数减1
	R2=0;
	C1=C2=1;
	if(C2==0)
	{
		delay_smg(100);
		if(C2==0)
		{
			while(C2==0)//避免参数设置时数据闪动
			{
				 display();
			}
			if(flag_s4==1)//仅在参数界面有效
			{
				t--;
			}
		}
	}
	R1=0;//s9 温度参数加1
	R2=1;
	C1=C2=1;
	if(C2==0)
	{
		delay_smg(100);
		if(C2==0)
		{
			while(C2==0)
			{
				display();
			}
			if(flag_s4==1)//仅在参数界面有效
			{
				t++;
			}
		}
	}
}
void led()//led显示
{
	P2=0X80;
	if(flag_s5==0x00)	//模式1
	{
	 	P0&=0XFE;//L1亮
	}
	if(flag_s4==0)	//温度显示界面
	{
	 	P0&=0XFD;//L2亮
	}
	else if(flag_s4==1)	//参数设置界面
	{
	 	P0&=0XFB;//L3亮
	}
	else if(flag_s4==2)	//DAC输出界面
	{
	 	P0&=0XF7;//L4亮
	}
 
}
void dac_ms()//模式变换
{
	if(flag_s5==0x00)//模式1
	{
		if(temp<t*100)
		{
			u=0;
			read_dac(0x00);
		}
		else
		{
			u=500;
			read_dac(0xff);
		}
	}
	if(flag_s5==0xff)//模式2
	{
		if(temp<2000)
		{
			u=100;
			read_dac(0x51);//255/5=51   1v=(1/5)*5v   5v对应255
		}
		else if(temp<=4000)
		{
			u=(0.15*temp)-200;//用点(2000,100)和(4000,400)解出直线方程
			read_dac(u*0.51);
		}
		else
		{
			u=400;
			read_dac(204);
		}
	}
}
void main()
{
		unsigned char i=0;
		P2=0x80;P0=0xff;P2=0XA0;P0=0X00;

		while(1)
		{
		  key();
		  led();
		  dac_ms();
		  display();
		}
}

 

  • 11
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 蓝桥杯是全国性的计算机大赛,旨在提高大学生的计算机技术水平和创新能力。嵌入式STM32G431是一款嵌入式芯片,具有高性能和低功耗的特点。第十二届第一场省赛停车计费系统是蓝桥杯的一道工程题目,要求参赛选手设计一个停车场计费系统。 停车计费系统是指通过嵌入式技术实现对车辆进入和离开停车场的自动检测、计时和计费的系统。对于这个题目,参赛选手可以根据题目要求,使用STM32G431芯片设计一个具有以下功能的系统: 1. 车辆进入检测:使用车辆传感器检测车辆的进入,触发计时。 2. 车辆离开检测:使用车辆传感器检测车辆的离开,停止计时。 3. 计时功能:使用内部时钟模块获取进入和离开的时间,并计算停车时间。 4. 计费功能:根据停车时间,按照一定的计费规则进行计费。 5. 显示功能:使用液晶显示屏显示当前的停车信息,如车牌号、停车时间、费用等。 6. 数据存储功能:使用闪存等储存介质将停车数据进行存储,以便后续的数据分析和查询。 设计一个停车计费系统涉及到硬件设计和软件编程两个方面。硬件方面,参赛选手需要选择合适的传感器、显示屏、存储介质等,以及设计电路和接口进行连接。软件方面,需要使用C语言或者汇编语言编写程序,对芯片进行编程,实现各项功能。 通过此次比赛,选手们可以锻炼嵌入式系统的设计能力和编程能力,了解实际应用中嵌入式系统的工作原理和应用场景。同时,也能提升对STM32G431芯片的理解和运用能力。这对于培养嵌入式技术人才,推动物联网技术的发展都具有积极意义。 ### 回答2: 蓝桥杯是面向计算机爱好者的智力竞赛,而嵌入式STM32G431是一款嵌入式系统开发板。第十二届第一场省赛的停车计费系统真题工程,则是要求参赛选手设计并实现一个能够进行停车计费的系统。 停车计费系统是一种用于自动计费和管理停车场的系统。这个系统可以通过识别车辆的进出以及停车的时间,自动计算并收费。在这个工程中,选手需要使用嵌入式STM32G431开发板以及相关的硬件和软件,来设计一个能够实现停车计费功能的系统。 首先,选手需要使用传感器或摄像头来实现车辆进出的检测。当车辆进入或离开停车场时,传感器会发出信号并通过STM32G431进行检测。接着,选手需要编程实现识别车辆的算法,以便能够识别不同的车辆。当车辆停放时,系统会通过计时器记录停车的时间。 然后,选手需要编写计费算法,根据停车的时间来计算费用。这个算法可以根据停车场的规则来确定费用的计算方式,例如按小时计费或按照不同的时间段采用不同的费率。 最后,选手还需要设计一个界面,使得系统能够与用户进行交互。用户可以通过该界面查询停车费用,并进行付款。同时,选手还需要保证系统的稳定性和安全性,确保数据的准确性和保密性。 总而言之,蓝桥杯嵌入式STM32G431第十二届第一场省赛停车计费系统真题工程要求选手使用硬件和软件开发能力,设计并实现一个完整的停车计费系统。这需要选手具备嵌入式系统开发、传感器技术、算法设计和界面设计等多方面的知识和技能。 ### 回答3: 蓝桥杯嵌入式stm32g431——第十二届第一场省赛停车计费系统真题工程是一个基于STM32G431开发板的停车计费系统设计题目。该系统的主要功能是实现停车场的车辆进入、出场的计费管理。 首先,该系统需要实现一个车辆进入检测的功能。当车辆进入停车场时,系统会通过传感器检测到车辆的到达,并记录下进入的时间。 然后,系统需要实现一个车辆出场的功能。当车辆准备离开停车场时,系统会通过传感器检测到车辆的离开,并记录下离开的时间。 接下来,系统需要计算车辆停留的时间。通过进入时间和离开时间的差值计算得出车辆停留的时长。 最后,系统需要计算停车费用。根据停车场的计费规则,根据车辆停留的时长计算出停车费用,并将费用显示在屏幕上。 在实现上述功能的过程中,需要运用STM32G431开发板的各种功能和模块,包括GPIO口、定时器、中断、串口通信等。通过编写相应的代码,实现按钮的控制、传感器检测、时间的计算以及屏幕的显示等功能。 该项目的设计需要考虑多种情况,比如车辆重复进入出场、车辆进入出场顺序错乱等,要充分考虑这些异常情况并进行相应的处理。在代码编写过程中,还需注意代码的优化和资源的合理利用,以提高系统的性能和效率。 通过完成这个项目的设计与实现,可以加深对STM32G431嵌入式系统的了解和应用,并提升嵌入式系统开发的能力。同时,也能锻炼自己的逻辑思维、问题解决能力和团队合作精神。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值