Proteus仿真51单片机串口接发数据实现单片机a按钮控制单片机b的led灯亮,单片机b按钮实现单片机a的led灯亮,c语言

时间: 2024-03-12 21:46:34 浏览: 12
下面是实现该功能的 C 语言代码示例: 单片机 A 代码: ```c #include <reg51.h> #define FOSC 11059200L // 单片机工作频率 #define BAUD 9600 // 串口波特率 #define TIMER_1MS (65536 - FOSC/12/1000) // 定时器计数初值,1ms 中断 sbit LED = P2^0; // 控制 LED 灯的引脚 sbit BTN = P3^0; // 按钮引脚 unsigned char code LED_ON = '1'; // 控制 B 单片机 LED 灯亮起的字符 unsigned char code LED_OFF = '0'; // 控制 B 单片机 LED 灯熄灭的字符 void init_timer(); // 初始化定时器 void init_serial(); // 初始化串口 void send_byte(unsigned char dat); // 发送一个字节数据 void main() { init_timer(); // 初始化定时器 init_serial(); // 初始化串口 while (1) { if (BTN == 0) // 按钮按下 { send_byte(LED_ON); // 发送控制 B 单片机 LED 亮起的字符 LED = 1; // 控制 A 单片机的 LED 灯亮起 while (BTN == 0); // 等待按钮释放 send_byte(LED_OFF); // 发送控制 B 单片机 LED 熄灭的字符 LED = 0; // 控制 A 单片机的 LED 灯熄灭 } } } // 初始化定时器 void init_timer() { TMOD |= 0x10; // 设置定时器 1 为模式 1(16 位定时器) TH1 = TIMER_1MS / 256; // 设置定时器初值 TL1 = TIMER_1MS % 256; ET1 = 1; // 允许定时器 1 中断 TR1 = 1; // 启动定时器 1 EA = 1; // 开启总中断 } // 定时器 1 中断服务程序,用于串口通信时的延时 void timer1_isr() interrupt 3 { static unsigned char cnt = 0; TH1 = TIMER_1MS / 256; // 重新设置定时器初值 TL1 = TIMER_1MS % 256; cnt++; if (cnt >= 10) // 10ms 延时 { cnt = 0; TF1 = 0; // 清除定时器 1 溢出标志 } } // 初始化串口 void init_serial() { SCON = 0x50; // 设置串口为模式 1,允许串口接收 TMOD |= 0x20; // 设置定时器 1 为模式 2(8 位自动重载定时器) TH1 = 256 - FOSC/12/32/BAUD; // 计算并设置波特率 TL1 = TH1; ES = 1; // 允许串口中断 } // 发送一个字节数据 void send_byte(unsigned char dat) { SBUF = dat; while (!TI); // 等待发送完成 TI = 0; } ``` 单片机 B 代码: ```c #include <reg51.h> #define FOSC 11059200L // 单片机工作频率 #define BAUD 9600 // 串口波特率 #define TIMER_1MS (65536 - FOSC/12/1000) // 定时器计数初值,1ms 中断 sbit LED = P2^0; // 控制 LED 灯的引脚 sbit BTN = P3^0; // 按钮引脚 unsigned char code LED_ON = '1'; // 控制 A 单片机 LED 灯亮起的字符 unsigned char code LED_OFF = '0'; // 控制 A 单片机 LED 灯熄灭的字符 void init_timer(); // 初始化定时器 void init_serial(); // 初始化串口 void send_byte(unsigned char dat); // 发送一个字节数据 void main() { init_timer(); // 初始化定时器 init_serial(); // 初始化串口 while (1) { if (BTN == 0) // 按钮按下 { send_byte(LED_ON); // 发送控制 A 单片机 LED 亮起的字符 LED = 1; // 控制 B 单片机的 LED 灯亮起 while (BTN == 0); // 等待按钮释放 send_byte(LED_OFF); // 发送控制 A 单片机 LED 熄灭的字符 LED = 0; // 控制 B 单片机的 LED 灯熄灭 } } } // 初始化定时器 void init_timer() { TMOD |= 0x10; // 设置定时器 1 为模式 1(16 位定时器) TH1 = TIMER_1MS / 256; // 设置定时器初值 TL1 = TIMER_1MS % 256; ET1 = 1; // 允许定时器 1 中断 TR1 = 1; // 启动定时器 1 EA = 1; // 开启总中断 } // 定时器 1 中断服务程序,用于串口通信时的延时 void timer1_isr() interrupt 3 { static unsigned char cnt = 0; TH1 = TIMER_1MS / 256; // 重新设置定时器初值 TL1 = TIMER_1MS % 256; cnt++; if (cnt >= 10) // 10ms 延时 { cnt = 0; TF1 = 0; // 清除定时器 1 溢出标志 } } // 初始化串口 void init_serial() { SCON = 0x50; // 设置串口为模式 1,允许串口接收 TMOD |= 0x20; // 设置定时器 1 为模式 2(8 位自动重载定时器) TH1 = 256 - FOSC/12/32/BAUD; // 计算并设置波特率 TL1 = TH1; ES = 1; // 允许串口中断 } // 发送一个字节数据 void send_byte(unsigned char dat) { SBUF = dat; while (!TI); // 等待发送完成 TI = 0; } // 串口接收中断服务程序 void serial_isr() interrupt 4 { static unsigned char dat = 0; static unsigned char cnt = 0; if (RI) // 接收到数据 { RI = 0; dat = SBUF; if (dat == LED_ON) // 收到控制 B 单片机 LED 亮起的字符 { LED = 1; // 控制 B 单片机的 LED 灯亮起 } else if (dat == LED_OFF) // 收到控制 B 单片机 LED 熄灭的字符 { LED = 0; // 控制 B 单片机的 LED 灯熄灭 } } } ```

相关推荐

最新推荐

recommend-type

基于AT89C51单片机的交通灯控制系统设计与仿真

系统除基本交通灯功能外,还具有通行时间手动设置、可倒计时显示、急车强行通过、交通特殊情况处理等相关功能,实验采用AT89C51单片机为控制芯片,采用"Proteus+KeilμVision2"对交通灯控制系统进行了仿真.
recommend-type

基于单片机的LED汉字显示屏的设计与Proteus仿真

本文 基于单片机的LED汉字显示屏的设计与Proteus仿真,虽然 只使用了一块16×16LED点阵,电路简单,但是已经包涵了LED汉字滚动显示屏的电路基本原理、基本程序和Proteus软件仿真,只要扩展单片机的10接口,并增加...
recommend-type

51单片机交通灯设计(汇编语言)

PDF报告里含有汇编代码和proteus仿真图,中断实验,参照实验电路,设计交通灯控制系统。模拟交通信号灯控制:一般情况下正常显示,东西-南北交替放行,各方向通行时间为 30 秒。有救护车或警车到达时,两个方向交通...
recommend-type

基于51单片机的超声波避障小车设计(含Proteus仿真)

超声波避障程序随处可见,基于51单片机的超声波避障小车也很成熟,但是完整的Proteus仿真并不容易找到开源资料。 这次主要给大家分享其Proteus仿真部分。 涉及到的模块有:超声波模块(hc-sr04)、L293D电机驱动器和...
recommend-type

基于AT89C51单片机的LED汉字显示屏设计方案

研究了基于AT89C51单片机16×16 LED汉字滚动显示屏的设计与运用Proteus软件的仿真实现。主要介绍了LED汉字显示屏的硬件电路、汇编程序设计与调试、Proteus软件仿真等方面的内容,本显示屏的设计具有体积小、硬件少、...
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

用matlab绘制高斯色噪声情况下的频率估计CRLB,其中w(n)是零均值高斯色噪声,w(n)=0.8*w(n-1)+e(n),e(n)服从零均值方差为se的高斯分布

以下是用matlab绘制高斯色噪声情况下频率估计CRLB的代码: ```matlab % 参数设置 N = 100; % 信号长度 se = 0.5; % 噪声方差 w = zeros(N,1); % 高斯色噪声 w(1) = randn(1)*sqrt(se); for n = 2:N w(n) = 0.8*w(n-1) + randn(1)*sqrt(se); end % 计算频率估计CRLB fs = 1; % 采样频率 df = 0.01; % 频率分辨率 f = 0:df:fs/2; % 频率范围 M = length(f); CRLB = zeros(M,1); for
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。