蓝桥杯备赛笔记_第1页
蓝桥杯备赛笔记_第2页
蓝桥杯备赛笔记_第3页
蓝桥杯备赛笔记_第4页
蓝桥杯备赛笔记_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1、P0口的复用P2口高3位的值38译码器低电平端口功能备注000(0x00)Y0无001(0x20)Y1010(0x40)Y2011(0x60)Y38255的CE引脚0:使能82551:禁用8255100(0x80)Y4LED灯锁存信号0:点亮LED灯1:熄灭LED灯101(0xA0)Y5UNL2003输出锁存信号0:断开继电器、禁用直流电机、关闭蜂鸣器1:闭合继电器、转动直流电机、开启蜂鸣器110(0xC0)Y6数码管位选锁存信号0:禁用该位1:使能该位111(0xE0)Y7数码管段选锁存信号0:点亮该段1:熄灭该段PS1:上电后需给所有锁存器初始化(Y5,Y6初始化为0x00,其余初始化

2、为0xFF)PS2:使用P0口时,按如下方式:禁用所有寄存器P0口赋值打开目标寄存器禁用所用寄存器PS3:锁存器高电平选通,低电平关闭/* * brief 初始化开发板 * param none * return none*/void initial_board(void)P0_BUS_COM com;P2 &= 0x1F; /禁用所有锁存器for(com = 3; com 8; com+)if(com = UNL2003 | com = DIGITAL_BIT)P0 = 0x00;elseP0 = 0xFF;P2 |= com 5;_nop_();P2 &= 0x1F;/* * brief

3、通过P0总线传输数据 * param com:总线占用的端口; databuf:传输的数据 * return none*/void P0_BUS(unsigned char com, unsigned char databuf)P2 &= 0x1F; /禁用所有锁存器P0 = databuf;P2 |= com keyovertime) /是否长按进入连击模式keycount = 0;if(upspeed UPSPEED_MAX)upspeed += 50;keyovertime = KEY_QUICK_TIME - upspeed; /进入连击模式return NOKEY;/elseelse

4、lastkey = keytemp; /保留上一次按键值keycount = 0;upspeed = 0;keyovertime = KEY_OVER_TIME;return NOKEY;/else/else二、矩阵键盘矩阵键盘原理介绍:如图,当按下S7时P30和P37将相连。这个时候有四种情况:按下S7前P30的状态按下S7前P37的状态按下S7后00都为001都为0(I/O口特性,P37会被P30拉低)10都为011都为1由上表可知,在S7按下前,只有在P30和P37处于不同状态下,S7才能使P30或P37状态产生变化,这样单片机才能检测到按键。因此,矩阵键盘不能像单按键一样,把I/O全部

5、拉高就可以(如果全部拉高,即P30与P37都为1,这样不管按键怎么按,两个I/O的状态始终不变,单片机当然无法检测到)。其他按键同理可得,既然状态设为不同按键才能产生响应,那么要初始化为0xF0H 还是0x0FH呢?如果初始化为0x0FH,同一行按键按下时(例如S7,S11,S15,S19)都会使P30变为低电平,无法分别是同一行中哪一个按键产生反应。若初始化为0XF0H,则会无法分辨同列的按键。怎么办?通常有以下两种方法:1、扫描法1)初始化为0xFFH2)拉低P30(即先扫描第一行)3)检测P34P37中有无被拉低的引脚4)若检测到P34P37中有引脚被拉低,即可以确定按键,若无引脚被拉低

6、,初始化为0xFFH后扫描下一行。char get_num(void) unsigned char i, j, m, n; for(i = 1, m = 0x01; i = 4; i+, m = m 1) P3 = 0xFF & m; for(j = 1, n = 0x10; j = 4; j+, n = n keyovertime) /是否长按进入连击模式keycount = 0;if(upspeed 8);if(T_interrupt)ET0 = 1;EA = 1;TF0 = 0;TR0 = 1;void timer0_Routine(void) interrupt 1FLAG_1MS =

7、 1;下面是使用定时器2的例子:/* * brief 定时器2初始化,默认为12T,0模式,不输出时钟 * param value: 定时器初值; T_interrupt;0:不开启中断,1开启中断 * return none*/void initial_timer2(uint16 value, BOOL T_interrupt)/AUXR |= 0x04; /使用1T取消注释/INT_CLKO |= 0x04; /需要输出时钟注释此行(P3.4输出)/AUXR |= 0x80; /使用外部时钟取消注释,P3.1输入时钟T2L = (uint8)value;T2H = (uint8)(valu

8、e 8);if(T_interrupt)IE2 |= 0x04; /开启定时2中断EA = 1;AUXR |= 0x10; /运行定时器2void timer2_Routine(void) interrupt 12FLAG_1MS = 1;5、 uart串口通信(1)IPA15拥有两个独立的串口,开发板上串口2通常不会使用,这里仅仅介绍串口1。占用引脚中断号拥有模式相关寄存器占用定时器有3组:1:P3.0(RxD)和P3.1(TxD)2:P3.6(RxD_2)和P3.7(TxD_2)3:P1.6(RxD_3)和P1.7(TxD_3)默认为组1,可以通过AUXR1寄存器调整4模式0:8位,波特率

9、固定模式1:8位,波特率可变模式2:9位,波特率固定模式3:9位,波特率固定SCON:模式选择,中断标志位等PCON(B7,B6):波特率是否翻倍AUXR(B5,B0):串口速率,占用定时器选择IE(B4):串口中断允许位IP(B4):串口中断优先级SBUF:串行口数据缓存寄存器定时器1和定时器2相关寄存器(用于设置波特率)模式0和模式2下不占用定时器,与系统频率相关。模式1和模式3下,占用定时1或定时器2,通过AUXR寄存器调整,默认占用定时器2使用串口通常需要以下步骤:选择工作模式,工作速率(配置SCON、PCON寄存器);若选择模式1或模式3,选择占用定时器,并设置波特率(配置AUXR,

10、及定时器1或定时器2相关寄存器);设置串口中断(配置IE,IP寄存器)。串口中断服务程序编写。详细说明:选择工作模式,工作速率(配置SCON、PCON寄存器)串口1有四种工作模式,通常选用工作模式1。SM0:当PCON(B6)/SOMD0为1时,该位用于错误帧检测,必须软件清0 当PCON(B6)/SOMD0为0时,该位与SM1组成,配置工作模式,如下表:SM2:多机通信时使用,与RB8配合,用于辨别是数据帧还是地址帧REN:0:不允许串口接受数据 1:允许串口接收数据TB8:工作模式2和工作模式3下,要发送的第九位数据存放处,软件编写RB8:工作模式2和工作模式3下,要接收的第九位数据存放处

11、,软件编写,通常作为多机通信中,与SM2配合,分辨地址帧和数据帧,或者作为奇偶检验位。TI:发送中断请求标志位,发送完成后,硬件置位,中断响应,需要软件清0;RI:接收中断请求标志位,接收完成后,硬件置位,中断响应,需要软件清0;SMOD:0:波特率不加倍 1:波特率加倍SMOD0:帧错位检验有效控制位,0无效,1有效若选择模式1或模式3,选择占用定时器,并设置波特率(配置AUXR,及定时器1或定时器2相关寄存器)波特率,单片机或计算机在串口通信时的速率,每秒传输的bit位数。波特率与占用定时器的溢出率有关(定时器溢出率:在重装情况下,每1秒钟溢出的次数(开中断的情况下,每1秒钟中断的次数。P

12、S:定时器用于产生波特率时,不能开中断)。当定时器用于产生波特率时,必须运行在可自动重装的模式下,即定时器1必须运行这模式0或模式2,定时器2只能运行在模式0。波特率与定时器初始值(重装值)的关系:Fosc:晶振频率Tosc:系统频率Tcy:系统周期Baud:波特率value:定时器初始值(value = TH 8);/TL1 = 0xE8;/TH1 = 0xFF;/1T模式/AUXR |= 0x40;/TL1 = uint8(65536 - (FOSC/4/BAUD);/TH1 = uint8(65536 - (FOSC/4/BAUD) 8);TR1 = 1;else if(2 = uart

13、_timer)AUXR |= 0x01; /串口1占用定时器2IE2 &= 0xFB; /关闭定时器2中断T2L = (uint8)(65536 - (FOSC/48/BAUD);T2H = (uint8)(65536 - (FOSC/48/BAUD) 8);/1T模式/AUXR |= 0x04;/TL1 = uint8(65536 - (FOSC/4/BAUD);/TH1 = uint8(65536 - (FOSC/4/BAUD) 8);AUXR |= 0x10; /启动定时器2ES = 1;EA = 1; /开启UART中断通过上面配置后,单片机便可以与PC进行通信,PC机上需要有串口调试

14、的软件,进行串口通讯时,注意串口调试软件波特率的选择,波特率需要与单片机所使用的波特率一样,不然会引起无法通信或通信错误。6、 uart串口通信(2)通过第五章的配置后,便可进行简单的串口通讯。串口发送或接受数据时,并不是一瞬间完成,而是根据波特率按位发送,需要一定的时间。当串口在发送数据时,这时候向SBUF写入数据,会造成数据丢失(此时SBUF不可写)。串口只能单字节接受数据,如果接收过快,来不及从SBUF中读取,也同样会造成数据的丢失。因此,若直接使用串口通讯,会存在以上数据丢失问题,造成通信的不稳定。为了使通讯更加稳定,这里引入缓冲区解决以上问题。#define T_BUFFER_LEN

15、TH 32 /发送缓冲区长度#define R_BUFFER_LENTH 32 /接收缓冲区长度uint8 xdata UART_T_BUFFERT_BUFFER_LENTH; /发送缓冲区 uint8 xdata UART_R_BUFFERR_BUFFER_LENTH; /接收缓冲区PS:xdata:与code类似,声明接下来的数据存入片外存储区。发送数据时,不直接向SBUF写入,先把数据按发送顺序写入发送缓冲区,让串口空闲时,自行发送,串口发送数据不会占用CUP周期(不包括写入SBUF)。接受数据时,接收单字节完毕后,立马把数据存入接收缓冲区,这样SBUF便可解放,可接受新的数据。什么串口

16、空闲?写入发送缓冲区时要从哪里开始写?发送发送缓冲区数据时,又要从哪里开始发生?接收的数据又要存入接收缓冲区哪里?为解决这些问题,建立以下标志位uint8 T_busy; /发送忙标志,为1时串口正在发送数据uint8 T_write; /发送缓冲区写指针uint8 T_read; /发送缓冲区读指针uint8 R_busy; /接收忙标志,为1时新数据在缓冲区未被读取,使用数据后手动清0uint8 R_count; /单次连续接收的字节数uint8 R_TimeOut; /单次接收延时#define R_TIMEOUT_SET 15 /单次连续接收最大时间间隔前三个辅助变量为发送缓冲区的标志

17、位:T_busy标志串口是否在发送数据,当T_busy为1时,串口正在发送数据,为0时串口空闲。T_write指向发送缓冲区的下一个数据存储区(数据放入缓冲区的入口),T_read指向发送缓冲区当前要发送的数据(数据出口)。当T_write与T_read相等时,发送缓冲区为空。后三个辅助变量为接收缓冲区的标志位:R_busy为1时,接收缓冲区有新数据未读取,串口接收的数据不会再写入缓冲区(防止数据被覆盖),为0时接收缓冲区为空。R_count为串口单次接收的字节数,也指向接收缓冲区下一个存放数据的地方。单次接收的时间长度与R_TIMEOUT_SET相关,若前后两个字节的数据接收时间间隔小于R_

18、TIMEOUT_SET,则视为单次接收(同一批次的数据)。R_TimeOut为前后两次数据接收计时,R_TimeOut为0时,表示本次接收结束,标记R_busy为1,在接收缓冲区数据未被读取前,不开始接收下次数据。每次成功接收数据(有数据放入缓冲区),更新R_TimeOut值为R_TIMEOUT_SET。为了代码可读性,将以上辅助变量共同放入一个结构体中typedef structuint8 T_busy; /发送忙标志,为1时串口正在发送数据uint8 T_write; /发送缓冲区写指针uint8 T_read; /发送缓冲区读指针uint8 R_busy; /接收忙标志,为1时新数据在缓

19、冲区未被读取,使用数据后手动清0uint8 R_count; /单次连续接收的字节数uint8 R_TimeOut; /单次接收延时UART_STATE;加入这些标志位后,串口的配置方法基本不变,只需在初始化串口时,同时初始化这些标志位。UART_STATE UART1;/* * brief 初始化串口1 * param uart_mode:工作模式,1、3可选 uart_time:占用定时器,1、2可选 r_enable:是否允许接受 * return none*/void initial_uart(uint8 uart_mode, BOOL r_enable, uint8 uart_timer)UART1.T_busy = 0;UART1.T_write = 0;UART1.T_read = 0;UART1.R_busy = 0;UART1.R_count =

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论