WeChat:【嵌入式工程师成长日记】
具体功能实现:
甲单片机通过按键可以控制乙单片机的LED灯,而乙单片机通过按键可以让连接甲单片机的数码管数字自增加一。
使用器件:
AT89C51、按键、排阻、4只LED灯、2片MAX232芯片、COM口(CONN-D9F)、数码管、若干电阻
Proteus仿真原理图:
仿真:
乙机控制甲机的数码管显示:
甲机控制乙机的LED灯:
知识介绍:
Proteus布线
为了让整个原理图看上去简洁明了,我们对元器件的导线进行标号,而不是直接和芯片相连。
定时中断系统简图
定时器资源
定时器个数:3个(T0,T1,T2),T0和T1与传统的51单片机兼容,T2是此型号单片机增加的资源。
(T0和T1的操作方式是所有51单片机共有的)
中断系统
执行现程序的过程中,出现某些急需处理的异常情况或特殊请求,CPU暂时中止现行程序,而转去对这些异常情况或特殊请求进行处理,在处理完毕后CPU又自动返回到现行程序的断点处,继续执行原程序
中断号:
外部中断0 interrupt 0
定时器0 interrupt 1
外部中断1 interrupt 2
定时器中断1 interrupt 3
串口中断 interrupt 4
细节注意
通信双方必须要有相同的波特率,通过发送中断标志和接受中断标志控制发送和接受的进行。
主要代码(C语言)KEIL5实现:
甲单片机:
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit LED1 = P1^0;
sbit LED2 = P1^3;
sbit K1 = P1^7;
uchar Operation_NO = 0;
uchar code DSY_CODE[]=
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
};
void Delay(uint x)
{
uchar i;
while(x--)
{
for(i=0;i<120;i++);
}
}
void putc_to_SerialPort(uchar c)
{
SBUF = c;
while(TI == 0);
TI = 0;
}
void main()
{
LED1=LED2=1;
P0 = 0x00;
SCON = 0x50;
TMOD = 0x20;
PCON = 0x00;
TH1 = 0xfd;
TL1 = 0xfd;
TI = 0;
RI = 0;
TR1 = 1;
IE = 0x90;
while(1)
{
Delay(100);
if(K1 == 0)
{
while(K1==0);
Operation_NO=(Operation_NO+1)%4;
switch(Operation_NO)
{
case 0:
putc_to_SerialPort('X');
LED1=LED2=1; break;
case 1:
putc_to_SerialPort('A');
LED1=0;LED2=1;break;
case 2:
putc_to_SerialPort('B');
LED2=0;LED1=1;break;
case 3:
putc_to_SerialPort('C');
LED1=0;LED2=0;break;
}
}
}
}
void Serial_INT() interrupt 4
{
if(RI)
{
RI = 0;
if(SBUF>=0&&SBUF<=9)
P0 = DSY_CODE[SBUF];
else
P0 = 0x00;
}
}
乙单片机:
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit LED1 = P1^0;
sbit LED2 = P1^3;
sbit K1 = P1^7;
uchar NumX = 0xff;
void Delay(uint x)
{
uchar i;
while(x--)
{
for(i=0;i<120;i++);
}
}
void main()
{
LED1=LED2=1;
SCON = 0x50;
TMOD = 0x20;
PCON = 0x00;
TH1 = 0xfd;
TL1 = 0xfd;
TI = 0;
RI = 0;
TR1 = 1;
IE = 0x90;
while(1)
{
Delay(100);
if(K1==0);
{
while(K1==0);
NumX = (NumX+1)%11;
SBUF = NumX;
while(TI == 0);
TI = 0;
}
}
}
void Serial_INT() interrupt 4
{
if(RI)
{
RI = 0;
switch(SBUF)
{
case 'X': LED1=1;LED2=1;break;
case 'A': LED1=0;LED2=1;break;
case 'B': LED2=0;LED1=1;break;
case 'C': LED1=0;LED2=0;
}
}
}
问题解答:
Q: COM口(CONN-D9N)接线图,如下图所示:
A:
OM口(CONN-D9F和CONN-D9M)该如何接线?
A:
CONN-D9F和CONN-D9M的连接必须交叉,.这样连的结果是一个的发送接另一个的接收,一个的接收接另一个的发送
Q:
单片机串口和MAX232、MAX232之间是如何连接的?
A:
单片机与MAX232的连接都是T接T,R接R;
各自的MAX232与对方连接是交叉的。
Q:
单片机SBUF总线协议图:
WeChat:【嵌入式工程师成长日记】