p1口实验_Zigbee-1-基础实验-1
内容列表
1.1 点亮一个LED
1.2 按键
1.3 外部中断
1.4 定时器T1(16位),采用查询方式,模模式
1.5 定时器1,采用中断方式,模模式
1.6 串口通讯
1.6.1 串口发送
1.6.2 串口发送和接收
1.6.3 UART0控制LED
基础实验就是在使用一款增强型的51单片机。通过寄存器的配置来使用CC2530内部的资源。
IO口中P1.0和P1.1内部不含上拉或下拉电阻
1.1 点亮一个LED
硬件电路如图所示: P10--LED1 P14--LED3
可见,P10,P14输出高电平时,LED点亮。
CC2530的IO口配置相关的三个寄存器为:P1SEl(端口1功能选择寄存器),P1DIR(端口1方向寄存器),P1INP(端口1输入模式寄存器)。
LED为输出设备,所以根据硬件电路是要将P10和P14配置为输出口,下拉,因而,根据表格
P1SEL:关心第0位和第4位,对应P1.0和P1.4。配置为通用IO,对应位写0,因此,P1SEL的配置是让第0位和第4位置0,其余位保持不变。 1110 1110 P1SEL &= 0xEE ;
P1DIR:将P1.0和P1.4设置为输出,对应位为1。因此P1DIR的配置是让第0位和第4位置1,其余位保持不变。 0001 0001 P1DIR |= 0x11;
由于是输出模式,所以不用对P1INP进行配置
#include
下载程序后,可以看到LED1和LED3同时点亮
1.2 按键
本次实验是用按键控制LED1的亮灭
硬件连接: S1--P01,按键按下时为高电平,放开时为低电平
根据1.1 LED的硬件,这次配置是要将P1.0配置为输出,将P01配置为输入
P1SEL:关心第0位,让第0位置0,其余位保持不变。设置为通用IO模式 1111 1110 P1SEL &= 0xFE ;
P1DIR:将P1.0设置为输出,让第0位置1,其余位保持不变。 0000 0001 P1DIR |= 0x01;
P0SEL:让第1位置0,其余保持不变,设置为通用IO模式 1111 1101 P0SEL &=0xFD;
P0DIR:将P0.1设置为输入,让第1位置0,其余位保持不变。 1111 1101 P0DIR &=0xFD;
P0INP:将P0.1设置为上下拉模式,即第1位置为0,其余位保持不变1111 1101 P0INP &= 0xFD;
P2INP:将P0口设置为上拉,即第5位为0,其余位保持不变。 1101 1111 P2INP &= 0xDF;
#include 1.3 外部中断
硬件连接:LED1--P10, Key1--P01
外部中断相关的寄存器:P0IEN,PICTL,P0IFG,IEN1
P0IEN:使用P0.1中断,第1位置1,其余位保持不变 0000 0010 P0IEN |= 0x02;
PICTL:上升沿中断。按键按下时由低变高。端口0配置为上升沿。第0位置0,其余位保持不变。 1111 1110 PICTL &= 0xFE;
P0IFG:端口0对应位发生中断时,对应的标志位会置1
IEN1:第5位置1,使能端口0中断。 0010 0000 IEN1 |=0x20;
#include 1.4 定时器T1(16位),采用查询方式,模模式
需要配置T1CTL,T1CC0H,T1CC0L,IRCON,T1CCTL0
T1CTL:分频倍数选择和定时模式选择。128分频(3:2为11),自动重装载(1:0为01) 0000 1101 T1CTL=0x0D;
T1STAT:通道0中断有效。
【模模式】
当定时器运行在模模式,16位计数器从0x0000开始,每个活动时钟边沿增加1。当计数器达到T1CC0(溢出),寄存器T1CC0H:T1CC0L保存的最终计数值,计数器将复位到0x0000,并继续递增。如果定时器开始于T1CC0以上的一个值,当达到最终计数值(0xFFFF)时,设置标志IRCON.T1IF和T1CTL.OVFIF。如果设置了相应的中断屏蔽位TIMIF.OVFIM以及IEN1.T1EN,将产生一个中断请求。模模式可以用于周期不是0xFFFF的应用程序。
//采用定时器查询方式,使用模模式
1.5 定时器1,采用中断方式,模模式
在查询方式的基础上,开启中断
//采用定时器中断方式,使用模模式
1.6 串口通讯
1.6.1 串口发送
硬件连接:P02--ch340TxD P03--ch340RxD,使用UART0
配置串口的步骤:
- 配置IO,使用外部设备功能
- 配置相应的串口控制和状态寄存器
- 配置串口工作的波特就绪。
相关的寄存器或标志位有:U0CSR(控制和状态寄存器),U0GCR(通用控制寄存器),U0BAUD(波特率控制寄存器),U0DBUF(收发数据缓冲器),UTX0IF(发送中断标志,IRCON2的第1位),PERCFG(设置UART0的引脚为1区),P2DIR(将P0优先配置为UART0)
波特率公式:
实际中只需要查表即可,并不用代公式。下表中是32MHz频率时波特率对应的数字
在此要设置为115200,所以可以查出UxBAUD.BAUDM=216, UxGCR.BAUDE=11
PERCFG:配置串口0 位置,位于1区还是2区, PERCFG &= 0xFE; 第0位为0表示选择1区,即P02和P03为USART0的Rx和Tx
从下面这个表可以看出,此时USART0的引脚是P02--Rx P03--Tx
P2DIR:将P0优先作为UART0,第7,6位设置为00 P2DIR &= 0x3F;
U0CSR:设置为UART,第7位置为1 U0CSR |=0x80;
根据波特率表,要设置为115200,U0GCR的第4到第0为设置为11,则U0GCR |=11 U0BAUD =216
UTX0IF = 0; 将UART0 TX 中断标志位置为0
下面是将系统时钟配置为32MHz的过程:
CLKCONCMD的第6位置为0,表示32MHz 晶振源,1011 1111 CLKCONCMD &= ~0x40;
CLKCONSTA:0100 0000 第6位为0表示当前为32MHz
while(CLKCONSTA & 0x40) ; //等待晶振稳定为32MHz
0100 0111取反为 1011 1000,CLKCONCMD &= ~0x47 即将第6位,第2,1,0位置0
CLKCONCMD &= ~0x47; //设置系统主时钟频率为32MHz
//串口通讯,波特率115200,使用UART0
1.6.2 串口发送和接收
接收在1.6.1 基础上添加允许接收
U0CSR:第6位置1表示允许接收 0100 0000
U0CSR |=0x40; //允许接收
IEN0:第7位置1表示总中断EA, 第2位置1表示开USART0中断 1000 0100
IEN0 |= 0x84; //开总中断,开接收中断
//串口通讯,波特率115200,使用UART0
1.6.3 UART0控制LED
接收和发送与1.6.2中相同
发送L1ON#亮灯,L1OFF#灭灯,L3ON#亮LED3,L3OFF#灭LED3
//串口通讯,波特率115200,使用UART0
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
