精华内容
下载资源
问答
  • 51单片机串行口中断的使用

    千次阅读 2020-06-28 18:05:34
    51单片机串行口中断的使用初始化中断服务程序主程序 初始化 void SCON_init() { SCON = 0x50; //0101 0000 TMOD = 0x20; //0010 0000 TH1 = 256 - 3; TL1 = 256 - 3; ES = 1; EA = 1; TR1 = 1; } 上一篇有...

    51单片机串行口中断的使用

    这个程序的功能是,通过上位机发送数字给单片机,然后再由单片机把这个数字返回给上位机。
    

    初始化

        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 目的是强行进入中断,在中断里面实现数据的发送,这样就不会那么杂乱

    展开全文
  • 51单片机外部中断+串行口中断

    万次阅读 2018-05-28 23:26:17
    从而测量物体最小包围盒,本科专业自动化,想做的省事一点,不用每次都判断位置开始拍照,所以加了两个接近开关,当步进电机向某一方向运行时,利用两个传感器确定需要拍照的时刻,同时通过串行口向电脑发送一个字符...

    新搭了一个系统,用线激光进行实时三维重建,不用每次都判断位置开始拍照,加了两个接近开关,当步进电机向某一方向运行时,利用两个传感器确定需要拍照的时刻,同时通过串行口向电脑发送一个字符,电脑收到这个字符开始拍照。今天先把keil端的程序弄上来,有时间再把串口通信的程序写一写。程序已经通过运行,如图所示:


    利用串口调试工具试了一下完全可以,程序的思路大概就是设置了两个状态标志位flag0和flag1,当通过接近开关1时,p3.2出现下降沿,此时设置flag0=1,当通过接近开关2时,p3.3出现下降沿,此时进入外部中断1,如果满足flag0=1,就设置flag1=1,如果flag1=1,则向串口发送一串字符即可。当然这其中还需要相互制约,保证反方向进入时不会发送数据,具体一看程序就明白了。当然也可以使用外部中断计数器做。



    #include <STC12C5A60S2.H>
    bit Flag=0; 
    bit flag0=0;    //0中断标志
    bit flag1=0;    //1中断标志
    void SendOneByte(unsigned char c)   
    {
    SBUF = c;           //把数据送往寄存器
    while(!TI);         //等待发送完成TI=0时一直发送,直到TI=1,发送后硬件自动置1
    TI = 0;             //发送完成标志
    }
    void SendString(unsigned char *p)
    {
    while(*p!='\0')
    {SendOneByte(*p++);}
     flag1=0;
     flag0=0;
    }


    void main(void)
    {
    //单片机初始化


    //通信设置,串行口中断
    TMOD = 0x20;
    SCON = 0x50;
    TH1 = 0xFD;
    TL1 = TH1;
    PCON = 0x00;
    EA = 1;
    ES = 1;
    TR1 = 1;
    //外部中断0
    IT0=1;      //外部中断0下降沿触发方式
    EX0=1;      //开外部中断0


    //开外部中断1
    IT1=1;      //外部中断1下降沿触发方式
    EX1=1;      //开外部中断1
    while(1)
    {
    while(flag1)
    {
    SendString("konglingsheng");
    while(!Flag); //flag=0一直循环,循环结束flag=1;
    Flag=0;
    }
    }
    }
    void int0(void) interrupt 0   //外部0中断服务
    {
            EX0=0;
            flag1=0;
            flag0 = 1;
            EX0=1;
    }
    void int1(void) interrupt 2 //外部1中断服务
    {    EX1=0;
        if(flag0) //如果0已中断
        {
           flag0=0;
    flag1=1;
        }
        else
    {
    flag1 = 0;
      flag0= 0;
    }
    EX1=1;
    }
    void UARTInterrupt(void) interrupt 4  //4号串行中断
    {
      RI = 0;                                    //停止接受
      Flag=1;                                     //标志位使循环 

    作者:kls 2018.5.28  23:26

    展开全文
  • 定时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

    定时1s亮灭10次

    ORG 0000H
    LJMP MAIN
    ORG 000BH
    LJMP TIMER0
    ORG 0030H
    MAIN: 
    	MOV R0,#10    ;循环10次,使定时100ms*10产生1s
    	MOV R1,#20    ;循环20次,亮10次,灭10次
    	MOV TMOD,#01H  ;工作方式1
    	MOV TH0,#3CH  ;计数器初值
    	MOV TL0,#0B0H
    	SETB ET0      ;开启定时/计数器(T0)中断允许位
    	SETB EA		  ;开启总中断
    	SETB TR0      ;开启定时/计数器(T0)运行控制位,为1时启动定时计数
    	SETB P1.0     ;先灭1s
    	SJMP $
    TIMER0:
    	MOV TH0,#3CH   ;重装初值
    	MOV TL0,#0B0H
    	DJNZ R0,EXIT
    	CPL P1.0     ;亮灭取反
    	MOV R0,#10
    	DJNZ R1,EXIT 
    	CLR EA		 ;关中断
    EXIT: RETI
    	END
    

    方式2计数,方式1定时,循环

    ORG 0000H
    LJMP MAIN
    ORG 000BH
    LJMP TIMER1
    ORG 0030H
    MAIN:
    	MOV TMOD,#06H   ;工作方式2计数
    	MOV TH0,#156	;计数100个脉冲
    	MOV TL0,#156
    	SETB ET0		;定时器中断初始化
    	SETB EA
    	SETB TR0		;TR0为1开始计数,此时标志位F0为0
    	SETB F0			;标志位置1
    	SJMP $	 ;程序原地踏步,定时和计数不停地来回切换
    TIMER1:			;中断用于切换工作方式和装填初值
    	JNB F0,TRANS	;标志位为0则跳
    	MOV TMOD,#01H	;方式1
    	MOV TH0,#0FEH
    	MOV TL0,#0CH
    	SJMP EXIT
    TRANS:
    	MOV TMOD,#06H
    	MOV TH0,#156
    	MOV TL0,#156
    EXIT:
    	CPL F0			;标志位取反
    	RETI
    

    串行口发送

    采用串口工作方式1将8051单片机P1口采集的8位数据实时串行传输。无需奇偶校验,采用中断方式。波特率为9600波特(晶振频率为11.0592MHz)。

    ORG 0000H
    LJMP MAIN
    ORG 0023H
    LJMP SEND
    ORG 0030H
    MAIN:
    	MOV SCON,#40H
    	MOV PCON,#00H
    	MOV TMOD,#20H
    	MOV TH1,#0FDH
    	MOV TL1,#0FDH
    	SETB TR1
    	SETB EA
    	SETB ES
    	MOV P1,#0FFH   ;P1输入
    	MOV A,P1
    	MOV SBUF,A
    	SJMP $
    SEND:
    	CLR TI
    	MOV P1,#0FFH
    	MOV A,P1
    	MOV SBUF,A
    	RETI
    

    串行口接收

    采用串口工作方式1接收8位串行数据,由P1口输出。无需奇偶校验,采用中断方式。波特率为9600波特(晶振频率为11.0592MHz)。

    ORG 0000H
    LJMP MAIN
    ORG 0023H
    LJMP RECEIVE
    ORG 0030H
    MAIN:
    	MOV SCON,#50H
    	MOV PCON,#00H
    	MOV TMOD,#20H
    	MOV TH1,#0FDH
    	MOV TL1,#0FDH
    	SETB TR1
    	SETB EA
    	SETB ES
    	SJMP $
    RECEIVE:
    	CLR RI
    	MOV A,SBUF
    	MOV P1,A
    	RETI
    
    展开全文
  • 2、串行口工作方式有2种,1为查询法,2为中断法。这里用中断法。3、串口的初始化:void init(void) //串口初始化 { EA=0; //暂时关闭总中断 TMOD=0x20; //定时器1工作在模式2--常数自动重装的8位定时器工作...

    基本概念

    51单片机串行通讯:

    1、串行口有两个数据缓冲寄存器SBUF,一个是发送缓冲寄存器,一个是接收缓冲寄 存器。

    2、串行口工作方式有2种,1为查询法,2为中断法。这里用中断法。

    3、串口的初始化:

    void init(void)				//串口初始化
    {
    	 EA=0;          //暂时关闭总中断
    	 TMOD=0x20;    //定时器1工作在模式2--常数自动重装的8位定时器工作模式
    	 SCON=0x50;     //0101 0000 串口工作在方式1--8位UART,波特率由T1和SMOD位决定
    		 TH1=256-jingzhen/(botelv*384);   //计算定时器重装值
    		 TL1=256-jingzhen/(botelv*384);
    	 PCON|=0x00;    //0000 0000  SMOD=0,串口波特率不加倍
    		 EA=1;         //总中断允许
    		 ES=1;         //Enable Serial   串行中断允许     
    		 TR1=1;        //启动定时器1
    		 REN=1;        //SCON中的 REN=1 (软件置1)允许串行口接收数据 
    	 
    }

    4、例如串行口工作在方式一时:SCON=0x50;

    如图所示:

    void send(unsigned char d)      //发送一个字节的数据,形参d即为待发送数据。
    	 			{
    				 SBUF=d; //将数据写入到 串口发送缓冲器
    				 sending=1;	 //设置发送标志,说明收到数据了
    				 while(sending); //等待发送完毕
    				}

    5、中断什么时候产生?--如上图,中断由硬件决定,当硬件置TI=1后,就触发了串口中断,因此,51程序里,中断函数是没有调用的,中断是由硬件决定的。当发送下一个数据时,再存入SBUF缓冲器,存完后由硬件将TI置1,再进入中断服务程序,判断RI或TI的情况。

    void uart(void) interrupt 4		 //串口发送中断
    						 {
    						 if(RI)    //如果数据接收完了,软件将RI清0
    						 {
    						  RI=0;   
    						 }
    						 else      //还没接收完的话,不让发送
    						 {
    						  TI=0;			 ///保持接收
    						  sending=0;  //清正在发送标志
    						 }
    						}

    2、方式1输入:


    展开全文
  • 串行口中断服务函数和其他中断本质上是一样的,达到特定的条件,如何向CPU申请中断,进入中断服务函数; 我特意在郭天祥老师的书上找到了一句话:当数据被写入SBUF寄存器后,单片机自动开始从起始位发送数据,发送...
  • 串行口中断 4.1串行口中断通信 代码示范 4.2串行口中断通信分析 4.2.1 80C51串行口的结构 4.2.2 使用到的新寄存器 4.2.3 波特率的设置 4.3串口如何使用 5.参考资料 1.中断系统的概念 1.1中断的概念 CPU在处理某一...
  • 在第一篇到第九篇博文中,我们认识到了一些基于IO输入与输出的基础电子器件使用: 《8051单片机实战分析(以STC89C52RC为例) | 01 - 点亮一个LED》 《8051单片机实战分析(以STC89C52RC为例) | 02 - LED延时约5s...
  • 1.串行口方式0应用编程 8051单片机串行口方式0为移位寄存器... 串行口方式0的数据传送可采用中断方式,也可采用查询方式,无论哪种方式,都要借助于TI或RI标志。串行发送时,能靠TI置位(发完一帧数据后)引起中断...
  • 用8051单片机串行口外接CD4094扩展8位并行输出口,8位并行口的各位都接一个发光二极管,要求发光管呈流水灯状态。 串行口方式0的数据传送可采用中断方式,也可采用查询方式,无论哪种方式,都要借助于TI或RI标志
  • 单片机—串行口

    2020-12-28 10:58:35
    目录前言一、串行口结构与相关寄存器1、串行口结构2、相关SFR二、串行口的工作方式三、串行口的初始化 前言 串行口知识简单整理 一、串行口结构与相关寄存器 ...1)TI,发送中断标志位。在方式0时,当串行发送
  • 串行口通信实验

    2012-01-31 22:14:22
    串行口方式0的数据传送可采用中断方式,也可采用查询方式,无论哪种方式,都要借助于TI或RI标志。串行发送时,能靠TI置位(发完一帧数据后)引起中断申请,在中断服务程序中发送下一帧数据,或者通过查询TI的状态,...
  • (1)发送:CPU执行一条写SBUF指令,启动了串行口发送,同时将1写入输出移位寄存器的第9位。发送起始位后,在每个移位脉冲的作用下,输出移位寄存器右移一位,左边移入0,在数据最高位移到输出位时,原写入的第9位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,...
  • 单片机串行口

    千次阅读 2013-07-03 12:23:26
    MCS-51单片机的串行口具有两条独立的数据线——发送端TXD和接收端RXD,它允许数据同时往两个相反的方向传输。一般通信时发送数据由TXD端输出,接收数据由RXD端输入。 MCS-51单片机的串行口既可以用于网络通信,
  • 俩个PC机通过串行口互联,实现件的无差错传输。程序必须用中断方式来完成任务
  • 串行口中断入口地址 LJMP INT_T0 ORG 0030H MAIN:MOV SCON,#50H ;串行口工作方式1 MOV PCON,#00H ; SMOD置0 MOV TMOD,#20H ;定时计数器工作方式2 MOV TH1,#0FDH ;设置溢出率初值 MOV TL1,#0FDH
  • 80C51串行口

    千次阅读 2017-07-10 11:54:03
    串行通信是指 使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度单工、半双工、全双工 单工数据传输只支持数据在一个方向上传输 半双工数据传输允许数据在两个方向上传输,但是,在某...
  • 51单片机学习 串行口通信实验
  • 串行口通信(一)

    2021-01-06 13:59:07
    串行口通信就被发明出来,下面来了解串行口通信(uart)。 几个概念 为了能更好理解串行口通信,在介绍它之前,先来看看几个概念,补充知识,方便深入明白uart工作原理。 通信方式 通信方式 通信方式有两种,...
  • 串行口方式0的数据传送可采用中断方 式,也可采用查询方式,无论哪种方式,都要借助于TI 或RI 标志。串行发送时,能靠TI 置位(发完一帧数据后)引起中断申请,在中断服务程序中发送下一帧数据,或者通过查询 TI 的...
  • uart串行口通信(二)

    2019-02-23 14:40:16
    上一篇就已经介绍串行口通信相关概念,寄存器。对串行口通信已经有一定的了解。还介绍串行口工作方式1,这个方式所用最多,务必会用。现在来介绍工作方式0,2,3。下面来了解一下。 串行口方式0 串行口的工作方式0为...
  • 学习串行口时,感觉挺复杂得 ,但是进入代码之后感觉还行,所以说还是得多练习实践。 2.80c51的串行口结构 2.1、内部结构介绍 AT89S51单片机串行口的内部结构如下图所示。它有两个物理上独立的接收、发送缓冲器...
  • 单片机的串行口及应用

    千次阅读 2019-12-18 21:51:06
    单片机的串行口及应用 通信方式: ​ 1.并行通信:数据的各位同时进行传送。速度快、效率高、成本高 ​ 2.串行通信:数据一位一位地按顺序进行传送。减少传输线、降低通信成本 按照数据传送方向: 单工、半双工、全...
  • 51单片机:串行口控制寄存器SCON

    千次阅读 2019-05-31 11:23:40
    51单片机:串行口控制寄存器SCON 串行口控制寄存器SCON的格式 D7 D6 D5 D4 D3 D2 D1 D0 SCON SM0 SM1 SM2 REN TB8 RB8 TI RI 98H 位地址 9FH 9EH 9DH 9CH 9BH 9AH 99H 98H ​ SM0、SM1——串行口...
  • uart串行口通信(一)

    千次阅读 2019-02-21 11:06:11
    串行口通信就被发明出来,下面来了解串行口通信(uart)。 几个概念 为了能更好理解串行口通信,在介绍它之前,先来看看几个概念,补充知识,方便深入明白uart工作原理。 通信方式 通信方式有两...
  • UART串行口简介

    千次阅读 2019-04-27 16:57:40
    处理由键盘或鼠标发出的中断信号(键盘和鼠标也是串行设备)。 可以处理计算机与外部串行设备的同步管理问题。   UART 是计算机中串行通信端口的关键部分 。 UART 相连于产生兼容RS232 规范信号的电路。...
  • IF标志位与中断的关系

    千次阅读 2016-05-05 23:04:45
    IF标志位与中断的关系

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,664
精华内容 3,465
关键字:

串行口中断的中断标志