蓝桥杯单片机编程笔记(DOC 36页).doc
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《蓝桥杯单片机编程笔记(DOC 36页).doc》由用户(2023DOC)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 蓝桥杯单片机编程笔记DOC 36页 蓝桥杯 单片机 编程 笔记 DOC 36
- 资源描述:
-
1、 . . 蓝桥杯单片机编程笔记一、IO口编程1二、数码管动态扫描和定时器3三、矩阵键盘5四、串口通讯和串口中断9五、外部中断的使用14六、实时时钟DS1302的使用14七、PCF8591与IIC总线的使用16八、DS18B20温度芯片的使用22九、超声波传感器的使用23十、步进电机与直流电机的使用26十一、扩展:宏定义编程方法(推荐)29十二、注意事项(常见编程错误)33一、 IO口编程IO编程,该开发板使用了573锁存器,通过P2口的5,6,7位连接3-8译码器,扩展出了8个口,其中4个口分别连接4个573锁存器,这里以的锁存器来举例:原理图:分析代码:();其中,与进行与运算,高三位清零,
2、其余位保持原来状态,不改变,即把控制译码器的高三位留出来:接着再或上;容易发现;或运算,与或结果为,与或结果不变,所以或上只需看的高三位,则高三位为,对应译码器的话,;所以输出;再经过与非运算,看下图示:则输出;即对应的锁存器的片选信号被选中,锁存器打通,接下来就可以对口进行操作,操作完之后,;高三位直接清零,此时Y4C=0,则把锁存器锁上了。类似的方法,数码管、蜂鸣器等都是如此操作,选中锁存器代码:P2=(P2&0x1f)|(这里填对应锁存器的位移号)。二、 数码管动态扫描和定时器数码管显示分为段选和位选,数码管定义和显示函数:code unsigned char tab = 0xc0,0x
3、f9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90;unsigned char dspbuf=10,10,10,10,10,10,10,10;unsigned char dspcom=0;void display()/段选,消隐P2=(P2&0x1f)|0xe0);P0=0xff;P2=P2&0x1f;/位选P2=(P2&0x1f)|0xc0);P0=(1dspcom);P2=P2&0x1f;/段码输入P2=(P2&0x1f)|0xe0);P0=tabdspbufdspcom;P2=P2&0x1f;if(+dspcom=8)dspcom=0;注意:这里1左移d
4、spcom位,刚开始dspcom=0,则1左移dspcom位依旧为1,接着dspcom每次自增1,1对应二进制0000 0001,即把1每次向左移,每次都比上一次多移一位,直至8位移完,对应8个数码管。定时器配置:这里只需记住定时器的配置,知道怎么使用就可以了。首先有两个定时器,T0和T1,(也有的单片机有T2),定时器有4种工作方式0,1,2,3;其中最常用的是方式1(16位),其次是方式2(8位自动重装,串口通讯中断会用到)。定时器需要配置:TMOD |=0x01;配置成使用定时器0,工作方式为1;同理使用定时器1工作方式1:TMOD |=0x10;则同时使用两个定时器且工作方式为1,那么
5、可以:TMOD |=0x11;定时器1配置成工作方式2:TMOD |=0x20;接着配置(以定时器0举例):TH0=(65535-2000)/256;/配置初值TL0=(65535-2000)%256;ET0=1;TR0=1;/定时0中断EA =1;/总中断定时器1也是同理的,只不过0要改成1.接着定时中断函数和优先级:定时器0void isr_timer_0(void) interrupt 1 /默认中断优先级 1 TH0 = (65536-2000)/256; TL0 = (65536-2000)%256; /定时器重载 display(); 定时器1:void isr_timer_1(v
6、oid) interrupt 3 /默认中断优先级 3 TH0 = (65536-2000)/256; TL0 = (65536-2000)%256; /定时器重载 display(); 注意:定时器0优先级为1,定时器1为3,串口中断优先级为4,总共有5个中断源,后面还会介绍外部中断和串口中断。数码管动态扫描,显示函数放在定时中断函数里面,2ms扫一次是最稳定的!三、 矩阵键盘矩阵键盘需要死记了!这里不再讲独立键盘。第二种单片机键盘扫描代码(没有消抖):sfr P44=0xC0;/键盘定义sbit r1=P30; /4行sbit r2=P31;sbit r3=P32;sbit r4=P33;
7、/4列sbit c1=P44;sbit c2=P42;sbit c3=P35;sbit c4=P34;/读取矩阵键盘键值unsigned char key_scan()unsigned char key_value;r1=0;r2=r3=r4=1;c1=c2=c3=c4=1;if(!c1) key_value=0;else if(!c2) key_value=1;else if(!c3) key_value=2;else if(!c4) key_value=3; r2=0;r1=r3=r4=1;c1=c2=c3=c4=1;if(!c1) key_value=4;else if(!c2) key
8、_value=5;else if(!c3) key_value=6;else if(!c4) key_value=7;r3=0;r2=r1=r4=1;c1=c2=c3=c4=1;if(!c1) key_value=8;else if(!c2) key_value=9;else if(!c3) key_value=10;else if(!c4) key_value=11;r4=0;r2=r3=r1=1;c1=c2=c3=c4=1;if(!c1) key_value=12;else if(!c2) key_value=13;else if(!c3) key_value=14;else if(!c4
9、) key_value=15;return key_value;四、 串口通讯和串口中断串口中断配置只需记住几个寄存器就行了,初始化:SCON =0x50; /串口配置成模式1TMOD |=0x20;/定时器1,方式2,8位自动重装TH1=256-(unsigbedchar)(SYSTEMCLOK/BAUDRATE/384+0.5);/定时初值ES=1; /串口中断打开TR1=1; /启动定时器1EA=1; /总中断打开这里必须使用定时器1,不能用定时器0.下面是模块化的函数:void Uart_Init()SCON = 0x50;TMOD |=0x20;TH1=256-(SYSREMCLOC
10、K/BAUDRATE/384+0.5);ES=1;TR1=1;EA=1;void UartSend(unsigned char*pBuff,int length)unsigned char c;int i=0;for(i=0;ilength;i+)c=pBuffi;SBUF=c;while(TI=0);TI=0;接收数据可以这样写:定义全局变量:unsigned char uart_buf100;/串口缓冲区unsigned int uart_Count=0;/串口数据长度void uart_inte() interrupt 4unsigned char c;if(RI)RI=0;c=SBUF
11、;uart_bufuart_Count=c;uart_Count+;如果可以指定的接收,可以这样写/串口中断服务函数void isr_uart(void) interrupt 4 if(RI) RI = 0; /清除接收标志位 rxbufrxcnt = SBUF; if(rxbufrxcnt = n) rxcnt = 0; rx_over = 1; ES = 0; /回车为接收结束标志,检测到回车符后,关闭串口中断 elserxcnt+; 当接收完一帧数据时关闭串口中断,设一个标志位,处理完之后再打开。#include reg51.h#include intrins.htypedef unsi
12、gned char BYTE;typedef unsigned int WORD;BYTE code_tab=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff;char arry10=I CAN PLAY;unsigned char x;#define FOSC 11059200/12000000L /系统频率#define BAUD 115200 /串口波特率#define NONE_PARITY 0 /无校验#define ODD_PARITY 1 /奇校验#define EVEN_PARITY 2 /偶校验#define MAR
13、K_PARITY 3 /标记校验#define SPACE_PARITY 4 /空白校验#define PARITYBIT NONE_PARITY /定义校验位sfr AUXR = 0x8e; /辅助寄存器sfr P_SW1 = 0xA2; /外设功能切换寄存器1#define S1_S0 0x40 /P_SW1.6#define S1_S1 0x80 /P_SW1.7sbit P22 = P22;bit busy;void SendData(BYTE dat);void SendString(char *s);void main() ACC = P_SW1; ACC &= (S1_S0 |
14、S1_S1); /S1_S0=0 S1_S1=0 P_SW1 = ACC; /(P3.0/RxD, P3.1/TxD) / ACC = P_SW1;/ ACC &= (S1_S0 | S1_S1); /S1_S0=1 S1_S1=0/ ACC |= S1_S0; /(P3.6/RxD_2, P3.7/TxD_2)/ P_SW1 = ACC; / / ACC = P_SW1;/ ACC &= (S1_S0 | S1_S1); /S1_S0=0 S1_S1=1/ ACC |= S1_S1; /(P1.6/RxD_3, P1.7/TxD_3)/ P_SW1 = ACC; /#if (PARITYBI
15、T = NONE_PARITY) SCON = 0x50; /8位可变波特率/#elif (PARITYBIT = ODD_PARITY) | (PARITYBIT = EVEN_PARITY) | (PARITYBIT = MARK_PARITY) / SCON = 0xda; /9位可变波特率,校验位初始为1/#elif (PARITYBIT = SPACE_PARITY) / SCON = 0xd2; /9位可变波特率,校验位初始为0/#endif AUXR = 0x40; /定时器1为1T模式 TMOD = 0x20; /定时器1为模式2(8位自动重载) TL1 = (256 - (F
16、OSC/32/BAUD); /设置波特率重装值 TH1 = (256 - (FOSC/32/BAUD); TR1 = 1; /定时器1开始工作 ES = 1; /使能串口中断 EA = 1; while(1)/SendString(arry);SendString(I CAN PLAYrn);/上位机显示接收文本模式/SendData(x);/*-UART 中断服务程序-*/void Uart() interrupt 4 using 1 if (RI)/单片机接收数据,发送数字09,可在数码管上显示,发送hex模式 RI = 0; /清除RI位/ P0 = SBUF;x=SBUF;/将缓存器的
17、数据赋值给xP0=0xff; /消隐P2|=0xe0;P2&=0x1f;P0=code_tabx;/段选P2|=0xe0;P2&=0x1f;P0=0x01; /位选第一位P2|=0xc0;P2&=0x3f; if (TI) TI = 0; /清除TI位 busy = 0; /清忙标志 /*-发送串口数据-*/void SendData(BYTE dat) while (busy); /等待前面的数据发送完成 ACC = dat; /获取校验位P (PSW.0) if (P) /根据P来设置校验位 #if (PARITYBIT = ODD_PARITY) TB8 = 0; /设置校验位为0#el
18、if (PARITYBIT = EVEN_PARITY) TB8 = 1; /设置校验位为1#endif else #if (PARITYBIT = ODD_PARITY) TB8 = 1; /设置校验位为1#elif (PARITYBIT = EVEN_PARITY) TB8 = 0; /设置校验位为0#endif busy = 1; SBUF = ACC; /写数据到UART数据寄存器/*-发送字符串-*/void SendString(char *s) while (*s) /检测字符串结束标志 SendData(*s+); /发送当前字符 记不住可以看手册!#include reg51
展开阅读全文