郭天祥51单片机笔记.docx
《郭天祥51单片机笔记.docx》由会员分享,可在线阅读,更多相关《郭天祥51单片机笔记.docx(15页珍藏版)》请在冰豆网上搜索。
郭天祥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;
…
}
}