-
2020-06-28 18:05:34
这个程序的功能是,通过上位机发送数字给单片机,然后再由单片机把这个数字返回给上位机。
初始化
void SCON_init() { SCON = 0x50; //0101 0000 TMOD = 0x20; //0010 0000 TH1 = 256 - 3; TL1 = 256 - 3; ES = 1; EA = 1; TR1 = 1; }
上一篇有介绍:
1、串行口寄存器SCON用于控制串行口的工作方式
2、波特率发生器由定时器T1构成中断服务程序
void zhongduan4() interrupt 4 { if(RI == 1) { recdat = SBUF; RI = 0; flag = 1; } if(TI == 1) { TI = 0; SBUF = recdat; while(!TI); //等待数据全部发送完成 TI = 0; } }
1、第一个TI = 0 是将TI恢复初始状态,这样将数据发送到SBUF时,TI能够正常置位
2、第二个TI = 0 时清除中断产生的标志位主程序
void main() { SCON_init(); while(1) { if(flag == 1) { TI = 1; flag =0; } } }
TI = 1 目的是强行进入中断,在中断里面实现数据的发送,这样就不会那么杂乱
更多相关内容 -
关于串行中断的解读
2020-03-10 00:10:08//CPU和片上外设--串行口之间的主从关系 typedef unsigned int u16; sbit led=P1^0; void serialportinit() { TMOD=0X20;//选择定时器T1,采用工作方式2---8位自动重装载 TH1=0XF3; // 根据选择的波特率---4800,...那一块不明白的可以下方留言,帮你解读
# include"reg51.h" //CPU和片上外设--串行口之间的主从关系 typedef unsigned int u16; sbit led=P1^0; void serialportinit() { TMOD=0X20;//选择定时器T1,采用工作方式2---8位自动重装载 TH1=0XF3; // 根据选择的波特率---4800,按照公式进行计算(选择溢出率) TL1=0XF3; //根据自动重装载的工作原理,高8位的初值(不变)会赋给低8位 //TCON是的中断标志位TF1硬件自动置1 PCON=0X80;//SMOD置1功率倍增 TR1=1; //前面只是为了启动定时器T1而已,没有让其申请中断 SCON=0X50;//选择工作方式1---10位异步收发器,其中REN置1允许串行接收数据 ES=1; EA=1;//串行通信中断 } void main() { serialportinit();/*执行到此,调用该函数,然后该函数满足中断条件, 进入中断服务函数 */ while(1); } void serialport() interrupt 4 //中断号为1 { u16 receivedata; receivedata=SBUF;//将缓冲区的数据赋给软件变量 RI=0;/*RI为接收数据中断标志位,RI置1时申请中断(内部硬件自动完成) 当RI置1说明这一帧数据cpu已经接收完成,因为是内部硬件完成, 所以需要软件将该位置0取消此次申请,这样才能等待下一次的接收 让cpu(SBUF)接收下一个数据 因为只有10位数据停止位过来时,硬件才能将RI置为1*/ SBUF=receivedata;//这时候的SBUF是发送数据时的缓冲区 while(!T1);/*判断如果该10位数据还在发送中,执行该死循环,如果 发送完成硬件将T1置1*/ TI=0;//执行到该步就说明发送这一帧数据完成,软件置0 }
-
单根总线等级分布式串行中断多机通讯系统的设计与实现
2010-11-02 10:09:59单根总线等级分布式串行中断多机通讯系统的设计与实现 -
串行通信中断方式子程序
2020-07-25 16:09:31本文给大家分享了串行通信中断方式子程序。 -
C51编程19-中断篇(串行通讯3)
2021-02-27 10:28:52MCS-51单片机提供了4种串口的方式,但是我们只有方式1最常用(可变的10位串行通讯方式),下面就方式1的使用进行讲解。...通过中断向量,可以知道串行通讯只有一个中断号4,也就是说当进入无论是发送或...MCS-51单片机提供了4种串口的方式,但是我们只有方式1最常用(可变的10位串行通讯方式),下面就方式1的使用进行讲解。
在开始之前先明确一个概念,中断会产生中断标志位,而CPU检测到中断标志位后,如果没有其他更高的中断在执行,CPU会响应该中断,并进入中断服务函数。串行通讯属于中断方式的一种,它服从这个概念。此外串行通讯并不是需要进入串行通讯的时候,会产生中断标志位;而是发送或者接收成功后,会产生中断标志位。
通过中断向量,可以知道串行通讯只有一个中断号4,也就是说当进入无论是发送或者接收成功,都会触发中断服务函数,因此如果需要区分发送与接收需要在中断服务函数中实现区分,可以通过判断中断标志位(TI == 1或者RI == 1)进行区分。
在实际应用中,发送数据成功就成功,一般不会在发送成功后再进入中断服务函数;在处理接串行通信数据的时候,中断服务函数是非常必要,当接收到外面的数据成功时RI =1,触发中断通知CPU,CPU进入中断服务函数,对接收到的数据进行处理。
串行通讯方式1,需要满足以下条件
1)中断总允许打开 EA = 1;
2)中断源允许打开 ES = 1;
3)设置SCON=0x50(SM0 =0;SM1 =1;REN = 1,开启接收),由于SCON可以位寻址,可以位设置SM0 =0;SM1 =1;REN = 1;
4)设置SMOD,由于SMOD在PCON寄存器中,不能位寻址。如果需要SMOD=1,设置PCON=0x80;如果需要SMOD = 0,则不需要设置PCON,因为PCON复位值为0,上电后默认SMOD = 0;
5)设置TMOD与预装值(TH1与TL1),定时器T1设置(定时器工作方式,不是计数模式),一般设置工作在方式2(8位自动重装);
6)开启定时器 TR1 = 1;
7)中断服务函数。
注:使用串行通讯方式1时,SMOD的值、TH1与TL1可以通过计算公式计算的得到。
波特率 = ( fosc*2SMOD)/(32*12*(256-X))
在51单片机中的波特率有,4800、9600、19200。除了公式计算得到,也可以通过开发小工具得到。
链接:https://pan.baidu.com/s/1xJNgKILVPiACX-fEpwWihg
提取码:ibe7
串行通讯在工作方式1,波特率19200的接收程序,代码实现。
/****************************************
Header:
File Name: main.c
Author: adam
Date: 2020年9月19日
******************************************/
#include "reg52.h"
#include "stdio.h"
void main(){
//波特率为19200bps,如果需要9600,将SMOD =0即可;
EA = 1; //总中断允许
ES = 1; //串行源中断允许
PCON = 0x80; //SMOD =1,
SCON = 0x50; //SM0 =0;SM1 =1;REN = 1;
TMOD = 0x20; //设置T1为模式2,定时器模式:C/T=0;不启动外部,INT0控制开始定时:GATE=0;
TH1 = 0xFD; //预装值
TL1 = 0xFD; //自动重装值
TR1 =1; //启动定时器T1
while(1);
}
void uart(void) interrupt 4
{
//判断串行中断是否属于接收
if(RI==1){
P2 = SBUF;
RI=0;
}
}
代码实现后,可以使用串口调试助手,通过电脑发送数据到单片机。需要注意的是,该串口调试助手,发送设置的hex方式,没有实现,只能用ASCII码的方式发送数据,也就是说当发送框中,写入“1”,将会发送16进制的数据位ASCII码,单片机接收到的数值为0x31,0x31将会中断服务函数中,赋值为P2,如果P2口有接LED,对应的LED将会被点亮。
工具链接地址:
链接:https://pan.baidu.com/s/1aGfcqwGE0E9R1FyeNO8FTg
提取码:jpv7
注:此外如果不是使用上面的串口调试助手,如果发现数值不对,除了检查数据以外,还需要注意工具是不是发送数据时,有默认添加换行符。
下面是笔者在用以下的串口调试助手测试时,发送数1时。P2的LED会闪以下,然后保持数据在0x0A,0x0A在ASCII编码中为换行,也就是说软件在发送的时候,发送数据1后,会默认再发送换行符。
---------------------------------------------------------
如果觉得文章还不错,那就扫码关注吧!
-
单片机串行口中断实验实验五.zip
2021-04-22 08:16:48放置两个单片机,通过串行口线的互连,应用方式1和方式2,同时设计发送和接受程序,完成两个方式的应用,将发送和接收的内容在虚拟串口中显示。 -
串行口中断服务的程序是什么?
2021-08-02 01:47:21编中断服务程序举例这里先举一个完整的自己能上机练习的中断服务程序例子。在第六章中介绍完可编程计数器/定时器8253后再举一例(在Pc系列机中加入一个用户中断源——可编程定时中断),说明在PC系列机中加入一个用户...编中断服务程序举例
这里先举一个完整的自己能上机练习的中断服务程序例子。在第六章中介绍完可编程计数器/定时器8253后再举一例(在Pc系列机中加入一个用户中断源——可编程定时中断),说明在PC系列机中加入一个用户中断源应做的工作。
例 利用1CH软中断作定时处理——每次进入1CH中断时显示一个“*”,18次后显示一个字符串“second”(秒)。
关于1CH软中断,前面已经介绍,是留给用户进行定时处理的“软接口”。在软时钟中断(中断类型号为08H)处理过程中,要调用一次INT 1CH软中断。系统本身(指DOS)在1cH中断服务程序中仅安排了一条中断返回指令,即什么也没有做,直接返回。所以,用户可重新编写1CH的中断服务程序,在其中加入自己所需的定时处理。下面是用Turbo C编写的1CH中断服务程序以及对1CH中断进行设置的主程序的清单。编译、连接,形成可执行文件后便可运行(DOS环境下)。
#include
union REGS in,out;
int U=0;
char fg=0;
void interrupt(*old intlc)(void); /*定义old_intlc为中断函数指针*/
void interrupt new_intle() /*自编的1CH中断服务程序*/
{in.h.ah=OxOe; /*调用BIOS功能显示字符'*'*/
in.h.al='*':
in.h.bh=0;
int86(0x10,&in,&out);
n++;if(n>=18){n=0;fg=1;}
}
main()
{old_intle=getvect(Oxlc); /*取原ICH中断向量*/
setveet(0xlc,new_intlc); /*置新的1CH中断向量*/
for(;;)
{if(fg==1){pfinff("second");fg=0;}
if(bioskey(1)!=0) /*按任一键,恢复原1CH中断向量,程序结束*/
{setvect(0xlc,old_intle);exit(O);{
}
程序中已作了一些注解,但还需要说明几点:
①程序的第二行定义in,out为union(联合)REGS类型的变量,一个用作C语言BIOS功能调用(int86)的输入变量,另一个作输出变量。联合REGS在头文件dos.h中作了定义(所以要引用DOS.H),定义如下:
struct WORDREGS
{unsigned int ax,bx,cx,dx,si,di,cflag,flags;}
struct BYTEREGS
{unsigned char al,ah,bl,bh,cl,ch,dl,dh;
union REGS
{struct WORDREGS x;
struct BYTEREGS h;
}
可见,REGS是结构WORDREGS和结构BYTEREGS的联合。这样,在c语言中可直接对寄存器进行操作。例如,通过in.x.ax可引用16位寄存器Ax,通过in.h.ah可引用8位寄存器AH。
②在turbo c中,中断服务程序是用类型为interrupt的函数表示的,函数名即为中断服务程序入口地址。所以在Turbo c中编写中断服务程序是相当方便的。
③在上述程序清单中没有见到保护现场和恢复现场,实际上这是由 Turbo C编译程序自动安排的(从编译的目标代码中可看到保护现场和恢复现场,且现场考虑得较全)。
④自编的中断服务程序开始的4行为调用BIOS功能显示字符“*”,这相当于下面的汇编语言程序段:
MOV AH,OEH
MOV AL.'*'
MOV BH,O
INT 10H ;在当前光标处显示一个字符
⑤软中断服务结束不需要发中断结束命令。中断结束命令只有外部可屏蔽硬中断才需要。
这个是 你需要的么?
-
51单片机外部中断+串行口中断
2018-05-28 23:26:17从而测量物体最小包围盒,本科专业自动化,想做的省事一点,不用每次都判断位置开始拍照,所以加了两个接近开关,当步进电机向某一方向运行时,利用两个传感器确定需要拍照的时刻,同时通过串行口向电脑发送一个字符... -
8051单片机实战分析(以STC89C52RC为例) | 12 - 串行口中断的使用
2021-06-08 20:22:52EA = 1时,各中断的产生由个别的允许位决定 ES 串行口RX/TX中断允许 ET1 定时器T1中断允许 EX1 外中断INT1中断允许 ET0 定时器T0中断允许 EX0 外部中断INT0中断允许 1.3 IP寄存器 IP(Interrupt Priority),中文叫... -
第十三章 串行口中断
2011-09-29 11:41:03串行口中断,单片机串行通信原理,工作方式、协议,串行通信入门基础 -
LPC中的中断处理小结
2020-08-15 10:30:37近来在LPC的中断过程上看了点文献,作为一个初学者感觉这个内容与其它的处理器还是有很大的区别。 -
中断请求串行判优先电路的设计.rar
2020-07-11 16:25:28中断请求串行优先电路,即菊花链优先排队电路,是一种优先级管理的简单硬件方案。它为每个设备接口都设置一个简单的逻辑电路,以便根据优先级来传递或截取CPU发出的中断响应信号INTA(低电平有效),以实现响应中断... -
stc89c52单片机串行口通讯
2015-08-26 15:50:36单片机与单片机之间通讯,里面包含接受和发送程序,并有8个led灯光提示,根据发送内容,点亮相应的led。 -
中断判优的中断串行链路(教材P267串行排队链路)源码
2016-01-16 20:33:42组成原理课程设计中断判优的中断串行链路(教材P267串行排队链路)源码 -
【51单片机】串行通信,采用中断,串行口方式3,甲机发送,乙机接收:接收数据通过七段数码管显示。
2022-04-21 10:08:30实验要求:甲、乙双机通过串行口进行连接,采用中断方式,编写串行口方式3下的甲、乙双机发送与接收程序。 甲机发送:发送数据存放在数组TRA[16]里面。 乙机接收:接收数据通过一个七段数码管进行显示。晶振频率为... -
实验5-单片机串行口中断实验.zip
2021-02-03 13:10:11放置两个51单片机,通过串行口线的互连,应用方式1和方式3,同时设计发送和接受程序,完成两个方式的应用,将发送和接收的内容在虚拟串口中显示。 详细链接:... -
51单片机中断系统
2021-01-14 19:23:1051单片机有5个中断源,分别是外部中断0,定时/计数器T0中断,外部中断1,定时/计数器T1中断,串行口中断,对应地址如下表: 中断源 中断矢量地址 外部中断0 0003H 定时/计数器T0中断 000BH 外部中断1 ... -
快速复习51单片机的外部中断、计数/定时器中断和串行口中断,加代码实现
2021-09-13 15:12:32IP 中断优先级控制寄存器 这个我们一般不改,用缺省值, 外部中断0 > 计数/定时器中断0 > 外部中断1 > 计数/定时器中断1 > 串行通信中断 为什么是这样的排序呢?因为在单片机的ROM他们的入口地址也是按照这个顺序... -
笔记 学习51单片机串口中断
2021-05-15 17:11:5651单片机通过特殊功能寄存器SBUF对串行接收或串行发送寄存器进行访问,两个寄存器共用一个地址99H,但在物理上是两个独立的寄存器。当接收数据时,写“A=SBUF”,单片机会自动将串口接收寄存器中的数据取走给A;当... -
51汇编——定时器中断、串行口中断
2021-01-10 15:33:12定时1s亮灭10次 ORG 0000H LJMP MAIN ORG 000BH LJMP TIMER0 ORG 0030H MAIN: MOV R0,#10 ;循环10次,使定时100ms*10产生1s MOV R1,#20 ;...开启定时/计数器(T0)中断允许位 SETB EA ;开启总中断 SET -
51单片机 AT89C52 的中断/定时器/计时器 笔记
2019-12-09 22:45:242外部中断+3内部定时器中断/计时器中断+1串口中断 EX0 EX1 外部中断; ET0 ET1 ET2 内部 定时器中断 / 计时器中断; ES 串口中断; 值为1,允许中断;值为0,禁止中断; =====================================... -
51单片机知识点梳理——中断
2020-02-07 15:27:26参考文章 89C51的中断系统有5个中断源:外部中断0、定时器0、外部中断1、定时器1、串口中断(优先级依次递减)。 中断相关寄存器 中断寄存器IE -
C51中断程序的设计教程详细说明
2021-07-07 13:50:42中断系统是计算机或者...在8051单片机中共有5个中断源,包括2个外部中断源、2个定时中断源和1个串行中断源。下面分别介绍这三类中断源。 1. 外部中断源 2. 定时中断源 3.串行中断源 -
51单片机串行口中断的使用(指针)
2020-07-01 11:27:2651单片机串行口中断的使用(指针)初始化中断服务函数主函数 这个程序的功能是通过上位机发送数字1234给单片机,单片机再把对应的数组发送给上位机 初始化 unsigned char shu1[] = {1}; unsigned char shu2[] = {1,... -
MCS-51单片机外中断软件编程
2021-01-19 19:17:34MCS-51单片机有多个中断源,以8051为例,有5个中断源,两个外中断、两个定时中断和一个串行中断,这一节我们讨论外中断软件编程。 外中断是由外部原因引起的中断,有两个中断源。即外中断0(INT0)和外中断1(INT... -
如何设置51单片机的中断优先级
2021-05-24 09:55:01PSPT1PX1PT0PX0IP优先级别寄存器各位介绍如下:PS:串行口中断优先级控制位。PS=1设定串行口为高优先级中断;PS=0为低优先级中断。PT1:T1中断优先级控制位。PT1=1设定定时器T1为高优先级中断;PT1=0为低优先级中断... -
单片机与DSP中的MCS-51单片机外中断软件编程
2020-11-08 05:10:07MCS-51单片机有多个中断源,以8051为例,有5个中断源,两个外中断、两个定时中断和一个串行中断,这一节我们讨论外中断软件编程。 外中断是由外部原因引起的中断,有两个中断源。即外中断0(INT0)和外中断1(INT... -
【单片机】4.7 中断请求的撤销
2021-12-01 21:20:59某个中断请求被响应后,就存在着一个中断请求的撤销问题。 1.定时器/计数器T0、T1中断请求的撤销 硬件会自动把中断请求标志位(TF0或TF1)清0,自动撤销。 2.外部中断请求的撤销 (1)跳沿方式外部中断请求的... -
关于51单片机串口中断的理解
2020-04-06 19:52:06关于51单片机串口中断的理解 关于这个问题找了好几个帖子,都没看到能让我明白的。自己就想了想,又看了看。新手不一定说得对,您凑合着看看。要不对的话,望指正。 首先,我们在SCON中设置的时候,一般都会将接收使... -
第四节:中断与串口(黄老师)
2022-02-25 13:49:16一、中断 中断的概念我在51篇已经有整理过了,这次就不再详细描述了,只介绍在STM32中的中断相关内容。 1.Cortex-M3的中断 其中断的框架是由内核设计者ARM公司设计的,设计了256个,很多型号的芯片由于资源不够,是...