蓝侨杯单片机编程笔记-胡昶威

发布时间 : 星期二 文章蓝侨杯单片机编程笔记-胡昶威更新完毕开始阅读

P2=((P2&0x1f)|0xe0); P0=0xff; P2=P2&0x1f; //位选

P2=((P2&0x1f)|0xc0); P0=(1<

P2=((P2&0x1f)|0xe0); P0=tab[dspbuf[dspcom]]; P2=P2&0x1f; if(++dspcom==8) dspcom=0;

}注意:这里1左移dspcom位,刚开始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,那么可以:TMOD |=0x11;

定时器1配置成工作方式2:TMOD |=0x20; 接着配置(以定时器0举例): TH0=(65535-2000)/256;//配置初值 TL0=(65535-2000)%6; ET0=1;

TR0=1;//定时0中断 EA =1;//总中断

定时器1也是同理的,只不过0要改成1.

接着定时中断函数和优先级: 定时器0

void isr_timer_0(void) interrupt 1 //默认中断优先级 1 {

TH0 = (65536-2000)/256;

TL0 = (65536-2000)%6; //定时器重载 display(); }

定时器1:

void isr_timer_1(void) interrupt 3 //默认中断优先级 3

{

TH0 = (65536-2000)/256;

TL0 = (65536-2000)%6; //定时器重载 display(); }

注意:定时器0优先级为1,定时器1为3,串口中断优先级为4,总共有5个中断源,后面还会介绍外部中断和串口中断。

数码管动态扫描,显示函数放在定时中断函数里面,2ms扫一次是最稳定的!!

三、 矩阵键盘

矩阵键盘需要死记了!这里不再讲独立键盘。

第二种单片机键盘扫描代码(没有消抖): sfr P4^4=0xC0; //键盘定义

sbit r1=P3^0; //4行 sbit r2=P3^1; sbit r3=P3^2; sbit r4=P3^3; //4列

sbit c1=P4^4; sbit c2=P4^2; sbit c3=P3^5; sbit c4=P3^4;

//读取矩阵键盘键值 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_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) key_value=15;

return key_value; }

四、 串口通讯和串口中断

串口中断配置只需记住几个寄存器就行了, 初始化:

SCON =0x50; //串口配置成模式1

TMOD |=0x20;//定时器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 length) {

unsigned char c; int i=0;

for(i=0;i

c=pBuff[i]; SBUF=c;

while(TI==0); TI=0; } }

接收数据可以这样写:

定义全局变量:

unsigned char uart_buf[100];//串口缓冲区 unsigned int uart_Count=0;//串口数据长度 void uart_inte() interrupt 4 {

unsigned char c; if(RI) { RI=0; c=SBUF; uart_buf[uart_Count]=c; uart_Count++;

联系合同范文客服:xxxxx#qq.com(#替换为@)