资源描述
51单片机初学知识点总结
经过这半个月的学习,我对于单片机的定时器、对I/O口的随意操作、输入检测、中断(定时器的中断、单片机的外部中断)、串口通信等几大学习模块有了一定了解和掌握。
1. 软件。我主要是在keil uvision3实现用C语言进行编程和调试。使用keil时,新建或者打开已有文件,按步骤一步步来,漏掉哪一步都会影响最后程序是否能顺利写入单片机中。其中应注意保存C文档、添加文件到工程中和建立hex文档这几个关键步骤。
2. 发光二极管和数码管的显示。发光二极管的静态显示是学习单片机的入门路标。分析相关模块的电路图,弄清楚引脚连接情况,根据电路图直接控制LED引脚电位的高低就能实现对相应LED亮灭的控制。了解后完成走马灯(流水线)或更多其他规则的LED显示。数码管的显示较LED稍微复杂一点点,它分位选和段选,位选控制整个数码管的亮灭,段选控制各数码管以何种形式亮或灭。数码管的显示分三步:(1).全部数码管显示一样的字符;(2).选定的数码管以规定的形式亮;(3).数码管的动态显示。其中利用定时器或者延时程序控制数码管动态显示的频率,以调节其显示亮度和视觉稳定度。
用延时函数完成动态扫描:
while(1)
{
D1=nn/100;
D2=nn%100/10;
D3=nn%10;
P1=0x01;
P0=tab[D1];
delay(10);
P1=0x02;
P0=tab[D2];
delay(10);
P1=0x04;
P0=tab[D3];
delay(10);
}
延时子程序:
void delay(x) // 延时1ms子程序
{
unsigned char y;
while(x--)
{
for(y=110;y>0;y--);
}
}
3. 定时/计数器。
编号
中断源
中断标志位
终端服务程序入口
优先级
0
外部中断0(INT0)
IE0
0003H
最高
1
定时/计数器0(T0)
TF0
000BH
次之
2
外部中断1(INT1)
IE1
0013H
次之
3
定时/计数器1(T1)
TF1
001BH
次之
4
串口
RI或TI
0023H
最低
l 关于定时/计数器的两个特殊功能寄存器
TMOD
用于T1
用于T0
GATE
C/T
M1
M0
GATE
C/T
M1
M0
TCON
用于定时/计数器
用于中断
TF1
TR1
TF0
TR0
IE1
IT1
IE0
IT0
l M1M0:工作方式设置位
M1
M0
工作方式
说明
0
0
0
13位T/C
0
1
1
16位T/C
1
0
2
8位自动重装T/C
1
1
3
T0分成两个独立的8位T/C,T1停止
GATE:门控位。GATE=0,用软件使TR0或TR1为1,就能启动定时/计数器;GATE=1,用软件使TR0或TR1为1,同事外部中断引脚也为高,启动。我们一般置GATE=0。C/T=0,位定时器;C/T=1,位计数器。
l 对于定时时间的计算:
或:要定时时间t=(65536-x)*(12/晶振频率)
l 定时/计数器初始化步骤:
(1) 根据上面的信息,对TMOD赋初值,确定T0、T1的工作方式。
(2) 计算初值,将其写入TH0、TL0或TH1、TL1。
(3) 为中断方式时,对IE赋值,开放中断。
(4) 使TR0或TR1置高,启动定时/计数器。
例:
TMOD=0x01;//T0处于工作方式1,为十六位定时/计数器
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;ET0=1;
TR0=1; //T0初始化完毕
定时子程序:
void timer0() interrupt 1 //定时子程序
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
if(aa==10)
{
aa=0;
……
}
}
4. 键盘。单片机键盘分独立键盘和矩阵键盘两类,矩阵键盘涉及键盘扫描程序。而与键盘按下有关的程序就要注意到消除抖动和松手检测两个重要的细节。松手检测原理是,当键按下时,key2为低,!key2=1,此时程序一直在while语句里面循环,无法跳出来,一旦松手,key2为高,程序即可跳出while循环,执行下面接下来的语句。
if(key2==0)
{
delay(5);//延时5ms
if(key2==0) //确定key2键的确按下,,消抖
{
while(!key2);//松手检测
……
}
}
5. 串口通信。串行通信的传输速率用波特率表示。波特率定义为:每秒发送二进制数码的位数,单位为“bps”。波特率的计算公式:
其中,。
l 串行口控制寄存器SCON
SCON
7
6
5
4
3
2
1
0(98H)
98H
SM0
SM1
SM2
REN
TB8
RB8
TI
RI
其中SM0与SM1为串行口工作方式选择位
SM0
SM1
工作方式
功能
波特率
0
0
0
8位同步移位方式
0
1
1
10位异步收发器(UART)
可变
1
0
2
11位异步收发器(UART)
或
1
1
3
12位异步收发器(UART)
可变
(1)51单片机串行口工作方式0实质是并行的工作方式,为同步的移位输出和输入,但要实现工作方式0必须要借助外接移位寄存芯片,实际应用中常用作并行I/O口得扩展。它的波特率固定,且数据传送是以8位数为一帧,没有起始和停止位。。
(2)我主要研究学习了串行口工作方式1,它的数据格式是:一个起始位,8个数据位和一个停止位。设,波特率为9600,则根据上面的公式,SMOD=0时,TH1=TL1=0xfd;SMOD=1时,TH1=TL1=0xfa。
(3)工作方式2和3的帧格式一样,与工作方式1的类似,只是在原基础上多加了一位内容由用户决定的数据位。工作方式2的波特率与PCON个SMOD位有关。SMOD=1时,波特率为,SMOD=0时,波特率为。
l 电源控制寄存器PCON(它不能位寻址)
PCON
7
6
5
4
3
2
1
0
97H
SMOD
SMOD为波特率倍增位。SMOD=1时,波特率增加一倍;复位时,SMOD=0。
l REN是允许接收控制位:REN=1时允许接收数据;REN=0时禁止接收数据。
TI是发送中断标志位:当发送完一帧数据后,该位由单片机自动置1,向CPU发送中断请求信号。在中断服务程序中,必须用软件将其清0.
RI是接收中断标志位:与TI类似,接收完一帧后自动被置1,需由软件置0.
6. 液晶显示。常见的单片液晶显示屏分16引脚和20引脚两种,我使用的是16引脚的YJD1602A-2。安装LCD时按如下三步走:(1)关闭开发板电源。(2)下载一个关闭数码管个流水灯的程序进单片机。(3)顺时针旋转相应电位器以调节LCD的对比度,知道看到5*7点阵。
功能
输入
输出
读状态
RS=L,RE=H,E=H
D0~D7=状态字
写指令
RS=L,RW=L,D0~D7=指令码,E=高脉冲
无
读数据
RS=H,RW=H,E=H
D0~D7=数据
写数据
RS=H,RW=L,D0~D7=数据,E=高脉冲
无
这四种功能里面,读状态与读数据实用性不大,我们学习单片机时主要联系写指令和写数据,所以我们对RW置高,给E高脉冲,5引脚直接接地。
l 关于数据指针:
显示模式: 0x38
控制信号
指令代码
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
0
0
0
0
1
DL
N
F
0
0
具体设置表为:
控制位
控制信号
功能
说明
DL
DL=0
接口总线为4位长度(仅D7~D4有效),8位数据与指令代码按先高后低位的方向分两次传输
LCD与单片机接口形式。(数据的传输方式)
DL=1
接口总线为8位长度(D7~D0有效)
N
N=0
显示1行字符行
N=1
显示2行字符行
F
F=0
5*7字符体
F=1
5*10字符体
显示开关及光标:00001DCB
1
0
D
开显示
关显示
C
显示光标
不显示光标
B
光标闪烁
光标不闪烁
00001NS
1
0
N
当读/写一个字节后地址指针加一,且光标加一
当读/写一个字节后地址指针减一,且光标减一
S
当写一个字符,(N=1)整屏左移,(N=1)整屏左移
当写一个字符,整屏显示不移动
清屏:指令代码0x01。执行此指令,HD44780将DDRAM的数据全部写入“空白”的代码,清除所显示的内容,同事光标移到左上角。
光标归位:指令代码0x02或0x03。AC(地址计数器)的值被清“0”,但是DDRAM(显示数据存储器)的逐句不变,光标移到左上角。
移动光标:
控制信号
指令代码
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
0
0
0
0
0
1
S/C
R/L
---
---
其中S/C和R/L的取值控制光标或字符的左右移动:
控制位
指令代码
说明
S/C
R/L
0
0
0x10
光标左移
0
1
0x14
光标右移
1
0
0x18
字符左移
1
1
0x1c
字符右移
写指令函数:
void write_com(uchar com)
{
rs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
写数据函数:
void write_date(uchar date)
{
rs=1;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
7. IIC总线。
IIC总线是由数据线SDA和时钟线SCL构成的串行总线,可发送和接收数据。IIC总线在数据传送过程中有四种类型信号,他们分别是:起始信号、终止信号、应答信号和非应答信号。
起始信号:SCL为高时,SDA有一个下降跳变。起始信号由主机产生。
void start() //起始信号
{
sda=1;
delay();// 5us就够了,所以这里只需一个指令周期
scl=1;
delay();
sda=0;
delay();
}
终止信号:SCL为高时,SDA有一个上升跳变。终止信号也只能由主机产生。
void stop() //终止信号
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
应答信号:IIC总线传送时每字节为8位,从机在接收到一个字节的数据后,在第9位以低电平作为应答信号,,同时要求主机在第9个时钟脉冲位上释放SDA线,以便从机发出应答信号,将SDA拉低,表示接收数据的应答
void respons() //应答信号
{
sda=0;
delay();
scl=1;
delay();
scl=0;
delay();
}
非应答信号:主机在第9位接收到非应答信号,则表示停止数据的发送或接收。
void disrespons() //非应答信号
{
sda=1;
delay();
scl=1;
delay();
scl=0;
delay();
}
移位操作:
左移:最低位补0,最高位移入PSW的CY位
右移:最高位补0,最低位移除
器件地址:高四位固定,最低位决定读/写,另外A0~A2位与从机和总线的接法有关。
1
0
1
0
A2
A1
A0
R/W=0,写
R/E=1,读
主机进行写操作时,首先由主机发送起始信号,接着是高四位固定为1010而最低位位0的写器件地址,从机发送应答信号后,主机发送写数据地址,从机再次应答之后主机就可以发送数据了,接着从机发送应答信号或者非应答信号之后主机发送终止信号,如下图所示。
主机进行读操作时,首先由主机发送起始信号,接着是高四位固定为1010而最低位位0的写器件地址,从机发送应答信号后,主机发送写数据地址,从机再次应答之后主机再次发送起始信号,接着是高四位固定为1010而最低位位1的读器件地址,从机应答之后就可以读数据了,接着主机发送应答信号或者非应答信号之后主机发送终止信号,如下图。
心得体会:
以上是我根据这半个月学习的单片机知识和编写程序时的程序文档笔记整理的重要知识点和一些经常会用到的基本子函数。学习单片机的这半个月里,我由开始时想一口吃成胖子的急躁心理慢慢调整为了平心静气,循序渐进的学习心态。我是跟着单片机相关的学习视频在学习,而只是跟着视频里面老师的讲解听的话,理解的总不会那么透彻,记忆也不会很深刻,只有举一反三的学习视频资料里面的内容加上自己亲手进行编程与调试后才能更好地掌握所学的知识。在进行C语言编程过程中一定要认真仔细,并注意养成良好的变成习惯,尽量保持程序工整明了,这也方便在出现问题时进行纠错和改错。
展开阅读全文