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

📄 com.c

📁 串口调试程序 简单小程序适合51初学者大虾就不用看了
💻 C
字号:
//串口调试程序,下载本程序到主板,打开本文件夹中的串口调试软件,试试看,不用我讲了吧!
#include <reg52.h>
#include <intrins.h>


sbit SPK=P3^4;		//SPK定义为P3口的第4位,驱动蜂鸣器

code unsigned char key_tab[17]={0xed,0x7e,0x7d,0x7b,
								0xbe,0xbd,0xbb,0xde,
								0xdd,0xdb,0x77,0xb7,
								0xee,0xd7,0xeb,0xe7,0XFF};//========================此数组为键盘编码,
															//本人采用类似电话按键的编码方式,方便以后设计
										//	1	2	3	a					0x01 0x02 0x03 0x0a
										//	4	5	6	b	对应16进制码:	0x04 0x05 0x06 0x0b
										//	7	8	9	e					0x07 0x08 0x09 0x0e
										//	*	0	#	f					0x0c 0x00 0x0e 0x0f
code unsigned char table[]=
			{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
			//共阴数码管 0-9 表
unsigned char l_tmpdate[3]={0,0,0};

unsigned char l_key=0xff;					//定义变量,存放键值	
unsigned char l_keyold=0xFF;	//做为按键松开否的凭证				

void ReadKey(void);   //扫描键盘 获取键值

void display(unsigned char *lp,unsigned char lc);//数字的显示函数;lp为指向数组的地址,lc为显示的个数
void delay();//延时子函数,5个空指令

void main(void)  
{
	EA=1;			//开启总中断
	//RI=1;
	EX0=1;  		//开启外部中断 0
	IT0=1;        // 设置成 下降沿触发方式
	P0=0xf0;		//键盘端口设备
				//AT89S52还有个定时器3,是16位定时计数器,我们这里就用定时器3来产生波特率,
				//为何我们不用定时器2呢,是因为我们用的晶振有关,你们可以计算下,12M的频率用定时器2是难以
				//产生我们串口软件所要的比如9600,4800等波特率,所以这里我们用到了定时计数器3
				//下面是产生9600波特率的初值,你们可以用工式计算下:16位计数为65536-12000000/12/32/9600
	RCAP2L = 0xD8;
	RCAP2H = 0xFF;
	TL2=0XD8;
	TH2=0XFF;
	T2CON=0X34;	//此寄存器为设置定时器3做波特率发生器,是一个开关,默认为定时器2,所以我们要设置它
	SCON=0X50;	//串口的工作方式,设置为方式1
	ES=1;		//打开串口中断
	 while(1)
	  {
	  	display(l_tmpdate,3);//显示接收缓冲变量的值
		if(l_key!=0xff){		//检测键盘是否有键要处理		
			SBUF=l_key;			//我们这里直接将键盘编码发送出去
			while(!TI){}
			TI=0;   //			等待发送完毕返回继续检测
			l_key=0xff;
		}
	  }	

}
void display(unsigned char *lp,unsigned char lc)//显示
{
	unsigned char i;		//定义变量
	P2=0;					//端口2为输出
	P1=P1&0xF8;				//将P1口的前3位输出0,对应138译门输入脚,全0为第一位数码管
	for(i=0;i<lc;i++){		//循环显示
	P2=table[lp[i]];		//查表法得到要显示数字的数码段
	delay();				//延时
	P2=0;					//清0端口,准备显示下位
	if(i==7)				//检测显示完8位否,完成直接退出,不让P1口再加1,否则进位影响到第四位数据
		break;	
	P1++;					//下一位数码管
	}
}
void delay(void)								//空5个指令
{
	unsigned char i=10;
	while(i)
		i--;
}
//以下一部份在键盘程序里有说明,此处不在讲述
void key_scan()   interrupt 0    //外部中断 0  0的优先级最高 							
{								
	EX0=0;					
	TMOD&=0XF1;				
	TH0=0X2E;				
	TL0=0X00;
	ET0=1;				
	TR0=1;					
} 
void timer0_isr(void) interrupt 1	//定时器0的中断函数
{	
	TR0=0;						
	ReadKey();				
}
void ReadKey(void)						//读键盘值
{
	unsigned char i,j,key;
	j=0xfe;
	key=0xff;			
	for (i=0;i<4;i++){		
		P0=j;				
		if ((P0&0xf0)!=0xf0){						
			key=P0;				
			break;		
		}
		j=_crol_(j,1);			
	}
	if (key==0xff){			
		l_keyold=0xff;
		P0=0xf0;			
		EX0=1;				
		SPK=1;
		return;
	}
	SPK=0;					
	if(l_keyold==key){		
		TH0=0X2E;			
		TL0=0;
		TR0=1;		
	   	return;
	}		
	TH0=0X2E;			
	TL0=0;
	TR0=1;				

	l_keyold=key;			

	for(i=0;i<17;i++){		
		if (key==key_tab[i]){
			l_key=i;
			break;
		}
	}
}  
void com_isr(void) interrupt 4      //串口中断
{	
	unsigned char tmp;			//定义变量执接收串口数据
	RI=0;						//将寄存器复位等待接收下一个
	tmp=SBUF;					//将接收的数据存于变量中
	l_tmpdate[0]=tmp/100;		//将数据分开三位显示
	tmp=tmp%100;
	l_tmpdate[1]=tmp/10;
	l_tmpdate[2]=tmp%10;
}

⌨️ 快捷键说明

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