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

📄 key_uart.c

📁 51系列单片机实验课程:计数 (通过串口
💻 C
字号:
/*****************************************************
激情创造,精彩无限-------欢迎进入单片机的世界
*****************************************************/
/*****************************************************
程序说明:本程序完成在实验箱BANK 3部分显示接收到的PC发送给单片机
 		 的字符的ASCII码值,及接收到的数据的个数;同时当按下行列
		 式键盘中的键时,将该键的键值发送给PC机,并在数码管上显
		 示发送的次数。
硬件连接:使用实验箱BANK 3部分电路。
程序版本:
作者:ZJ
编写时间:2007年12月13日
修改记录:
备注:
*****************************************************/
#include <reg52.h>

sbit SEGLOCK = P1^3;			//定义段码锁存信号端名字
sbit POSITLOCK = P1^2;			//定义位选锁存信号端名字

code unsigned char LedCode[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
								//共阳数码管码表
code unsigned char PositCode[] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
								//共阳数码管位选信号码表
code unsigned char ASCII[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
								//数字0----F对应的ASCII码值

unsigned char Rch,Tch;				//定义接收和发送字符变量
unsigned char Rcounter,Tcounter;	//定义接收和发送字符次数变量
unsigned char DisBuf[8];			//定义显存空间

/**********************************************
函数名称:段码锁存信号函数
函数功能:实现段码锁存功能
入口参数:void
出口参数:void
备注:
**********************************************/
void SegLock (void)					
{
	SEGLOCK = 1;
	SEGLOCK = 0;
}

/**********************************************
函数名称:位选锁存信号函数
函数功能:实现位选锁存功能
入口参数:void
出口参数:void
备注:
**********************************************/
void PositLock (void)
{
	POSITLOCK = 1;
	POSITLOCK = 0;
}

/**********************************************
函数名称:Delay()
函数功能:实现一短暂的延时,时间长短由入口参数决定
入口参数:unsigned int
出口参数:void
备注:
**********************************************/
void Delay (unsigned int Dat)
{
	unsigned int i;
	for (i=0;i<Dat;i++);
}

/**********************************************
函数名称:数码管显示函数
函数功能:实现8位数码管的显示
入口参数:void
出口参数:void
备注:
**********************************************/
void Display (void)
{
	unsigned char i;
	for (i=0;i<8;i++)
	{
		P0 = LedCode[DisBuf[i]];		//送对应的显存空间中数的段码
		SegLock();						//锁存段码
		P0 = PositCode[i];				//送对应的显存的位选信号
		PositLock();					//锁存位选
		Delay(10);						//延时
		P0 = 0x00;						//送消隐信号
		PositLock();
	}
}

/**********************************************
函数名称:显存数据更新函数
函数功能:实现8位显存数据的更新
入口参数:void
出口参数:void
备注:
**********************************************/
void DisPrint (void)
{
	DisBuf[0] = Tch >> 4;			//将发送数据的ASCII码值的高四位送入DisBuf[0]
	DisBuf[1] = Tch & 0x0f;			//将发送数据的ASCII码值的低四位送入DisBuf[1]
	DisBuf[2] = Tcounter / 10;		//将发送数据次数变量的十位送入DisBuf[2]
	DisBuf[3] = Tcounter % 10;		//将发送数据次数变量的个位送入DisBuf[3]
	DisBuf[4] = Rch >> 4;			//将接收数据的ASCII码值的高四位送入DisBuf[4]
	DisBuf[5] = Rch & 0x0f;			//将接收数据的ASCII码值的低四位送入DisBuf[5]
	DisBuf[6] = Rcounter / 10;		//将接收数据次数变量的十位送入DisBuf[6]
	DisBuf[7] = Rcounter % 10;		//将接收数据次数变量的个位送入DisBuf[7]
}

/**********************************************
函数名称:判键函数
函数功能:判断是否有键按下
入口参数:void
出口参数:unsigned char ( 0 / 1)
备注:
**********************************************/
unsigned char Kbhit (void)
{
	P2 = 0xf0;
	if ( P2==0xf0 ) return (0);
	else return (1);
}

/**********************************************
函数名称:判键值函数
函数功能:判断按键的键值
入口参数:void
出口参数:unsigned char
备注:
**********************************************/
unsigned char GetKeyCode ( void )
{
	unsigned char keycode;	//定义一个键值变量用于判断键值
	P2 = 0x0f;
	keycode = P2;
	P2 = 0xf0;
	keycode |= P2;	//将组合以后的键值存储
	switch ( keycode )	
	{
		case 0xee: return ( 15 );	break;
		case 0xde: return ( 0 ); 	break;
		case 0xbe: return ( 14 ); 	break;
		case 0x7e: return ( 13 ); 	break;
		case 0xed: return ( 7 ); 	break;
		case 0xdd: return ( 8 ); 	break;
		case 0xbd: return ( 9 ); 	break;
		case 0x7d: return ( 12 ); 	break;
		case 0xeb: return ( 4 ); 	break;
		case 0xdb: return ( 5 );	break;
		case 0xbb: return ( 6 ); 	break;
		case 0x7b: return ( 11 ); 	break;
		case 0xe7: return ( 1 ); 	break;
		case 0xd7: return ( 2 ); 	break;
		case 0xb7: return ( 3 ); 	break;
		case 0x77: return ( 10 ); 	break;
	}
}

/**********************************************
函数名称:主函数
函数功能:
入口参数:void
出口参数:void
备注:
**********************************************/
void main (void)
{
	SCON = 0x50;					//设定串口工作方式
	TMOD = ( TMOD&0x0F ) | 0x20;	//设定T1波特率发生器工作方式
	TH1 = -11059200/12/32/9600;		//设定T1的初值
	TL1 = TH1;
	TR1 = 1;						//启动波特率发生器
	ES = 1;							//开启串口中断
	EA = 1;							//开启单片机总的中断
	while (1)
	{
		DisPrint();					//更新显存内容
		Display();					//调用显示函数
		if ( Kbhit() )				//判断有无键按下
		{
			SBUF = ASCII[GetKeyCode()];		//将按下的键的键值取出转换成ASCII码值后送如发送缓冲器发出
			TI = 0;
			while ( TI==0 );				//判断发送是否完成
			TI = 0;							//发送完成后把TI清零,防止TI触发中断
			if(++Tcounter >= 100)			//对发送数据次数变量加1,判断是否超过100
				Tcounter = 0;
			Tch = ASCII[GetKeyCode()];		//更新发送数据变量的值
			while ( Kbhit() )				//判断键是否弹起,如果没有,循环执行更新显存和显示函数
			{	
				DisPrint();	
				Display();
			}
		}
	}
}


/**********************************************
函数名称:串口中断服务程序函数
函数功能:判断是否接收到数据
入口参数:void
出口参数:void
备注:
**********************************************/
void Uart_int (void) interrupt 4		
{
	if (RI)							//判断是否接收到了新的数据
	{	
		Rch = SBUF;					//如果接收到了新的数据,将新的数据取出
		RI = 0;
		if (++Rcounter >= 100)		//对接收数据次数变量加1,判断是否超过100
			Rcounter = 0;
	}
}

⌨️ 快捷键说明

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