单片机基础实验(二)

0x06 LED矩阵

74HC595

74HC595

教程:https://www.bilibili.com/video/av25104575?from=search&seid=1047628661288106627

工作原理

image.png

D0到D7从下到上
P0到P7从右往左

代码示例

0x07 驱动直流电机

驱动原理

本例中使用的是UNL2003芯片


image.png

可以看到和非门类似,输入低电平就为高电平,输入高电平就为低电平
吧直流电机一端接在5V电源上(高电平),另外一端接四个管脚的其中一个


接线端

要控制直流电机,要使直流电机两端电平不同,一端已经接了高电平(5V),所以因为UNL2003类似非门,输入高电平时才是低电平,所以UNL2003芯片的输入应该也为高电平

代码

让直流电机运行一小会

注意最后一定要加while(1);
单片机默认会循环的执行程序,所以不加的话可能就会一直运行或者运行一会停止又马上运行

#include <reg51.h>
#include "intrins.h"


sbit moto  = P1^0;

typedef unsigned char u8;
typedef unsigned int u16;



void delay(u16 t){
    while(t--);
}

void main(){
    
    moto = 0; //?????

    delay(5000);
    //??????
    moto = 1;
    delay(50000);

    moto = 0;// ?????

    while(1){}  


}



注意:
默认直流电机为开启状态,如果打开电源后电机总是处在运行状态没有停止与代码不相符,一定要检查是否控制错了管脚,本例中控制的是P01

0x07 中断

1. 中断的概念

中断即指单品机停止当前所作的工作A,转向工作B,稍后在来完成工作A


image.png

引起CPU中断的根源,称为中断源。中断源向CPU提出的中断请求。CPU暂时中断原来的事务A,转去处理事件B。对事件B处理完毕后,再回到原来被中断的地方(即断点),称为中断返回。实现中断功能的部件称为中断系统。


image.png

2. 中断的类型

STC89C5X 系列单片机提供了 8 个中断请求源,它们分别是:外部中断 O(INTO)、外部中断 1(INT1)、外部中断 2(INT2)、外部中断 3(INT3)、定时器 0 中断、定时器 1 中断、定时器 2 中断、串口(UART)中断

注意:51 系列单片 机一定有基本的 5 个中断,但不全有 8 个中断,需要查看芯片手册,通常我们 使用的都是基本的 5 个中断:INT0、INT1、定时器 0/1,串口中断


image.png

中断号会体现在代码中!

3. 单片机中断系统

89C51/52的中断系统有5个中断源 ,2个优先级,可实现二级中断嵌套 。
从上到下优先级递增

单片机中断系统

4. 中断的条件

1.1 中断允许控制

CPU对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE控制的。

IE
  • EX0(IE.0),外部中断0允许位;
  • ET0(IE.1),定时/计数器T0中断允许位;
  • EX1(IE.2),外部中断0允许位;
  • ET1(IE.3),定时/计数器T1中断允许位;
  • ES(IE.4),串行口中断允许位;
  • EA (IE.7), CPU中断允许(总允许)位。如果置0不能发生中断

1.2 中断请求标志

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溢出中断请求标志位。

1.3 中断响应条件

  1. 中断源有中断请求.如当IT0 = 1时发生了下降沿
  2. 此中断源的中断允许位为1,如外部中断0, EX0 =1
  3. CPU开中断(即EA=1)。
    以上三条同时满足时,CPU才有可能响应中断。

4. 使用中断,程序员需要做什么?

image.png
  1. 你想使用的中断是哪个?选择相应的中断号;
  2. 你所希望的触发条件是什么?
  3. 你希望在中断之后干什么?

中断服务函数:

void   int0   ()  interrupt   0    using  1
{
    do anything that you want
}

using 1可以省略不用

0x08 定时器/计数器中断

51 单片机有两组定时器/计数器,因为既可以定时,又可以计数,故称之 为定时器/计数器。

1. 四个周期

  1. 振荡周期:为单片机提供定时信号的振荡源的周期(晶振周期或外加振荡 周期)
  2. 状态周期:2 个振荡周期为 1 个状态周期,用 S 表示。振荡周期又称 S 周 期或时钟周期
  3. 机器周期:1 个机器周期含 6 个状态周期,12 个振荡周期。
  4. 指令周期:完成 1 条指令所占用的全部时间,它以机器周期为单位

,51 单片机相关周期的具体值为:
振荡周期=1/12us; 状态周期=1/6us;
机器周期=1us; 指令周期=1~4us;

2. 定时器工作原理

STC89C5X 单片机内有两个可编程的定时/计数器 T0、T1 和一个特殊功能定 时器 T2。定时/计数器的实质是加 1 计数器(16 位),由高 8 位和低 8 位两 个寄存器 THx 和 TLx 组成。它随着计数器的输入脉冲进行自加 1,也就是每来一 个脉冲,计数器就自动加 1,当加到计数器为全 1 时,再输入一个脉冲就使计数 器回零,且计数器的溢出使相应的中断标志位置 1,向 CPU 发出中断请求(定时 /计数器中断允许时)。如果定时/计数器工作于定时模式,则表示定时时间已到; 如果工作于计数模式,则表示计数值已满。可见,由溢出时计数器的值减去计数 初值才是加 1 计数器的计数值。

注意:
①定时器/计数器和单片机的 CPU 是相互独立的。定时器/计数器工作的过程 是自动完成的,不需要 CPU 的参与。
②51 单片机中的定时器/计数器是根据机器内部的时钟或者是外部的脉冲信 号对寄存器中的数据加 1。

2.1 51 单片机定时/计数器结构

单片机定时/计数器结构

T0对应 P3.4管脚
T1对应P3.5 管脚

51单片机定时/计数器的工作由两个特殊功能寄存器控制.

  1. TMOD: 确定工作方式
  2. TCON: 控制定时器/计数器的启动,停止与设置溢出标志

2.2 工作方式寄存器TMOD

工作方式寄存器 TMOD 用于设置定时/计数器的工作方式,低四位用于 T0,高 四位用于 T1。其格式如下:


image.png

GATE 是门控位, GATE=0 时,用于控制定时器的启动是否受外部中断源信号 的影响。只要用软件使 TCON 中的 TR0 或 TR1 为 1,就可以启动定时/计数器工作; GATA=1 时,要用软件使 TR0 或 TR1 为 1,同时外部中断引脚 INT0/1 也为高电平 时,才能启动定时/计数器工作。即此时定时器的启动条件,加上了 INT0/1 引脚 为高电平这一条件

C/T :定时/计数模式选择位。C/T =0 为定时模式;C/T =1 为计数模式。 M1M0:工作方式设置位。工作方式详见下节

例如要使用定时器0,那么就设置TMOD |= 0x01(使用或运算是为了不使之前TMOD的值收到干扰)

  • GATE = 0 ,此时将TCON中的TR0设置为1即可工作
  • C/T = 0定时模式
  • M1M0 = 01 为模式1

2.3 控制寄存器TCON

TCON 的低 4 位用于控制外部中断,已在前面介绍。TCON 的高 4 位用于控制定 时/计数器的启动和中断申请。其格式如下:


image.png

TF1(TCON.7):T1 溢出中断请求标志位。T1 计数溢出时由硬件自动置 TF1 为 1。CPU 响应中断后 TF1 由硬件自动清 0。T1 工作时,CPU 可随时查询 TF1 的 状态。所以,TF1 可用作查询测试的标志。TF1 也可以用软件置 1 或清 0,同硬 件置 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 类同。

如果要使用定时器0,需要将TR1 置为1,才能打开控制,当溢出时TF0 为1,清零将TF0置零即可

3. 定时器工作方式

定时/计数器有四种工作方式。


image.png

3.1 方式0

方式 0 为 13 位计数,由 TL0 的低 5 位(高 3 位未用)和 TH0 的 8 位组成。 TL0 的低 5 位溢出时向 TH0 进位,TH0 溢出时,置位 TCON 中的 TF0 标志,向 CPU 发出中断请求。其结构图如下所示:


image.png

3.2 方式1

方式 1 的计数位数是 16 位,由 TL0 作为低 8 位,TH0 作为高 8 位,组成了 16 位加 1 计数器。其结构图如下所示:


image.png

3.3 方式2

方式 2 为自动重装初值的 8 位计数方式。工作方式 2 特别适合于用作较 精确的脉冲信号发生器。其结构图如下所示:


image.png

4. 定时器配置

在使用定时器时,应该如何配置使其工作?其步骤如下(各步骤顺序可任 意):①对 TMOD 赋值,以确定 T0 和 T1 的工作方式,如果使用定时器 0 即对 T0 配 置,如果使用定时器 1 即对 T1 配置。 ②根据所要定时的时间计算初值,并将其写入 TH0、TL0 或 TH1、TL1。 ③如果使用中断,则对 EA 赋值,开放定时器中断。 ④使 TR0 或 TR1 置位,启动定时/计数器定时或计数。 上述中有一个定时/计数器初值的计算,下面我们来看下如何计算定时/计数 器初值。

5. 计算初值

定时器本质上其实就是计数器,只不过是根据机器周期把计数的次数转化成了时间而已
可以自己计算,也可以使用软件计算
自己计算的方法如下

定时器初值计算方法

前面我们介绍过机器周期的概念,它是 CPU 完成一个基本操作所需要的时间。 其计算公式是:机器周期=1/单片机的时钟频率。51 单片机内部时钟频率是外部 时钟的 12 分频,也就是说当外部晶振的频率输入到单片机里面的时候要进行 12 分频。比如说你用的是 12MHZ 晶振,那么单片机内部的时钟频率就是 12/12MHZ, 当你使用 12MHZ 的外部晶振的时候,机器周期=1/1M=1us。如果我们想定时 1ms 172
的初值是多少呢?1ms/1us=1000。也就是要计数 1000 个,初值=65535-1000+1 (因为实际上计数器计数到 66636(2 的 16 次方)才溢出,所以后面要加 1) =64536=FC18H,所以初值即为 THx=0XFC,TLx=0X18。

如果要计算太多的时间,可以以一个比较小的时间为基本单位:如1ms,

6. 实验代码

控制小灯间隔1s闪烁

别忘了在main函数中调用Timer0Init()函数!!!

#include "reg52.h"


typedef unsigned char u8;
typedef unsigned int u16;

sbit led = P2^0;


void Timer0init(){

    // ???????????TMOD????????????,????M0M1,????|????
    TMOD |= 0x01;    //???????0????1,??TMOD?????λ????,????λ??????????
    //???1ms ????????1us  ???????? 1ms/1us  = 1000  c????65536-1000  =  FC18H   
    //??????????μ???????????м???

    //???ó??
    TH0 = 0xFC;
    TL0 = 0x18;
    
    //?????1????ж???λ ET0
    ET0 = 1;
    // ???ж?    
    EA = 1;
    //???п???λ,??1???????                   
    TR0 = 1;


}




void main(){
    Timer0init();
    while(1)
    {
    }
}



//?????0???ж???1,?????1???ж???3
void Timer0() interrupt 1{
    
    static u16 i = 0;
    TH0 = 0xFC;
    TL0 = 0x18;
    i++;
    //??i????1s
    if(i==1000){
        i = 0;
        led = ~led; 
    }
}       
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容

  • 本文集下的内容主要介绍stc89c51系列单片的基础知识(初学者看会感到乏味,建议培养兴趣爱好之后再来看) 本文主...
    keep1234quiet阅读 3,256评论 8 6
  • 寄存器IE(8位):对单片机系统所有中断以及某个中断源的开放和屏蔽的控制 EX0(IE.0),外部中断0允许位; ...
    又是那一片天阅读 1,349评论 0 1
  • 6.1定时器概述 89C51/S51单片机内部有两个16位定时器/计数器,即定时器0(T0)和定时器1(T1)。 ...
    MUZYOU阅读 1,228评论 0 0
  • 51单片机采用中断方式的串口通信过程及程序分析: 所谓中断方式,就是串口收/发标志位出发中断后,在中断中执行既定操...
    緣來阅读 5,322评论 0 6
  • 单片机STC89C52学习——17 定时器和计数器 汇总:00 单片机STC89C52学习参考教程:普中科技 1 ...
    aaa小菜鸡阅读 1,288评论 0 0