双单片机的串行通信Word版
两片单片机之间的串行通信(proteus仿真图+程序)

两片单片机之间的串行通信(proteus仿真图+程序)两片单片机之间的串行通信(仿真图+程序)AT89C51+MAX232功能:(1)甲机P1口的开关控制乙机P1口的发光二级管,开关闭合发光二级管亮,开关断开发光二级管灭。
(2)乙机P2口的开关控制甲机P2口的数码管,按下4*4矩阵键盘,显示对应的键值0~F (3)乙机P0^0口的开关控制甲机P2口的数码管,按下按键,数码管从0~9循环显示;乙机P0^2口的开关控制甲机P2口的数码管,按下按键,数码管清零。
/****************************甲机控制与接收*********************************/ #include#include#define uchar unsigned char#define uint unsigned intsbit K0=P1^0;sbit K1=P1^1;sbit K2=P1^2;sbit K3=P1^3;sbit K4=P1^4;sbit K5=P1^5;sbit K6=P1^6;sbit K7=P1^7;uchar i;uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; void delay(uint z){ uint x,y;for(x=z;x>0;x--)for(y=110;y<0;y--);}void send(uchar c) //向串口发送字符{ SBUF=c;while(TI==0);TI=0;}void main(){ uchar i;P2=0x00;SCON=0x50; //串口模式1TMOD=0x20; //T1工作模式2PCON=0x00; //波特率不倍增TH1=0xfd; //波特率设定6900TL1=0xfd;TI=RI=0;TR1=1; //启动定时器T1IE=0x90; //允许串口中断while(1){ if(K0==0) send('0'); else send('A');if(K1==0) send('1'); else send('B');if(K2==0) send('2'); else send('C');if(K3==0) send('3'); else send('D');if(K4==0) send('4'); else send('E');if(K5==0) send('5'); else send('F');if(K6==0) send('6'); else send('G');if(K7==0) send('7'); else send('H');}}void serial_int() interrupt 4 //甲机串口接收中断函数{ if(RI){ RI=0;if(SBUF>=0 &&SBUF<=15)P2=tab[SBUF];elseP2=0x00;if(SBUF=='x')if(i>=0&&i<9){i=i+1;P2=tab[i];}if(i==9) i=0;if(SBUF=='y'){P2=0x00;i=0;}}}/*****************************乙机控制与接收程序*****************************/ #include#include#define uchar unsigned char#define uint unsigned intsbit L0=P1^0;sbit L1=P1^1;sbit L2=P1^2;sbit L3=P1^3;sbit L4=P1^4;sbit L5=P1^5;sbit L6=P1^6;sbit L7=P1^7;sbit KEY1=P0^0;sbit KEY2=P0^2;void delay(uint z){ uint x,y;for(x=z;x>0;x--)for(y=110;y<0;y--);}void send(uchar c) //向串口发送字符{ SBUF=c;while(TI==0);TI=0;}uchar key() //按键扫描{ uchar keyon,temp;P2=0x0f;delay(1);temp=P2^0x0f;switch(temp){ case 1:keyon=3;break;case 2:keyon=2;break;case 4:keyon=1;break;case 8:keyon=0;break;default:keyon=16;}P2=0xf0;delay(1);temp=P2>>4^0x0f;switch(temp){ case 1:keyon+=0;break;case 2:keyon+=4;break;case 4:keyon+=8;break;case 8:keyon+=12;break;}return keyon;}void main(){ SCON=0x50; //串口模式1,允许接收TMOD=0x20; //T1 工作模式2PCON=0x00; //波特率不倍增TH1=0xfd; //波特率设定: 9600TL1=0xfd;TI=RI=0;TR1=1; //启动定时器T1IE=0x90; //允许串口中断delay(100);while(1){ P2=0xf0; //矩阵键盘if(P2!=0xf0)send(key());if(KEY1==1) //独立按键{ delay(20);if(KEY1==0)send('x');}if(KEY2==0) //清零send('y');}}void serial_int() interrupt 4 //乙机串口接收中断函数{ if(RI) { RI=0;switch(SBUF){ case '0':L0=0;break;case '1':L1=0;break;case '2':L2=0;break;case '3':L3=0;break;case '4':L4=0;break;case '5':L5=0;break;case '6':L6=0;break;case '7':L7=0;break;case 'A':L0=1;break;case 'B':L1=1;break;case 'C':L2=1;break;case 'D':L3=1;break;case 'E':L4=1;break;case 'F':L5=1;break;case 'G':L6=1;break;case 'H':L7=1;break;}}}。
第17讲 单片机串行通信(双机双向通信)

被确认的从机,复位SM2=0,接收RB8=0的数据帧。
RB8=1:地址帧 SM2=1:多机通信方式
RB8=0:数据帧
SM2=0:直通方式
22
3)REN—允许接收位
控制串行数据的接收。
REN=0:禁止接收;
REN=1:允许接收 通过软件置位、复位 4)TB8 在方式2、方式3下,要发送的第9位数据(格式信 息),在多机通信中,通过TB8状态,来表示主机 发送的时地址帧(1)还是数据帧(0)。
参见第11章 MCS—51串行通信
11-1 串行通信基础 11-1-1 串行通信
通信种类:
串行通信:数据各位一位一位传输。传输距离较远;
并行通信:数据字符所有位同时传输。速度快、效率高, 距离短。
11
串行通信有同步和异步两种方式
同步方式:有严格的同步时钟控制。较少使用。
异步方式:不需要严格的同步信号,也不需要数据流的
RxD TxD
P1.0
DATA
CLK
CD4014
P/S
数据发送:当8位数据全部移出后,TI被自动置位 数据接收:当REN=1(允许接收),接收到8位数据
时,RI被自动置位。
31
方式0时,移位操作的波特率固定,为单片机 晶振频率1/12。
晶振fosc=6MHz,波特率为500K/秒,2s移位一次; 晶振fosc=12MHz,波特率为1M/秒,1s移位一次;
2
电 路 设 计
3
硬件相关知识
CONN-D9M (9针串口-公) CONN-D9F (9针串口-母)
信号线 引脚
信号地 保护地 发送数据 接收数据 请求发送RTS (输出) 消除发送CTS (输入) 数据准备好(输入)
单片机串行通信双机通信

因为串行口工作于方式3 时的波特率为
模式3的波特率 2SMOD
fOSC
32 12 (256 TH1)
所以
TH
1
256
波特率
fOSC 12 (32
/
2 SMOD )
当SMOD=0 时, 初值TH1=256-6×106/(1 200×12×32/1) =243=0F3H
当SMOD=1 时, 初值TH1=256-6×106/(1200×12×32/2) =230=0E6H
9.2.4
串行口每秒钟发送或接收的数据位数称为波特率。 假设 发送一位数据所需时间为T, 则波特率为 1/T。
(1) 模式 0 的波特率等于单片机晶振频率的 1/12, 即每个 机器周期接收或发送一位数据。
(2) 模式 2 的波特率与电源控制器PCON的最高位SMOD 的写入值有关:
模式2的波特率 晶振频率 2SMOD 64
SM0 SM1 模式
功能
波特率
0
0 0 同步移位寄存器 fOSC/12
0 1 1 8位UART
可变
1 0 2 9位UART 1 1 3 9位UART
fOSC/64 或 fOSC/32
可变
REN:串行接收允许位。由软件置位或清零, ‘1’ :允许接收;’0’:禁止接收。
TB8:在方式2或方式3中,是将要发送的第九位 数据,由软件置位或清零,它可作为数据奇偶校验位, 也可在多机通信中作为地址帧或数据帧的标志位使用。
跟我做
1、准备器件及单片机最小系 统
2、设计硬件电路,焊接电路 板
3、编写控制程序 4、程序下载,软硬件联调
电路原理图
跟我总结
1、与串口通信有关的SFR 2、串行口的工作方式与初始 化
单片机单片机课程设计-双机串行通信

单片机单片机课程设计-双机串行通信单片机课程设计双机串行通信在当今的电子信息领域,单片机的应用无处不在。
而双机串行通信作为单片机系统中的一个重要环节,为实现设备之间的数据交换和协同工作提供了关键的技术支持。
一、双机串行通信的基本原理双机串行通信是指两个单片机之间通过串行接口进行数据传输的过程。
串行通信相较于并行通信,具有线路简单、成本低、抗干扰能力强等优点。
在串行通信中,数据是一位一位地按顺序传输的。
常见的串行通信协议有 UART(通用异步收发器)、SPI(串行外设接口)和 I2C(内部集成电路)等。
在本次课程设计中,我们主要采用 UART 协议来实现双机串行通信。
UART 协议包括起始位、数据位、奇偶校验位和停止位。
起始位用于标识数据传输的开始,通常为逻辑 0;数据位可以是 5 位、6 位、7 位或 8 位,具体取决于通信双方的约定;奇偶校验位用于检验数据传输的正确性,可选择奇校验、偶校验或无校验;停止位用于标识数据传输的结束,通常为逻辑 1。
二、硬件设计为了实现双机串行通信,我们需要搭建相应的硬件电路。
首先,每个单片机都需要有一个串行通信接口,通常可以使用单片机自带的UART 模块。
在硬件连接方面,我们将两个单片机的发送端(TXD)和接收端(RXD)交叉连接。
即单片机 A 的 TXD 连接到单片机 B 的 RXD,单片机 B 的 TXD 连接到单片机 A 的 RXD。
同时,还需要共地以保证信号的参考电平一致。
此外,为了提高通信的稳定性和可靠性,我们可以在通信线路上添加一些滤波电容和上拉电阻。
三、软件设计软件设计是实现双机串行通信的核心部分。
在本次课程设计中,我们使用 C 语言来编写单片机的程序。
对于发送方单片机,首先需要对 UART 模块进行初始化,设置波特率、数据位、奇偶校验位和停止位等参数。
然后,将要发送的数据放入发送缓冲区,并通过 UART 发送函数将数据一位一位地发送出去。
对于接收方单片机,同样需要对 UART 模块进行初始化。
单片机串行通信

单片机串行通信在现代电子技术的领域中,单片机串行通信扮演着至关重要的角色。
它就像是信息传递的“高速公路”,让单片机能够与外部设备或其他单片机进行高效、准确的数据交流。
串行通信,简单来说,就是数据一位一位地按顺序传输。
相较于并行通信,它所需的数据线更少,这在硬件设计上带来了极大的便利,降低了成本,也减少了布线的复杂性。
想象一下,如果每次传输数据都需要同时通过很多根线,那得是多么繁琐和容易出错!而串行通信则巧妙地解决了这个问题。
单片机串行通信有两种常见的方式:同步串行通信和异步串行通信。
异步串行通信就像是两个不太合拍的朋友在交流。
发送方和接收方各自按照自己的节奏工作,但他们通过事先约定好的一些规则来确保信息能被正确理解。
比如,规定好每个数据的位数(通常是 5 到 8 位)、起始位和停止位的形式。
起始位就像是一个打招呼的信号,告诉接收方“我要开始发数据啦”;而停止位则表示这一轮数据传输结束。
在异步通信中,双方不需要严格同步时钟,这使得它在很多应用场景中都非常灵活。
同步串行通信则更像是两个默契十足的伙伴。
发送方和接收方共用一个时钟信号,数据的传输在这个时钟的控制下有序进行。
这样可以保证数据传输的准确性和稳定性,但也对时钟的同步要求较高。
在实际应用中,单片机串行通信常用于与各种外部设备进行通信,比如传感器、显示屏、计算机等。
以传感器为例,单片机通过串行通信获取传感器采集到的温度、湿度、压力等数据,然后进行处理和控制。
为了实现串行通信,单片机通常会配备专门的串行通信接口。
比如常见的 UART(通用异步收发器)、SPI(串行外设接口)和 I2C(集成电路总线)等。
UART 是一种应用广泛的异步串行通信接口。
它的硬件实现相对简单,只需要两根数据线:发送线(TXD)和接收线(RXD)。
通过设置合适的波特率(即数据传输的速率),就可以实现单片机与其他设备之间的异步通信。
SPI 则是一种同步串行通信接口,它通常需要四根线:时钟线(SCK)、主机输出从机输入线(MOSI)、主机输入从机输出线(MISO)和片选线(CS)。
单片机单片机课程设计-双机串行通信

单片机单片机课程设计-双机串行通信摘要由单片机构成的双机通信系统采用总线型主从式结构。
程设计就是要利用单片机来完成一个系统,实现双片单片机串行通信。
通信的结果实用数码管进行显示,数码管采用查表方式显示。
所谓主从式结构,即在两个单片机中,一个主机负责通信管理,另一个为从机,从机要负责主机的调度与支配。
该设计用A T89C51芯片,并用C语言程序来控制A T89C51,使之能实现两个单片机之间的通信。
通信方式为单工通信,一个为主单片机,作为发送方,另一个为从单片机,作为接收方。
关键字:单片机.AT89C51.C语言目录摘要 (1)前言 (3)二绪论 (4)2.1单片机 (4)2.2C语言: (4)2.3双机通信 (5)三.系统分析 (6)3.1 基本原理 (6)3.2波特率选择 (7)3.3通信协议的使用 (7)四、硬件设计 (7)4.1单片机串行通信功能 (10)4.2 MAX232芯片 (12)4.3整体电路设计 (13)五、软件设计 (14)5.1串行通信软件实现 (14)5.2程序流程图 (14)六.联合调试 (17)总结 (18)参考文献 (23)前言近年来,在自动化控制和只能仪器仪表中,单片机的应用越来越广泛,由于单片机的运算功能较差,往往需要借助计算机系统,因此单片机和PC机进行远程通信更具有实际意义,通信的关键在于互传数据信息。
51单片机内部的串行口具有通信的功能,该串口可作为通信接口,利用该串口与PC机的串口通信进行串行通信,将单片机采集的数据进行整理及统计等复杂处理就能满足实际的应用需要。
51单片机的开发除了硬件支持外,同样离不开软件。
用汇编语言或C 语言等高级语言编写的源程序必须转化为机器码才能被执行。
目前流行的Keil 8051c编译器。
它提供了集成开发环境,包括C编译器、宏编码、连接器、库管理和仿真调制器。
利用keil 8051ccuvision编写的程序可直接调用编译器编译,连接后可直接运行。
51单片机双机串行通信设计

51单片机双机串行通信设计51单片机是一款广泛应用于嵌入式系统中的微控制器,具有高性能和低功耗的特点。
在一些场景中,需要使用51单片机之间进行双机串行通信,以实现数据传输和协同工作。
本文将介绍51单片机双机串行通信的设计,包括硬件连接和软件编程。
一、硬件连接1.串行通信口选择:51单片机具有多个串行通信口,如UART、SPI 和I2C等。
在双机串行通信中,可以选择其中一个串行通信口作为数据传输的接口。
一般来说,UART是最常用的串行通信口之一,因为它的硬件接口简单且易于使用。
2.引脚连接:选定UART口作为串行通信口后,需要将两个单片机之间的TX(发送)和RX(接收)引脚相连。
具体的引脚连接方式取决于所使用的单片机和外设,但一般原则上是将两个单片机的TX和RX引脚交叉连接。
二、软件编程1.串行通信初始化:首先需要通过软件编程来初始化串行通信口。
在51单片机中,可以通过设置相应的寄存器来配置波特率和其他参数。
具体的初始化代码可以使用C语言编写,并根据所使用的开发工具进行相应的配置。
2.发送数据:发送数据时,可以通过写入相应的寄存器来传输数据。
在51单片机中,通过将数据写入UART的发送寄存器,即可将数据发送出去。
发送数据的代码通常包括以下几个步骤:(1)设置发送寄存器;(2)等待数据发送完成;(3)清除数据发送完成标志位。
3.接收数据:接收数据时,需要通过读取相应的寄存器来获取接收到的数据。
在51单片机中,可以通过读取UART的接收寄存器,即可获取到接收到的数据。
接收数据的代码通常包括以下几个步骤:(1)等待数据接收完成;(2)读取接收寄存器中的数据;(3)清除数据接收完成标志位。
4.数据处理:接收到数据后,可以进行相应的数据处理。
根据具体的应用场景,可以对接收到的数据进行解析、计算或其他操作。
数据处理的代码可以根据具体的需求进行编写。
5.中断服务程序:在双机串行通信中,使用中断可以提高通信的效率。
两个单片机之间的串行通信

两个单片机之间的串行通信一、设计要求在某个控制系统中有U1、U2这两个单片机,U1单片机首先将P1端口指拨开关数据载入SBUF,然后经由TXD将数据传送给U2单片机,U2单片机将接收数据存入SBUF,再由SBUF载入累加器,并输出至P1端口,点亮相应端口的LED。
二、实验所需元器件三、电路原理图:四、程序设计这两个单片机均工作在半工状态,U1将P1端口的状态通过TXD发半空给U2,而U2接收U1的数据,然后控制P1端口的LED显示。
因此,需编写两个不同的程序,其程序流程图如下所示:五、C语言程序:U1的C语言程序:#include "reg51.h"#define uint unsigned int #define uchar unsigned charvoid send(uchar state){SBUF=state;while(TI==0);TI=0;}void SCON_init(void){SCON=0x50;TMOD=0x20;PCON=0x00;TH1=0xfd;TL1=0xfd;TI=0;TR1=1;ES=1;}void main(){P1=0xff;SCON_init();while(1){send(P1);}}U2的C语言程序:#include "reg51.h"#define uint unsigned int #define uchar unsigned char uchar state;void receive(){while(RI==0)state=SBUF;RI=0;}void SCON_init(void) {SCON=0x50;TMOD=0x20;PCON=0x00;TH1=0xfd;TL1=0xfd;RI=0;TR1=1; }void main(){SCON_init();while(1){receive();P1=state;}}六、调试与仿真:。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录一、总体设计 (1)1、系统概述 (1)2、设计要求 (2)3、设计方案 (2)二、设计原理 (2)1、硬件设计 (3)2、系统软件设计 (4)三、系统设计图 (6)四、设计小结 (6)五、参考文献 (7)双单片机的串行通信一、总体设计1、系统概述MCS-51 单片机系列是 Intel 公司推出的功能强、速度快的 8位高档单片微型计算机系列产品,是当前工业测试系统中较理想的一种,内部有一个可编程的全双工的串行通信口,即串行通信和发送缓冲器 (SBUF),这两个在物理上是独立的接收发送器,既可以发送数据,也可以接收数据。
全双工的串行通信只需要一根输出线 (发送数据TXD)和一根输入线 (接收数据RXD)。
串行通信中主要有两种技术问题,一个是数据传送,另一个是数据转换。
具体说,在发送端,要把并行数据转换为串行数据;而在接收端,则要把接收到的串行数据转换为并行数据。
串行数据传送是将构成字符的每个二进制数据按一定的顺序进行传送的方式,串行通信协议规定字符数据的传送格式,每个串行数据由起始位、数据位、奇偶校检位和停止位组成。
本系统就是利用单片机的串行口,以串行通信方式,实现两单片机之间的数据交换,信息共享。
2、设计要求功能要求:①实现两片51单片机之间信息的串行通信。
②通信信息由小键盘(0~F)输入,发送机每按一次任意键,即刻发送到接收机。
③接收机按接收的顺序在本机的4位LED显示器上从右往左挤兑显示。
④没有接收到信息前两处的4位LED显示器不显示。
⑤每一个单片机既可以是接收机也可以是发送机。
3、设计方案本系统利用单片机的串行口,由软件和硬件两部分协调实现两单片机的串行数据传输。
硬件电路以AT89C5l单片机为核心,外围电路包括键盘电路(数据的输入),显示电路(数据的输出)。
工作在硬件电路基础上的软件主要完成数据输入,存储,显示,发送和接收。
由于两单片机相距很近,可以直接将其串行口相连。
系统整体电路图如图 1所示图 1 系统整体电路框二、设计原理此设计以AT89C5l单片机为核心,利用其内部的串行口,通过硬件与软件相结合的方式,实现双机的全双工的串行通信。
硬件电路包括键盘电路,显示电路,单片机主控电路,串行通信线和电源电路。
软件包括键盘扫描程序,显示程序,发送程序和接受程序。
发送和接收都采用中断方式。
硬件电路的组成如图2所示。
图 2硬件电路的组成由于两个单片机应用系统相距很近,近程通信时 (通信距离小于 15米),可以不使用调制解调器,将它们的串行口直接相连就可以实现全双工的串行通信。
1、硬件设计( 1)系统组成下面就以 1 号机为例,介绍硬件。
硬件电路包括AT89C5l 单片机,共阳性LED数码管以及传输线。
AT89C5l 是一个低电压,低功耗,高性能 CMOS 8位单片机,40个引脚,32个外部双向输入/输出 (I/0)端口,同时内含2个外设中断口,2个 16位可编程定时计数器,2个全双工串行通信口。
AT89C5l可以按照常规的方法进行编程,也可以在线编程。
片内含4k bytes 的可反复擦写的Flash 只读程序存储器和 128 bytes 的随机存取数据存储器 (RAM),器件采用 ATMEL 公司的高密度、非易失性存储技术生产,兼容标准MCS-51 指令系统。
(2)单片机主控电路AT89C5l 是片内有ROM/EPROM 的单片机,用其构成最小应用系统时,只要将单片机接上时钟电路和复位电路即可。
①晶振电路AT89C5l 单片机的时钟信号通常有两种形式:一种是内部时钟方式,另外一种是外部时钟方式。
内部时钟方式是在单片机的XTALI和XTAL2 引脚外接石英晶体,就构成了自激震荡并在单片机内部产生时钟脉冲信号。
本设计采用内部时钟方式,可以不受设各条件的影响。
○2复位电路当在AT89C5l 单片机的RST引脚引入高电平并保持两个机器周期时,单片机内部就执行复位操作。
在实际应用中,复位操作有两个基本形式:一种是上电复位,另一种是上电与按键均有效的复位。
本系统采用上电与按键均有效的复位。
开机瞬间RST引脚获得高电平,随着电容C 的充电,RST引脚的高电平将获得下降。
RST引脚的高电平只能保持足够的时间 (2个机器周期),单片机就可以进行复位操作。
另外在单片机运行期间,还可以利用按键完成复位操作。
(3)键盘电路按键实际上就是简单的开关,当按键接下时,相当于开关闭合;当按键松开时,相当于开关断开。
操作员通过键盘输入数据或命令,实现简单的人机对话。
按键有独立式按键和行列式按键。
独立式按键的各个按键相互独立,每一个按键独立地与一根数据输入线相连。
独立式按键配置灵活,软件结构简单,但每个按键必须占用一根口线,在按键数量多时,口线占用多。
所以,独立式按键常用于按键数量不多的场合。
由于此系统所用的按键较少,故选用独立式按键。
(4)显示电路显示器是单片机应用系统常用的设备,主要包括 LED和LCD。
LED显示器由若干个发光二极管组成。
当发光二极管导通时,相应的一个笔画或一个点就发光,控制相应的二极管导通,就能显示出对应字符。
七段LED通常构成字型“8”,还有一个发光二极管用来显示小数点。
由于LED显示器成本低廉,配置灵活,并且与单片机接口方便,所以本系统选用七段LED显示器 (共阳极)2、系统软件设计( 1)总体方案此系统欲实现双机的全双工的串行通信。
甲乙两机的内部软件是完全相同的,1 号机和 2 号机都能发送和接收数据信息能同时进行数据交换。
假设 1 号机为发送方,2 号机为接收方。
当接下发送按键时,1号机开始发送数据,存储在R7 中并通过显示器显示接下 2号机的接收按键,2号机开始接收数据,每接收一个数值就直接送到显示器显示。
本设计通过键盘输入数据。
利用软件控制键盘进行加 1或者减1操作,可以使其输入0~F之间的任意一个数。
(2)模块说明○1串行口工作方式单片机的串行通信口是可编程的,在工作之前应该初始化,对它初始化编程只需将两个控制字分别写入特殊功能寄存器SCON [98H]和电源控制寄存器PCON [97H]即可。
串行控制寄存器SCON是一个特殊功能寄存器,用以设定串行口的工作方式、发送/接收控制以及设置控制状态标志。
字节地址为 98H,可进行位寻址,SMO 和 SMI(SCON. 7和SCON. 6):串行口工作方式选择位,可选择 4 种工作方式 (见表 1)表1 串行口工作方式本系统采用串行口方式1 (SMO置0,SMI置1)进行通信,一帧信息为 10位,其中有 1个起始位,8个数据位和 1个停止位。
○2中断口设定AT89C5l单片机有5个中断源,在应用之前应该初始化。
本系统用到外部中断0 (丽),外部中断 1(丽),作为发送中断,入口地址是OOO3H。
当此键接下,转到中断服务程序 (执行发送程序)。
丽作为接收中断,入口地址是OOl3H。
当此键接下,转到中断服务程序 (执行接收程序)。
中断控制寄存器TCON FP ITO位,IT1 位应置0,采用电平触发方式。
中断允许控制寄存器IE FP EXO、EXI、ES位应置 1,允许中断。
(3)键盘工作设定本系统采用独立式按键结构。
对于是否有按键接下的信息输入方式有中断方式和查询方式,本系统采用查询方式。
本系统的键盘控制程序分为以下几个部分:○1判断有无键接下;○2用软件编程的方式控制键盘的输入数值;③可靠的逻辑处理方法。
(4)显示工作设定显示程序用查表法显示,七段数码管 (共阳性)显示段选码如表2所示。
表2数码管显示段选码显示字符0 1 2 3 4 5 6 7段选码COH F9H A4H BOH 99H 92H 82H F8H显示字符8 9 A B C D E F段选码80H 90H 88H 83H C6H AIH 86H 8EH 三、系统设计图四、设计小结我觉得做单片机课程设计是十分有意义的,而且是十分必要的。
在已度过的大学时间里,我们大多数接触的是专业课。
我们在课堂上掌握的仅仅是专业课的理论知识,如何去锻炼我们的实践能力?如何把我们所学的专业基础课理论知识运用到实践中去呢?我想做类似的课程设计就为我们提供了良好的实践平台。
在做本次课程设计的过程中,我感触最深的当属查阅大量的设计资料了,无论是课本上的还是网上的都浏览了不少相关的程序,从中也借鉴了别人的思想,开阔了自己的思路。
做单片机课程设计,对设计者对软硬件的理解和掌握的要求都比较高。
在设计程序之前,设计者必学对所用单片机的内部结构有一个系统的了解,知道该单片机内有哪些资源;要有一个清晰的思路和一个完整的的软件流程图;在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;在设计课程过程中遇到问题是很正常德,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题。
回顾这段时间以来自己从接到题目到编写出程序、画出电路原理图,自己真的收获不少。
无论是软件的使用还是对单片机内部资源的了解,自己的认识都加深了很多。
真希望能有多点的时间来把设计深入下去,把原理图做成实实在在的电路板,并在板子上实现设计的功能。
另外,这次课程设计让我感到了团队合作的重要性。
在团队中,我们互帮互助,对整个课程设计来说,这是至关重要的,缺少每一个人都会对我们的设计产生影响。
还有要感谢指导老师在我们遇到困难时,给予我们的建议与鼓励!五、参考文献1.单片机接口技术(C51版)张道德编著水利水电出版社2.单片微型计算机原理及接口技术杨光友朱宏辉主编水利水电出版社3.51单片机C语言应用程序设计实例精讲戴佳戴卫恒编著电子工业出版社4.单片机语言C51典型应用设计刘文涛编著人民邮电出版社5.μVision2单片机应用程开发指南尹勇李宇编著科学出版社6.单片机控制实习与专题制作蔡朝洋编著北京航天航空大学出版社附录:1.主机发送程序#include<reg52.h>#define uchar unsigned charuchar TAB[8];uchar i,sum; /*sum为求和校验*/void delay(void) /*延时程序*/{ int j;for(j=0;j<12000;j++);}void scanf(){ /*键盘扫描程序*/uchar j,k=0;unsigned char num[4][4]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};while(1){for(k=0;k<8;k++)P1=0x0F;delay(); /*软件去抖动*/if((P1&0x0F)!=0x0F){switch(P1){case 0x07: i=3; break;case 0x0b: i=2; break;case 0x0d: i=1; break;case 0x0e: i=0; break;default: break;}}P1=0xF0; /*反转行和列上的电平*/if((P1&0xF0)!=0xF0){switch(P1){case 0x70: j=3; break;case 0xb0: j=2; break;case 0xd0: j=1; break;case 0xe0: j=0; break;default: break;}TAB[k]=num[j][i]; /*P1输出对应的按键值*/ }}}void init(void) /*初始化程序*/{TMOD=0x20;TH1=0xf3; /*波特率为2400bps*/TL1=0xf3;PCON=0x00; /*SMOD=0*/TR1=1; /*开T1中断*/SCON=0x50; /*接收允许*/}void send(void) /*发送函数*/{do{SBUF=0xaa; /*发送握手信号0XAA*/while(!TI); /*等待接收*/TI=0; /*传送完复位*/while(!RI); /*等待接收*/RI=0; /*接收完复位*/}while(SBUF!=0xbb); /*甲机收到BBH后就把数码表*/// TAB[8] /*中的8个数据发送给乙机,并发送校验和*/ do{sum=0;for(i=0;i<=7;i++){SBUF=TAB[i]; /*发送段选码*/sum+=TAB[i]; /*和校验*/while(!TI);TI=0;}SBUF=sum; /*发送校验和*/while(!TI);TI=0;while(!RI);RI=0;}while(SBUF!=0); //等待接收}main() //主程序{init();while(1){scanf();send();}}2.从机接受程序#include<reg52.h>#define uchar unsigned charvoid init(void) //初始化程序{TMOD=0x20;TH1=0xf3; //波特率为2400bpsTL1=0xf3;PCON=0x00;TR1=1;SCON=0x50;}void delay(void) /*延时程序*/{uchar j;for(j=0;j<12000;j++);}void receive(void) //接收函数{ uchar i,sum;uchar TABS[4]; //定义接收数组do { while(!RI);RI=0;}while(SBUF!=0xaa); //接收完0XAA则向主机发送0XBB SBUF=0xbb; while(!TI);TI=0;while(1){ sum=0;for(i=0;i<=3;i++){ while(!RI);RI=0;TABS[i]=SBUF; //装人接收的数据sum+=TABS[i];}while(!RI);RI=0;if (SBUF==sum) //和校验{ SBUF=0X00;while(!TI);TI=0;break;}else{ SBUF=0xff;while(!TI);TI=0;}}while(1) //p2口为位选码P2=0xfe;{ for(i=0;i<=3;i++){ P0=TABS[i]; //p0口输出段选码P2=P2<<1|0x01; //位选码左移,并或0X01实现动态显示delay(); } //延时}}void main(void) //接收主函数{ init();receive();}(注:可编辑下载,若有不当之处,请指正,谢谢!)。