双机通信程序
发布网友
发布时间:2022-05-12 11:42
我来回答
共1个回答
热心网友
时间:2023-10-30 18:41
#include <reg51.h> //单片机头文件
#define uchar unsigned char //宏定义,uchar字符代替unsigned char,即无符号字符型数据,占1个字节,取值于0-255
#define uint unsigned int //宏定义,用uint字符代替unsigned int,即无符号整数,
sbit p21=P2^1;//(按键端口)定义特殊功能寄存器的位变量
uint j,f;
uchar dat[]={0xff,0x00,0x18,0x3c,0x7e,0xff,0x7e,0x3c,0x18,0x00};//发送控制LED的十六进制的数,依次为255,0,24,60,126,255,126,60,24,0。
void delay(uint x)//void为无返回值的函数,软件延时
{
uint k; //定规无符号整数k
while(x--)//while循环,弱非0,则执行循环体语句,
{
for(k=120;k>0;k--); //循环嵌套达到延时目的。
}
}
void serial_init() //using 0 中断初始化
{
P1=0x00;
p21=1;
SCON=0x50;//(工作在方式1下,REN设置为允许接收).给SCON控制寄存器赋值16进制数50,即01110000,01决定工作方式1,REN为第四个数字,即1,为允许两机接收。
PCON=0x00;//(不加倍) PCON寄存器定义:当值为1是,串口波特率加倍,其他则不加倍 (PCON除最高位外都输虚设的)
TMOD=0x20;//自动重装初值,波特率:9600。计数模式控制寄存器,方式2,初值自动重载8位计数器。
TH1=0xfd;//TH1是作为时间常数的寄存器的
TL1=0xfd;//TL1是作为8位计数器,可以实现TL1计数回0时自动重装时间常数,即将TH1中的数自动送给TL1,再次计数 (9600=11.0592*1000000/12/(0x100-0xfd)/32)
TR1=1;//T1运行控制位,启动T1定时器 (GATE=0 需要手动开启T1定时/计数器)
EA=1;//开启总中断,允许开启串口中断(中断允许位)
ES=1;//开启串口中断
}
void serial_inte() interrupt 4 //中断函数 串行口中断 P117
{
if(TI==0)//只让接收中断执行以下类容 软件清零 (TI是SCON发送中断标志位)
{
ES=0;
RI=0;//RI=1表示帧接收完成, 清零RI, (RI是SCON接受中断标志位) (串口发送数据之后就进入中断)
P1=SBUF; //当接收完一帧数据后,RI置1,此时如果开了全局中断EA和局部中断ES那么就会进中断,中断里面无论你怎么去读SBUF都不会清零RI
ES=1;
}
}
void main()
{
uint i,t;
P1=0xff;
serial_init();//串口初始化
while(1)
{
for(i=0;i<9;)
{
t=p21;
delay(1);//延时去抖动
if(p21==t&&p21==0)//再次判断是否按下
{
while(!p21);//判断是否弹起
delay(1);//延时去抖动
SBUF=dat[i];
while(!TI);//判断是否发送完成
TI=0; //清除发送结束标志位 (进入中断)
i++; //for循环最后的i++
delay(100);//使LED灯能点亮让人看见
}
}
}
}