⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bh1415.c

📁 基于单片机的BH1415控制做的调频发射机控制系统源程序
💻 C
字号:
#define uchar unsigned char
#define uint  unsigned int
#include "REG52.H"
#include "BH1415.H"

//按键定义
sbit key_select=P1^0;//频率位数选择
sbit key_add   =P1^1;//频率值加一
sbit key_del   =P1^2;//频率值减一

uchar code num[]={ 0x3F,0x06,0x5B,0x4F,
						 0x66,0x6D,0x7D,0x07,
						 0x7F,0x6F,0x77,0x7C,
						 0x39,0x5E,0x79,0x71};
uchar fre[4];	//要设定的四位发射频率,如99.90MHz
uchar key;		//频率的第几位数的选择
bit flag;		//频率是否已更改
uchar count,count2; //count2 用于brind()闪烁函数作延时是否到了的标志
						  //count 用于标志当前状态,为1则进入了频率设置

void display(uchar *p);
void delayms(uchar i);
void scankey(void);
void brind();

//功能: 主程序
void main(void)
{
	fre[0]=1;
	fre[1]=0;
	fre[2]=1;
	fre[3]=8;
	/////////////////////////////////////////////////////
	while(1)
	{
		display(fre); //显示四位频率值
		scankey();
		//-----------------
		if(flag==1)
		{
			writefrequency(fre);
			flag=0;
		}
		//-----------------
	   if(count==1)//如果处于设置状态则设置位正在闪烁
		brind();
	}
	/////////////////////////////////////////////////////

}

//功能: 显示四位频率值
void display(uchar *p)
{
	if( ((count==1)&&(key!=0)) || (count!=1) ){
	P2=0x0fe;//数码管位选1
	P3=num[*(p+0)];
	delayms(2);
	P2=0x0ff;
  }

   if( ((count==1)&&(key!=1)) || (count!=1) ){
	P2=0xffd;//数码管位选2
	P3=num[*(p+1)];
	delayms(2);
	P2=0x0ff;
  }

   if( ((count==1)&&(key!=2)) || (count!=1) ){
	P2=0xfb;//数码管位选3
	P3=num[*(p+2)]|0x80;//显示小数点
	delayms(2);
	P2=0xff;
  }

   if( ((count==1)&&(key!=3)) || (count!=1) ){
	P2=0xf7;//数码管位选4
	P3=num[*(p+3)];
	delayms(2);
	P2=0xff;
  }
}

//功能: 选择中的频率位闪烁
void brind()
{
	uchar i,temp;
	switch(key)
	{
		case 0:temp=0xfe;break;
		case 1:temp=0xfd;break;
		case 2:temp=0xfb;break;
		case 3:temp=0xf7;break;
		default:break;
	}
	count2++;
	if(count2>40)
   {
  	  count2=0;
     ///////////
	  for(i=20;i>0;i--)
	  {
	   P2=temp;//数码管位选
	   P3=num[*(fre+key)];//当前正在操作的数据位闪烁
		delayms(2);
	   P2=0xff;
		display(fre);
	  }
	  //////////
   }
}

//功能: 通用延时程序
void delayms(uchar i)
{
	uchar n=10;
	while(i--)
	while(n--);
}

//功能: 按键扫描,执行后可能改变的值:flag,key,fre[key]
void scankey(void)
{
   //数码管位选择按键 key_select
	if(key_select==0)	//频率位选择
	{
		delayms(5);
		if(key_select==0)
		{
			while(key_select==0)
		    display(fre); //在按键未松开时进行显示,避免按下不放时没有显示数值

			if(count==0) count=1; //这样可以识别key_select这个按键是否是第一次按下
										 //也提供了一个count==1的标志给其它函数指示
			else
			{
			    key++;
			    if(key>3)
			   {
			     key=0;
				  flag=1;
			     count=0;//当最后一位频率值设定后再按此键就标志完成一次频率修改
				  			 //这样就可以减少一个确定按键的使用
			   }
				 else
				 switch(key)
				 {
					case 2:if((fre[0]==1)&&(fre[1]>=2)) {fre[2]=0;fre[1]=2;}
							 else if((fre[0]==0)&&(fre[1]<7)) fre[1]=7;break;
					case 3:if((fre[0]==1)&&(fre[1]==2)) fre[2]=fre[3]=0;break;
					default:break;
				 }
			}
		}
	}

	//频率值加一按键 key_add
	if(key_add==0) //频率值增加
	{
		delayms(5);
		if(key_add==0)
		{
			while(key_add==0) display(fre);
			fre[key]++;
			switch(key)
			{
				case 0:if(fre[key]>1) fre[key]=0;break;
				case 1:if((fre[0]==1)&&(fre[1]>2)) fre[key]=0;
						 else if((fre[0]==0)&&(fre[key]>9)) fre[key]=7;
						 else	if((fre[0]==0)&&(fre[key]<7)) fre[key]=9;
						 else if(fre[key]>9) fre[key]=0;break;

				case 2:if((fre[0]==1)&&(fre[1]>=2)) {fre[2]=0;fre[1]=2;}
						 else if(fre[key]>9) fre[key]=0;
						 if((fre[0]==0)&&(fre[1]<7)) fre[1]=7;
						 break;

				case 3:if((fre[0]==1)&&(fre[1]==2)) fre[2]=fre[3]=0;
						 else if(fre[key]>9) fre[key]=0;break;
				default:break;
			}
		}
	}
	
	//频率值减一按键 key_del
	if(key_del==0) //频率值减小
	{
		delayms(5);
		if(key_del==0)
		{
			while(key_del==0) display(fre);
			if(fre[key]==0)
				fre[key]=9;
			else
				fre[key]--;
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -