ImageVerifierCode 换一换
格式:DOCX , 页数:36 ,大小:158.62KB ,
资源ID:7074194      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-7074194.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(蓝侨杯单片机编程笔记胡昶威Word文档格式.docx)为本站会员(b****4)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

蓝侨杯单片机编程笔记胡昶威Word文档格式.docx

1、/段选,消隐 P2=(P2&0x1f)|0xe0); P0=0xff; P2=P2&0x1f;/位选0x1f)|0xc0); P0=(1dspcom);/段码输入 P0=tabdspbufdspcom; if(+dspcom=8) dspcom=0;注意:这里1左移dspcom位,刚开始dspcom=0,则1左移dspcom位依旧为1,接着dspcom每次自增1,1对应二进制0000 0001,即把1每次向左移,每次都比上一次多移一位,直至8位移完,对应8个数码管。定时器配置:这里只需记住定时器的配置,知道怎么使用就可以了。首先有两个定时器,T0和T1,(也有的单片机有T2),定时器有4种工作

2、方式0,1,2,3;其中最常用的是方式1(16位),其次是方式2(8位自动重装,串口通讯中断会用到)。定时器需要配置:TMOD |=0x01;配置成使用定时器0,工作方式为1;同理使用定时器1工作方式1:TMOD |=0x10;则同时使用两个定时器且工作方式为1,那么可以: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.接着定时中断函数和优先级:定时器0v

3、oid isr_timer_0(void) interrupt 1 /默认中断优先级 1 TH0 = (65536-2000)/256; TL0 = (65536-2000)%256; /定时器重载 display(); 定时器1:void isr_timer_1(void) interrupt 3 /默认中断优先级 3注意:定时器0优先级为1,定时器1为3,串口中断优先级为4,总共有5个中断源,后面还会介绍外部中断和串口中断。数码管动态扫描,显示函数放在定时中断函数里面,2ms扫一次是最稳定的!三、 矩阵键盘矩阵键盘需要死记了!这里不再讲独立键盘。第二种单片机键盘扫描代码(没有消抖):sfr

4、 P44=0xC0;/键盘定义sbit r1=P30; /4行sbit r2=P31;sbit r3=P32;sbit r4=P33;/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;c3) key_value=2;c4) key_value=3; r2=0; r1=r3

5、=r4=1;c1) key_value=4;c2) key_value=5;c3) key_value=6;c4) key_value=7; r3=0; r2=r1=r4=1;c1) key_value=8;c2) key_value=9;c3) key_value=10;c4) key_value=11; r4=0; r2=r3=r1=1;c1) key_value=12;c2) key_value=13;c3) key_value=14;c4) key_value=15; return key_value;四、 串口通讯和串口中断串口中断配置只需记住几个寄存器就行了,初始化: SCON =

6、0x50; /串口配置成模式1/定时器1,方式2,8位自动重装 TH1=256-(unsigbedchar)(SYSTEMCLOK/BAUDRATE/384+0.5);/定时初值 ES=1; /串口中断打开 TR1=1; /启动定时器1 EA=1; /总中断打开这里必须使用定时器1,不能用定时器0.下面是模块化的函数:void Uart_Init() SCON = 0x50; TMOD |=0x20; TH1=256-(SYSREMCLOCK/BAUDRATE/384+0.5); ES=1; TR1=1; EA=1;void UartSend(unsigned char*pBuff,int l

7、ength)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 4 unsigned char c; if(RI) RI=0; c=SBUF; uart_bufuart_Count=c; uart_Count+; 如果可以指定的接收,可以这样写/串口中断服务函数void i

8、sr_uart(void) interrupt 4 if(RI) RI = 0; /清除接收标志位 rxbufrxcnt = SBUF; if(rxbufrxcnt = n) rxcnt = 0; rx_over = 1; ES = 0;/回车为接收结束标志,检测到回车符后,关闭串口中断 else rxcnt+; 当接收完一帧数据时关闭串口中断,设一个标志位,处理完之后再打开。#include reg51.hintrins.htypedef unsigned char BYTE;typedef unsigned int WORD;BYTE code_tab=0xc0,0xf9,0xa4,0xb

9、0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff;char arry10=I CAN PLAY;unsigned char x;#define BAUD 115200 /串口波特率#define NONE_PARITY 0 /无校验#define ODD_PARITY 1 /奇校验#define EVEN_PARITY 2 /偶校验#define MARK_PARITY 3 /标记校验#define SPACE_PARITY 4 /空白校验#define PARITYBIT NONE_PARITY /定义校验位sfr AUXR = 0x8e; /辅助寄存器sfr P_S

10、W1 = 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 | S1_S1); /S1_S0=0 S1_S1=0 P_SW1 = ACC; /(P3.0/RxD, P3.1/TxD)/ ACC = P_SW1;/ ACC & /S1_S0=1 S1_S1=0/ ACC |= S1_S

11、0; /(P3.6/RxD_2, P3.7/TxD_2)/ P_SW1 = ACC;/ /S1_S0=0 S1_S1=1/ ACC |= S1_S1; /(P1.6/RxD_3, P1.7/TxD_3)/#if (PARITYBIT = NONE_PARITY) /8位可变波特率/#elif (PARITYBIT = ODD_PARITY) | (PARITYBIT = EVEN_PARITY) | (PARITYBIT = MARK_PARITY) / SCON = 0xda; /9位可变波特率,校验位初始为1/#elif (PARITYBIT = SPACE_PARITY) / SCON

12、= 0xd2; /9位可变波特率,校验位初始为0/#endif AUXR = 0x40; /定时器1为1T模式 TMOD = 0x20; /定时器1为模式2(8位自动重载) TL1 = (256 - (FOSC/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 U

13、art() interrupt 4 using 1 if (RI)/单片机接收数据,发送数字09,可在数码管上显示,发送hex模式 /清除RI位/ P0 = SBUF; x=SBUF;/将缓存器的数据赋值给x P0=0xff; /消隐 P2|=0xe0; P2&=0x1f; P0=code_tabx; /段选 P0=0x01; /位选第一位 P2|=0xc0;=0x3f; if (TI) TI = 0; /清除TI位 busy = 0; /清忙标志发送串口数据-*/void SendData(BYTE dat) while (busy); /等待前面的数据发送完成 ACC = dat; /获取

14、校验位P (PSW.0) if (P) /根据P来设置校验位#if (PARITYBIT = ODD_PARITY) TB8 = 0; /设置校验位为0#elif (PARITYBIT = EVEN_PARITY) TB8 = 1; /设置校验位为1#endif else busy = 1; SBUF = ACC; /写数据到UART数据寄存器发送字符串void SendString(char *s) while (*s) /检测字符串结束标志 SendData(*s+); /发送当前字符记不住可以看手册!#define BAUD 115200sfr AUXR=0x8e;sbit P22=P2

15、2; SCON=0x50; AUXR=0x40; /设置定时器T1为1T,即一个机器周期模式 TMOD=0x20; TL1=(256-(FOSC/32/BAUD); TH1=(256-(FOSC/32/BAUD);Hello while(1); P0=SBUF; if(TI) TI=0; busy=0; while(busy); busy=1; SBUF=dat; while(*s) SendData(*s+);五、 外部中断的使用#include sbit L1=P00;int main() IT0=1; /IT0=1,下降沿触发外部中断0,IT0=0边沿触发 EX0=1;/使用外部中断0

16、while(1)void Ex_int0() interrupt 0 /外部中断优先级最高0x1f)|0x80); L1=L1; P2=(P2&0x1f); 其中,外部中断的引脚控制是P32,P33,即对应独立按键的S5,S4。六、 实时时钟DS1302的使用蓝桥杯提供函数,解释为:里面的命令和写入的数据可以看芯片手册:左侧的READ、WRITE分别是读写的命令,BIT7-BIT0是要写入的数据,根据需要进行配置。DS1302只需记住这两个函数即可:Write_Ds1302( , )与Read_Ds1302(x),配置看手册。重点:芯片表说明:第一行:秒-因为秒的范围是0-59,所以6,5,4

17、位表示秒的十位,3,2,1,0表示个位,十位最大是5,所以三位即可。第二行:跟上面一样;第三行:7位:1为12小时制,0为24小时制;5位:12小时制时为0表示上午,1表示下午,24小时制时,和4位一起表示小时的十位;其余的时间一样的表示。倒数第二行:只看7位:为1时禁止写数据,所以开始写数据时必须置0;读数时:需要加“写操作这一行代码”。读的话直接按照命令读即可。DS1302进阶(BCD码转换):解决之前60秒不能进位的问题。1) 写入初始值时,要把10十进制数转换为码,例:写入时间:Ds1302_Single_Byte_Write(0x8e, 0x00);/写操作 Ds1302_Singl

18、e_Byte_Write(0x85, (17/10)4 | (17%10);/写时 Ds1302_Single_Byte_Write(0x83, (58/10)4 | (58%10);/写分 Ds1302_Single_Byte_Write(0x81, (50/10)4 | (50%10);/写秒 Ds1302_Single_Byte_Write(0x8e, 0x80);/写保护即转换的公式是:(Value/10)4)*10 + (ReadValue&0x0F);八进制转十进制-ReadValue=Ds1302_Single_Byte_Read(0x85); hour=(ReadValue&

19、!(这句一定不要省) Ds1302_Single_Byte_Write(0x00, 0x00); ReadValue=Ds1302_Single_Byte_Read(0x83); minute=(ReadValue& Ds1302_Single_Byte_Write(0x00, 0x00); ReadValue=Ds1302_Single_Byte_Read(0x81); sec=(ReadValue&显示: dspbuf0=hour/10; dspbuf1=hour%10; dspbuf2=minute/10; dspbuf3=minute%10; dspbuf4=sec/10; dspbu

20、f5=sec%10;七、 PCF8591与IIC总线的使用(1) IIC总线的使用:比赛提供了IIC的两个库文件,IIC.h;IIC.c,其中需要注意的函数是:其中,该函数是初始化的,当使用AD转换的时候需要在main函数开始时调用,该函数内部只需看这句代码即可:i2c_sendbyte(0x03);/ADC通道3,板上有4个模拟输入口,分别为0,1,2,3;设置哪一个模拟输入口就是根据这句代码,0x03表示通道3,这是根据芯片手册配置的,如图:8位前6位不用管,都为0,最后两位就是配置选择哪一个通道的。第二个函数:读取AD转换后的数值,这个函数直接调用就可以了,函数内部如何实现不用管,但是需

21、要注意的是:该函数扫描调用最好是100ms。第三个函数,上面的都是AD转换,即模拟信号转数字信号,下面这个函数是DA转换,数字信号转换成模拟信号,就是单片机输出数字信号,用万能表去量单片机引出的引脚,量一下电压大小,这个估计比赛不会考,不过预防万一:该函数和上面两个函数分离开来的,一、二函数是要在一起使用,初始化后之后才能调用,第三个加入头文件,直接调用即可,比较简单!!上面说法有误,A/D转换的初始化函数和读取转换后的数值都需要自己写。这里了解一下PCF8591只需根据时序格式发送地址字节和控制字节:,这是地址字节,其中A2,A1,A0硬件已经接地,故都为0,最低位表示的是你要从IIC总线上读数还是写数据,1表示读,0表示写,即读数据发的地址是:0x91;写数据发的地址是0x90;控制字节:由芯片资料知,控制字节有8位,有两位固定是0,除了第0、1位需要自己设置,其他的我们都设为0,那些位都是一些具体的功能,我们暂时用不着,不用管先,第0、1位是模拟通道选择,PCF8591上提供了4路模拟通道,根据需求进行选择,如选择通道3即发送控制字节:0x03;地址字节和控制字节都明白了,接下来根据时序要求进行配置,A/D转换需要一个初始化函数:Init_ADpcf8591();

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2