单片机C语言学习笔记.docx
- 文档编号:4647628
- 上传时间:2023-05-07
- 格式:DOCX
- 页数:41
- 大小:1.45MB
单片机C语言学习笔记.docx
《单片机C语言学习笔记.docx》由会员分享,可在线阅读,更多相关《单片机C语言学习笔记.docx(41页珍藏版)》请在冰点文库上搜索。
单片机C语言学习笔记
一、定时器/计数器
1.定时器/计数器结构
芯片型号
8051
计数器/定时器
2个寄存器组成
备注
T0
TH0+TL0
21321628
T1
TH1+TL1
2.寄存器TCON:
定时器/计数启动和停止
2.1TCON的高4位控制定时器/计数器的启动和中断申请,低4位与外部中断有关。
位序
8F
8E
8D
8C
8B
8A
89
88
位符号
TF1
TR1
TF0
TR0
2.1.1TF1/TF0:
定时器/计数器T1和T0的益处标志位,定时器/计数器有溢出时,会将TF1或TF0位置“1”,表示定时器/计数器有中断请求。
2.1.2TR1或TR0:
定时器/计数器T1和T0的启动/停止位。
TR1或TR0设置为“1”定时器/计数器T1和T0的启动,若设置为“0”,相应的定时器/计数器就停止工作。
3.寄存器TMOD:
设置定时器/计数工作方式(用于计数或定时)。
3.1TMOD:
定时器/计数器工作方式
工作方式
T1
T0
位序
B8
B7
B6
B5
B4
B3
B2
B1
位符号
GATE
C/T
M1
M0
GATE
C/T
M1
M0
3.2TMOD寄存器中高4位控制T1,低4位控制T0。
他们对定时器/计数器工作T0、T1的控制功能是一样。
(下面以低4位控制定时器/计数器T0为例,说明各位的具体控制功能)
3.2.1GATE:
门控位,控制定时器/计数器的启动模式。
GATE=0时,只要用软件使TCON中的TR0置“1”,就可以启动定时器/计数器工作。
GATE=1时,将TR0置“1”外,还需要外部中断引脚INT0也为高电平,才能启动定时器/计数器工作。
3.2.2C/T:
定时器/计数器模式选择位
C/T=0时,定时器/计数器被设置为定时器工作方式,C/T=1时,定时器/计数器被设置为计数器工作方式。
3.2.3M0、M1:
定时器/计数器工作方式设置位。
M1
M0
工作方式
功能说明
0
0
0
13位定时器,TH0的8位和TL0的低5位,最大计数值213=8192
0
1
1
16位定时器,TH0的8位和TL0的低8位,最大计数值216=65535
1
0
2
带自动重装功能的8位计数器,最大计数28=256
1
1
3
T0分成两个独立的8位计数器,T1在方式3时停止工作
备注:
T0、T1工作于定时或者计数时都不占CPU工作时间。
4.定时器/计数器的初始值计算
4.1T1和T0都是增量计数器,因此不能直接将要计数的值作为初值放入寄存器中,而是将计数的最大值减去实际要计数的值的差存入寄存器中,定时器/计数器初值计算公式:
定时器/计数器初值=2n-计数值(n为工作方式决定的计数器位数,213、216、28)
例:
当T0工作于方式0时(T0为13位定时器),最大计数值为213=8192,若要计数1000次,初值为8192-1000=7192。
如果单片机工作晶振为11.0592MHz,则计数1次需要时间(12分频后的1个脉冲周期),T=12÷11.0592MHz=1.085us。
所以计数1000次实际上就相当于计时1.085×1000=1085us。
(定时器/计数器初值的计算是一样的)
5.定时器/计数器应用举例
5.1用定时器T0查询方式控制P2口8位LED灯闪烁
使用定时器T0的查询方式TF0来控制P2口8位LED闪烁,T0工作于方式1,LED灯闪烁周期100ms,即亮50ms,熄灭50ms0。
5.1.1定时器T0工作方式的设置
用指令对T0的工作方式进行设置:
TMOD=0X01;//即TMOD=00000001B,低4位GATE=0,C/T=0,M1M0=01
上述设置中,低4位C/T=0,使T0工作于计时方式。
GATE=0,使TR0=1时即可启动T0开始工作。
M1M0=01,使T0工作于方式1。
5.1.2定时器初值的设定
单片机晶振为11.0592MHz,所以经12分频后送到T0的脉冲频率是f=11.0592/12MHz,周期T=1/f=12/11.0592=1.085us。
即每个脉冲计时1.085us,要计时50ms(即50000us),需要计的脉冲数为50000/1.085=46038(次)。
则定时器的初始应设置为65536-46083=19453。
这个数需要T0的高8位寄存器(TH0)和低8位寄存器(TL0)来分别存储,这两个寄存器初始值的设置方法如下:
TH0=(65536-46083)/256;//定时器T0的高8位赋初值
TL0=(65536-46083)%256;//定时器T0的低8位赋初值
5.1.3定时器T0开始工作后,可通过编程让单片机不断查询益出标志位TF0是否为1,若为1,则表示计时时间到,否则等待。
5.1.4程序设计
实例42:
用定时器T0查询方式P2口8位控制LED闪烁
#include
/**************************************************************
函数功能:
主函数
**************************************************************/
voidmain(void)
{
//EA=1;//开总中断
//ET0=1;//定时器T0中断允许
TMOD=0x01;//TMOD=00000001B,使用定时器T0的模式1
TH0=(65536-46083)/256;//定时器T0的高8位赋初值
TL0=(65536-46083)%256;//定时器T0的低8位赋初值
TR0=1;//启动定时器T0
TF0=0;//定时器T0溢出标志位用软件清零
P2=0xff;//先定义P2口为高电平,LED灯不亮
while
(1)//无限循环等待查询
{
while(TF0==0)//查询标志位是否溢出
;//空指令
TF0=0;//若计时时间到TF0=1,需用软件将其清0
P2=~P2;//将P2按位取反,实现LED灯闪烁
TH0=(65536-46083)/256;//定时器T0的高8位重新赋初值
TL0=(65536-46083)%256;//定时器T0的低8位重新赋初值
}
}
5.2用定时器T1查询方式控制单片机发出1KHz音频
5.2.1定时器T1工作方式的设置
用指令对T1的工作方式进行设置:
TMOD=0X10;//即TMOD=00010000B,高4位GATE=0,C/T=0,M1M0=01
上述设置中,高4位C/T=0,使T1工作于计时方式。
GATE=0,使TR1=1时即可启动T1开始工作。
M1M0=01,使T1工作于方式1。
5.2.2定时器T1初值的设定
要发出1KHz音频,让单片机送给蜂鸣器(接P3.7引脚)的电平信号,每隔音频的半个周期取反一次即可。
音频的周期为1/1000=0.001s,即1000us,则要计数的脉冲数为1000/1.0852=921(次),定时器T1的初值设置如下:
TH1=(65536-921)/256;//定时器T0的高8位赋初值
TL1=(65536-921)%256;//定时器T0的低8位赋初值
5.2.3程序设计
实例43:
用定时器T1查询方式控制单片机发出1KHz音频
#include
sbitsound=P3^7;//将sound位定义为P3.7引脚
/**************************************************************
函数功能:
主函数
**************************************************************/
voidmain(void)
{
//EA=1;//开总中断
//ET0=1;//定时器T0中断允许
TMOD=0x10;//TMOD=00010000B,使用定时器T1的模式1
TH1=(65536-921)/256;//定时器T1的高8位赋初值
TL1=(65536-921)%256;//定时器T1的低8位赋初值
TR1=1;//启动定时器T1
TF1=0;//定时器T1溢出标志位用软件清零
while
(1)//无限循环等待查询
{
while(TF1==0)//查询标志位是否溢出
;//空指令
TF1=0;//若计时时间到TF0=1,需用软件将其清0
sound=~sound;//将P3.7引脚输出电平取反
TH1=(65536-921)/256;//定时器T0的高8位重新赋初值
TL1=(65536-921)%256;//定时器T0的低8位重新赋初值
}
}
二、中断
1.中断优先响应级别:
2.VoidTime0(void)interrupt1using0
注解:
interrupt1为外部INT0中断using0为使用0组工作寄存器(不声明,默认为0组)
3.中断号要与定时器(中断源)相对应,才能正确响应中断。
4.中断启用:
只有总开关EA和分支开关均闭合,相应中断才被使用。
5.外部INT1/INT0、定时器/计数器、串口等中断开关说明:
1)EA:
中断允许总控制位,EA=0时,禁止所有中断,EA=1时,开启总中断。
2)ES:
串口允许中断控制位,ES=0时,禁止串口中断,ES=1时,允许串口中断。
3)ET1:
定时器/计数器T1的溢出中断允许位,ET1=0时,禁止T1中断,ET1=1时,允许T1中断。
4)EX1:
外部中断1中断允许位,EX1=0时,禁止INT1中断,EX1=1时,允许INT1中断。
5)ET0:
定时器/计数器T0的溢出中断允许位,ET0=0时,禁止T0中断,ET0=1时,允许T0中断。
6)EX0:
外部中断0中断允许位,EX0=0时,禁止INT0中断,EX0=1时,允许INT0中断。
6.TR0和TR1:
定时器/计数器T0和T1的启动/停止位,TR0/TR1=1,定时器/计数器开始工作,TR0/TR1=0,定时器/计数器停止工作。
7.TF0和TF1:
定时器/计数器T0和T1的中断请求标志。
当定时器/计数器T0和T1工作产生溢出时,会将TF0或TF1位置1。
以定时器T0为例,T0溢出时,TF0置1,同时向CPU发出中断请求。
在CPU响应中断后,TF0自动清0。
注意和定时器查询方式的区别:
查询到TF0置1时,需由软件清0。
8.IE0—外部中断0请求标志。
当定时器0触发中断时,IE0=1;
IT0—外部中断0触发方式选择位。
当IT0=0时,为电平触发方式。
当IT0=1时,为跳变沿触发方式。
9.中断优先级寄存器IP
中断优先级寄存器IP可以用来设置中断的优先级,只要用程序修改其内容,就可以实现各中断源级别的设置,其内容如表3.4所示。
名称D7D6D5D4D3D2D1D0
IP--PT2PSPT1PX1PT0PX0
IP中的某位如果为1,则该位所对应的中断定义为高优先级中断;反之,IP中的某位如果为0,则该位所对应的中断定义为低优先级中断(PT2、PS、PT1、PX1、PT0、PX0分别对应定时器T2中断、串行口中断、定时器T1中断、外部中断1、定时器T0中断、外部中
断0)。
其中PT2位在C51、S51和C2051中无定义。
10.IP(InterruptPriorityRegister)寄存器
80C51单片机有2个中断优先级,可实现中断2级嵌套。
80C52单片机有4个中断优先级,可实现中断4级嵌套。
PT2(PriorityofTimer/Counter2):
定时/计数器2中断优先级设定位。
0:
低优先级;1:
高优先级。
PS(PriorityofSerialPort):
串行口中断优先级设定位。
0:
低优先级;
1:
高优先级。
PT1(PriorityofTimer/Counter1):
定时/计数器1中断优先级设定位。
0:
低优先级;1:
高优先级。
PX1(PriorityofExternalInterrupt1):
外部中断1优先级设定位。
0:
低优先级;1:
高优先级。
PT0(PriorityofTimer/Counter0):
定时/计数器0中断优先级设定位。
0:
低优先级;1:
高优先级。
PX0(PriorityofExternalInterrupt0):
外部中断0优先级设定位。
0:
低优先级;1:
高优先级。
PT2H、PSH、PT1H、PX1H、PT0H、PX0H等几个位与其相应的低位功
能相同,由两个位搭配组合,从而可以为单片机设定4级中断优先级。
11.TCON寄存器中外部中断的各功能位
TCON
(88H)
位
7
6
5
4
3
2
1
0
功能
-
-
-
-
IE1
IT1
IE0
IT0
IE1(Interrupt1Enable):
外部中断1使能。
0:
禁止;1:
使能。
IT1(Interrupt1Type):
外部中断触发方式选择。
IT1=0时为低电平触发
方式;IT1=1时,为下降沿触发方式。
IE0(Interrupt0Enable):
外部中断0使能。
0:
禁止;1:
使能。
IT0(Interrupt0Type):
外部中断触发方式选择。
IT0=0时为低电平触发
方式;IT0=1时,为下降沿触发方式。
外部中断0,1有两种触发方式:
(1)低电平触发方式。
当IT0/IT1=0时,外部中断为低电平触发方式。
(2)下降沿触发方式。
当IT0/IT1=1时,外部中断为下降沿触发方式。
设定外部中断的一般步骤为:
(1)设定中断触发方式(IT0/IT1)。
(2)使能外部中断(IE0/IE1=1)。
(3)使能CPU总中断(EA=1)。
12.中断系统应用举例
1)//实例44:
用定时器T0的中断控制1位LED闪烁
#include
sbitD1=P2^0;//将D1位定义为P2.0引脚
/**************************************************************
函数功能:
主函数
**************************************************************/
voidmain(void)
{
EA=1;//开总中断
ET0=1;//定时器T0中断允许
TMOD=0x01;//使用定时器T0的模式2
TH0=(65536-46083)/256;//定时器T0的高8位赋初值
TL0=(65536-46083)%256;//定时器T0的高8位赋初值
TR0=1;//启动定时器T0
while
(1)//无限循环等待中断
;
}
/**************************************************************
函数功能:
定时器T0的中断服务程序
**************************************************************/
voidTime0(void)interrupt1using0//“interrupt”声明函数为中断服务函数
//其后的1为定时器T0的中断编号;0表示使用第0组工作寄存器
{
D1=~D1;//按位取反操作,将P2.0引脚输出电平取反
TH0=(65536-46083)/256;//定时器T0的高8位重新赋初值
TL0=(65536-46083)%256;//定时器T0的高8位重新赋初值
}
2)//实例45:
用定时器T1中断控制两个LED以不同周期闪烁
#include
sbitD1=P2^0;//将D1位定义为P2.0引脚
sbitD2=P2^1;//将D2位定义为P2.1引脚
unsignedcharCountor1;//设置全局变量,储存定时器T1中断次数
unsignedcharCountor2;//设置全局变量,储存定时器T1中断次数
/**************************************************************
函数功能:
主函数
**************************************************************/
voidmain(void)
{
EA=1;//开总中断
ET1=1;//定时器T1中断允许
TMOD=0x10;//使用定时器T1的模式1
TH1=(65536-46083)/256;//定时器T1的高8位赋初值
TL1=(65536-46083)%256;//定时器T1的高8位赋初值
TR1=1;//启动定时器T1
Countor1=0;//从0开始累计中断次数
Countor2=0;//从0开始累计中断次数
while
(1)//无限循环等待中断
;
}
/**************************************************************
函数功能:
定时器T1的中断服务程序
**************************************************************/
voidTime1(void)interrupt3using0//“interrupt”声明函数为中断服务函数
//其后的3为定时器T1的中断编号;0表示使用第0组工作寄存器
{
Countor1++;//Countor1自加1
Countor2++;//Countor2自加1
if(Countor1==2)//若累计满2次,即计时满100ms
{
D1=~D1;//按位取反操作,将P2.0引脚输出电平取反
Countor1=0;//将Countor1清0,重新从0开始计数
}
if(Countor2==8)//若累计满8次,即计时满400ms
{
D2=~D2;//按位取反操作,将P2.1引脚输出电平取反
Countor2=0;//将Countor1清0,重新从0开始计数
}
TH1=(65536-46083)/256;//定时器T1的高8位重新赋初值
TL1=(65536-46083)%256;//定时器T1的高8位重新赋初值
}
3)//实例46:
用计数器T1的中断控制蜂鸣器发出1KHz音频
#include
sbitsound=P3^7;//将sound位定义为P3.7引脚
/**************************************************************
函数功能:
主函数
**************************************************************/
voidmain(void)
{
EA=1;//开总中断
ET1=1;//定时器T1中断允许
TMOD=0x10;//TMOD=0001000B,使用定时器T1的模式1
TH1=(65536-921)/256;//定时器T1的高8位赋初值
TL1=(65536-921)%256;//定时器T1的高8位赋初值
TR1=1;//启动定时器T1
while
(1)//无限循环等待中断
;
}
/**************************************************************
函数功能:
定时器T1的中断服务程序
**************************************************************/
voidTime1(void)interrupt3using0//“interrupt”声明函数为中断服务函数
{
sound=~sound;
TH1=(65536-921)/256;//定时器T1的高8位重新赋初值
TL1=(65536-921)%256;//定时器T1的高8位重新赋初值
}
4)//实例47:
用定时器T0的中断实现"渴望"主题曲的播放
#include
sbitsound=P3^7;//将sound位定义为P3.7
unsignedintC;//储存定时器的定时常数
//以下是C调低音的音频宏定义
#definel_dao262//将“l_dao”宏定义为低音“1”的频率262Hz
#definel_re286//将“l_re”宏定义为低音“2”的频率286Hz
#definel_mi311//将“l_mi”宏定义为低音“3”的频率311Hz
#definel_fa349//将“l_fa”宏定义为低音“4”的频率349Hz
#definel_sao392//将“l_sao”宏定义为低音“5”的频率392Hz
#definel_la440//将“l_a”宏定义为低音“6”的频率440Hz
#definel_xi494//将“l_xi”宏定义为低音“7”的频率494Hz
//以下是C调中音的音频宏定义
#definedao523//将“dao”宏定义为中音“1”的频率523Hz
#definere587//将“re”宏定义为中音“2”的频率587Hz
#definemi659//将“mi”宏定义为中音“3”的频率659Hz
#definefa698//将“fa”宏定义为中音“4”的频率698Hz
#definesao784//将“sao”宏定义为中音“5”的频率784Hz
#definela880//将“la”宏定义为中音“6”的频率880Hz
#definexi987//将“xi”宏定义为中音“7”的频率523H
//以下是C调高音的音频宏定义
#defin
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 语言 学习 笔记