第十届蓝桥杯单片机省赛程序题

第十届蓝桥杯单片机省赛程序题,第1张

第十届赛题是我第一次尝试写的比赛真题,当时刚把模块的东西学习一遍就开始尝试写,当初写那真是七零八落 bug百出,很是难受。


经过几个月的漫长学习以及沉淀,比赛将近我又又又把这届赛题写了一遍,现在这种感觉可谓是畅通无阻,当然除了LED模块那调试了几次,

 

 

 

 main.c

#include "stc15f2k60s2.h"
#include "iic.h"
#define uchar unsigned char 
#define uint unsigned int 
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
                  0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,
                  0xbf,0xff,0x8e,0xc1};
uchar Digbuf[]={0,1,2,3,4,5,6,7};//数码管显示位数
uchar Digcom=0,led_kai,led_bit;
bit DAC=0,bz;
uchar mode,yemian;
uint coun_f,count,pinlv,dianya,AD;
void keyscan(); //按键函数
void Timer2Init(void)	;//数码管显示定时器
void delayms(int ms);//延时函数
void Allinit();//初始化函数
void pinlv_dis();//频率电压显示界面
void timer0_init();//NE555定时器初始化函数
void led_dis();//LED显示函数
void main()
{
	Timer2Init();
	Allinit();
	timer0_init();

//	Digbuf[0]=1;Digbuf[1]=2;Digbuf[2]=3;Digbuf[3]=4;Digbuf[4]=5;Digbuf[5]=6;Digbuf[6]=7;Digbuf[7]=8;
	while(1)
	{
		AD=AD_read(0x03);//获取AD的值
		if(DAC==0){AD_wirte(102);}//当DAC等于0时读取固定电压值2V
		else if(DAC==1){AD_wirte(AD);}//当DAC等于1时读取RB2模拟电压值
		keyscan();
	  led_dis();//led显示函数
		pinlv_dis();
	}
}
void led_dis()
{
	if(led_kai==0)//打开led
	{
		if(yemian==0){P2=(P2&0X1F)|0X80;led_bit=0XFE;led_bit|=0x02;P0=led_bit;}
		if(yemian==1){P2=(P2&0X1F)|0X80;led_bit=0XFD;led_bit|=0x01;P0=led_bit;}
		if(dianya<150){P2=(P2&0X1F)|0X80;led_bit|=0X04;P0=led_bit;}
		else if((dianya<=150)&&(dianya<250)){P2=(P2&0X1F)|0X80;led_bit&=0xfb;P0=led_bit;}
		else if((dianya<=250)&&(dianya<350)){P2=(P2&0X1F)|0X80;led_bit|=0X04;P0=led_bit;}
		else if(dianya>=350){P2=(P2&0X1F)|0X80;led_bit&=0xfb;P0=led_bit;}
		if(pinlv<1000){P2=(P2&0X1F)|0X80;led_bit|=0x08;P0=led_bit;}
		else if((1000<=pinlv)&&(pinlv<5000)){P2=(P2&0X1F)|0X80;led_bit&=0xf7;P0=led_bit;}
		else if((5000<=pinlv)&&(pinlv<10000)){P2=(P2&0X1F)|0X80;led_bit|=0x08;P0=led_bit;}
		else if(pinlv>=10000){P2=(P2&0X1F)|0X80;led_bit&=0xf7;P0=led_bit;}
		
		if(DAC==0){P2=(P2&0X1F)|0X80;led_bit|=0x10;P0=led_bit;}
		else if(DAC==1){P2=(P2&0X1F)|0X80;led_bit&=0xef;P0=led_bit;}
		
	}
	else if(led_kai==1)//关闭led
	{
		P2=(P2&0X1F)|0x80;P0=0XFf;
	}
}
void pinlv_dis()
{
	if(yemian==0)//频率显示界面
	{
		
	if(pinlv>=10000){Digbuf[0]=22,Digbuf[1]=21;Digbuf[2]=21;Digbuf[3]=pinlv/10000;Digbuf[4]=pinlv%10000/1000;Digbuf[5]=pinlv%1000/100;Digbuf[6]=pinlv%100/10;Digbuf[7]=pinlv%10;}
	else if(pinlv>=1000){Digbuf[0]=22,Digbuf[1]=21;Digbuf[2]=21;Digbuf[3]=21;Digbuf[4]=pinlv/1000;Digbuf[5]=pinlv%1000/100;Digbuf[6]=pinlv%100/10;Digbuf[7]=pinlv%10;}
	else if(pinlv>=100){Digbuf[0]=22,Digbuf[1]=21;Digbuf[2]=21;Digbuf[3]=21;Digbuf[4]=21;Digbuf[5]=pinlv/100;Digbuf[6]=pinlv%100/10;Digbuf[7]=pinlv%10;}	
	else if(pinlv>=10){Digbuf[0]=22,Digbuf[1]=21;Digbuf[2]=21;Digbuf[3]=21;Digbuf[4]=21;Digbuf[5]=21;Digbuf[6]=pinlv/10;Digbuf[7]=pinlv%10;}
  }	
  else if(yemian==1)//电压界面
	{
		dianya=AD*1.96;
		Digbuf[0]=23;Digbuf[1]=21;Digbuf[2]=21;Digbuf[3]=21;Digbuf[4]=21;Digbuf[5]=dianya/100+10;Digbuf[6]=dianya%100/10;Digbuf[7]=dianya%10;
	}
  
}
void timer0_init()//定时器初始化函数
{
	TMOD=0X16;
	TH0=0XFF;
	TL0=0XFF;
	TH1=(65535-50000)/255;
	TL1=(65535-50000)%255;
	ET0=1;
	ET1=1;
	TR0=1;
	TR1=1;
	EA=1;
}
void timer0() interrupt 1
{
	count++;
}
void timer1() interrupt 3
{
	coun_f++;
	if(coun_f==20)
	{
		coun_f=0;
		pinlv=count;
		count=0;
	}
}
void keyscan()
{
	if(P30==0)
	{
		delayms(5);
	  if(P30==0)
		{
			if(bz==0){bz=1;EA=0;ET0=0;P2=0XC0;P0=0XFF;P2=0XFF;P0=0XFF;}//关闭数码管,我这里数码管是用定时器写的,所以我就关闭了定时器
			else if(bz==1){bz=0;EA=1;ET0=1;}//开启定时器
		}
		while(!P30);
	}
	else if(P31==0)
	{
		delayms(5);
	  if(P31==0)
		{
			if(led_kai==0){led_kai=1;}
			else if(led_kai==1){led_kai=0;}
		}
		while(!P31);
	}
	else if(P32==0)
	{
		delayms(5);
	  if(P32==0)
		{
			if(DAC==0){DAC=1;}
			else if(DAC==1){DAC=0;}
		}
		while(!P32);
	}
	else if(P33==0)
	{
		delayms(5);
	  if(P33==0)
		{
			if(yemian==0){yemian=1;P2=(P2&0X1F)|0X80;led_bit=0XFD;led_bit|=0x01;P0=led_bit;}
			else if(yemian==1){yemian=0;P2=(P2&0X1F)|0X80;led_bit=0XFE;led_bit|=0x02;P0=led_bit;}
		}
		while(!P33);
	}
}
void Timer2Init(void)		//1毫秒@11.0592MHz
{
	AUXR |= 0x04;		//定时器时钟1T模式
	T2L = 0xCD;		//设置定时初始值
	T2H = 0xD4;		//设置定时初始值
	AUXR |= 0x10;		//定时器2开始计时
	
	IE2|=0X04;//开定时器2中断
	EA=1;			//开总中断
}

//中断服务程序(数码管显示)
void time2int() interrupt 12		//中断入口
{
	P2|=0XC0;//打开位选573		U8
	P2&=0XDF;
	P0=(1<

 iic.c

#include "stc15f2k60s2.h"
#include "intrins.h"
#include "iic.h"
#define somenop {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}    


#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1

//总线引脚定义
sbit SDA = P2^1;  /* 数据线 */
sbit SCL = P2^0;  /* 时钟线 */


//总线启动条件
void IIC_Start(void)
{
	SDA = 1;
	SCL = 1;
	somenop;
	SDA = 0;
	somenop;
	SCL = 0;	
}

//总线停止条件
void IIC_Stop(void)
{
	SDA = 0;
	SCL = 1;
	somenop;
	SDA = 1;
}

//等待应答
bit IIC_WaitAck(void)
{
	SDA = 1;
	somenop;
	SCL = 1;
	somenop;
	if(SDA)    
	{   
		SCL = 0;
		IIC_Stop();
		return 0;
	}
	else  
	{ 
		SCL = 0;
		return 1;
	}
}

//通过I2C总线发送数据
void IIC_SendByte(unsigned char byt)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{   
		if(byt&0x80) 
		{	
			SDA = 1;
		}
		else 
		{
			SDA = 0;
		}
		somenop;
		SCL = 1;
		byt <<= 1;
		somenop;
		SCL = 0;
	}
}

//从I2C总线上接收数据
unsigned char IIC_RecByte(void)
{
	unsigned char da;
	unsigned char i;
	
	for(i=0;i<8;i++)
	{   
		SCL = 1;
		somenop;
		da <<= 1;
		if(SDA) 
		da |= 0x01;
		SCL = 0;
		somenop;
	}
	return da;
}
unsigned char AD_read(unsigned char dat)
{
	unsigned char temp;
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(dat);
	IIC_WaitAck();
	IIC_Stop();
	
	IIC_Start();
	IIC_SendByte(0x91);
	IIC_WaitAck();
	temp=IIC_RecByte();
	IIC_WaitAck();
	IIC_Stop();
	
	return temp;
}
void AD_wirte(unsigned char add)
{
	IIC_Start();
	IIC_SendByte(0x90);
	IIC_WaitAck();
	IIC_SendByte(0x40);
	IIC_WaitAck();
	IIC_SendByte(add);
	IIC_WaitAck();
	IIC_Stop();
}

 iic.h

 

#ifndef _IIC_H
#define _IIC_H
void IIC_Start(void);
void IIC_Stop(void);
bit IIC_WaitAck(void);
void IIC_SendByte(unsigned char byt);
unsigned char IIC_RecByte(void);
unsigned char AD_read(unsigned char dat);
void AD_wirte(unsigned char add);


#endif

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/564066.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-03
下一篇 2022-04-03

发表评论

登录后才能评论

评论列表(0条)