第十一届省赛程序设计题--温度测试蓝桥杯真题—06

Posted 谏书稀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第十一届省赛程序设计题--温度测试蓝桥杯真题—06相关的知识,希望对你有一定的参考价值。



实现代码

#include <STC15F2K60S2.H>
#include <onewire.h>
#include <iic.h>

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

//unsigned char SMGNoDot_CA[10]=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90; //无小数点
//unsigned char SMGDot_CA[10]=0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10;
unsigned char table[]=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;

unsigned int count=0; //定时器计数

unsigned char temp_k=1; //温度读取开关
unsigned int temp=0;
unsigned int temp_max=30;
unsigned int temp_min=20;
unsigned char temp_flag=0; //0表示设置temp_max   1表示设置temp_min

unsigned char smg_f=1;  //数码管闪烁标志位	选中了1S闪烁

unsigned char smg_stat=0;  //0为数据显示页面  1为参数设置页面


void delay(int t)

	while(t--);

void delay_ms(int n)

	int i,j;
	for(i=n;i>0;i--)
		for(j=110;j>0;j--);


/**=====================================================================
温度读取函数
======================================================================*/
void read_temp()

	unsigned char LSB;
	unsigned char MSB;
	init_ds18b20();	
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);

	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);

	LSB=Read_DS18B20();
	MSB=Read_DS18B20();

	temp=(MSB<<8)|LSB;
	if((temp&0xf800)==0x0000)
	
		temp = temp>>4;
	


void read_temp_k()

	if(temp_k==1)
	
		read_temp();
	

/**=====================================================================
DAC模拟电压	  输出电压=dac/255.0*0.4
======================================================================*/
void PCF8591_DAC(unsigned char dat)

	IIC_Start(); 
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(0x40);
	IIC_WaitAck(); 
	IIC_SendByte(dat);
	IIC_WaitAck(); 
	IIC_Stop();	  


/**=====================================================================
数码管显示函数
======================================================================*/
void selecthc(unsigned char choose)

	switch(choose)
	
		case 4 : P2=(P2&0x1f)|0x8f; break;
		case 5 : P2=(P2&0x1f)|0xaf; break;
		case 6 : P2=(P2&0x1f)|0xcf; break;
		case 7 : P2=(P2&0x1f)|0xef; break;
		case 0 : P2=(P2&0x1f)|0x00; break;
	

void show_bit(unsigned char w,unsigned char n)

	selecthc(7);
	P0=0x00;
	selecthc(6);
	P0=0x01<<w-1;
	selecthc(7);
	P0=n;

void show_all(unsigned char n)


	selecthc(6);
	P0=0xff;
	selecthc(7);
	P0=n;	

//数码管显示温度
void show_temp()

	show_bit(1,0xc6);
	delay(500);
	show_bit(7,table[temp/10]);
	delay(500);
	show_bit(8,table[temp%10]);
	delay(500);
	show_all(0xff);

//数码管显示参数设置
void show_num()

	show_bit(1,0x8c);
	delay(500);
	if(((temp_flag==0&smg_f==1))|(temp_flag==1))
	
		show_bit(4,table[temp_max/10]);
		delay(500);
		show_bit(5,table[temp_max%10]);
		delay(500);		
	
	delay_ms(1);
	if(((temp_flag==1&smg_f==1))|(temp_flag==0))
	
		show_bit(7,table[temp_min/10]);
		delay(500);
		show_bit(8,table[temp_min%10]);
		delay(500);			
	
	show_all(0xff);


void showsmg()

	if(smg_stat==0)
	
		show_temp();	
	else if(smg_stat==1)
	
		show_num();
	


/**=====================================================================
LED灯显示函数	温度控制DAC输出函数
======================================================================*/
void led_runing_DAC()

	selecthc(4);
	if(temp>temp_max)
	
		PCF8591_DAC(204);	//输出4V=DAC/255*5
		P0=0xfe; //L1点亮
	
	else if(temp<=temp_max&&temp>=temp_min)
	
		PCF8591_DAC(153); 	//输出3V=DAC/255*5
		P0=0xfd; //L2点亮
	
	else if(temp<temp_min)
	
		PCF8591_DAC(153);	//输出2V=DAC/255*5
		P0=0xfb;
	
	else P0=0xf7;
	selecthc(0);	


/**=====================================================================
定时器相关函数	 定时器0 16位定时器	  定时1000us=1ms
======================================================================*/
void init()

	TMOD=0x01; 	
	TH0=(65536-1000)/256;
	TL0=(65536-1000)%256;

	TR0=1;
	ET0=1;
	EA=1;

void service() interrupt 1

	TH0=(65536-1000)/256;
	TL0=(65536-1000)%256;
	
	count++;
	//if(count>=500) //0.5秒刷新一次温度读取
	//
	//	temp_k=~temp_k;
	//
	if(count>=1000)
	
		smg_f=~smg_f;
		count=0;
			


/**=====================================================================
开关扫描函数
======================================================================*/
void keys()

	if(s4==0)
	
		delay_ms(1);
		if(s4==0)
		
			while(s4==0)
			
				showsmg();
				led_runing_DAC();
			
			if(smg_stat==0)
			  
				temp_flag=1;
				showsmg();
				smg_stat=1;
			else if(smg_stat==1)
			  
				showsmg();
				smg_stat=0;
			
		
	
	if(smg_stat==1)
	
		if(s5==0)
		
			delay_ms(1);
			if(s5==0)
			
				while(s5==0)
				
					showsmg();
					led_runing_DAC();
				
				temp_flag++; //flag_s7默认0,0为正常显示时钟
				if (temp_flag >=2)
				
					temp_flag = 0;
				
			
		
	
	if(s6==0) //加
	
		delay_ms(1);
		if(s6==0)
		
			while(s6==0)
			
				showsmg();
				led_runing_DAC();
			
			if(temp_flag==0)
			
				temp_max++;
				if(temp_max>=99)
				
					temp_max=0;
				
			
			else if(temp_flag==1)
			
			
				if(temp_min<temp_max-1)
				
					temp_min++;
				
			
		

	
	if(s7==0)  //减
	
		delay_ms(1);
		if(s7==0)
		
			while(s7==0)
			
				showsmg();
				led_runing_DAC();
			
			if(temp_flag==0)
			
				if(temp_max>temp_min+1)
				
					temp_max--;
				
			
			else if(temp_flag==1)
			
				if(temp_min>=0)
				
					temp_min--;
				
			
		
	


																			 
void main()

	selecthc(5);
	P0=0x00;
	selecthc(0);
	init();
	while(1)
	
		keys();
		read_temp();
		led_runing_DAC();
		showsmg();	
	
  

以上是关于第十一届省赛程序设计题--温度测试蓝桥杯真题—06的主要内容,如果未能解决你的问题,请参考以下文章

第十一届省赛程序设计题--电压测量蓝桥杯真题—07

第十一届省赛程序设计题--电压测量蓝桥杯真题—07

《蓝桥杯真题》:2.第十二届省赛

第十届省赛程序设计题--电压频率测量蓝桥杯真题—01

《蓝桥杯真题》:2020年单片机省赛第二场(第十一届第二场)

《蓝桥杯真题》:2020年单片机省赛第二场(第十一届第二场)