郭天祥51单片机笔记.docx

上传人:b****9 文档编号:26087209 上传时间:2023-06-17 格式:DOCX 页数:15 大小:161.12KB
下载 相关 举报
郭天祥51单片机笔记.docx_第1页
第1页 / 共15页
郭天祥51单片机笔记.docx_第2页
第2页 / 共15页
郭天祥51单片机笔记.docx_第3页
第3页 / 共15页
郭天祥51单片机笔记.docx_第4页
第4页 / 共15页
郭天祥51单片机笔记.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

郭天祥51单片机笔记.docx

《郭天祥51单片机笔记.docx》由会员分享,可在线阅读,更多相关《郭天祥51单片机笔记.docx(15页珍藏版)》请在冰豆网上搜索。

郭天祥51单片机笔记.docx

郭天祥51单片机笔记

1)二极管

导通电流I:

3mA-10mA;导通压降v:

1.7V。

(排阻计算公式:

R=VCC(5V)-v(1.7V)/I(3mA))。

2)电源指示灯

开关电源:

内部有开关控制电流大小,不稳定。

去耦电容:

稳压,去波。

3)锁存器(74HC573)

OE:

OutEnable,低电平有效(必须为低电平)。

输入端:

OE

(1),LE(11锁存端diola),D(D0

(2)-D7(9),一般接P1^0-P1^7)。

输出端:

Q(1Q-8Q)。

Z:

高阻状态,非高非低电瓶。

LE:

为高时,Q端与D同变换;为低电平时,Q端保持上次状态。

sbitLED00=0x80;//位指针;指针大小占一个字节;指针控制一个位的值;

sfrLED0=0x80;//字节指针;指针大小占一个字节;指针控制一个字节的值;

4)51库函数

头文件:

#include

函数:

unsignedchar_crol_(unsignedcharc,

unsignedcharb);

描述:

The_crol_routinerotatesthebitpatternforthecharactercleftbbits.This

routineisimplementedasanintrinsicfunction.The_crol_routinereturnsthe

rotatedvalueofc.

5)蜂鸣器

名称:

b:

基极;C:

集电极;e:

发射集;

原理:

e极发射电子;当b极接低电平时,ce导通,并且放大电流;当b接高电平时,ce截止。

JPFMQ接P3.6管脚。

分类:

有源蜂鸣器;无缘蜂鸣器。

(源:

震荡源)

Proteus:

buzzer-有源;sounder、speaker-无源。

端口电压:

0.02v。

6)数码管

P0管脚:

没有上拉电阻,所有有三态。

P1、P2、P3管脚:

有上拉电阻,没有三态。

分类:

共阴极;共阳极。

显示方法:

静态,动态。

段选:

P0.0-P0.7。

位选:

P2.0-P2.7。

 

7)继电器

接口:

P3.7。

D4:

引流二极管,防止断电烧坏电炉原件。

 

8)独立键盘

K1-K4:

P3.2-P3.5。

K5-K8:

P1.4-P1.7。

独立键盘检测程序:

#include

voidmain()

{

while

(1)

{

if(K1==0)

{

delay(20);//大约延时10-20ms

if(K1==0)

{

//确独立按键K1按下

}

}

while(!

K1);//确认为一次动作

}

}

9)4*4矩阵键盘

行线:

P1.0-P1.3。

竖线:

P1.4-P1.7。

优点:

占用端口少,硬件电路简单。

缺点:

编程较复杂。

矩阵键盘的检测方法:

扫描法和线反转法。

程序实例:

1)扫描法

#include

#defineucharunsignedchar

#defineuintunsignedint

uchari,j,temp_num,num=16;

ucharcodescan[]={0xfe,0xfd,0xfb,0xf7};//11111110-11110111

ucharcodecoding[][4]={//扫描码

0xee,0xde,0xbe,0x7e,

0xed,0xdd,0xbd,0x7d,

0xeb,0xdb,0xbb,0x7b,

0xe7,0xd7,0xb7,0x77};

ucharcodenum_code[]={

0xc0,0xf9,0xa4,0xb0,//数码管0-16编码

0x99,0x92,0x82,0xf8,

0x80,0x90,0x88,0x83,

0xc6,0xa1,0x86,0x8e,

0xfe};

voiddelay(uintk)//延迟函数

{

uintdatai,j;

for(i=0;i

{for(j=0;j<180;j++)

{;}}

}

voidmain()

{

P1=0xff;

while

(1)

{

P1=0xf0;

if(0xf0!

=P1)//第一次检测

{

//delay(20);//消抖

//P1=0xf0;//第二次检测

//if(0xf0!

=P1)//实践证明不必消抖也是可以的

//{

temp_num=num;

for(i=0;i<4;i++)

{

P1=scan[i];

for(j=0;j<4;j++)

{

if(coding[i][j]==P1)

{

num=4*i+j;

break;

}

if(num!

=temp_num)

break;

}

}

//}

P1=0xf0;

while(0xf0!

=P1);//防止多次检测

}

P0=num_code[num];

P2=0x7F;

}

}

2)线反转法

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitP37=P3^7;//继电器接口

ucharcodecoding[]={

0xee,0xde,0xbe,0x7e,

0xed,0xdd,0xbd,0x7d,

0xeb,0xdb,0xbb,0x7b,

0xe7,0xd7,0xb7,0x77};

ucharcodenum_code[]={0xc0,0xf9,0xa4,0xb0,

0x99,0x92,0x82,0xf8,

0x80,0x90,0x88,0x83,

0xc6,0xa1,0x86,0x8e,

0xfe};

ucharKey=16;//表示按键编号

voiddelay(uintm)

{

uintk;

while(--m)

{

for(k=0;k<180;k++);

}

}

uchardetection()//检测按键

{

ucharscan1,scan2,key_code,i;

P1=0xf0;

scan1=P1;

if(0xf0!

=scan1)

{

//delay(30);

//scan1=P1;

//if(0xf0!

=scan1)

//{

P1=0x0f;

scan2=P1;

key_code=scan1|scan2;//组合编码

for(i=0;i<16;i++)

{

if(key_code==coding[i])

{

Key=i;

P37=!

P37;

returni;

}

}

//}

//P1=0xf0;去掉上面的return就可以,两种区别是:

//while(0xf0!

=P1);1)按下就显示;

//2)按下放开之后才显示.

}

else

P1=0xff;

return16;

}

voiddispalyI(uchari)//数码管显示函数

{

P2=0x7f;

P0=num_code[i];

}

voidmain()

{

P1=0xff;

while

(1)

{

detection();

dispalyI(Key);

}

}

10)中断、计时、计数

1.中断源:

1)两个外部中断源:

INT0(P3.2),INT1(P3.3)。

(INT:

interrupt)

2)三个片内定时器:

T0(外部计数P3.4),T1(外部计数P3.5),T2。

(Timer)

3)一个串口中断请:

TI/RI。

2.定时器控制寄存器TCON

 

TF0/TF1(TimerFlag):

定时器0/定时器1溢出中断申请标志位,=0未溢出,=1溢出申请中断,进入中断后自动清零。

TR0/TR1(TimerRunning):

定时器运行启动控制位,=0定时器停止运行,=1定时器启动运行。

IT0/IT1(InterruptTrigger触发):

外部中断请求触发方式选择位,=0外部中断低电平触发,=1外部中断负跳变触发。

IE0/IE1:

外部中断申请标志位,=0没有外部中断,=1有外部中断。

3.定时器允许寄存器IE(InterruptEnabled)

 

EX0/EX1(EnabledeXternal):

分别是外部中断INT0/INT1中断允许控制位,=0禁止中断,=1允许中断。

ET0/ET1(EnabledTimer):

分别是片内计时器T0/T1中断允许控制位,=0,禁止中断,=1允许中断。

ET2:

T2中断允许控制位。

EA:

总中断控制位,=0禁止全部中断,=1允许中断。

4.中断优先级控制寄存器IP(InterruptPriority)

PX0/PX1(PriorityeXternal):

INT0/INT1优先级控制位,=0低优先级,=1高优先级。

PT0/PT1/PT2(PriorityTimer):

T0/T1/T2中断优先级控制。

PS1(Priorityserialport):

串口中断优先级控制位。

5.定时器方式寄存器TMOD

 

常用工作方式:

(M1,M0)=(0,1):

16位定时器。

(M1,M0)=(1,0):

8位自动重装定时器。

C/T:

计数器/定时器选择位,=0定时,片内计数;=1片外计数(T0,T1)。

GATE门控制位:

=0由TRx启动计数器/定时器(TRx=1启动);=1由TRx和INTx共同启动(TRx=1,INTx=1启动)计数器/定时器。

6.interruptm修饰符

m:

0—外部中断INT0

1—定时/计数中断T0

2—外部中断INT1

3—定时/计数中断T1

4—串口中断

5—定时/计数中断T2

外部中断过程:

1)开启中断总开关

EA=1;//EnabledAll

2)开启外部中断INT0开关

EX0=1;

3)选择外部中断的中断触发方式

IT0=1;//0低电平触发,1负跳变触发

4)设定优先级

PX0=1;//0低优先级,1高优先级

5)声明外部中断函数

voidEexternInterrupt()interrupt0//0外部中断0

{…}

定时器/计数器发生过程:

1.定时器/计数器选择:

定时器和计数器都是片内16位计数内存工作,当作为计数器时,片内16位计数内存是对外部T0/T1引脚的矩形波进行计数;当做为定时器时,片内16位计数内存是对晶振产生的方波进行12分频后所得的方波进行计数;定时和计数是由定时器方式寄存器TMOD的C/T位进行选择的。

2.定时/计数溢出事件方法

当片内16位计数内存溢出时则触发溢出事件,溢出事件的发生可以有定时/计数中断产生,也可由软件检测溢出标志位TFx位的值产生。

定时/计数中断程序过程:

1)打开总中断开关

EA=1;

2)打开计时器中断开关

ET0=1;

3)选择启动方式、计数/定时、计数方式

TMOD=0x01;//TR0启动,定时(片内计数),16计数方式

4)计数内存高低位置初值

TH0=0x01;

TL0=0x01;

5)启动计数/定时器

TR0=1;

6)声明中断函数

voidTimerInterrupt()interrupt1

{

TH0=0x01;//重装计数内存

TL0=0x01;

}

定时/计数软件检测程序过程:

1)选择启动方式、计数/定时、计数方式

TMOD=0x01;//TR0启动,定时(片内计数),16计数方式

2)计数内存高低位置初值

TH0=0x01;

TL0=0x01;

3)启动计数/定时器

TR0=1;

4)软件检测TFx标志位

While

(1)

{

if(TF0==1)

{

TF0=0;//必须手动清零

TH0=0x01;//重装计数内存

TL0=0x01;

}

}

 

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1