第十一届省赛(7月)

该程序实现了一款嵌入式设备,用于监测环境温度和电源电压,并通过LCD显示。系统中,ADC读取温度传感器数据,当温度超过设定阈值时,计数器增加。用户可通过按键切换显示模式(温度、电压或计数值),同时,按键也可用来调整电源电压。此外,系统还包含了一个工作指示LED和按键松手检测功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stc15f2k60s2.h>
#include <iic.h>
#define uchar unsigned char
uchar tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10,0XBF,0XFF,0Xc1,0X8C,0XC8};//22个数 tab[22]=U,tab[23]=P,tab[24]=N
uchar discode[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar dis[9]={0,0,0,0,0,0,0,0,0};
uchar adread_flag;
uchar mode;
uchar key_flag,P2_flag;
int Vp=300;
int t;
int temp;
uchar Vpp;
uchar N;
void delayms(int ms);
void allinit();	
void display();
void keyscan();
uchar adread();
void Timer0Init(void);
void workled();
void epromwrite(uchar temp);
uchar epromread();
void main()
{
	allinit();
  Timer0Init();	
	//epromwrite(0);delayms(5);
	Vp=10*epromread();delayms(2);
	while(1)
	{
		temp=1.97*adread();
		if(mode==0)
		{
			if(temp>500) temp=500;
			dis[1]=22;
			dis[2]=21;dis[3]=21;dis[4]=21;dis[5]=21;
      dis[6]=temp/100+10;
			dis[7]=temp/10%10;
			dis[8]=temp%10;
		}
		if(mode==1)
		{
			dis[1]=23;
			dis[2]=21;dis[3]=21;dis[4]=21;dis[5]=21;
      dis[6]=Vp/100+10;
			dis[7]=Vp/10%10;
			dis[8]=Vp%10;						
		}
		if(mode==2)
		{
			dis[1]=24;
			dis[2]=21;dis[3]=21;dis[4]=21;dis[5]=21;
			dis[6]=N/100;
			dis[7]=N/10%10;
			dis[8]=N%10;						
		}
		if((temp<Vp)&&(adread_flag==1))
		{
		 N++;adread_flag=0;	
		}
		if(temp>=Vp)
		{	
			adread_flag=1;
		}
		keyscan();
		display();
		workled();
	}
	
}
void delayms(int ms)
{
  int i,j;
	for(i=0;i<ms;i++)
	for(j=125;j--;j>0);
}
void allinit()
{
	P2=0X80;P0=0XFF;//LED
	P2=0XA0;P0=0X00;//蜂鸣器
	P2=0XC0;P0=0XFF;P2=0XE0;P0=0XFF;//数码管
}
void display()
{
	uchar i;
	for(i=0;i<8;i++)
	{
		P2=0XC0;
		P0=discode[i];
		P2=0XE0;
		P0=tab[dis[i+1]];
		delayms(1);
		P2=0XC0;P0=0XFF;
		P2=0XE0;P0=0XFF;
	}
	
}
void keyscan()
{
	//1
	uchar temp;
	P44=0;P42=1;P3=0X7F;
	temp=P3;
	temp=temp&0x0f;
	if(temp!=0x0f)
	{
	  delayms(2);
		temp=P3;
	  temp=temp&0x0f;
	  if(temp!=0x0f)
		{
		 temp=P3&0x0f;
		 switch(temp)	
		 {
			 case 0x0e: key_flag++;    break;
			 case 0x0d: key_flag++;    break;
			 case 0x0b: key_flag++;    break;
			 case 0x07: key_flag++;    break;
		 }		
		 	while(temp!=0x0f)
		{
	   temp=P3;
	   temp=temp&0x0f; 		
		}
		}
	}
	//2
	P42=0;P44=1;P3=0XbF;
	temp=P3;
	temp=temp&0x0f;
	if(temp!=0x0f)
	{
	  delayms(2);
	  temp=temp&0x0f;
	  if(temp!=0x0f)
		{
		 temp=P3;
		 temp=P3&0x0f;
		 switch(temp)	
		 {
			 case 0x0e:  key_flag++;   break;
			 case 0x0d:  key_flag++;   break;
			 case 0x0b:  
			 {
				 key_flag=0;
				if(mode==1) 
				{
				 if(Vp==0) Vp=550;
				 Vp=Vp-50;
				 Vpp=Vp/10;
				epromwrite(Vpp);
				}
			 }
			 break;
			 case 0x07: 
			 {
				 key_flag=0;
				if(mode==1) 
				{
			  if(Vp==500) Vp=-50;
				 Vp=Vp+50;
				 Vpp=Vp/10;
				epromwrite(Vpp);
				}
			 }
			 break;
		 }		
		 	while(temp!=0x0f)
		{
	   temp=P3;
	   temp=temp&0x0f; 		
		}
		}

	}
	//3
	P44=1;P42=1;P3=0XdF;
	temp=P3;
	temp=temp&0x0f;
	if(temp!=0x0f)
	{
	  delayms(2);
	  temp=P3;		
	  temp=temp&0x0f;
	  if(temp!=0x0f)
		{
		 temp=P3&0x0f;
		 switch(temp)	
		 {
			 case 0x0e: key_flag++;    break;
			 case 0x0d: key_flag++;    break;
			 case 0x0b:   
			 {
				 key_flag=0;
        if(mode==2)
				{
				 N=0;	
				}
			 break;
			 }
			 case 0x07: 
			 { 
				 key_flag=0;
			  if(mode==0) mode=1;
				else if(mode==1)
				{
					Vpp=Vp/10;
					epromwrite(Vpp);delayms(1);
					mode=2;
				}
				else if(mode==2) mode=0;
			  break;
			 }
		 }		
		 	while(temp!=0x0f)
		{
	   temp=P3;
	   temp=temp&0x0f; 		
		}
		}

	}
	//4
	P44=1;P42=1;P3=0XeF;
	temp=P3;
	temp=temp&0x0f;
	if(temp!=0x0f)
	{
	  delayms(2);
		temp=P3;
	  temp=temp&0x0f;
	  if(temp!=0x0f)
		{
		 temp=P3&0x0f;
		 switch(temp)	
		 {
			 case 0x0e: key_flag++;   break;
			 case 0x0d: key_flag++;    break;
			 case 0x0b: key_flag++; 	 break;
			 case 0x07: key_flag++;   	break;

		 }		
		 	while(temp!=0x0f)
		{
	   temp=P3;
	   temp=temp&0x0f; 		
		}//注意这个松手检测的位置呀!!
		}

	}
	
}
uchar adread()
{
	uchar temp;
	IIC_Start(); 
	IIC_SendByte(0x90); 
	IIC_WaitAck(); 	
	IIC_SendByte(0x03); 
	IIC_WaitAck(); 		
	IIC_Stop();
	
	IIC_Start(); 	
	IIC_SendByte(0x91); 	
	IIC_WaitAck(); 		
	temp=IIC_RecByte(); 
	return temp;
}
void epromwrite(uchar temp)
{
	IIC_Start(); 
	IIC_SendByte(0xa0); 	
	IIC_WaitAck(); 		
	IIC_SendByte(0x00); 
	IIC_WaitAck(); 		
	IIC_SendByte(temp); 	
	IIC_WaitAck(); 	
	IIC_Stop();	
}
uchar epromread()
{
	uchar temp;
	IIC_Start(); 
	IIC_SendByte(0xa0); 	
	IIC_WaitAck(); 
	IIC_SendByte(0x00); 	
	IIC_WaitAck(); 	
	IIC_Stop();	
	
	IIC_Start(); 	
	IIC_SendByte(0xa1); 	
	IIC_WaitAck(); 		
	temp=IIC_RecByte(); 	
	return temp;
}

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

void workled()
{
		if(N%2==0)
	{
	 P2=0X80;P01=1;;//1111 1101
	}
	else
	{
	 P2=0x80;P01=0;	
	}
	if(key_flag>=3)
	{
		P2=0X80;P02=0;
	}
	else
	{
		P2=0X80;P02=1;
	}
	if(P2_flag==1)
	{
	P2=0x80;P00=0;t=0;		
	}
	else 
	{
	P2=0X80;P00=1;
	}
}
void Time0() interrupt 1
{
	if(temp<Vp)
	{
  t++;
	if(t>=1000)	
	{
	 P2_flag=1;	
	}
	}
	else 
	{
	 P2_flag=0;
	}	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值