串口通信:求解释?
串口通信:一主机(灯亮)控制 两片从机(数码管)求解释?
主机:
#include <reg52.h> //头文件的包含
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
int begin=0;//当为0时表示对于接收到的数据丢弃,1表示接收的数据放到数组array中
sbit A1=P0^0;//LED灯
sbit A2=P0^1;
sbit A3=P0^2;
sbit A4=P0^3;
unsigned char array[16];//数组 为什么是16
uchar temp; //定义临时变量
uchar t=0;
//延时0.1S函数
void mDelay0(int utime)
{
int i,j,k;
for(i=0;i<utime;i++)
{
for(j=0;j<11;j++)
{
for(k=0;k<11;)
k++;
}
}
}
void InitUART(void)
{
SCON = 0x50;
TMOD |= 0x20;
TH1 = 0xD0; //这里波特率是1200?为什么没有TL1?
TR1 = 1;
EA = 1;
ES = 1;
}
/*------------------------------------------------
发送一个字节
------------------------------------------------*/
void SendByte(unsigned char dat)
{
SBUF = dat;
while(!TI);
TI = 0;
}
/*------------------------------------------------
主函数
------------------------------------------------*/
void main()
{
uchar a1,a2,a3,a4,b1,b2,b3,b4;
InitUART();
A1=0;A2=0;A3=0;A4=0; mDelay0(500);//不同的灯亮
A1=1;A2=1;A3=1;A4=1; mDelay0(10);
A1=0;A2=0;A3=0;A4=0; mDelay0(10);
while(1)
{
a1=array[0];// ?
a2=array[1];//?
a3=array[2];//?
a4=array[3];//?
if (array[0]==0x00)//?
{
A1=0;
}
else
{
A1=1;
}
if (array[1]==0x00)?
{
A2=0;
}
else
{
A2=1;
}
if (array[2]==0x00)?
{
A3=0;
}
else
{
A3=1;
}
if (array[3]==0x00)?
{
A4=0;
}
else
{
A4=1;
}
if(b1!=array[4])//?
{
b1=array[4];?
SendByte(0x01);mDelay0(1);//?
SendByte(b1);mDelay0(1); //?
}
if(b2!=array[6])//?
{
b2=array[6]; //?
SendByte(0x02);mDelay0(1); //?
SendByte(b2);mDelay0(1); //?
}
if(b3!=array[8]) //?
{
b3=array[8]; //?
SendByte(0x03);mDelay0(1); //?
SendByte(b3);mDelay0(1); //?
}
if(b4!=array[10]) //?
{
b4=array[10]; //?
SendByte(0x04);mDelay0(1); //?
SendByte(b4);mDelay0(1); //?
}
}
}
void UART_SER (void) interrupt 4 //串行中断服务程序
{
if (RI) //从机没有发送数据,只有主机发送数据。这里接受的是主机发送的数据吗?
{
RI = 0;
temp = SBUF;
if ((temp == 0xc5) || (begin == 1))// ?0xc5什么意思
{
begin = 1; //什么作用?
if(temp!=0xc5)//?
{
array[t]=temp;//?
t++;
if(t>=13) { begin=0;t=0; } //?
}
}
}
}
丛机1:
#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit b1=P2^0;
sbit b2=P2^1;
sbit b3=P2^2;
sbit b4=P2^3;
uchar t=0;
uchar Q1;
int begin=0;
void mDelay(int utime)
{
int i,j,k;
for(i=0;i<utime;i++)
{
for(j=0;j<5;j++)
{
for(k=0;k<99;)
k++;
}
}
}
/*------------------------------------------------
串口初始化
------------------------------------------------*/
void InitUART (void)
{
SCON = 0x50;
TMOD |= 0x20;
TH1 = 0xD0;
TR1 = 1; // TR1: timer 1 打开
EA = 1; //打开总中断
//ES = 1; //打开串口中断
}
void main (void)
{
int i;
uchar a1,a2,a3;
InitUART();
ES=1;
while(1)
{ //90度
if(Q1==0x00) {a1=0x00;a2=0x3f;a3=0x8f;}// 0
if(Q1==0x01) {a1=0x00;a2=0x30;a3=0x8f;}// 1
if(Q1==0x02) {a1=0x00;a2=0x5b;a3=0x8f;}// 2
if(Q1==0x03) {a1=0x00;a2=0x79;a3=0x8f;}// 3
if(Q1==0x04) {a1=0x00;a2=0x74;a3=0x8f;}// 4
if(Q1==0x05) {a1=0x00;a2=0x6d;a3=0x8f;}// 5
if(Q1==0x06) {a1=0x00;a2=0x6f;a3=0x8f;}// 6
if(Q1==0x07) {a1=0x00;a2=0x38;a3=0x8f;}// 7
if(Q1==0x08) {a1=0x00;a2=0x7f;a3=0x8f;}// 8
if(Q1==0x09) {a1=0x00;a2=0x7d;a3=0x8f;}// 9
if(Q1==0x0a) {a1=0x06;a2=0x3f;a3=0x8f;}// 10
if(Q1==0x0b) {a1=0x06;a2=0x30;a3=0x8f;}// 11
if(Q1==0x0c) {a1=0x06;a2=0x5b;a3=0x8f;}// 12
if(Q1==0x0d) {a1=0x06;a2=0x79;a3=0x8f;}// 13
if(Q1==0x0e) {a1=0x06;a2=0x74;a3=0x8f;}// 14
if(Q1==0x0f) {a1=0x06;a2=0x6d;a3=0x8f;}// 15
if(Q1==0x10) {a1=0x06;a2=0x6f;a3=0x8f;}// 16
if(Q1==0x11) {a1=0x06;a2=0x38;a3=0x8f;}// 17
if(Q1==0x12) {a1=0x06;a2=0x7f;a3=0x8f;}// 18
if(Q1==0x13) {a1=0x06;a2=0x7d;a3=0x8f;}// 19
if(Q1==0x14) {a1=0x5b;a2=0x3f;a3=0x8f;}// 20
if(Q1==0x15) {a1=0x5b;a2=0x30;a3=0x8f;}// 21
if(Q1==0x16) {a1=0x5b;a2=0x5b;a3=0x8f;}// 22
if(Q1==0x17) {a1=0x5b;a2=0x79;a3=0x8f;}// 23
if(Q1==0x18) {a1=0x5b;a2=0x74;a3=0x8f;}// 24
if(Q1==0x19) {a1=0x5b;a2=0x6d;a3=0x8f;}// 25
if(Q1==0x1a) {a1=0x5b;a2=0x6f;a3=0x8f;}// 26
if(Q1==0x1b) {a1=0x5b;a2=0x38;a3=0x8f;}// 27
if(Q1==0x1c) {a1=0x5b;a2=0x7f;a3=0x8f;}// 28
if(Q1==0x1d) {a1=0x5b;a2=0x7d;a3=0x8f;}// 29
if(Q1==0x1e) {a1=0x4f;a2=0x3f;a3=0x8f;}// 30
if(Q1==0x1f) {a1=0x4f;a2=0x30;a3=0x8f;}// 31
if(Q1==0x20) {a1=0x4f;a2=0x5b;a3=0x8f;}// 32
if(Q1==0x21) {a1=0x4f;a2=0x79;a3=0x8f;}// 33
if(Q1==0x22) {a1=0x4f;a2=0x74;a3=0x8f;}// 34
if(Q1==0x23) {a1=0x4f;a2=0x6d;a3=0x8f;}// 35
if(Q1==0x24) {a1=0x4f;a2=0x6f;a3=0x8f;}// 36
if(Q1==0x25) {a1=0x4f;a2=0x38;a3=0x8f;}// 37
if(Q1==0x26) {a1=0x4f;a2=0x7f;a3=0x8f;}// 38
if(Q1==0x27) {a1=0x4f;a2=0x7d;a3=0x8f;}// 39
if(Q1==0x28) {a1=0x66;a2=0x3f;a3=0x8f;}// 40
if(Q1==0x29) {a1=0x66;a2=0x30;a3=0x8f;}// 41
if(Q1==0x2a) {a1=0x66;a2=0x5b;a3=0x8f;}// 42
if(Q1==0x2b) {a1=0x66;a2=0x79;a3=0x8f;}// 43
if(Q1==0x2c) {a1=0x66;a2=0x74;a3=0x8f;}// 44
if(Q1==0x2d) {a1=0x66;a2=0x6d;a3=0x8f;}// 45
// 0:0000 0011
// b2=1;b3=1; // 1:1111 0011
// b1=0;b4=1; // 2:0010 0101
//1 // 3:0110 0001
// P0=a1; // 4:1101 0001
// 5:0100 1001
// 6:0000 1001
// 7:1110 0011
// 8:0000 0001
// 9:0100 0001
// C:0000 1110
// mDelay(1); //
b2=0;b3=1;b1=1;b4=1;
P0=a1;
mDelay(1);
b2=1;b3=0;b1=1;b4=1;
P0=a2;
mDelay(1);
b2=1;b3=1;b1=1;b4=0;
P0=a3;
mDelay(1);
}
}
void UART_SER (void) interrupt 4 //串行中断服务程序
{
unsigned char temp; //定义临时变量
if (RI)
{
RI = 0;
temp = SBUF;
if ((temp == 0x02) || (begin == 1))
{
begin = 1;
if(temp!=0x02)
{
Q1=temp;
t++;
if(t>=1) { begin=0;t=0; }
}
}
}
}
丛机2;
#include<reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit b1=P2^0;
sbit b2=P2^1;
sbit b3=P2^2;
sbit b4=P2^3;
uchar t=0;
uchar Q1;
int begin=0;
void mDelay(int utime)
{
int i,j,k;
for(i=0;i<utime;i++)
{
for(j=0;j<5;j++)
{
for(k=0;k<99;)
k++;
}
}
}
/*------------------------------------------------
串口初始化
------------------------------------------------*/
void InitUART (void)
{
SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收
TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重装
TH1 = 0xD0; // TH1: 重装值 9600 波特率 晶振 11.0592MHz
TR1 = 1; // TR1: timer 1 打开
EA = 1; //打开总中断
//ES = 1; //打开串口中断
}
void main (void)
{
int i;
uchar a1,a2,a3;
InitUART();
ES=1;
while(1)
{ //90度
if(Q1==0x00) {a1=0x00;a2=0x3f;a3=0x8f;}// 0
if(Q1==0x01) {a1=0x00;a2=0x30;a3=0x8f;}// 1
if(Q1==0x02) {a1=0x00;a2=0x5b;a3=0x8f;}// 2
if(Q1==0x03) {a1=0x00;a2=0x79;a3=0x8f;}// 3
if(Q1==0x04) {a1=0x00;a2=0x74;a3=0x8f;}// 4
if(Q1==0x05) {a1=0x00;a2=0x6d;a3=0x8f;}// 5
if(Q1==0x06) {a1=0x00;a2=0x6f;a3=0x8f;}// 6
if(Q1==0x07) {a1=0x00;a2=0x38;a3=0x8f;}// 7
if(Q1==0x08) {a1=0x00;a2=0x7f;a3=0x8f;}// 8
if(Q1==0x09) {a1=0x00;a2=0x7d;a3=0x8f;}// 9
if(Q1==0x0a) {a1=0x06;a2=0x3f;a3=0x8f;}// 10
if(Q1==0x0b) {a1=0x06;a2=0x30;a3=0x8f;}// 11
if(Q1==0x0c) {a1=0x06;a2=0x5b;a3=0x8f;}// 12
if(Q1==0x0d) {a1=0x06;a2=0x79;a3=0x8f;}// 13
if(Q1==0x0e) {a1=0x06;a2=0x74;a3=0x8f;}// 14
if(Q1==0x0f) {a1=0x06;a2=0x6d;a3=0x8f;}// 15
if(Q1==0x10) {a1=0x06;a2=0x6f;a3=0x8f;}// 16
if(Q1==0x11) {a1=0x06;a2=0x38;a3=0x8f;}// 17
if(Q1==0x12) {a1=0x06;a2=0x7f;a3=0x8f;}// 18
if(Q1==0x13) {a1=0x06;a2=0x7d;a3=0x8f;}// 19
if(Q1==0x14) {a1=0x5b;a2=0x3f;a3=0x8f;}// 20
if(Q1==0x15) {a1=0x5b;a2=0x30;a3=0x8f;}// 21
if(Q1==0x16) {a1=0x5b;a2=0x5b;a3=0x8f;}// 22
if(Q1==0x17) {a1=0x5b;a2=0x79;a3=0x8f;}// 23
if(Q1==0x18) {a1=0x5b;a2=0x74;a3=0x8f;}// 24
if(Q1==0x19) {a1=0x5b;a2=0x6d;a3=0x8f;}// 25
if(Q1==0x1a) {a1=0x5b;a2=0x6f;a3=0x8f;}// 26
if(Q1==0x1b) {a1=0x5b;a2=0x38;a3=0x8f;}// 27
if(Q1==0x1c) {a1=0x5b;a2=0x7f;a3=0x8f;}// 28
if(Q1==0x1d) {a1=0x5b;a2=0x7d;a3=0x8f;}// 29
if(Q1==0x1e) {a1=0x4f;a2=0x3f;a3=0x8f;}// 30
if(Q1==0x1f) {a1=0x4f;a2=0x30;a3=0x8f;}// 31
if(Q1==0x20) {a1=0x4f;a2=0x5b;a3=0x8f;}// 32
if(Q1==0x21) {a1=0x4f;a2=0x79;a3=0x8f;}// 33
if(Q1==0x22) {a1=0x4f;a2=0x74;a3=0x8f;}// 34
if(Q1==0x23) {a1=0x4f;a2=0x6d;a3=0x8f;}// 35
if(Q1==0x24) {a1=0x4f;a2=0x6f;a3=0x8f;}// 36
if(Q1==0x25) {a1=0x4f;a2=0x38;a3=0x8f;}// 37
if(Q1==0x26) {a1=0x4f;a2=0x7f;a3=0x8f;}// 38
if(Q1==0x27) {a1=0x4f;a2=0x7d;a3=0x8f;}// 39
if(Q1==0x28) {a1=0x66;a2=0x3f;a3=0x8f;}// 40
if(Q1==0x29) {a1=0x66;a2=0x30;a3=0x8f;}// 41
if(Q1==0x2a) {a1=0x66;a2=0x5b;a3=0x8f;}// 42
if(Q1==0x2b) {a1=0x66;a2=0x79;a3=0x8f;}// 43
if(Q1==0x2c) {a1=0x66;a2=0x74;a3=0x8f;}// 44
if(Q1==0x2d) {a1=0x66;a2=0x6d;a3=0x8f;}// 45
// 0:0000 0011
// b2=1;b3=1; // 1:1111 0011
// b1=0;b4=1; // 2:0010 0101
//1 // 3:0110 0001
// P0=a1; // 4:1101 0001
// 5:0100 1001
// 6:0000 1001
// 7:1110 0011
// 8:0000 0001
// 9:0100 0001
// C:0000 1110
// mDelay(1); //
b2=0;b3=1;b1=1;b4=1;
P0=a1;
mDelay(1);
b2=1;b3=0;b1=1;b4=1;
P0=a2;
mDelay(1);
b2=1;b3=1;b1=1;b4=0;
P0=a3;
mDelay(1);
}
}
void UART_SER (void) interrupt 4 //串行中断服务程序{
unsigned char temp; //定义临时变量
if (RI)
{
RI = 0;
temp = SBUF;
if ((temp == 0x01) || (begin == 1))
{
begin = 1;
if(temp!=0x01)
{
Q1=temp;
t++;
if(t>=1) { begin=0;t=0; } //?/?
}
}
}
尤其是每个中断函数里面都有什么作用?找个时间 一行一行跟你说哈 ! 现在忙
哇,程序好长;
while(1)
{ //90度
if(Q1==0x00) {a1=0x00;a2=0x3f;a3=0x8f;}// 0
if(Q1==0x01) {a1=0x00;a2=0x30;a3=0x8f;}// 1
if(Q1==0x02) {a1=0x00;a2=0x5b;a3=0x8f;}// 2
if(Q1==0x03) {a1=0x00;a2=0x79;a3=0x8f;}// 3
if(Q1==0x04).....
这里为什么不用 else if 呢?每个值都要比较一次!?比如Q1=0,然后后面还要if 44次?
如果使用查表的方式,是不是会更好呢?
恩是的不过这段我不是很理解void UART_SER (void) interrupt 4 //串行中断服务程序
{
if (RI) //从机没有发送数据,只有主机发送数据。这里接受的是主机发送的数据吗?
{
RI = 0;
temp = SBUF;
if ((temp == 0xc5) || (begin == 1))// ?0xc5什么意思
{
begin = 1; //什么作用?
if(temp!=0xc5)//?
{
array[t]=temp;//?
t++;
if(t>=13) { begin=0;t=0; } //?
}
}
}
