目录
C语言知识点:
51单片机简单实验
51单片机引脚图
1、点亮led灯
2、闪烁led灯
3、led流水灯
4、蜂鸣器
6、中断
6.1、中断的定义
6.2、中断源、中断寄存器和中断优先级
6.3、中断处理过程
7、外部中断
8、定时器和计数器中断
8.1、CPU时序的有关知识
8.2、51单片机定时器/计数器
8.3、定时/计数器的工作方式
9、串口通信
9.1、串口通信的原理
9.2、80C51的串行口
9.3、串行口的工作方式
C语言知识点:
1、sbit:sbit 变量名=地址名; //在给某个引脚取名的时候
2、#typedef使用:重新定义一些常用的关键词
typedef unsigned char u8; //使u8可定义无符号字符型
typedef unsigned int u16; //使u16可定义无符号整型
3、#define
#define A P0 //用A来定义成P0
4、延时函数:可通过设置断点(在左侧行数栏双击)进行debug调试查看具体延时时间
void delay(u16 i) //i为1时,大约延时10us
{
while(i--);
}
5、循环左移右移函数(包含在intrins.h库函数中)
_crol_(a,b); //循环左移函数,a是左移值,b是左移的位数
_cror_(a,b); //循环右移函数,a是右移值,b是右移的位数
51单片机简单实验
51单片机引脚图
P3口第二功能各引脚功能定义: P3.0:RXD串行口输入 P3.1:TXD串行口输出 P3.2:INT0外部中断0输入 P3.3:INT1外部中断1输入 P3.4:T0定时器0外部输入 P3.5:T1定时器1外部输入 P3.6:WR外部写控制 P3.7:RD外部读控制1、点亮led灯
这里我的开发板上led灯当引脚输出为低电平时点亮,故选取了P2.0引脚使其输出低电平(此处可根据自己led连接或者板上电路来设置高低电平)#include"reg52.h"
sbit led=P2^0; //取P2.0变量名为led
void main()
{
while(1)
{
led=0;
}
}
2、闪烁led灯
闪烁程序上即为在点亮后进行延时一段时间在熄灭再延时,执行如此循环,故可在上一个程序中修改为:#include"reg52.h"
typedef unsigned int u16;
sbit led=P2^0; //取P2.0变量名为led
void delay(u16 i) //构建延时函数
{
while(i--);
}
void main()
{
while(1)
{
led=0;
delay(50000);
led=1;
delay(50000);
}
}
3、led流水灯
#include"reg52.h"
#include"intrins.h"
#define led P2 //将P2定义为led
typedef unsigned int u16;
typedef unsigned char u8;
void delay(u16 i) //构建延时函数
{
while(i--);
}
void main()
{
u8 i;
led=0xfe; //1111 1110
delay(50000); //延时450ms
while(1)
{
for(i=0;i<7;i++)
{
led=_crol_(led,1);
delay(500000);
}
}
}
4、蜂鸣器
无源蜂鸣器(压电式蜂鸣器):左边第一张图即有绿色电路板,由多谐振荡器、压电蜂鸣片等组成,接通电源后(1.5v~15v直流工作电压),多谐振荡器起振,输出1.5~2.5kHZ的音频信号,发声。需要形成脉冲控制,改变单片机输出波形的频率(脉冲周期),就可以控制蜂鸣器音调,产生不同音色、音调的声音;改变输出电平的高低电平占空比,则可以控制蜂鸣器的声音大小 有源蜂鸣器(电磁式蜂鸣器):下部无绿色电路板,内部含有振荡器电路,接通电源后,振荡器产生音频信号电流通过电磁线圈,使电磁线圈产生磁场,周期性振动地发声。可通过单片机高低电平直接控制 ULN2003:高耐压、大电流达林顿陈列,由七个npn达林顿管组成(com接VCC,E接GND) 这里我的开发板上蜂鸣器连接引脚P1^5故可设置如下程序:#include"reg52.h"
typedef unsigned int u16;
sbit beep=P1^5;
void delay(u16 i) //延时函数
{
while(i--);
}
void main()
{
while(1)
{
beep=~beep; //取反
delay(10); //延时100us,不同延时频率不同声音不同
}
}
6、中断
6.1、中断的定义
CPU在处理某一事件时,发生另一事件B请求CPU迅速去处理(中断发生),CPU暂时中断当前的工作,转去处理需要迅速处理的事件(中断响应和中断服务),待中断事件处理完成后继续处理原事件(中断返回) 引起CPU中断的根源称为中断源,CPU暂时中断原来的事件转向中断事件,处理完成后回到原来的地方(即断点),实现中断功能的部件称为中断系统。 中断的优点:分时操作:CPU可以分时为多个I/O设备服务,提高计算机的利用率、实时响应:CPU能够及时处理应用系统的随机事件,实时性大大增强、可靠性高:CPU具有处理设备故障及掉电等突发事件能力,使可靠性提高、解决了快速主机预慢速I/O设备的数据传输问题6.2、中断源、中断寄存器和中断优先级
89C51的中断系统有5个中断源,2个中断优先级,可实现二级中断嵌套。五个中断源如图由上至下对应为外部中断0、定时器0、外部中断1、定时器1、串口中断,其中断优先级由上至下递减;TCON中的IT0和IT1可决定INT0和INT1低电平有效还是下降沿有效;对应的中断标志位IE0、TF0(定时器0溢出)、IE1、TF1(定时器1溢出)为1时触发中断,当RX或TX串行口接受或者发送完成RI或TI置1触发中断; CPU对中断系统所有中断及某个中断源的开放和屏蔽是由中断寄存器IE控制的。 EX0(IE.0):外部中断0允许位;ET0(IE.1):定时/计数器T0中断允许位;EX1(IE.2):外部中断1允许位;ET1(定时/计数器T1中断允许位);ES(IE.4)串行口中断允许位;EA(IE.7):CPU中断总允许位 TCON中断请求标志。 IT0(TCON.0),外部中断0触发方式控制位。当IT0=0时,为电平触发方式;当IT0=1时,为边沿触发方式(下降沿有效)。 IE0(TCON.1),外部中断0中断请求标志位。发生中断后标志位置一。 IT1(TCON.2),外部中断1触发方式控制位。 IE1(TCON.3),外部中断1中断请求标志位。 TF0(TCON.5),定时/计数器T0溢出请求标志位。 TF1(TCON.7),定时/计数器T1溢出中断请求标志位。 同一优先级的中断请求不止一个时,则有中断优先级的排队问题。其排列如图所示: 中断源 正在进行的中断过程不能被新的同级或低级优先级的中断请求所中断,进行的低优先级中断服务可被高优先级中断请求所中断。6.3、中断处理过程
中断响应条件: 中断源有中断请求; 此中断源的中断标志位为1; CPU开中断(即EA=1)。 使用中断,需要做什么 想使用的中断是哪个?选择而响应的中断号; 希望触发的条件是什么? 希望在中断之后干什么? 以外部中断0为例EA=1; //打开总中断开关
EX0=1; //打开外部中断0
IT0=0/1; //设置外部中断的触发方式,0为低电平1为下降沿
中断服务函数
void int0 () interrupt 0 using 1 //int0为函数名称,() interrupt为固定格式,0位中断号,using1可不写
{
do anything that you want
}
7、外部中断
51单片机中断系统结构 P3.0:RXD串行口输入 P3.1:TXD串行口输出 P3.2:INT0外部中断0输入 P3.3:INT1外部中断1输入 P3.4:T0定时器0外部输入 P3.5:T1定时器1外部输入 外部中断实验: 将开关连接至单片机的P3.2口(外部中断0),按下开关使得连接至P2.0的小灯点亮状态进行取反。#include "reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit key = P3 ^ 2; //定义按键key
sbit led = P2 ^ 0; //定义P2.0为led口
void delay(u16 i) //构建延时函数
{
while (i--);
}
void Int0Init() //构建中断初始化函数
{
EA = 1;
EX0 = 1;
IT0 = 1;
}
void main()
{
Int0Init(); //设置外部中断0
while (1);
}
void Int0() interrupt 0 //中断响应程序
{
delay(1000); //延时消抖
if (key == 0)
led = ~led;
}
8、定时器和计数器中断
8.1、CPU时序的有关知识
振荡周期:为单片机提供定时信号的振荡源的周期(即为晶振周期或外加振荡周期)(一般外界晶振为12M,一个振荡周期为1/12us) 状态周期:2个振荡周期为1个状态周期,用S表示。(若为12m晶振,一个状态周期为1/6us) 机器周期:1个机器周期含6个状态周期,12个振荡周期。(若为12m晶振,一个机器周期=12x1/12m,即为1us) 指令周期:完成1条指令所占用的全部时间,以机器周期为单位。(若为12m晶振,1~4us)8.2、51单片机定时器/计数器
8.2.1 需要了解的知识
51单片机有两组定时器/计数器,因为既可以定时,又可以计数。 定时器/计数器和单片机CPU是相互独立的。定时器/计数器工作过程不需要CPU的参与。可以增加单片机的效率,一些简单的重复加1的工作可以交给定时器/计数器处理。同时实现精确定时的作用。 51单片机中的定时器/计数器是根据机器内部的时钟或者是外部的脉冲信号对寄存器的数据加1。8.2.2 工作原理
定时/计数器实际上是一个加1的计数器。它随着计数器的输入脉冲进行自加1,也就是每来一个脉冲计数器就自动加1,当加到计数器全为1时,再输入一个脉冲就使计数器回零,且计数器的溢出使得相应的中断标志位置一,同CPU发出中断请求。 可见,由溢出时计数器的值减去计数器的初值才是加1计数器的值。 定时/计数器的实质是加1计数器(16位),由高8位和低8位两个寄存器THx和TLx组成。TMOD是定时/计数器的工作方式寄存器,确定工作方式和功能;TCON是控制寄存器,控制T0、T1的启动停止及设置溢出标志。8.2.3、定时/计数器的控制
定时/计数器工作由两个特殊功能寄存器控制。TMOD用于设置其工作方式;TCON用于控制其启动和中断申请。 (1)工作方式寄存器TMOD 工作方式寄存器TMOD用于设置定时/计数器的工作方式,低四位用于T0,高四位用于T1。格式如下: GATE是门控位,用于控制定时器的启动是否受中断源的影响。GATE位0时,只要软件使TCON中的TR0和TR1位1,就可以使定时器/计数器工作;GATE=1时,需要外部中断INT0/1也为高电平时,TR0或TR1为1,才能启动定时/计数器工作。 C/T:定时/计数模式选择位。C/T=0为定时模式;C/T=1为计数模式。 M1 M0:工作方式设置位。定时/计数器有四种工作方式。(一般使用方式1和方式2) (2)控制寄存器TCON TCON的高4位用于控制定时/计数器的启动和中断。格式如下: TF1(TCON.7):T1溢出中断请求标志位。T1计数溢出时由硬件自动置1,CPU响应中断后TF1由硬件自动清0。T1工作时,CPU可随时查询TF1的状态,TF1可用作查询测试的标志。TF1也可用软件置1或清0。 TR1(TCON.6):T1运行控制位。TR1置1时,T1开始工作;TR1置0时,T1停止工作。TR1由软件置1或清0. TF0(TCON.5):T0溢出中断请求标志位,其功能与TF1类同。 TR0(TCON.4):T0运行控制位,其功能与TR1类同。8.3、定时/计数器的工作方式
1、方式0 方式0位13位计数器,由TL0的低5位(高3位未用)和TH0的8位组成。TL0的低5位溢出时向TH0进位,TH0溢出时,置位TCON中的TF0的标志,向CPU发出中断请求。 定时器模式有:N=t/Tcy,定时器的初值还可以采用计数个数直接取补法获得 计数器初值计算公式为:X=2^13-N,计数模式时计数脉冲是T0引脚上的外部脉冲获得 门控位GATE具有特殊的作用。当GATE=0时,经反向后使或门输出为1,此时仅由TR0控制与门的开启,与门输出1时,控制开关接通,计数开始;当GATE=1时,由外中断引脚信号控制或门的输出,此时控制与门的开启由外部中断引脚信号和TR0共同控制。 2、方式1 方式1的计数位数是16位,由TL0作为低8位,TH0作为高8位,组成了16加1计数器。 计数个数与计数初值的关系为:X=2^16-N 3、方式2 方式2位自动重装初值的8位计数方式。(只要低8位计满就会重新装载) 计数与计数初值的关系为:X=2^8-N,适合于用作较精确的脉冲信号发生器。 4、方式3 方式3只适用于定时/计数器T0,定时器T1处于方式3时相当于TR1=0,停止计数。 工作方式3将T0分成两个的8位计数器TL0和TH0。 使用定时/计数器该做哪些工作: 对TMOD赋值,以确定T0和T1的工作方式。 计算初值,并将其写入TH0、TL0或TH1、TL1。 中断方式时,对EA赋值,开放定时器中断。 使TR0或TR1置位,启动定时/计数器定时或计数 计数器初值的计算 机器周期也就是完成一个基本操作所需要的时间。 机器周期=1/单片机的时钟频率 51单片机的时钟频率是外部时钟的12分频。也就是说当外部晶振的频率输入到单片机里面的时候要进行12分频。当使用12M晶振,那么单片机内部的时钟频率就是12/12MHZ,机器周期=1us 定时1ms的初值是多少呢?1ms=1000us。也就是要数1000个数,初值=65535-1000+1(因为实际上计数器记到66636才溢出)=64536=FC18H8.4、定时器中断例程
时间小灯间隔1s的闪烁,连接led至P2^0口,使用定时器0进行定时#include "reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit led = P2 ^ 0;
void time0Init()
{
TMOD = 0x01; //定时器0门控位设置为0,设置为定时器模式,计数模式1
TH0 = 0xFC; //设置定时器初值
TL0 = 0x18;
EA = 1; //开启总中断
ET0 = 1; //打开定时器0中断允许
TR0 = 1; //打开定时器
}
void main()
{
time0Init();
while (1);
}
void time0() interrupt 1
{
static u16 i; //设置静态变量,每过1ms即执行一次中断加1
TH0 = 0xFC; //赋予初值
TL0 = 0x18;
i++;
if (i == 1000) //u16累加至1000即过1s后i清0 led状态取反
{
i = 0;
led = ~led;
}
}
评论(0)
您还未登录,请登录后发表或查看评论