📄 myapi.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 + -