去耦:防止突然很大的电压,稳定电流电压;并联电容。耐压选电路1.5~2倍数
三极管:NPN型号:箭头朝外,电流顺箭头流过,通电导通
B控制极 base基极 e 带有箭头 发射极 emitter c啥也没有的竖的 集电极 collector
限流电阻:串联电阻,防止电流过大烧坏电路
分压电阻:通过比例分压:并联电阻两端取的适合的电压
sfr 寄存器命名 sfr P1=0x90; 将地址赋予寄存器名字(头文件里)
sbit 定于寄存器 sbit LED=P1^2; 将端口命名便于使用记忆
#define 定于字符 #define ON 1; 1就代表ON
typedef 定义类型 typedef unsigned char uchar; 省略数据类型;
寄存器:一个芯片里有cpu,硬件控制器【GPIO,I^2C.ADC......】cpu不能直接控制硬件,但每个硬件都有一个寄存器SFR,写入二进制数值可以控制输出模式或高低电平,SFR寄存器在RAM里一块区域和ROM共同组成一块连续储存地址,地址用十六进制表示,而头文件是对地址进行宏定义,或用结构体对一个硬件进行封装。
data RAM xdata =123B保存在片外ram,小于1024B
code ROM
强制类型转换
(unsigned char)a;使用时间前面括号里面加入要转换的类型;
unsigned char 数据类型位8位,最大255,在端口赋值时使用可节省空间
unsigned int 数据类型位16位,在延时函数中使用较多
运算
左移 P1=0xa<<n; 将二进制数向左n位,即十六进制a转换为二进制左边舍弃n位,右边补充n个0;再将值赋给P1;
延时
fro(i=1; i<100;i++);
i=1000;
while(i--);
点流水灯
1.利用左移 将一个1左移,再取反,即顺序点亮
2.利用数组循环
#include"reg51.h"
sbit LE=P1^0; //sbit 定义引脚 s小写,P大写
void delay(unsigned int t)
{
unsigned char i;
for(;t>0;t--){
for(i=100;i>0;i--);
}
}
unsigned char LED[]={0XFE,0XFD,0XFB,0XF7,0XEF,0XDF,0XBF,0X7F};
void main(void)
{
P1=0x55; //010 1010 1 ¿ª¹Ø¿ª¹Ø¿ª¹Ø¿ª¹Ø
LE=0;
//P1=0xFE; //111 1111 0 ¹Ø¹Ø¹Ø¹Ø¹Ø¹Ø¹Ø¿ª
//P1&=0x55; //010 1010 0
/* &两个是1才为1,| 有一个1就是1, ^ x相同为0,不同为1, ~取反*/
while(1)
{
unsigned char i;
for(i=0;i<8;i++){
P2=LED[i]; //利用数组循环赋值
//P2 = ~(0x01<<i); //利用取反移动
delay(400);
}
}
}
按键防抖
#include"reg51.h"
#include "intrins.h"
sbit key1=P1^6;
sbit key2=P1^7;
sbit LED=P1^0;
void Delay10us() //@12.000MHz
{
unsigned char i;
_nop_();
i = 1;
while (--i);
}
void main(void)
{
while(1)
{
// unsigned char i;
// i=P0; i读取到P0端口八个端口的十六进制数值,当接口在右侧为读取模式
// P2=i;
if(key2==0) // 当按键第一次检测到电平下降 (初抖)
{
Delay10us(); //等待按键抖动过程
if(key2==0) //检测真正电平下降
{LED=~LED;} //灯的状态取反
while(key2==0); //等待灯完全跳出低电平
}
}
}
定时器/计数器
不同于 delay函数,
Hz 赫兹 一秒完成多少次完整周期,其倒数为时钟周期,为CPU最小时间单位,越小越好
1千赫 (kHz 10^3 Hz) =1 000 Hz
1兆赫 (MHz 10^6 Hz) =1 000 000 Hz
1吉赫 (GHz 10^9 Hz) =1 000 000 000 Hz
时间 1s = 10^-3 ms = 10^-6 us
指令周期:一则指令周期包含 取指令 转译指令 执行指令 其中每个动作包含4个时钟周期
时钟周期=1/(12M) (s)= 1/12/1000/1000 (s) = 1/12 us
51单片机一个器周期是12个时钟周期,即机器(指令)周期=12*1/12 us = 1us
计时器为2字节:
最大65535,分高位和地位 THn TLn,TLn先加到255后归零,再THn再加到255就溢出,每次加一为一个机器周期。
超过定时器用循环和倍数
计时器有两个T0和T1;
即TH0 TL0和TH1 TL0; 总共存65535
TR1=1;计时器启动 TR1=0:计时器停止
TF1 当溢出时TF1自动变成1
T0(P3.4) T1(P3.5) 每来一个脉冲加一
TMOD为八位工作模式选择器,前四位为T0的,后四位为T1的
GATE 1为开始计时 测量外部信号脉冲
C/T 1 为计数 0定时
M1 M0 01 THn和TLn组成16位计时器 10 THn溢出TLn 11 定时器1禁用 定时器0变成两个8位定时器
例如使用定时器控制灯闪烁
unsigend char can=0; //记录多少次溢出
TMOD=0x01 ; //计时器模式选择
THO=0x ; //高位设定
TL0=0x ; //低位设定
TRO=1; //启动记时
while(1)
{
if(TF0=1) //判断是否到达溢出
{
TF0=0; //清零后再次记时
THO=0x ; //高位设定
TL0=0x ; //低位设定
cot++;
else if (cot>=50) //当到记时位定时器的50倍时
{
cot=0; //进入下一个50X计时器即使
LED=~LED; //LED灯状态取反
}
}
当10ms以内,100Hz以上的闪烁人眼无法看出
中断
unsigned char code LedChar[15]; //存储在
unsigned char LedChar[15]; //变量存储再RAM里供给cpu更改
1.中断有两个八位寄存器,中断使能寄存器和中断优先寄存器
2.中断为一种运行机制
3.中断使能寄存器
7.EA =1中断总开关 5.ET2 定时器2 4.ES 串口中断 3.ET1 定时器1 2.EX1 外部中断 1.ET0 定时器0 0.EX0.外部中断
1.外部中断两个0和1 INT0(P.2) INT1(P3.3)
2.片内两个定时器 T0 T1
3.串口中断 TXD RXD
中断优先级:INT0 —— T0 —— INT1 —— T1 —— TXD / RXD
下降沿触发和低电平触发,
主要代码:
IT=0; //或IT=1;设置外部中断的触发方式
EX0=1; //打开外部中断0
EA=1; //打开中断总开关
中断服务函数
viod int0() interrupt 0 //0为中断号
{
}