单片机C语言学习笔记.docx

上传人:b****7 文档编号:10757659 上传时间:2023-02-22 格式:DOCX 页数:41 大小:1.45MB
下载 相关 举报
单片机C语言学习笔记.docx_第1页
第1页 / 共41页
单片机C语言学习笔记.docx_第2页
第2页 / 共41页
单片机C语言学习笔记.docx_第3页
第3页 / 共41页
单片机C语言学习笔记.docx_第4页
第4页 / 共41页
单片机C语言学习笔记.docx_第5页
第5页 / 共41页
点击查看更多>>
下载资源
资源描述

单片机C语言学习笔记.docx

《单片机C语言学习笔记.docx》由会员分享,可在线阅读,更多相关《单片机C语言学习笔记.docx(41页珍藏版)》请在冰豆网上搜索。

单片机C语言学习笔记.docx

单片机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//包含51单片机寄存器定义的头文件

/**************************************************************

函数功能:

主函数

**************************************************************/

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//包含51单片机寄存器定义的头文件

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//包含51单片机寄存器定义的头文件

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//包含51单片机寄存器定义的头文件

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//包含51单片机寄存器定义的头文件

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//包含51单片机寄存器定义的头文件

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

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

当前位置:首页 > 工程科技 > 能源化工

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

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