430单片机个人总结 - 图文

更新时间:2024-01-14 09:14:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

430单片机个人总结

一 时钟部分(msp430f149单片机)

1、关于XT2

图1 XT2Sx=11、XT2OFF=0时,XT2来源于外部时钟信号,也就是可以直接在 XT2IN管脚上施加一个时钟信号,而不需要在XT2IN和XT2OUT上加时钟源

2、关于XT1

当在XIN和XOUT两端加低频晶振时,晶振之间可以不加电容,而通过单片机内部给其配置电容 当在XIN和XOUT两端加高频晶振时,晶振之间需要配置电容 当LFXT1Sx=11、OSCOFF=0时,XIN和XOUT之间可以不加晶振,只需在XIN管脚上施加一个时钟信号既可

图2 3、关于MCLK

PUC信号之后,MCLK来源于DCO时钟信号(可以不设置,系统PUC之后会有一个默认值),如果要设置MCLK来源于XT1或者XT2,步骤如下:

1、打开需要的晶体振荡器;(作为MCLK的时钟源,而不是默认的DCO) 2、清除OFIFG标志位;

3、延时50us;

4、测试OFIFG标志位。若OFIFG=0,说明设置成功;若OFIFG=1,设置未成功,重复2~3步骤;程序如下

BCSCTL1 &=~XT2OFF; // XT2 is on do {

IFG1 &=~OFIFG; // clear OSCFault flag for(i=255;i>0;i--); // time for flag to set }

while((IFG1 & OFIFG));

BCSCTL2 |=SELM_2+DIVM_3; //f(mclk)=f(XT2)/8;

二 IO口部分(msp430f149单片机)

430单片机的IO口都是复用的,除了做普通IO口用外,还可以作为片内外设用,图3所示为 msp430g2553单片机的P1.6、P1.7管脚说明,可以发现P1.6管脚除了作为普通的IO之外,还可以作为TA0.1、TCLK等用,那么应该如何选择这些管脚的功能呢? 1、 给寄存器PxSEL(图4)赋值,确定管脚是作为IO用,还是作为片内外设用,当PxSEL=0时,用作IO,当PxSEL=1时,用作片内外设;

2、给寄存器PxDIR(图5)赋值,确定管脚的输出方向(作为IO时,用来设置是input还是output;作为片内外设时,用来设置是输出的片内外设还是输入的片内外设,如P1.6管脚用作片内外设时,TA0.1是输出,CA6是输入),当PxDIR=0时,用作输入,当PxDIR=1时,用作输出;

图3

图4

三 中断函数

标准中断函数的格式为;

#pragam vector=中断向量 __interrupt void ISR(void)

{ }

用户程序;

四 低功耗模式

进入低功耗程序模式为(以进入低功耗LPM0模式为例): _EINT(); LPM0;

以上两句程序等价为:_BIS_SR(LPM0_bits + GIE); 那么退出低功耗程序为: LPM0_EXIT;

五 Flash操作(msp430f149单片机)

Flash被划分成main memory和information memory,两者没有太大区别,只是两者的容量和物理地址不同。

CPU:中央处理器(center processing unit),是一台计算机的运算核心和控制核心。它的功能是解释处理指令。主要由运算器(算术逻辑运算单元ALU,arithmetic logic unit)、高速缓冲存储器(cache)、数据总线(data bus)、控制总线(control bus)、地址总线(address bus)组成。它与内部存储器(memory,程序存储器和数据存储器)和输入/输出(I/O)设备合称为电子计算机三大核心部件。

Flash就是memory的一种。 对flash进行操作时,其频率需在257kHz~476KHz之间,同时单片机的供电电压不能低于2.7V。

对flash的操作有三种:读、写和擦除;默认方式是读。 擦除操作:

对flash进行擦除操作时,需要进行一个假写入,假写入的目的是启动flash时钟发生器和启动擦除操作,若果假写入的地址不在需要擦除的段内,该假写入不能启动该段的擦除。

擦除flash所需的时间是固定的,并不取决于需要擦擦除的flash的数量,mass擦除的时间t= 10593/fFTG,segment擦除的时间t=4819/fFTG,色

写入flash步骤:

1、关闭看门狗电路和总中断;

2、设置FCTL2(FCTL2寄存器用来设置flash timing); 3、设置指针指向需要写入段的首地址;

4、设置FCTL1、FCTL3(FCTL1用来控制flash的操作方式是写操作还是擦除操作,默认是读操作;FCTL3用来控制能否对flash进行操作),需要首先设置FCTL1控制flash为擦除操作(在写入之前需要先擦除);

5、假写入(用来启动擦除操作,若是从flash中启动擦除操作(???),那么在擦除过程中,CPU将会停止运行;擦除完成后,CPU继续执行后面的代码); 怎么理解从flash中启动擦除操作???

个人理解:就是通过上位机下载到单片机的程序保存在flash中,而没有保存到RAM中。擦除指令代码也是保存在flash中。

6、擦除操作完成后,设置FCTL1(设置Flash为写入模式); 7、写入flash程序;

8、写入完成后,设置FCLT1、FCTL3(FCTL1设置flash为默认模式;FCTL3锁存flash,让程序无法对flash进行操作) c语言程序如下: void main(void) {

uchar *Flash_ptr; // flash pointer

uint i,value; //value为需要写入的数值; WDTCTL=WDTPW + WDTHOLD; //关闭看门狗;

FCTL2=FWKEY + FSSEL0+FN0; //设置flash timing value=0;

Flash_ptr=(uchar *) 0x1080; //设置flash pointer为需要写入的flash段的首地址 FCTL1=FWKEY+ERASE; //设置flash为擦除模式;

FCTL3= FWKEY; //打开flash操作,默认为读模式,用户不能对flash进行其他操作 *Flash_ptr=2; //假写入一个数值(假写入的目的是启动擦除操作)

FCTL1=FWKEY+WRT; //设置flash为写模式 for(i=0;i<128;i++) //写入程序 {

*Flash_ptr++=value; }

FCTL1=FWKEY; //关闭写入模式

FCTL3=FWKEY+LOCK; //关闭flash,用户不能对flash写/擦除操作,只能读 }

如何理解从flash启动对flash的操作、从RAM启动flash的操作?

回答:对flash进行的这段代码存放在哪里,就是从哪里启动flash的操作,如果该段代码放在RAM中,那么即是从RAM启动flash的操作;如果这段代码放在flash中,即是从flash启动flash操作。

如何判断程序是存放在Flash中还是RAM中?

回答:x86架构的PC机cpu在运行时,程序是存储在RAM中的,PC机在运行程序的时候将程序从外存(硬盘)调入到RAM中运行,CPU从RAM中读取程序和数据;而单片机等嵌入式系统则是存放在flash中的,单片机程序是固化在flash中,CPU运行时直接从flash中读取程序,从RAM中读取数据。

造成以上差别的原因在于:x86架构的CPU是基于冯.诺依曼体系的,即数据和程序存储在一起的,而且pc机的RAM资源相当丰富,客观上能够有承受大量的程序数据;单片机的架构大多是哈佛体系的,即程序和数据分开存储,而且单片机的片内RAM资源是相当有限的,内部的RAM过大会带来成本的大幅度提高。

冯.诺依曼结构(又称普林斯顿结构)和哈佛结构的区别? 回答:两者的区别在于程序空间和数据空间是否是一体的。冯诺依曼结构是将程序空间和数据空间合在一起的存储器结构。程序指令存储地址和数据存储地址指向同一个存储的不同物

理地址,因此程序指令和数据指令的宽度相同。取指令和取操作数都在同一条总线上,通过分时复用的方式进行的,缺点是在高速运行时,不能达到同时取指令和取操作数,从而形成了传输过程的瓶颈。常见的微控制器和中央处理器有:Intel公司的x86微处理器、Intel公司的其他中央处理器、安谋公司的ARM7、MIPS公司的mips处理器。 哈佛体系的内部程序空间和数据空间是分开的,这样就可以同时去指令和操作数,从而大大提高了运算能力。常见的微控制器和中央处理器有:microchip公司的PIC系列芯片、摩托罗拉的MC68系列、zilog公司的Z8系列。Atmel公司的AVR系列、安谋公司的ARM9、ARM10和ARM11、51单片机。 在通用计算机系统中(PC机),应用软件的多样性是的计算机要不断地变化所执行的代码的内容,并且频繁地对数据域代码占有的存储器进行重新分配,这种请款下,冯诺依曼结构占有绝对优势,因为同一编址可以最大限度地利用资源,而哈佛结构的计算机应用在这种请款下会对存储器资源产生理论上最大可达50%的浪费;但是再嵌入式应用中,系统要执行的任务相对单一,程序一般是固化在硬件里。当然这时使用冯诺依曼结构液可以,代码区和数据区在编译时一次性分配好了而已,但是其灵活性得不到体现,所以现在大量单片机还是使用的哈佛结构。

为什么说哈佛结构在嵌入式计算机中占有优势呢? 回答:嵌入式计算机在工作时与通用计算机有着一些区别:嵌入式计算机在工作期间的绝大部分时间是无人值守的,而通用计算机工作期间一般是有人操作的;嵌入式计算机的故障可能会导致灾难性的后果,而通用计算机一般就是死死机,重新启动集合,这两点决定了对嵌入式计算机的一个基本要求:可靠性。 使用冯诺依曼机构的计算机,程序空间不封闭,其程序空间的数据在运行期理论上可以被修改,此外程序一旦跑飞也有可能运行到数据区。虽然都是一些不常见的特殊情况,但是看看哈佛机构的计算机在这些情况下是怎样的:程序只能在密闭的代码区中运行,不可能跑飞到数据区。 总结

冯诺依曼原理:程序只是一种特殊的数据,它可以像数据一样被处理,因此可以和数据一起存储在同一个存储器中,数据总线和地址总线复用。 哈佛结构是一种并行结构,程序存储器和数据存储器是两个独立的存储器,每个存储器独立编址、独立访问,与两个存储器对应的是系统的4条总线:程序的数据总线和地址总线、数据的数据总线和地址总线

六 UART通信(msp430f149单片机)

UART通信又称串行异步通信,串行同步/异步收发器通过RXD/TXD管脚将430单片机和外部系统相连。如果RXD/TXD管脚没有接受/发送数据,则RXD/TXD管脚一致保持高电平状态。

UART的数据帧结构为:1位停止位、8位数据位、1位奇偶校验位、1位停止位,在实际数据发送过程中,串口是以字符为基本单位来发送的。 收发步骤(UART初始化设置): 1、设置IO口为RXD、TXD;

2、设置SWRST=1(正常情况时,一个PUC(上电复位)信号后,SWRST自动设置=1,因此可以不用设置SWRST);

3、设置相关寄存器(RXD/TXD使能、数据格式、波特率的时钟源、波特率大小); 4、清除SWRST(即设置SWRST=0),这样USART模块才能工作; 5、打开接收、发送中断(????);

6、接收/发送处理程序部分;

void uart_init() //uart初始化函数 {

P3SEL |=BIT4+BIT5; //set P3.4 as TXD,P3.5 as RXD

ME1 |=UTXE0+URXE0; //Enable USART0 transmit and recieve UCTL0 |=CHAR; //8 bit character UTCTL0 |=SSEL0; // UCLK = ACLK UBR00 =0x0D; //32768/2400 UBR10 =0x00; UMCTL0 =0x6B;

UCTL0 &=~SWRST; // 初始化UART0状态机 IE1 |=URXIE0; //enable RXD interrupt }

发送程序处理部分:

先判断UxTXBUF是否空闲;若空闲,则将要发送的数据送入到UxTXBUF中;程序如下所示: while(!(IFG1 & UTXIFG0));

TXBUF0 =value; (value为要发送的变量)

七 上电复位(POR)和上电清除(PUC)

PUC信号是上电清除信号。

POR(Power-On-Reset)是上电复位信号,它只在以下两个事件发生时产生: 1、芯片上电。

2、RST/NMI设置成复位模式,在RST/NMI引脚上出现低电平信号。 POR信号的产生总会产生PUC(Power-UP-Clear)信号,但PUC信号的发生不会产生POR信号。PUC信号是上电清除信号,产生它的事件为: 1、发生POR信号。

2、处于看门狗模式下,看门狗定时时间到。 3、看门狗定时器写入错误的安全键值。

4、RST/NMI设置成NMI模式,在RST/NMI引脚上出现低电平信号, 5、FLASH存储器写入错误的安全键值。

八 WDT+模块(msp430g2553单片机)

WDT+模块通过WDTCTL寄存器中的WDTTMSEL位来进行对应的功能选择,可以设置为watchdog模式,也可以设置为internal timer模式。

Watchdog模式:什么是看门狗? 回答:在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于检测单片机程序运行的芯片,俗称“看门狗”。

Internal timer模式:简单来说就是定时器模式。

九 比较器comparator_A+(msp430g2553单片机)

Comparator_A+是一个模拟电压比较器,所有msp430x2xx系列的单片机均有此模块。 操作步骤:

1. 使能比较器模块,即设置CAON位; 2. 参考电压大小选择,即设置CAREFx位;

3. 参考电压方向选择(参考电压是接入到比较器的+端还是-端),即设置CAEX位和

CARSEL位;

4. 待比较的电压输入位选择,即是选择CA0、还是CA1、还是CA2等;

5. 因为第四步中设置了比较电压输入位,而这些位是与IO口复用,因此需要设置P

口的功能选择位PxSEL以及方向位PxDIR;

十 定时器(msp430g2553单片机)

MSP430有两个16位定时器Timer_A和Timer_B,两者基本相同。在430单片机的定时器模块,经常会看见“Timer_A3、Timer_B3”和“Timer_B7”,这里的“3”和“7”是指Timer_A、Timer_B模块分别具有3个或7个捕获/比较寄存器。

Timer_A大致可分为四个功能模块:计数器、比较/捕获寄存器0、比较/捕获寄存器1、比较/捕获寄存器2。比较模式和捕获模式在单片机内部有不同的硬件电路。Timer_A模块将定时器和捕获/比较模块集成到了一起。

对定时器的处理均是通过中断方式进行的。在Timer_A模块中,具有两个中断向量,分别是TACCR0中断向量和TAIV中断向量。TACCR0模块单独对应TACCR0中断向量,是一个单源中断,TACCR1、TACCR2、TAIFG对应TAIV中断向量,是一个多源中断。因此2个中断向量实际上对应了4个中断。

Msp430g2553有两个Timer_A模块,分别是Timer0_A3、Timer1_A3。Timer0_A3中用的很多寄存器都采用简写的方式,且容易理解记忆,而Timer1_A3中很多寄存器没有采用简写的方式,并且其书写方式与Timer0_A3中寄存器的书写方式不一样,因此在实际编程使用时,需重点注意!!!

因为一个Timer_A模块具有2个中断向量,因此2553单片机具有4个定时器中断向量,Timer0_A3对应的中断向量为TIMER0_A0_VECTOR、TIMER0_A1_VECTOR;Timer1_A3对应的中断向量为TIMER1_A0_VECTOR、TIMER1_A1_VECTOR。前者的优先级均高于后者的优先级。Timer0_A3的CCR0对应TIMER0_A0_VECTOR中断,Timer0_A3的CCR1、CCR2、定时器溢出对应TIMER0_A1_VECTOR中断。

对于中断过程的理解

计数器是主体,它是一个可开启和关闭的定时器。如果开启它就是一直在循环计数,会有一个溢出中断。如在连续计数模式时,当从0计数到0xffff时就会产生一个中断。那么如何实现定时功能呢?这需要靠3个比较/捕获寄存器(下用CCRx表示)。当计数器寄存器TAR中的值增加到与CCR0或CCR1或CCR2寄存器中的值相等时,会分别触发对应的CCRx中断,这样可以通过定时器A得到3个定时时间。CCRx有3个中断,再加上计数器本身的溢出中断,因此Timer_A模块共有4个中断

CCR0比较特殊,通过它可以改变计数器的最大计数值,当计数器计数到CCR0的值时自动将计数器清零,但是需要设置相应的工作模式,模式列表如下: MCx 00 01 10 11 Mode 停止 增计数 连续计数 增减计数 说明 定时器暂停 计数器计数到CCR0,再清零计数 计数器计数到0xffff,再清零计数 增计数到CCR0,再减计数到0 范例:

Description:采用Timer0_A3定时器,连续计数模式,利用定时器溢出中断在P2.1产

65536?65.536*2?131ms 的方波信号,利用CCR0比较中断(初值设

1MHz40000?80ms 的方波信号为40000)在P2.2产生频率约为2?(SMCLK默认约为1MHz)。

1MHz生频率约为2*void main() {

WDTCTL =WDTPW+WDTHOLD; //stop watchdog P2DIR |=0xff; //set P2 as output

TACCTL0 =CCIE; // enable CCRx interrupt TACCR0 =50000; // CCR0初值

TACTL =TASSEL_2+TACLR+MC_2+TAIE; //定时器A的时钟源为SMCLK,

计数器清零,连续计数模式,溢出中断允许

_EINT(); LPM0; }

#pragma vector=TIMER0_A0_VECTOR __interrupt void Timer_A0(void) {

P2OUT ^=BIT2; //P2.2取反

CCR0 +=50000; //CCR0置入计数值 }

#pragma vector=TIMER0_A1_VECTOR __interrupt void Timer_A1(void) {

switch(TAIV) {

case 2:break; //CCR1中断未用 case 4:break; //CCR2中断未用 case 10:P2OUT ^=BIT1; //p2.1 取反 break; } }

如何理解比较和捕获???

比较:CCR0中开始时有一个初始值,计数器在时钟的触发下,不断的计数,当计数器中的值等于CCR0中的值时,触发产生一个中断。因此,比较模式一般是用在定时功能的。是定时器的默认模式。

捕获:外部输入信号触发中断,读取计时器的计数值,就可以测量信号脉宽、周期等参数。捕获的方式有上升沿捕获、下降沿捕获、上升/下降沿捕获。

在捕获模式,当满足捕获条件,硬件自动将计数器TAR数据写入相应的寄存器CCRx。

如测量某窄脉冲(高电平)的脉冲长度,可定义上升沿和下降沿都捕获。在上升沿捕获一个定时器数据;再等待下降沿的到来,在下降沿又捕获到一个定时器数据。那么两次捕获的定时器数据差就是窄脉冲的宽度(时间)。

根据下表来确定捕获模式的输入信号源。

Timer0_A3 signal connections Input pin number PW20,N20 P1.0-2 PinOsc P1.1-3 P1.2-4 PinOsc PW28 P1.0-2 PinOsc P1.1-3 P1.2-4 PinOsc RHB32 Device input signal ACLK Module Module Module Output pin number input block output PW20,PW28 RHB32 name signal N20 Timer NA CCR0 TA0 P1.1-3 P1.5-7 CCR1 TA1 P1.2-4 P1.1-3 P1.5-7 P1.2-4 P1.1-1 P1.5-5 P1.2-2 ACLK INCLK CCI0A CCI0B GND Vcc CCI1A CCI1B GND Vcc CCI2A CCI2B GND Vcc CCR2 TA2 P1.0-31 TACLK TACLK P1.1-1 P1.2-2 PinOsc SMCLK SMCLK TA0.0 ACLK Vss Vcc TA0.1 CAOUT Vss Vcc TA0.2 TA0.2 Vss Vcc PinOsc TACLK P3.4-15 P3.4-13 P1.6-14 P1.6-22 P1.6-21 P2.6-19 P2.6-27 P2.6-26 P3.5-19 P3.5-18 P3.0-19 P3.0-17 P3.6-20 P3.6-19 P3.0-19 P3.0-17 注释:上表中的“Px.x-x”的意义,“Px.x”代表P口,“x”代表对应封装中的第x号

管脚;“PW20,N20”、“PW28”、“RHB32”代表封装;“TAx.x”中第一个“x”代表定时器模块x(2553单片机有两个Timer_A模块,分别是Timer0_A3和Timer1_A3,因此这里的“x”只能取0和1),第2个“x”代表定时器模块中的第x个捕获比较寄存器(2553单片机的两个定时器模块都具有3个捕获比较寄存器,因此这里的“x”可取值0,1,2)

如何用Timer的比较/捕获方式来软件模拟UART通信?? 接收过程:

上图所示为一个3位数据帧的时序。首先确定起始位,用来进行帧同步。利用Timer的捕获模式来捕获起始位的下降沿。定义Timer的CAP位为1,则进入捕获模式,如图所示,在A点捕获到起始位,系统将此刻的定时器值T存放到CCRx中,并由于捕获而产生中断。在中断处理程序中,对A点所产生中断的处理非常重要,一进入中断就将捕获功能转换为比较功能。另外设置TACTL中的MC0=1,启动定时器的增计数模式,并将1.5位的时间间隔(1.5T)加到CCRx中,即CCRx=1.5T。同时将单片机内部的计数器TAR清零。

这样当单片机内部的计数器TAR的值达到1.5T(B点)时,就会由此比较功能触发中断,这样就实现了1.5位时间间隔的精确定时。由于1.5T的时间跳过了起始位,刚好是在第一位数据位的中间,这时的数据位是最稳定的,没有电平的突变,在中断处理程序中可以读取输入引脚的状态,从而接收到Bit1的信息。同时重新设定CCRx的值,将其设定为一位数据位T的时间,TAR清零重新开始计数,当TAR计数达到CCRx的值时,又产生一次中断,这时刚好是在第二位的数据位的中间部分,中断服务程序中可以读取Bit2的信息。如此重复8次,就可以完成一个字节数据的接收。收完一个字符后,再重复上述过程,可以连续接收多个字符。

发送过程:

先利用比较功能产生一个间隔为1位时间(T)的时序,相当于一个波特率发生器。首先,设定Timer为比较模式(CAP位=0),设定CCR0=T,清除TAR,设为增计数模式,则TAR从0计数到T,到达T时触发中断,进入中断处理程序,然后TAR再清零(硬件自动完成),重新开始计数,计数到T时又触发中断,如此反复。在每一次比较功能触发的中断服务程序中发送一个数据位,如此循环执行,这样就可以完成一个数据帧的发送。UART通信的数据帧往往是10位(省略校验位)或11位。可以利用将数据帧的所有位安排在一个待发送字中,然后移位发送,而不需要专门编程产生起始位和停止位。

例程:

Msp430单片机选用8M晶振,定义SMCLK=1MHz,并作为Timer_A的时钟源,该段代码如下:

BCSCTL1 &=~XT2OFF; //XT2CLK模式 BCSCTL1 &=~XTS; Do { IFG1 &=~OFIFG; For(i=0xff;i>0;i--); }while(OFIFG&IFG1); BCSCTL2 |=SELM1; BCSCTL2 &=~DIVM0; BCSCTL2 &=~DIVM1;

BCSCTL2 |=SELS+DIVS1+DIVS0;

然后对Timer_A初始化,使其进入捕获模式,来捕获起始位,P1.1是捕获的输入脚,初始化必须在进入中断前执行。接收数据的初始化程序如下:

TACTL |=TASSEL1+TACLR; P1SEL |=BIT1; P1DIR &=~BIT1;

TACCTL0 =CM1+CCIE+CAP+OUT; //下降沿捕获,中断允许

这里以9600bps的波特率为例。Timer_A的时钟是SMCLK(1MHz),而UART串行通信的为9600bps(即每一位的时间

t1?11st?s, ),而Timer_A的定时间隔时间960021M设置CCR的值T?t1,这样当TAR从0计数到T时,就会触发捕获中断。实际上根据接t2收过程的分析,CCR的值一般设为1.5T=0X9C。

初始化Timer_A的程序如下:

TACTL1 |=TASSEL1+TACLR+MC0; CCR0=0x9c; CCTL0=CCIE; P1SEL &=BIT1; P1DIR &=BIT1; Bitcount=11; RXTXData=0;

这样就设置好了Timer_A定时器,打开中断,当P1.1上出现了下降沿,就会硬件触发中断,进入中断。

中断程序设计: 定义P1.5发数据,P1.1收数据,这样就在中断函数中实现了UART的发送和接收功能,当下降沿触发,进入中断后,把CCRx的值改为一个周期T,跳过了起始位。

初始化Timer_A的程序如下:

TACTL1 |=TASSEL1+TACLR+MC0; CCR0=0x9c; CCTL0=CCIE; P1SEL &=BIT1; P1DIR &=BIT1; Bitcount=11; RXTXData=0;

这样就设置好了Timer_A定时器,打开中断,当P1.1上出现了下降沿,就会硬件触发中断,进入中断。

中断程序设计: 定义P1.5发数据,P1.1收数据,这样就在中断函数中实现了UART的发送和接收功能,当下降沿触发,进入中断后,把CCRx的值改为一个周期T,跳过了起始位。

本文来源:https://www.bwwdw.com/article/e31o.html

Top