串口通信的进阶应用

 这里主要是对题目的通信规约进行分析,题目要求的是0关灯,1开灯,而P0口是0点亮led灯,所以在传入数据时,要对数据进行取反操作,另外AB分别对led灯进行不同的操作,那么当输入为0xa3时,其目的是点亮led的1.3栈灯,但是输入的a是高八位,为了不影响原来P0的高8位就需要进行相应的与或操作,0与任何数相或不改变原来的数,1与任何数相与不改变原来的数。

例如P0=0x43,我的commend=0xa5,为的是打开第一盏灯和第三盏灯,那么首先我需要对commend取反,因为题目的关灯和开灯是与我的P0电灯是相反的,那么我的目的就是将P0=0x43改为0x45,因为只有低4位操作led灯(其实高4位也没有相应的操作),P0 |0x0f ,高位4不变 ,低4位为1(P0口的灯全部熄灭) ,  然后将(~commend) | 0xf0 保证commend的后4位不变 ,然后 

P0 |0x0f  & (~commend) | 0xf0  1与然和数相与 为原来的数 ,就可以保证 P0的高4不变,然后 又可以通过commend的低4位进行点灯的操作

因为当输入命令的时候0xa? 中的a已经占了高4位,那么就不可能点亮5678中的灯,

当输入命令为0xb? 是对5678中的灯进行操作,那么就需要将命令commed左移4位 才能点亮led,移动4位就是对高4位进行操作,那么与或的值也要跟着改变 

例如 P0=0x43  我的命令是0xb5 就是对P0的高位操作 那么P0 | f0  然后   ~commend<<4  | 0x0f   最后它们 再进行相与

对通信规约解释完后 ,然后是发送字符串 需要定义一个发送字符串的函数,在接收变量的时候用指针接收地址,然后一位一位移动进行发送

具体步骤: 定义选择138的开关,定义初始化继电器的函数(通过选择138先关掉继电器然后关掉led), 初始化定时器1(一共有7行代码) ,中断服务函数 用来接收数据(需要定义变量),发送字节函数(需要定义变量),发送字符串函数(需要用到指针变量来接收),工作做函数,对接收的变量的内容进行操作,进行完相关的操作后要给变量符初值,否则会一直进行相关的操作

#include <STC12C5A60S2.H>

void sendstring(unsigned char *date);
void send(unsigned char dat);
void delay(unsigned char i)
{
	while(i--);
	
}

void select138(unsigned char n)
{
	switch(n)
	{
		case 4:
			P2=(P2&0x1f)|0x80;
		break;
		case 5:
			P2=(P2&0x1f)|0xa0;
		break;
		case 6:
			P2=(P2&0x1f)|0xc0;
		break;
		case 7:
			P2=(P2&0x1f)|0xe0;
		break;
		
	
	}
}

void  inintjdj()
{
	select138(5);
	P0=0x00;
	select138(4);
	P0=0xff;
}

void INint()
{
	TMOD=0x20;
	TR1=1;
	TH1=0xfd;
	TL1=0xfd;
	SCON=0x50;
	EA=1;
	ES=1;
	AUXR=0x00;


}
unsigned char commend=0x00;
void service() interrupt 4
{
	if(RI==1)
	{
		commend=SBUF;
		RI=0;
	}
	
}
void send(unsigned char commend)
{
	SBUF=commend;
	while(TI==0);
	TI=0;
}
void sendstring(unsigned char *commend)
{
	while(*commend!='\0')
	{
		send(*commend++);
	}

}




void key()
{
	select138(4);
	if(commend!=0x00)
	{
		switch(commend&0xf0)
		{
		case 0xa0:
			P0= (P0|0x0f) &  (~commend | 0xf0);
		    commend=0x00;
		break;
		case 0xb0:
			P0= (P0|0xf0) &  ((~commend <<4)| 0x0f);
		    commend=0x00;
		break;
		case 0xc0:
			sendstring("asdfasd");
			 commend=0x00;
		break;
		
		}
	}
	


}




void main()
{	
	INint();
	inintjdj();
	while(1)
	{
		key();
	}
}

书名:《C/C++串口通信典型应用实例编程实践》(电子工业出版社.曹卫杉) PDF扫描版,全书共分10章,共316页。 内容介绍 本书从工程应用的角度出发,对目前流行的三种不同类型的C/C++语言(包括C++ Builder、Visual C++和LabWindows/CVI)开发串口通信(也称为串行通信)程序进行了阐述。 基础篇简单介绍了C/C++语言实现串口通信需要的基本知识;应用篇通过PC与PC、PC与单片机、PC与智能仪器、PC与PLC、PC与GSM短信模块、PC与远程I/O模块等典型应用实例,详细介绍了C/C++语言利用MSComm控件、API函数实现串口通信的程序设计方法。每个实例的设计任务同时采用C++ Builder、Visual C++和Labgrmdows/CVI实现。 本书内容丰富,结构清晰,文字叙述深入浅出,通俗易懂,以实践应用为主,突出程序设计,重在功能实现,有较强的实用性和可操作性。 本书可作为高等院校计算机应用、测控技术、机电一体化、自动化等专业的研究生、本科生以及计算机测控系统研发的工程技术人员等学习C/C++串口通信编程技术的参考书。 目录 基础篇   第1章 串口通信基础   1.1 串口通信的基本概念   1.2 串口通信及其标准   1.3 串口通信调试   第2章 C/C++编程语言与串口通信   2.1 串行通信控件MSComm   2.2 API函数   2.3 线程   2.4 LabWindows/CVI串口通信函数 应用篇   第3章 PC与PC串口通信程序设计   3.1 设计说明   3.2 任务实现   第4章 PC与单片机串口通信程序设计   4.1 设计说明   4.2 任务实现   第5章 PC与智能仪器串口通信程序设计   5.1 设计说明   5.2 任务实现   第6章 PC与PLC串口通信程序设计   6.1 设计说明   6.2 任务实现   第7章 PC与GSM短信模块串口通信程序设计   7.1 设计说明   7.2 任务实现   第8章 PC与读卡器串口通信程序设计   8.1 设计说明   8.2 任务实现   第9章 PC与智能仪器构成的DCS程序设计   9.1 设计说明   9.2 任务实现   第10章 PC与远程I/O模块构成的DCS程序设计   参考文献
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值