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

📄 chuankou.c

📁 串口双工通讯
💻 C
字号:
/***********************************************************************
函数名称:串口通信
函数功能:实现串口半双工通信
说明:主机发送1-8数字是可控制单片机LED点亮
	  主机发送的单个字符可在LCD 上显示
	  主机发送的数据可原样返回
	  单片机P3_2---P3_7可向主机发送字符
李灿松
2008.7.20
***********************************************************************/
#include<reg52.h>
#include<intrins.h>
#include<absacc.h>
#define uchar unsigned char
#define L1602_DB0_DB7 P0             //定义1602的数据总线
uchar code tab[10]={0x28,0xeb,0x32,0xa2,0xe1,0xa4,0x24,0xea,0x20,0xa0,}	;
uchar code str[]={"I LOVE YOU FOR 10.2 "};
uchar code hello[]={"hello:"};
uchar data dat[4];
sbit L1602_RS=P2^0;                  //定义1602得RS控制线
sbit L1602_RW=P2^1;                  //定义1602得RW控制线
sbit L1602_E=P2^2;                   //定义1602的E控制线
sbit L1602_Busy=P0^7;                //定义1602的测忙线
sbit P3_2=P3^2;
sbit P3_3=P3^3;
sbit P3_4=P3^4;
sbit P3_5=P3^5;
sbit P3_6=P3^6;
sbit P3_7=P3^7;
typedef bit BOOL ; 

void init(void)
{
	TMOD=0x20;			//定时器1工作在方式2
	PCON=0x00;	        //波特率不增倍
	SCON=0x50;			//串行工作方式3			   
	TH1=0xFD;		    //SMOD=0时的初值
	TL1=0xFD;
	TR1=1;
}

/*void delay(void)
{
	int k;
	for(k=0;k<800;k++);

}
  */

/**********************************************************************************************
函数名称:显示函数
函数功能:显示接受的数据
说明:
**********************************************************************************************/
void display()
{
    uchar t_shi,t_ge,t_feng,t_miao;
    void LCM1602_Init();
	void print(uchar a,uchar *str);
	void print1(uchar a,uchar t);
	void LCM1602_Delay(uchar count);
//    if(k==49)  P1=0xfe;
//	else if(k==50)  P1=0xfd; 
//	else if(k==51)  P1=0xfb;
//	else if(k==52)  P1=0xf7;
//	else if(k==53)  P1=0xef;
//	else if(k==54)  P1=0xdf;
//	else if(k==55)  P1=0xbf;
//	else if(k==56)  P1=0x7f;
//	else P1=0xff;
    t_shi=dat[0];t_ge=dat[1];t_feng=dat[2];t_miao=dat[3];
	LCM1602_Init();
	print(0x80,hello);
	print1(0xc0,t_shi);
	print1(0xc1,t_ge);
	print1(0xc2,t_feng);
	print1(0xc3,t_miao);
	LCM1602_Delay(5000);
}


void send_str()
// 传送字串
{
	unsigned char i = 0;
	while(str[i] != '\0')
	{
		SBUF = str[i];
		while(!TI);				// 等特数据传送
		TI = 0;					// 清除数据传送标志
		i++;					// 下一个字符
	}	
}

/**********************************************************************************************
函数名称:主函数
函数功能:主函数
说明:
**********************************************************************************************/

void main()
{
	P2=0xff;
	P0=0xff;
	EA=1;
	ES=1;             //串行口中断开
	init();
	while(1)
	{
		display();
		if(P3_2==0)	
		{
//	        SBUF='L';		   //发送
//	    	while(TI==0);		//等待串口发送完毕	
//			TI=0;
            send_str();
			while(P3_2==0);		//等待按键放
		}
		if(P3_3==0)	
		{
	 		SBUF='b';		   //发送
			while(TI==0);		//等待串口发送完毕
			TI=0;
			while(P3_3==0);		//等待按键放
		}
		if(P3_4==0)	
		{
	 		SBUF='i';		   //发送
			while(TI==0);		//等待串口发送完毕
			TI=0;
			while(P3_4==0);		//等待按键放
		}
		if(P3_5==0)	
		{
	 		SBUF='y';		   //发送
			while(TI==0);		//等待串口发送完毕
			TI=0;
			while(P3_5==0);		//等待按键放
		}
		if(P3_6==0)	
		{
	 		SBUF='n';		   //发送
			while(TI==0);		//等待串口发送完毕
			TI=0;
			while(P3_6==0);		//等待按键放
		}
		if(P3_7==0)	
		{
	 		SBUF='g';		   //发送
			while(TI==0);		//等待串口发送完毕
			TI=0;
			while(P3_7==0);		//等待按键放
		}

	}
 
}

serial () interrupt 4 using 1
{
    int i;
	if(RI==1)
	{
		RI=0;
		for(i=0;i<4;i++)
		{
			dat[i]=SBUF; 			//接受
            SBUF=dat[i];		   //发送	
		}
		while(TI==0);
		TI=0;
	}
}

/**********************************************************************************************
函数名称:延时函数
函数功能:转换延时和显示延时
说明:LCM1602_Delay()是液晶显示延时,delay()是温度转换延时
**********************************************************************************************/
void delay(unsigned int delay_time) // 延时程序
{
 while(delay_time--);
}

void LCM1602_Delay(uchar count)
{
	uchar i;
	while(--count!=0)
	   {for(i=0;i<250;i++);}	
}

/**********************************************************************************************
函数名称:初始化函数
函数功能:液晶1602初始化
说明:
**********************************************************************************************/
void  LCM1602_Init(void)
{
 void LCM1602_WriteData(uchar LCM1602_data);
 void LCM1602_WriteCMD(uchar LCM1602_command);
 LCM1602_WriteCMD(0x38);    //显示两行,每个字符为5*7个像素
 delay(1);
 LCM1602_WriteCMD(0x06);    //光标移动设置,光标右移
 delay(1);
 LCM1602_WriteCMD(0x0c);    //现设开,光标开,闪烁开
 delay(1);
 LCM1602_WriteCMD(0x01);    //清屏
 delay(1);
}
void  print(uchar a,uchar *str)
{
 void  LCM1602_WriteData(uchar LCM1602_data);
 void  LCM1602_WriteCMD(uchar LCM1602_command);
 LCM1602_WriteCMD(a);
 while(*str!='\0')
    {
    LCM1602_WriteData(*str++);
	}
 *str=0;
}
void print1(uchar a,uchar t)
{
 LCM1602_WriteCMD(a);
 LCM1602_WriteData(t);
}



/**********************************************************************************************
函数名称:写命令和写数据函数
函数功能:向LCD写命令和数据
说明:LCM1602_WriteCMD是写命令函数,void LCM1602_WriteData是写数据函数
**********************************************************************************************/
void LCM1602_WriteCMD(uchar LCM1602_command)
{
BOOL lcd_bz();
while(lcd_bz());	//测忙
L1602_RS=0;
L1602_RW=0;
L1602_E=0;
_nop_();
_nop_();
L1602_DB0_DB7=LCM1602_command;
_nop_();
_nop_();_nop_();
L1602_E=1;    //命令总送出
_nop_();_nop_();_nop_();
L1602_E=0; 
}

void LCM1602_WriteData(uchar LCM1602_data)
{
BOOL lcd_bz();
while(lcd_bz());	//测忙
L1602_RS=1;
L1602_RW=0;
L1602_E=0;
L1602_DB0_DB7=LCM1602_data;
_nop_();
_nop_();
_nop_();
_nop_();
L1602_E=1;   //数据送出
_nop_();
_nop_();
_nop_();
L1602_E=0;
}


/**********************************************************************************************
函数名称:LCD检测忙函数
函数功能:检测LCD是否处于忙状态
说明: 
**********************************************************************************************/
BOOL lcd_bz()
{							// 测试LCD忙碌状态
	BOOL result;
	L1602_RS=0;
    L1602_RW=1;
    L1602_E=1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	result = (BOOL)(P0 & 0x80);
	L1602_E = 0;
	return result;	
}
/**********************************************************************************************/ 

⌨️ 快捷键说明

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