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

📄 square.c

📁 51单片机实现方波信号可调输出
💻 C
字号:
#include <reg51.h>
#include <intrins.h>

/******************************与编译器无关的数据类型定义*********************************/

typedef unsigned char      uint8;                // 无符号8位整型变量
typedef signed   char      int8;                 // 有符号8位整型变量
typedef unsigned short     uint16;               // 无符号16位整型变量
typedef signed   short     int16;                // 有符号16位整型变量
typedef unsigned long      uint32;               // 无符号32位整型变量
typedef signed   long      int32;                // 有符号32位整型变量
typedef float              fp32;                 // 单精度浮点数(32位长度)
typedef double             fp64;                 // 双精度浮点数(64位长度)

/********************************MPU管脚定义***********************************************/

#define KEY        P2							 //键盘管脚定义

sbit 	OUT   	   = P1^0;						 //方波输出管脚定义
 
/********************************全局变量定义***********************************************/
   
uint8 code Tab[36]={0x14,0x46,0x72,0x65,0x71,0x75,0x65,0x6E,0x63,0x65,      //显示数据
			    	0x3A,0x39,0x39,0x39,0x39,0x2E,0x39,0x39,0x39,0x48,
					0x7A,0x50,0x65,0x72,0x69,0x6F,0x64,0x3A,0x30,0x30,
					0x30,0x31,0x30,0x30,0x75,0x53};  

int8  data1,data2,data3,data4=1;											//显示缓存

uint16 k=0,count=1;									                   		//软件计数寄存器

/********************************************************************************************
* 函数名称:Delay()
* 功    能:软件延时
* 入口参数:count    延时参数,值越大,延时越长
* 出口参数:无
*********************************************************************************************/
void Delay(uint16 count)
{
	uint8 i;           
	while(--count!=0)        
    	{
        	for(i=0;i<125;i++);     // i 从0加到125,在12M晶体下CPU大概耗时1毫秒           
    	}                                
}

/********************************************************************************************
* 函数名称:Key()
* 功    能:扫描键值
* 入口参数:无
* 出口参数:Key_value  	有按键返回键值,否则返回0
*********************************************************************************************/
uint8 Key(void)
{	
	uint8 Key_value;
	if(KEY!=0xFF)               //有键按下
	{
	  	Delay(20);			  	//延时去抖动
		if(KEY!=0xFF)			//确认真的有键按下
		{
			Key_value=KEY;
			switch(Key_value)	//根据按键情况赋键值
			{
				case(0xFE):{Key_value=8;}
				break;
				case(0xFD):{Key_value=7;}
				break;
				case(0xFB):{Key_value=6;}
				break;
				case(0xF7):{Key_value=5;}
				break;
				case(0xEF):{Key_value=4;}
				break;
				case(0xDF):{Key_value=3;}
				break;
				case(0xBF):{Key_value=2;}
				break;
				case(0x7F):{Key_value=1;}
				break;		
			} 
		}
		else Key_value=0;	//此次按键为误码,返回0			
	}
	else Key_value=0;		//无键按下,返回0			
	return Key_value;		 			
}

/********************************************************************************************
* 函数名称:COM_init()
* 功    能:串口初始化,用于LCD数据发送
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void COM_init(void)
{	
	TMOD=0x22;           		 //定时器T1设置(方式2)
	TL1=0xFA;			 		 //置定时器T1初值
	TH1=0xFA;			 		 //串口波特率9600(晶振11.0592M)
	TR1=1;						 //启动T1
	PCON=0x80;					 //SMOD=1
	SCON=0x50;					 //设置串口方式1工作
}

/********************************************************************************************
* 函数名称:Time0_init()
* 功    能:定时器0初始化
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void Time0_init(void)
{	
	TMOD=0x22;           		 //定时器T0设置(方式2)
	TL0=0xD2;			 		 //置定时器T0初值
	TH0=0xD2;			 		 //定时50uS(晶振11.0592M)
	EA=1;						 //开CPU中断
	ET0=1;			  	   		 //允许T0中断
	TR0=1;						 //启动T0
}

/********************************************************************************************
* 函数名称:Timer0()
* 功    能:定时器T0中断服务程序
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void Timer0(void)	interrupt 1
{	
	k++;
	if(k>=count)
	{
		k=0;
		OUT=!OUT;					//方波输出
	}
}

/********************************************************************************************
* 函数名称:LCD_write()
* 功    能:向LCD写入1Byte数据
* 入口参数:data  要写入的数据
* 出口参数:无
*********************************************************************************************/
void LCD_write(uint8 DATA)
{
	   	EA=0;		 				//关中断
		SBUF=DATA;					//向LCD串行写入1Byte数据
		Delay(10);					//延时
		EA=1;                      	//开中断
}

/********************************************************************************************
* 函数名称:Init()
* 功    能:程序初始化
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void Init(void)
{
	uint8 i;	
	Time0_init();
	COM_init();
	P1=0;							//清P0口
	for(i=0;i<36;i++)               //LCD显示初始化         
	{
		LCD_write(Tab[i]);
	} 	                         
}
  
/********************************************************************************************
* 函数名称:main()
* 功    能:主程序
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void main(void)
{
	int8 key_value;							//键值存放寄存器  
	int8 DP;                                //指示光标位置寄存器 
	uint32	freq; 
	Init();
	while(1)
	{
		key_value=Key();
		if(key_value!=0)
		{  						 
			switch(key_value)	
			{
				case(1):
				{
					DP=0x1E;
					LCD_write(0x10);		//指示光标定位
					LCD_write(0x1E);
					LCD_write(0x15);		//光标闪烁
				}
				break;
				case(5):
				{
					if(DP!=0)
					{
						LCD_write(0x14);			//光标消隐
						EA=0;
						count=data1*1000+data2*100+data3*10+data4;
						EA=1;
						if(count==0)
						{
							count=1;
							LCD_write(0x10);		//指示光标定位
							LCD_write(0x1E);
							LCD_write(0x31);
						}
						if(count==1)
						{
							LCD_write(0x10);		//指示光标定位
							LCD_write(0x0A);
							LCD_write(0x39);
							LCD_write(0x39);
							LCD_write(0x39);
							LCD_write(0x39);
							LCD_write(0x2E);
							LCD_write(0x39);
							LCD_write(0x39);
							LCD_write(0x39);
						}
						else
						{
						   	freq=10000000/count;
							LCD_write(0x10);		//指示光标定位
							LCD_write(0x0A);
							LCD_write(freq/1000000+0x30);
							LCD_write((freq/100000)%10+0x30);
							LCD_write((freq/10000)%10+0x30);
							LCD_write((freq/1000)%10+0x30);
							LCD_write(0x2E);
							LCD_write((freq/100)%10+0x30);
							LCD_write((freq/10)%10+0x30);
							LCD_write(freq%10+0x30);
						}	
						DP=0;
					}
				}
				break;
				case(3):
				{
					if(DP!=0)
					{
					   	switch(DP)
						{
					   		case(0x1B):
							{
								data1++;					//数据增
								if(data1==10){data1=0;}
								LCD_write(data1+0x30);		//更新显示
								LCD_write(0x10);		    //指示光标重新定位
								LCD_write(DP);
							}
							break;
							case(0x1C):
							{
								data2++;					//数据增
								if(data2==10){data2=0;}
								LCD_write(data2+0x30);		//更新显示
								LCD_write(0x10);		    //指示光标重新定位
								LCD_write(DP);
							}
							break;
							case(0x1D):
							{
								data3++;					//数据增
								if(data3==10){data3=0;}
								LCD_write(data3+0x30);		//更新显示
								LCD_write(0x10);		    //指示光标重新定位
								LCD_write(DP);
							}
							break;
							case(0x1E):
							{
								data4++;					//数据增
								if(data4==10){data4=0;}
								LCD_write(data4+0x30);		//更新显示
								LCD_write(0x10);		    //指示光标重新定位
								LCD_write(DP);
							}
							break;
						}
					}
				}
				break;
				case(7):
				{ 										
					if(DP!=0)
					{
						switch(DP)
						{
					   		case(0x1B):
							{
								data1--;					//数据减
								if(data1<0){data1=9;}
								LCD_write(data1+0x30);		//更新显示
								LCD_write(0x10);		    //指示光标重新定位
								LCD_write(DP);
							}
							break;
							case(0x1C):
							{
								data2--;					//数据减
								if(data2<0){data2=9;}
								LCD_write(data2+0x30);		//更新显示
								LCD_write(0x10);		    //指示光标重新定位
								LCD_write(DP);
							}
							break;
							case(0x1D):
							{
								data3--;					//数据减
								if(data3<0){data3=9;}
								LCD_write(data3+0x30);		//更新显示
								LCD_write(0x10);		    //指示光标重新定位
								LCD_write(DP);
							}
							break;
							case(0x1E):
							{
								data4--;					//数据减
								if(data4<0){data4=9;}
								LCD_write(data4+0x30);		//更新显示
								LCD_write(0x10);		    //指示光标重新定位
								LCD_write(DP);
							}
							break;
						}
					}
				}
				break;
				case(2):
				{						
					if(DP!=0)
					{
						DP--;						//光标左移
						if(DP==0x1A){DP=0x1B;}
						LCD_write(0x10);		    //指示光标重新定位
						LCD_write(DP);
					}	
				}
				break;
				case(6):
				{
					if(DP!=0)
					{
						DP++;						//光标右移
						if(DP==0x1F){DP=0x1E;}
						LCD_write(0x10);		    //指示光标重新定位
						LCD_write(DP);
					}					
				}
				break;						
			} 	
			Delay(100);	
		}		 		
	}
}

******************************************************************exp666********************************************

⌨️ 快捷键说明

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