历史上的今天
今天是:2026年01月31日(星期六)
2023年01月31日 | 基于51单片机之间的双向通信(Proteus仿真)
2023-01-31 来源:zhihu
具体功能实现:
甲单片机通过按键可以控制乙单片机的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 #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 #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)该如何接线? CONN-D9F和CONN-D9M的连接必须交叉,.这样连的结果是一个的发送接另一个的接收,一个的接收接另一个的发送 单片机串口和MAX232、MAX232之间是如何连接的? 单片机与MAX232的连接都是T接T,R接R; 各自的MAX232与对方连接是交叉的。 单片机SBUF总线协议图:问题解答:


A:
Q:
A:
Q:

史海拾趣
|
1.这是一款浙江地区生产的摇摇棒成品电路图,根据实物绘出,单片机型号打磨掉了。 此款产品附带软件,可以在电脑上很方便的更改文字或者图片(COM口),10来元的产品,还算超值。 … 查看全部问答> |
|
用的workbench3.0 选的是SIMNTdiab,编译通过,但是下载.OUT文件的时候 提示如下: “Please resolve following symbols before next download semBSmCreate smNameAdd” 不知道该如何解决,我是初学者一个。 源程序如下: #include #inc ...… 查看全部问答> |
|
开发了一款软件,可是开发的时候模拟器的分辨率是640X480的,但最后公司拿来的硬件分辨率是320x240的,软件运行后只显示一个角,怎么办呢?… 查看全部问答> |
|
遇到的问题,我加入一个驱动,执行到oeminit done就死了。 之后恢复到原来没有加入驱动之前的,仍然不行。重新编译也不行,重新安装wince,不行。 重新安装windows,不行。太奇怪了。哪位朋友了解的话,能否回复介绍一下?谢谢了。… 查看全部问答> |
|
基于CAN控制电机转速——只用两个按键就可以实现电机的正反转 经过一段时间的学习,终于把CAN基本的东西给搞定,还有许多东西还要去学,在此先发一部分这段时间的学习内容,希望高手拍砖,让讨论抵御这大冷的冬天!! 在刚开始申请板子的时候是想采用232通信来完成电机的控制,但是拿到板子后发现该板子有好多 ...… 查看全部问答> |




