单片机实现双机通信自己整理的

合集下载

51单片机实现双机通信(自己整理的)

51单片机实现双机通信(自己整理的)

左边1号机,右边2号机,,功能实现1号机程序#include<reg51.h>#define uint unsigned int#define uchar unsigned charsbit p10=P1^0;uchar a,b,kk;//uchar code d_c[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; void delay_ms(uchar y){uchar i;while(y--)for(i=0;i<120;i++);}void put(uchar x) //发送函数{SBUF=x; //SBUF:串行口数据缓冲器while(TI==0); //等待发送结束TI=0;}void main(){uchar j;SCON=0x40; //串行口工作方式1,8位通用异步发送器TMOD=0x20; //定时器1工作方式2PCON=0x00; //波特率不倍增TH1=0xf4;TL1=0xf4; //波特率2400TR1=1; //定时器1开始计时P2=0xc0;while(1){if(p10==0&&j==0){delay_ms(15);while(p10==0);kk=1;P2=0xf9;j=1;}if(p10==0&&j==1){delay_ms(15);while(p10==0);kk=2;P2=0xa4;j=2;}if(p10==0&&j==2){delay_ms(15);while(p10==0);kk=3;P2=0xb0;j=0;}if(kk==1)put('A');if(kk==2)put('B');if(kk==3)put('C');delay_ms(10);}}/*********************************************************************** if(p10==0&&j==0){delay_ms(15);while(p10==0);kk=0;P2=~0xf9;j=1;}if(p10==0&&j==1){delay_ms(15);while(p10==0);kk=1;P2=~0xa4;j=2;}if(p10==0&&j==2){delay_ms(15);while(p10==0);kk=2;P2=~0xc0;j=0;}if(kk==0)put('A');if(kk==1)put('B');if(kk==2)put('C');delay_ms(100);*********************************************************** if(p10==0){delay_ms(15);while(p10==0);number=(number+1)%4;}switch(oper){case 0:break;case 1:put('A');P2=~0xf9;break;case 2:put('B');P2=~0xa4;break;case 3:put('C');P2=~0xc0;break;}delay_ms(10);******************************************************************** if(p10==0){delay_ms(15);while(p10==0);j=(j+1)%3;}switch(j){case 0:put('A');P2=~0xf9;break;case 1:put('B');P2=~0xa4;break;case 2:put('C');P2=~0xc0;break;}delay_ms(10);*/2号机程序。

单片机普通IO口双机通信

单片机普通IO口双机通信

12864液晶串口显示发送机P1口与接收机P0口间接一块74H573 发送机:#include<reg52.h>#define uchar unsigned charsbit s1=P3^0;//按键uchar num=0x00;void delay(uchar z){uchar i,j;for(i=z;i>0;i--)for(j=110;j>0;j--);}void key(){if(s1==0){delay(5);if(s1==0){num++;if(num==0x0a){num=0x00;}}while(!s1);}}void main(){while(1){key();P1=num;delay(2);}}接收机:#include <reg52.h>#define uchar unsigned char#define uint unsigned intuint i,j,k;sbit SID = P2^5; //串行数据sbit SCLK = P2^6; //串行同步时钟uchar code table[]="0123456789";/*****延时子程序*****/void delay(uint z){for(i=z;i>0;i--);for(j=110;j>0;j--);}void delay50us(uint z){uint i,j;for(i=z;i>0;i--)for(j=19;j>0;j--);}/*****串行发送一个字节*****/void send_byte(uchar byte){uchar i;for(i=0;i<8;i++){SCLK = 0;byte=byte<<1; //左移一位先发送高位的数据SID = CY; //移出的位给SIDSCLK = 1; //上升沿触发发送SCLK = 0;}}/*****写指令*****/void write_com(uchar com ){delay(5);//检测忙的子程序我们就不写了,因为串行的不支持读操作,我们就用个延时吧send_byte(0xf8); //11111,RW(0),RS(0),0send_byte(0xf0&com); //高四位数据分两次发送,而且把数据放在高四位上发送send_byte(0xf0&com<<4); //低四位(先执行<<)}/*****写数据*****/void write_dat(uchar dat){delay(5);send_byte(0xfa); //11111,RW(0),RS(1),0send_byte(0xf0&dat); //高四位send_byte(0xf0&dat<<4); //低四位(先执行<<)}/*****初始化LCD*****/void init(){delay(100);write_com(0x30);delay50us(4);write_com(0x30);delay50us(4);write_com(0x0c); //打开显示delay50us(4);write_com(0x01); //清屏delay(50);write_com(0x06);delay(10);}void display(){uchar num;uint shu;num=P0;shu=num/10;write_com(0x80); write_dat(table[num]); delay(5);}/*****主函数*****/ void main(void){P0=0x00;init();while(1){display();}}。

51单片机的双击通信(分享借鉴)

51单片机的双击通信(分享借鉴)

一设计题目:双机通信系统二实验描述:设计一个双机通信系统,实现按键数据的互发及显示功能。

三实验要求:利用两片8051单片机完成双机通信(A机和B机),A、B机发至对方数据可用数码管显示,通信过程用按键控制,发送内容自定。

四实验元件:ST89C51(两片)、电容(30PF*4、10UF*4)、数码管(共阳)、晶振(11.059 2MHZ)、小按键等。

五具体设计:1:设计介绍1.1 串行通信介绍广义地讲,终端(如计算机等)与其他终端、终端与外部设备(如打印机、显示器等)之间的信息交换称为数据通信(Data Communication)。

数据通信方式有两种:串行通信和并行通信。

并行通信:数据的各位同时进行传送(接收和发送),其优点是传递速度快、效率高,多用在实时、快速的场合。

串行通信:数据逐位传送,优点是数据只需要一根数据线就能完成传送,联结介质简单,成本低。

1.2 8051简介51内部结构:8051单片机包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线,·中央处理器:中央处理器(CPU)是整个单片机的核心部件,是8位数据宽度的处理器,能处理8位二进制数据或代码,CPU负责控制、指挥和调度整个单元系统协调的工作,完成运算和控制输入输出功能等操作。

·数据存储器(RAM):8051内部有128个8位用户数据存储单元8051内部有128个8位用户数据存储单元和128个专用寄存器单元,它们是统一编址的,专用寄存器只能用于存放控制指令数据,用户只能访问,而不能用于存放用户数据,所以,用户能使用的的RAM只有128个,可存放读写的数据,运算的中间结果或用户定义的字型表。

·程序存储器(ROM):8051共有4096个8位掩膜ROM,用于存放用户程序,原始数据或表格。

·定时/计数器(ROM):8051有两个16位的可编程定时/计数器,以实现定时或计数产生中断用于控制程序转向。

单片机用proteus仿真双机串口通信总结体会

单片机用proteus仿真双机串口通信总结体会

单片机用 Proteus 仿真双机串口通信总结体会本文介绍了使用 Proteus 仿真软件进行单片机双机串口通信的实验过程及总结体会。

下面是本店铺为大家精心编写的5篇《单片机用 Proteus 仿真双机串口通信总结体会》,供大家借鉴与参考,希望对大家有所帮助。

《单片机用 Proteus 仿真双机串口通信总结体会》篇1引言在单片机应用中,串口通信是一种重要的通信方式,它具有传输速率快、传输距离远、抗干扰能力强等优点。

Proteus 仿真软件是一种功能强大的电子电路仿真工具,可以用来模拟单片机串口通信的整个过程,为学习和实践提供方便。

本文将详细介绍使用Proteus 仿真软件进行单片机双机串口通信的实验过程及总结体会。

实验过程1. 硬件电路设计首先,我们需要设计一个简单的单片机硬件电路,包括电源电路、串口通信电路和 LED 显示电路。

电源电路可以使用电池或者稳压器来提供稳定的电压,串口通信电路可以使用 Proteus 提供的串口助手软件进行设计和调试,LED 显示电路可以使用 Proteus 提供的 LED 助手软件进行设计和调试。

2. 软件程序设计在软件程序设计中,我们需要编写两个程序:主程序和串口通信程序。

主程序主要负责初始化串口通信电路和 LED 显示电路,并将控制权转移到串口通信程序。

串口通信程序主要负责接收和发送数据,通过串口助手软件可以方便地进行调试和测试。

3. 仿真测试在仿真测试中,我们可以使用 Proteus 提供的仿真工具进行测试。

首先,我们需要将硬件电路和软件程序导入 Proteus 仿真软件中,并进行电路连接和程序编译。

然后,我们可以通过串口助手软件进行数据发送和接收,并通过 LED 显示电路进行数据展示。

总结体会通过使用 Proteus 仿真软件进行单片机双机串口通信实验,我们可以得出以下总结体会:1. Proteus 仿真软件是一种非常强大的电子电路仿真工具,可以用来模拟各种电路和通信方式。

单片机实验三双机通信实验程序

单片机实验三双机通信实验程序

单片机实验三双机通信实验程序第一篇:单片机实验三双机通信实验程序实验三双机通信实验一、实验目的UART 串行通信接口技术应用二、实验实现的功能用两片核心板之间实现串行通信,将按键信息互发到对方数码管显示。

三、系统硬件设计实验所需硬件:电脑一台;开发板一块;串口通信线一根; USB线一根;四、系统软件设计实验所需软件:编译软件:keil uvision3;程序下载软件:STC_ISP_V480;试验程序:#include sbit W1=P0^0;sbit W2=P0^1;sbit W3=P0^2;sbit W4=P0^3;sbit D9=P3^2;sbit D10=P3^3;sbit D11=P3^4;sbit D12=P3^5;sbit DP=P1^7;code unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};sfr P1M1=0x91;sfr P1M0=0x92;sbit H1=P3^6;sbit H2=P3^7;sbit L1=P0^5;sbit L2=P0^6;sbit L3=P0^7;unsigned char dat;unsigned char keynum;unsigned char keyscan();void display();void delay(void);L1=1;L2=1;L3=1;H1=0;if(L1==0)return 1;else if(L2==0)return 2;else if(L3==0)return 3;H1=1;H2=0;if(L1==0)return 4;else if(L2==0)return 5;else if(L3==0)return 6;H2=1;return 0;} unsigned char keyscan(){ static unsigned int ct=0;static unsigned char lastkey=0;unsigned char key;key=getkey();if(key==lastkey){ct++;if(ct==900){ct=0;lastkey=0;return key;} } else {第二篇:单片机串行通信实验实验四单片机串行通信实验一、实验目的1、掌握单片机串行口工作方式的程序设计,及简易三线式通讯的方法。

单片机双机通信(C51程序)

单片机双机通信(C51程序)

单片机双机通信(C51程序)/*发送程序连线:两个单片机用3 根线连起来,要共地,rxd,txd 要交叉连接程序效果:通过主机发送,从机接收在主机中通过记下按键按下的次数,主机中显示最后按下的六个数值,并发送给从机,从机也显示这六个数值*/#includereg52.h //头文件#includeintrins.h //循环移位文件#define uchar unsigned char//宏定义#define uint unsigned intsbit key1=P3 ; //位声明uchar code table[] ={0X00,0x3f,0x06,0x5b,//数码管显示的数值0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar table_tr[6];//暂存最后按下的六个数值uchar count,cnt;//延时子函数,用于数码管显示void delay(uchar i){ uchar x,y; for(x=i;x0;x--) for(y=110;y0;y--);}//初始化子函数void init(){ TMOD=0x20;//T1 工作在方式2 TH1=0XF4;//波特率为4.8kbit/s TL1=0XF4; TR1=1;//启动定时器1 SCON=0X50;//串口工作在方式1,允许接收}//显示子函数void display(){ uchar i,j;//定义局部变量j=0x7f; //赋初值for(i=0;i6;i++) { P2=j; //点亮最右边的数码管P0=table[table_tr[i]]; //显示该数值delay(10); //延时,便于眼睛看清j=_cror_(j,1);//循环右移一位}}//按键扫描子函数void key_scan(){ if(key1==0) //判断是否有按键按下{ while(!key1) //等待按键松手{ display();//防止掉显} cnt++; //加1,用于显示SBUF=cnt;//送给缓冲区,发送while(!TI); //等待发送完TI=0; //发送完了,标志位清零for(count=0;count5;count++) //用于保存最后按下的六个按键数值{ table_tr[count] =table_tr[count+1]; } table_tr[5]=cnt; //把最后按下的按键数值赋给table_tr【5】if(cnt==10) //按键按下的次数有没有等于10 cnt=0;//等于,则清零}}void main() { init(); //调用初始化子函数P0=0x00; while(1) { key_scan(); //调用键盘扫描子函数display();//调用显示子函数} }tips:感谢大家的阅读,本文由我司收集整编。

双机通信实验报告

双机通信实验报告

一、实验目的1. 掌握双机通信的基本原理和实现方法。

2. 熟悉串行通信的硬件接口和软件编程。

3. 通过实验,加深对单片机串行通信的理解和应用。

二、实验原理双机通信是指两台计算机或单片机之间的数据交换。

串行通信是双机通信中常用的一种通信方式,它将数据一位一位地按顺序传送,适合于远距离通信。

本实验采用单片机串行通信,通过串行口实现数据传输。

三、实验设备1. 两套单片机实验装置(如AT89S51单片机最小系统)2. 串行通信线(如RS-232线)3. 串口调试工具(如串口助手)4. 连接线和电源四、实验内容1. 硬件连接将两套单片机实验装置通过串行通信线连接起来,确保连接线正确无误。

2. 软件编程(1)单片机编程编写单片机程序,实现数据的发送和接收。

程序主要包括以下部分:- 初始化串行口:设置波特率、数据位、停止位和校验位等。

- 发送数据:将数据写入发送缓冲区,启动发送。

- 接收数据:检测接收缓冲区是否有数据,读取数据。

(2)PC端编程编写PC端程序,实现数据的发送和接收。

程序主要包括以下部分:- 串口配置:设置串口号、波特率、数据位、停止位和校验位等。

- 发送数据:将数据写入串口缓冲区,启动发送。

- 接收数据:从串口缓冲区读取数据,显示或处理。

3. 调试与测试(1)单片机端调试- 使用串口调试工具,发送数据到单片机。

- 检查单片机接收到的数据是否正确。

(2)PC端调试- 使用串口调试工具,发送数据到PC。

- 检查PC接收到的数据是否正确。

五、实验结果与分析1. 硬件连接硬件连接正确,两套单片机实验装置通过串行通信线连接。

2. 软件编程(1)单片机程序```c// 单片机程序示例(AT89S51)#include <reg51.h>#define BAUDRATE 9600sbit TXD = P3^1; // 发送引脚sbit RXD = P3^0; // 接收引脚void Serial_Init() {TMOD = 0x20; // 定时器1工作在模式2TH1 = 0xFD; // 设置波特率TL1 = 0xFD;TR1 = 1; // 启动定时器1SCON = 0x50; // 设置串行口工作在模式1 }void main() {Serial_Init();while (1) {// 发送数据TXD = 1; // 发送起始位while (!TXD); // 等待发送完成// 发送数据字节for (char i = 0; i < 8; i++) {TXD = 1; // 发送数据位while (!TXD);TXD = 0; // 发送停止位while (!TXD);}// 接收数据RXD = 1; // 接收起始位while (!RXD); // 等待接收完成// 接收数据字节for (char i = 0; i < 8; i++) {RXD = 1; // 接收数据位while (!RXD);RXD = 0; // 接收停止位while (!RXD);}}}```(2)PC端程序```c// PC端程序示例(C#)using System;using System.IO.Ports;class Program {static void Main() {SerialPort serialPort = new SerialPort("COM1", 9600, Parity.None, 8, StopBits.One);serialPort.Open();while (true) {// 发送数据serialPort.WriteLine("Hello, world!");// 接收数据string receivedData = serialPort.ReadLine();Console.WriteLine("Received: " + receivedData);}serialPort.Close();}}```3. 调试与测试通过串口调试工具,发送数据到单片机和PC,检查接收到的数据是否正确。

单片机双机之间的串行通信设计

单片机双机之间的串行通信设计

单片机双机之间的串行通信设计Company Document number:WTUT-WT88Y-W8BBGB-BWYTT-19998专业方向课程设计报告题目:单片机双机之间的串行通信设计单片机双机之间的串行通信设计一.设计要求:两片单片机利用串行口进行串行通信:串行通信的波特率可从键盘进行设定,可选的波特率为1200、2400、4800和9600bit/s。

二、方案论证:方案一:以两片51单片机作为通信部件,以4*4矩阵键盘作为数据输入接口,通过16个不同键值输入不同的信息,按照51单片机的方式3进行串口通信,从机采用中断方式接收信息并按照通信协议改变波特率或者用I/O口输出、CD4511译码、数码管显示相关数据,整个系统的软件部分采用C语言编写。

方案二:整个系统的硬件设计与方案一样,但是通信方式采用方式一进行通信,主从机之间的访问采用查询方式,数据输出直接由单片机的译码程序输出译码数据,同时软件编写采用汇编语言。

两种方式从设计上来说各有特色,而且两种方式都应该是可行的。

方案一中按照方式三通信可以输出九位数据而方式一只能输出八位数据,但就本题的要求来说方式一就可以了。

主从机之间的交流采用中断方式是一种高效且保护单片机的选择,但是相比之下本人对查询方式的理解更好一些。

数码管的显示若采用CD4511译码则直接输出数据就可以了,但是这样会增加硬件陈本,而且单片机的资源大部分都还闲置着,所以直接编写一段译码程序是比较好的做法。

另外在软件编写上,采用C语言在后续设计中对硬件的考虑稍少一些,换言之采用汇编可以使自己对整个通信过程及单片机的部分结构有更清晰地认识所以综合考虑采用方案二。

三、理论设计:采用AltiumDesigner绘制的原理图(整图)本系统主要包括五个基本模块:单片机最小系统(包括晶振电路、电源、复位电路及相关设置电路)、4*4矩阵键盘、功能控制电路、数据显示电路、波特率更改指示电路。

本设计的基本思路是通过控制口选择将要实现的功能,然后矩阵键盘输入数据,单片机对数据进行处理(加校验码、设置功能标志位),然后与从机握手,一切就绪之后后就开始发送数据,然后从机对接收数据校验,回发校验结果,主机根据校验结果进行下一步动作,或者重发,或者进入下一数据的发送过程,然后按照此过程不段循环,直到结束。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
j=0;
}
if(kk==1)
put('A');
if(kk==2)
put('B');
if(kk==3)
put('C');
delay_ms(10);
}
}
/*
**********************************************************************
if(p10==0&&j==0)
{
SCON=0x50;//串行口工作方式1,8位通用异步发送器
TMOD=0x20;//定时器1工作方式2
PCON=0x00;//波特率不倍增
TH1=0xf4;
TL1=0xf4;
TR1=1;
P1=0xc0;
L1=L2=0;
while(1)
{
if(RI)
{
RI=0;
switch(SBUF)
{
case'A':L1=~L1;L2=0;P1=0xf9;break;
SCON=0x40; //串行口工作方式1,8位通用异步发送器
TMOD=0x20;//定时器1工作方式2
PCON=0x00;//波特率不倍增
TH1=0xf4;
TL1=0xf4;//波特率2400
TR1=1;//定时器1开始计时
P2=0xc0;
while(1)
{
if(p10==0&&j==0)
{
delay_ms(15);
左边1号机,右边2号机,,功能实现
1号机程序
#include<>
#define uint unsigned int
#define uchar unsigned char
sbit p10=P1^0;
uchar a,b,kk;
//uchar code d_c[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
void delay_ms(uchar y)
{
uchar i;
while(y--)
for(i=0;i<120;i++)
;
}
void put(uchar x) //发送函数
{
SBUF=x;//SBUF:串行口数据缓冲器
while(TI==0);//等待发送结束
TI=0;
}
void main()
{
uchar j;
{
delay_ms(15);
while(p10==0);
number=(number+1)%4;
}
switch(oper)
{
case 0:break;
case 1:put('A');P2=~0xf9;break;
case 2:put('B');P2=~0xa4;break;
case 3:put('C');P2=~0xc0;break;
case 1:put('B');P2=~0xa4;break;
case 2:put('C');P2=~0xc0;break;
}
delay_mห้องสมุดไป่ตู้(10);
*/
2号机程序。
#include<>
#define uint unsigned int
#define uchar unsigned char
sbit L1=P2^0;
}
delay_ms(10);
********************************************************************
if(p10==0)
{
delay_ms(15);
while(p10==0);
j=(j+1)%3;
}
switch(j)
{
case 0:put('A');P2=~0xf9;break;
case'B':L1=~L1;L2=~L2;P1=0xa4;break;
case'C':L1=0;L2=0;P1=0xb0;break;
}
}
delay_ms(100);
}
}
/*********************************************************
if(RI)
sbit L2=P2^1;
//uchar code d_c[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
void delay_ms(int x)
{
uchar i;
while(x--)
for(i=0;i<120;i++)
;
}
void main()
while(p10==0);
kk=1;
P2=0xf9;
j=1;
}
if(p10==0&&j==1)
{
delay_ms(15);
while(p10==0);
kk=2;
P2=0xa4;
j=2;
}
if(p10==0&&j==2)
{
delay_ms(15);
while(p10==0);
kk=3;
P2=0xb0;
kk=2;
P2=~0xc0;
j=0;
}
if(kk==0)
put('A');
if(kk==1)
put('B');
if(kk==2)
put('C');
delay_ms(100);
***********************************************************
if(p10==0)
{
delay_ms(15);
while(p10==0);
kk=0;
P2=~0xf9;
j=1;
}
if(p10==0&&j==1)
{
delay_ms(15);
while(p10==0);
kk=1;
P2=~0xa4;
j=2;
}
if(p10==0&&j==2)
{
delay_ms(15);
while(p10==0);
{
RI=0;
if(SBUF=='A')
{L1=~L1;P1=0xf9;}
if(SBUF=='B')
{L1=~L1;L2=~L2;P1=0xa4;}
if(SBUF=='C')
{L1=0;L2=0;P1=0xc0;}
}
**********************************************************/
相关文档
最新文档