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

📄 myapi.c

📁 单片机485通信单发单收单发多收及主从模式
💻 C
字号:
#include<reg52.h>
#include"MYAPI.h"
extern BYTE DISPLAYNUM;
extern BYTE oldSW;
extern BYTE TorRF;
extern BYTE COUNT1;
extern BYTE COUNT2;
extern BYTE SENDNUM;
extern BYTE RENUM;
extern BYTE EERCOUNT;
extern BYTE MASTERNUM;//累加主机接收到的个数 主机中使用
extern BYTE SLAVERNUM;//累加从机发送的个数,从机中使用
extern BYTE ADDRSlaver;//主机使用的 地址变量
extern BYTE ACKMASTER;
extern BYTE ACKSLAVER;
extern BYTE COUNT3;

void CPU_INIT(void)//中断  定时器  串口初始化
{	
	ACKMASTER	=	0;
	ACKSLAVER	=	0;
	COUNT1	=	0;
	COUNT2	=	0;
	COUNT3	=	0;	
	DISPLAYNUM	 =	0;
	SENDNUM		 =	0x00;
	RENUM		 =	0;
	oldSW		=	0xFF;
	TorRF	=	1;//不能接收
	TR_CFG	=	1;
	P2		=	0xFF;
	//中断
	IE		=	0x0A;//EA _ _ ES ET1 EX1 ET0 EX0
	IP		=	0x08;//- - - PS PT1 PX1 PT0 PX0
	//定时器
	TMOD	=	0x11;//GATE C/_T M1 M0(T1) GATE C/_T M1 M0(T0)
	TCON	=	0x00;//TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
	TH0		=	0x3C; 
	TL0		=	0xAF;//sw定时初值
	TH1		=	0xB1; 
	TL1		=	0xE0;//Display定时初值
	//T2
//	T2CON	=	0x30;
//	RCAP2H	=	0xff;
//	RCAP2L	=	0xee;
//	TH2		=	0xff;
//	TL2		=	0xee;
	

	//串口
	SCON	=	0x90;//SM0 SM1 SM2 REN TB8 RB8 TI RI
	PCON	=	PCON|0x80;//SMOD - - - - - - - 
	EA		=	1;
	TR0		=	1;
}
//根据不同的拨码开关值执行不同测试程序(SW1 SW2 SW3 ~SWT)	  
//0111(7F)数码管  1011(BF)发光二极管跑马灯
//拨码开关(1101(DF)红 1110(EF)绿)  
//通信(0111(F7)单发 1011(FB)单收  1101(FD)单发多收,多机通信)  0101 SW5==0为主机   1001  SW6==0为从机
void STATE_SW(void)
{
		BYTE tmp;
		tmp	=	P1;
		tmp =	tmp|0x01;

		switch(tmp)
		{
			case 0x7F:
			{
				TR1		=	1;TorRF	=	1;
				if(COUNT1	<	5) COUNT1++;
				else {COUNT1 = 0; if(DISPLAYNUM<99) ++DISPLAYNUM;else {SR2=SR1=ST1=ST2=1;DISPLAYNUM=0;}}
			}
			break;
			case 0xBF:
				LED();	
			  	break;
			case 0xF7:
				AtoB();
				break;
			case 0xFB:
				AreB();
				break;
			case 0xFD:
			case 0xF5:
			case 0xF9:
				MasterTOSlaver();
				break;
			case 0x01:
				CPU_INIT();
				break;
			default:
					TESTSW();
				if(SW1) {DisplayOFF();}
				if(SW6) {AreBOFF();}
				if(SW5) {AtoBOFF();}				
				break;
		}
		oldSW	=	tmp;
}
void Delay(BYTE n)//大约n ms
{
	BYTE i;   
    while(n--)   
        for(i = 0; i < 124; i++);
}
void Display(void)
{	

	if(DISPLAYNUM	<=	9)
	{
		P0	=	0xF0|DISPLAYNUM;
		if(TorRF	==	1) {SR1	=	1;ST2		=	1; ST1	=	0;}
		else {ST1	=	1;SR2	=	1;SR1	=	0; }
	}
	else
	{
		BYTE TMP1;
		BYTE TMP2;
		TMP1	=	DISPLAYNUM%10;
		TMP2	=	DISPLAYNUM/10;
		if(TorRF	==	1) {SR1	=	SR2	=	1;ST2	=	1;P0	=	TMP1|0xF0;ST1	=	0;Delay(40);ST1	=	1;P0	=	TMP2|0xF0;ST2	=	0;}
		else {ST1	=	ST2	=	1;SR2	=	1;P0	=	TMP1|0xF0;SR1	=	0;Delay(40);SR1	=	1;P0		=	TMP2|0xF0;SR2	=	0;}
	}

}
void DisplayOFF(void)
{TR1	=	0;SR2=SR1=ST1=ST2=1;DISPLAYNUM=0;}
void LED(void)//跑马灯
{
	BYTE tmp;
	tmp	=	P2|0x0F;
	P2	=	tmp&0xF7;
	Delay(255);
	P2	=	tmp&0xF3;
	Delay(255);
	P2	=	tmp&0xF9;
	Delay(255);
	P2	=	tmp&0xFC;
	Delay(255);
	P2	=	tmp&0xFE;
	Delay(255);
	P2	=	tmp&0xFF;
	Delay(255);
}

void TESTSW(void)//当检测到P1.?和P1.?口为低电平时,就分别将红灯点亮和将绿灯点亮。
{		if(SWGREEN == 0) GREEN1	=	GREEN2	=	0; else GREEN1	=	GREEN2	=	1;
		if(SWRED   == 0) RED1	=	RED2	=	0; else RED1	=	RED2	=	1;
}


void AtoB(void)//将i到j从A发送到B    闪烁~~~~~~~~
{
	TorRF	=	1;TR_CFG	=	1;
	ES		=	0;
	SBUF	=	SENDNUM;
	DISPLAYNUM	 =	SENDNUM;
	TR1		=	1; 
	while(!TI);
	TI	=	0;
	GREEN1	=	0;
	GREEN1	=	1;
	if(COUNT2	<	5) COUNT2++;
	else {COUNT2 = 0; if(SENDNUM<99) ++SENDNUM;else SENDNUM=DISPLAYNUM=0;}
	ES	=	1;
}
void AtoBOFF(void)
{ES		=	0;TR1		=	0;DISPLAYNUM	=	0;ST1	=	ST2	=	1;}
void AreB(void)//A从B接收到一个字节 作为跟新全局变量DISPLAYNUM
{
	ES		=	1;TorRF		=	0;TR_CFG	=	0;
	while(!RI);
	RI	=	0;
	RENUM	=	SBUF;
	TorRF	=	0;
	TR1	=	1;
	DISPLAYNUM	=	RENUM;
}
void AreBOFF(void)
{ES		=	0;TorRF		=	1;TR_CFG	=	1;SR1	=	SR2	=	1;TR1	=	0;}
void MasterTOSlaver(void)//主从通信 每回合通信为16个数
{
	SM2	=	1;
	TR0	=	0;
	//主机程序
	if((SW5	==	0)&&(!ACKMASTER))
	{
		TR1		=	0;	ST1 = ST2 = SR1 = SR2 = 1;TI	=	0;
		TB8	=	1;
		TR_CFG	=	1;
		SBUF	=	ADD1;
		
		while(!TI);
		TI	=	0;
		TR_CFG	=	0;
		SM2	=	0;
		GREEN1	=	0;
		GREEN1	=	1;
		
		MASTERNUM	=	0;
		DISPLAYNUM	=	0;
		TorRF	=	0;

		RI	=	0; 
			
				
		while(MASTERNUM	<	MAXNUM 	+	1)
		{
			while(!RI);
			RI	=	0;
			RENUM	=	SBUF;
			DISPLAYNUM	=	RENUM;ACKMASTER	=	1; TorRF	=	0;
			TR1	=	1;
			MASTERNUM++;
//			Delay(255);
		}
		TR_CFG	=	1;	
		SM2	=	1;	
	
/*		//接收超时
		if(!ACKMASTER)
		{
			TR1	=	0;
			ST1 = ST2 = SR1 = SR2 = 1;
			P0	=	0xF8;
			DISPLAYNUM	=	SENDNUM;TR1	=	1;TorRF	=	1;//可在此处修正从机地址
		}*/ 
		
		

	}
	if((SW6 	==	0)&&(!ACKSLAVER))
	{
		TR1		=	0;	ST1 = ST2 = SR1 = SR2 = 1;TR_CFG	=	0;TorRF	=	0;
		
//		while(EERCOUNT	<	255) 
//		{
//			++EERCOUNT;
//			if(RI	==	1)
//			{
				while(!RI)
				RI	=	0;

				RENUM	=	SBUF;
				if(ADD	==	RENUM)
				{
					SENDNUM	=	0x10;SM2	=	0;
					TorRF	=	1;TR_CFG	=	1;ACKSLAVER = 1;
					SLAVERNUM	=	0;
					while(SLAVERNUM	<	MAXNUM)
					{
						TB8	=	0;
						SBUF	=	SENDNUM;
						DISPLAYNUM	 =	SENDNUM;
						TR1		=	1; 
						while(!TI);
						TI	=	0;
						GREEN1	=	0;
						GREEN1	=	1;
						if(SENDNUM<99) ++SENDNUM;
						else SENDNUM=DISPLAYNUM=0;
						SLAVERNUM++;
						Delay(255);
					}

				}

//			} 
//		}

/*		if(!ACKSLAVER)
		{
			TR1	=	0;
			ST1 = ST2 = SR1 = SR2 = 1;
			P0	=	0xF0;
			DISPLAYNUM	=	SENDNUM;TR1	=	1;TorRF	=	0;//可在此处修正从机地址
		}  */

	}
	SM2	=	1;
	TR0	=	1;
}

⌨️ 快捷键说明

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