admin 管理员组

文章数量: 887019

普中51 - 普中51

  • 功能与使用 介绍
    • 功能模块
    • CMOS是Complementary Metal Oxide Semiconductor(互补金属氧化物半导体)
    • 通常 汉字有 16*16 个像素点
  • P2 51单片机介绍(一)
        • 基础
          • 第二功能
  • P3 51单片机介绍(二)
  • P4 C语言基础
  • 添加 stc 芯片库
  • keil5新建c51工程 并配置
  • CH340 驱动安装
    • 程序的烧录
  • 数字电路与C语言基础
    • 电平特性
    • 二进制中运算
      • & 与运算
      • | 或运算
      • 非运算
      • C51中的基础知识
  • 点亮第一个LED
  • LED 闪烁
    • reg52.h 头文件介绍
  • 单片机最小系统构成
    • (1)晶振电路
    • (2)复位电路
    • (3)电源电路
    • (4)下载电路
  • Keil uVision 5-C51和MDK-ARM共存
  • 解决中文注释 ??? 的问题
  • 外部中断 and 定时器中断
    • 1.什么是中断
    • 2.中断有什么用
    • 3.双重功能的P3引脚
    • 4.8051中断体系
    • 5.中断特寄存器
    • 6.中断的优先级
    • 7.中断服务程序的编写
    • 8.外部中断实现代码
    • 9.定时器/计数器中断工作原理
    • 10.定时器/计数器定时数值的计算

https://www.bilibili/video/av286413345/

功能与使用 介绍

单核A2产品
基于STC89C52 STC89Cxx 芯片
宏晶公司推出的增强型 51 单片机STC89Cxx/STC90Cxx 等系列更受大众喜爱
低功耗,高性能的51内核的CMOS 8位单片机

产品的 A6/7 双cpu
STC8A STM8M

内部资源及功能大大增强外
支持 ISP(在系统可编程)/IAP(在应用可编程),
无需专用编程器或专用仿真器。
宏晶公司推出的 51 芯片种类非常多

STC–表示芯片为 STC 公司生产的产品,其他公司的也有 AT、i、SST 等
8–表示该芯片为 8051 内核芯片
9–表示内部含有 Flash EEPROM 存储器,
还有
如 80C51 中 0 表内部含有MaskROM(掩模 ROM)存储器;
如 87C51 中 7 表示内部含有 EPROM(紫外线可擦除ROM)存储器。

C–表示该器件为 CMOS 产品。
还有如 89LV52 和 89LE58 中的 LV 和 LE 都表示该芯片为低电压产品
(通常为 3.3V 电压供电);
而 89S52 中 S 表示该芯片含有可串行下载功能的 Flash 存储器,
即具有 ISP 可在线编程功能。

5–固定不变。
2–表示该芯片内部程序存储(FLASH)空间大小,
1 为 4KB,2 为 8KB,3 为12KB,即该数乘以 4KB 就是芯片内部的程序存储空间大小。
程序空间大小决定了一个芯片所能装入执行代码的多少。
一般来说,程序存储空间越大,芯片价格也越高,
所以我们再选择芯片的时候要根据自己需求选择合适芯片

功能模块

  • 数码管 四位一体
    共阴极

  • 数码管 驱动电路(不能直接用 单片机 管脚来驱动)

大的 : 74hc245 CMOS高速收发器 输出 作为 数码管 段选 信号
小的 : 74HC138 高速CMOS器件 74HC138译码器
八个数码管的片选
节约 iO口资源

CMOS是Complementary Metal Oxide Semiconductor(互补金属氧化物半导体)

  • LCD1602液晶显示器 接口

    显示 数字 字符

  • LCD9648 液晶屏

  • LCD12864
    带字库/不带字库
    字库芯片

  • 电位器

    1602 对比度
    (对应 电压管脚)

  • LED 8*8 点阵


64 个 灯(内部电路 很明白 清楚)(初学易学)

或者 市场上 8*8集成点阵 (带控制引脚)
比较 不太好 初学

  • io拓展 芯片 74HC595
    8位串行输入、并行输出的位移缓存器
    串转并
    3个管脚 拓展 8个(剩下的 8 个 通过 单片机io口)
    节约io口

  • 跳线帽 短接片

595 有一个 使能 管脚控制 切换

默认 接 GND 右 (左边 VCC)
处于 一直工作 状态 有效
使得 管脚 有 默认 的 输出电平
使得 点阵 发光

对应 丝印

  • LED 模块

    简单 io口 操作
    用 LED灯 练习基本 IO口 使用
    用来 调试 程序

  • 4*4 矩阵键盘

独立 按键 一个 io口 一个 按键 (另一端接地)
根据 监测 io口 电平状态 就能 按键功能检测

单片机总共 32 io口

矩阵 4*4 (既要检查 行 又要 检测 列)
(也可以拆分成 独立按键)
8个io口可以解决
有效的 拓展 按键数量 (输入)

1602显示器(输出)2*16 = 32 字符
02说明 2行
16能显示16个字符(数字,字符)

12864/9648中文 汉字 图形
96 液晶屏像素点 一行
有48 个 行

每一行128点
每一列64点

通常 汉字有 16*16 个像素点

1602 用 5*7

汉字为 两个 字符 大小
128/16 == 8 个 汉字
64/16 = 4

字符
16个 一行

  • ds18b20 温度传感器

  • 红外 接收头

    注意凸起 丝印 ------ 不然容易 电源短路烧掉 传感器/芯片

  • 2.4G 接口

nRF24L01 模块

两个模块 通信

500m左右 通信距离

  • 电源 输出 管脚

    配置 为 系统的 电源
    给外部传感器 供电 插针

3.3 gnd 5v

外部电源

从 usb 供电口 供电

  • 稳压芯片 将5v 转成 3.3(wifi , 蓝牙 ,2.4G)

  • usb 转 串口 模块

    单片机支持 串口 下载
    ch340c 芯片
    信号转换
    usb — 串口

通过 上位机 实现 程序 下载

还可以 供电

短接片 (跳线帽)

串口 连到 转接片 ----到 单片机
接受 与 发送

wifi 蓝牙 gps GSM 等
串口模块 调试
可以通过 串口调试助手 AT指令 进行调试

模拟 单片机 的 串口功能
模块 进行 响应

双方 进行 学习 (电脑 调试助手 / 单片机)

usb转 TTL电平信号 (串口)

  • AD/DA 模块
    ad芯片xpt2046
    精度 12位
    四路模拟输入通道

通过电位器 改变电压 (模拟电压)输入到 对应通道
采集电压值 - 第一路

光敏 (模拟信号) 光线强弱 变化 ad值 也会变化
转换成 数字信号 给 单片机 处理 - 第二路

热敏电阻 感应环境温度 - 第三路


外部 传感器 模拟信号 输入到 芯片 进行 采集 - 第四路

  • 加上 gnd

da 没有用 da芯片
在实际的 开发 中 用的不多

  1. 成本高
  2. 精度 一般 8位
  3. 一般 单片机 输出 pwm 波 / RC 电路 实现 da 模拟 来实现 da芯片 功能
  • LM358是双运算放大器

信号 放大

da 的 输出 模拟信号 进行 外部 调节 (电机)

通过 灯 进行 变化 体现 功能

  • 无源蜂鸣器

有源 只需要 电源 发生

无源 需要 一定频率 脉冲

  • DS1302 实时时钟芯片
    时钟电路

  • 32.768K晶振
    给 ds1302 提供 时钟源

  • 电机模块 uln2003

    高耐压、大电流复合晶体管阵列,由七个硅NPN 复合晶体管组成,

每一对达林顿(两个三极管接在一起)都串联一个2.7K 的基极电阻,
在5V 的工作电压下它能与TTL 和CMOS 电路直接相连,
可以直接处理原先需要标准逻辑缓冲器来处理的数据

五线四相步进电机/直流电机(只能驱动 一个方向/ 不能 反转)

  • 单片机 stc89c52

    一个低功耗,高性能的51内核的CMOS 8位单片机
    stc89c516
    at89c52

8051内核

40个 管脚

32 个 io口
4*8

avr
msp430
stm32

连接对应模块

  • 主芯片 晶振电路
    12M晶振

    最小系统

  • 复位电路

    高电平 复位
    复位管脚

芯片 重新运行


芯片 方向

短路
vcc gnd 对调

  • ch340 驱动
    https://gitee/rtthread/rt-thread 开源物联网操作系统

设备管理器 串口号 ch340

  • 程序下载软件

P2 51单片机介绍(一)

基础

  • 大学里 学 电子的 课程

  • ROM 只读存储器 (掉电不丢失)(存储程序)

  • RAM 随机存储器 (掉电丢失) (存储变量参数)

  • cpu 位数

  • rom ram 大小

  • DIP 封装 双列直插封装 dual in-line package

  • SOP 封装 贴片 封装

AT (Atmel 半导体)



  • MAX232芯片
    美信(MAXIM)公司专为RS-232标准串口设计的单电源电平转换芯片,使用+5v单电源供电。




  • AT 89c51

  • CMOS是Complementary Metal Oxide Semiconductor(互补金属氧化物半导体)的缩写。
    它是指制造大规模集成电路芯片用的一种技术或用这种技术制造出来的芯片,
    是电脑主板上的一块可读写的RAM芯片。
    因为可读写的特性,所以在电脑主板上用来保存BIOS设置。


80C51 89C51总线型


P3.6 没有引出来 非总线型

32个IO口 40 管脚

第二功能

通讯 串行接口 RX TX
下载程序


并行 io口
T/C 定时/计数


串口I/O UART 通用 异步 接收发送器
可以跟电脑通信

12MHZ晶振

P3 51单片机介绍(二)

学习板子



开漏输出OC门 P0 内部没有上拉电阻 要输入 高低电平 需要外部加

  • 集电极开路(漏极开路)与非门门电路,Open Collector(Open Drain)

p1 p2 p3 准双向 IO 内部 有 上拉电阻

反相器
晶体管

通过 上拉电阻 保持 IO口 与 内部输出 同步




数电模电

P4 C语言基础


  • 头文件 包含 单片机 一些 特殊寄存器





do while  至少执行 一下  do里的语句

添加 stc 芯片库





keil5新建c51工程 并配置









CH340 驱动安装

程序的烧录

在下载程序前先确认下开发板上的
USB 转 TTL 串口模块上的 J39 和 J44 端子短接片是否短接好
(即 P31T 与 URXD 连接,P30R 与 UTXD 连接)

数字电路与C语言基础

电平特性

单片机是一种数字集成芯片,数字电路中只有两种电平:高电平和低电平
暂时定义单片机输出与输入为 TTL 电平,其中高电平为+5V,低电平为 0V。
计算机的串口为 RS232 电平,其中高电平为-12V,低电平为+12V。
这里强调的是,RS232C 电平为负逻辑电平,大家不要认为上面是我写错了。
因此当计算机与单片机之间要通信时, 需要依靠电平转换芯片,比如 MAX232 电平转换芯片。
TTL 电路和 CMOS 电路的逻辑电平关系如下:
①VOH:逻辑电平 1 的输出电压。
②VOL:逻辑电平 0 的输出电压。
③VIH:逻辑电平 1 的输入电压。
④VIL:逻辑电平 0 的输入电压。
TTL 电平临界值:
①VOHmin=2.4V,VOLmax=0.4V。
②VIHmin=2.0V,VILmax=0.8V。
CMOS 电平临界值(假设电源电压为+5V):
①VOHmin=4.99V,VOLmax=0.01V。
②VIHmin=3.5V,VILmax=1.5V。
TTL 和 CMOS 的逻辑电平转换:
CMOS 电平能驱动 TTL 电平,但 TTL 电平不能驱动 CMOS 电平,需加上拉电阻

二进制中运算

& 与运算

实现“必须都有,否则就没有”这种逻辑关系的一种运算。
C 语言中运算符为“&”,其运算规则如下:0&0=0,0&1=0(1&0=0),1&1=1。
C 语言中“&&”表示“按位与”运算,
意思是变量之间按二进制位数对应关系一一进行“与”运算。
如(0101 0101)&&(1010 1010)=0000 0000,而上面讲到的“&”运算只是对单一位进行运算

| 或运算

只要其中之一有就有”这种逻辑关系的一种运算。
C 语言中运算符为“|”,其运算规则如下:0|0=0,0|1=1(1|0=1),1|1=1。
C 语言中“||”表示“按位或”运算,
变量之间按二进制位数对应关系一一进行“或”运算。如(0101 0101)||(1010 1010)=1111 1111,
而上面讲到的“|”运算只是对单一位进行运算

非运算

非”运算是实现“求反”这种逻辑关系的一种运算。
C 语言中运算符为“!”,其运算规则如下:!0=1,!1=0

C 语言中 ~  表示“按位取反”运算。
如~0101 0101=1010 1010,而上面讲到的“!”运算只是对单一位进行运算

C51中的基础知识



short int,
long int,
signed short int 等数据类型,
在单片机的 C 语言中我们默认的规则如下:
short int 即为 int, long int 即为 long,
前面若无 unsigned 符号则一律认为是 signed 型。

C51 扩充数据类型

C51 中,为了增加程序的可读性,允许用户为系统固有的数据类型说明符用 typedef 起别名,格式如下

typedef c51 固有数据类型说明符 别名

点亮第一个LED

GPIO(general purpose intput output)是通用输入输出端口的简称,可以通过软件来控制其输入和输出。
51 单片机芯片的 GPIO 引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。
不过 GPIO 最简单的应用还属点亮 LED 灯了,只需通过软件控制 GPIO 输出高低电平即可。
当然 GPIO 还可以作为输入控制,比如在引脚上接入一个按键,通过电平的高低判断按键是否按下。

Led简介
LED 即发光二极管。它具有单向导电性,
通过 5mA 左右电流即可发光,电流越大,其亮度越强,但若电流过大,会烧毁二极管,
一般我们控制在 3 mA-20mA 之间,
通常我们会在 LED 管脚上串联一个电阻,目的就是为了限制通过发光二极管的电流不要太大,因此这些电阻又可以称为“限流电阻”。
当发光二极管发光时,测量它两端电压约为 1.7V,这个电压又叫做发光二极管的“导通压降发光二极管正极又称阳极,负极又称阴极,电流只能从阳极流向阴极。
直插式发光二极管长脚为阳极,短脚为阴极。仔细观察贴片式发光二极管正面的一端有彩色标记,通常有标记的一端为阴极。

开发板上的电路设计


LED 采用共阳接法,
即所有 LED 阳极管脚接电源 VCC,
阴极管脚通过一个 470 欧的限流电阻接到J19以及J18端子上,
要让 LED 发光即对应的阴极管脚应该为低电平,若为高电平则熄灭。

#include "reg52.h"
sbit LED1 = P2^0; 
void main(){
	LED1 = 0;
}


代码中使用的是p20针脚,说以我们只能接p20针脚,
然后我们的LED灯可以接J19j18任意的针脚,接哪哪亮,因为led都是共阳极

LED 闪烁

 #include "reg52.h"
// 对系统默认数据类型进行重命名 
typedef unsigned int u16;
sbit LED1 = P2^0; 
void delay(u16 ten){
	while(ten--);
}
void main(){
	while(1){
		LED1 = 0;
		delay(5000);
		LED1 = 1;
		delay(5000);
	}
}

u16不是 C 语言数据类型关键字,
这是我们重定义的数据类型使用关键字 typedef 对系统默认数据类型 unsigned int 和 unsigned char 重新命名,
主要是方便我们代码的书写和变量类型的查看。
u16 即代表该变量是16 位的无符号整型数据,u8 代表该变量是 8 位的无符号字符型数据。

reg52.h 头文件介绍

在代码中引用头文件,
意义就是将这个头文件中的全部内容放到引用 头文件的位置处,
免去我们每次编写同类程序都要将头文件中的语句重复编写。
在代码中加入头文件有两种书写方法,
分别为#include <reg52.h>和#include “reg52.h”,包含头文件时都不需要在后面加分号。
两种写法的区别如下:

1.当使用<>包含头文件时,编译器先进入到软件安装文件夹处开始搜索这个 头文件,也就是 KEILC51/C51/INC 这个文件夹下,
如果这个文件夹没有引用的头 文件,编译器将会报错。

2.当使用""包含头文件时,
编译器先进入到当前工程所在文件夹处开始搜索 该头文件,如果当前工程所在文件夹下没有该头文件,
编译器将继续回到软件安装文件夹处搜索这个头文件,若找不到该头文件,编译器将报错。

https://blog.51cto/990487026/1710519

单片机最小系统构成

(1)晶振电路

单片机正常工作需要一个时钟
因此就需要在其晶振引脚上外接晶振
(我们使用STC89CXX 单片机晶振引脚是 18 和 19 脚),
至于需要多大晶振这 就取决于你所使用的单片机,
由于我们使用的是 51 单片机,其时钟频率可在 0-40MHZ 上运行,
一般情况下我们建议选择 12M(适合计算延时时间)或者是 11.0592M(适合串口通信)。
若直接将此晶振接入单片机晶振引脚,会发现系统 工作不稳定,
晶振起振的一瞬间会产生一些电感,为了消除这个电感所 带来的干扰,
可以在此晶振两端分别加上一个电容,电容的选取需要无极性的, 另一端需要共地。
根据选取的晶振大小决定电容值,通常电容可在 10-33PF 值范 围内选取。
我们使用的是 33PF 电容。
这样一来就构成了晶振电路。只有保证晶 振电路稳定,单片机才能继续工作。

(2)复位电路

系统也有可能会出 现崩溃或者瘫痪状态。
单片机引脚当中就有一个 RST 复位引 脚,
而 STC89CXX 单片机又是高电平复位,
所以只需要让这个引脚保持一段时间 高电平就可以。
要实现此功能通常有两种方式,一种是通过按键进行手动复位,
还有一种是上电复位,即电源开启后自动复位。
手动复位是通过一个按键及电容 电阻所组成,利用按键的开关功能实现复位,按键按下后 VCC 直接进入到单片机 RST 引脚,松开后 VCC 断开,RST 被电阻拉为低电平。
这一合一开就实现了手动 复位。

而自动复位主要是利用 RC 充放电功能,电源已开启,由于电容隔直,
VCC 直接进入 RST,然后电容开始慢慢充电,直到充电完成,此时 RST 被电阻拉低。
这样就起到上电复位的效果。
这里我们采用手动复位。
不到系统崩溃,我们几乎 不会操作复位。
当按下按键 RSTK1,VCC 直接连接到 RST 复位脚,VCC 是高电平所以系统复位。

(3)电源电路

STC89CXX 单片机的工作电压是 3.3-5.5V 范围, 通常我们使用 5V 直流。
将电源接入到各芯片电源引脚即可。
预留了 P3(5V/3V)端子,这些端子可以很方便的给外部模块连 接电源。

(4)下载电路

程序要烧写到单片机内是通过上位机(PC 机)及对应的软件将编译器生成的 75 xxx.HEX 文件通过单片机串口写入进去。

我们知道现在的笔记本电脑没有 RS232 接口,
所以要使用 USB 转 TTL 串口电 平芯片来建立 PC 机和单片机数据传输通路。
通常使用 CH340G 或者 CH340C 芯片 来完成电平转换。
CH340G 需外接 12M 晶振,而 CH340C 内部自带晶振,所以可以 不接外部 12M 晶振。开发板上使用的是 CH340C 芯片。

一键自动下载电路,无需冷启动。
主要依靠上位机 软件(PZ-ISP)控制 CH340 芯片的 RTS 和 DTR 脚输出,
进而使 MOS 管 Q3 自动断 电后上电,完成冷启动工作。

USB1 接口即为程序下载接口,
D-和 D+连接到 CH340 芯片 的 D-和 D+,
然后 CH340 芯片的串口 TXD 和 RXD 管脚就连接到单片机的串口(P3.0、 P3.1)上,
这里不是直接连接到单片机串口,而是通过 P5 端子进行转接。

这样 做不仅可以让开发板 USB 接口下载程序,还可以让单片机串口不受 CH340 干扰, 这样开发板也可以当成 USB 转 TTL 模块使用,

该设计也是考虑 WIFI、蓝牙等模 块与串口通信不受干扰问题。
USB1 接口不仅可以作为程序下载口,还可以作为串口通信口,因为它本身就 是实现串口下载。

同时还可以作为电源供电口,可以看到 USB1 的管脚 1 就是 5V 电源脚,
所以开发板的可以直接使用 USB 线来供电,如果提供的 USB 线有问题,
可以使用安卓手机数据线,接口都是兼容的。
当电源开关打开后,电源指示灯 DP1 即会点亮,表明系统电源正常。

Keil uVision 5-C51和MDK-ARM共存












解决中文注释 ??? 的问题




外部中断 and 定时器中断

1.什么是中断

中断就是指CPU正在执行一项任务A,
然后突然停止任务A去执行任务B,
执行完任务B再回来继续执行任务A的过程。

中断跟硬件有关。可以说是硬件来让单片机中断。

2.中断有什么用

1.中断能让CPU同时执行多项任务,
例如CPU在执行流水灯程序,
就无法执行 按下按键时,蜂鸣器发声了。

2.当然上面的例子可以用软件轮询检擦案件是否按下来实现,
但这样就消耗了CPU一部分资源来轮询检测
按键是否有按下了,所以中断的另一个优点就是
节省CPU资源

3.双重功能的P3引脚

由最小系统板的原理图可知,
P3.0~P3.7的引脚对应着
RXD,TXD,INTO,INT1,T0,T1等,
说明P3引脚既是 I/O口,
由有别的功能,这个功能就是中断功能。

4.8051中断体系

8051的单片机有
5个中断源,2个优先级

由上图可知,
INT0是通过引脚P3.2,
INI1时通过引脚P3.3,
定时器T0和T1是 引脚P3.4和P3.5

中断源:
INT0(外部中断0),
INT1(外部中断1),
T0(定时器0),T1(定时器1),
RXD和TXD(同属串口中断)

中断相关的特殊寄存器:

(1)中断允许控制寄存器(IE)--------控制各中断的开放和屏蔽

(2)定时器/计数器控制寄存器(TCON)-------定时器和外部中断的控制

(3)串行口控制寄存器(SCON)-------串行中断的控制

(4)中断优先级控制寄存器(IP)-------设置各中断的优先级

各寄存器的控制范围如下图:

从上图可看出从中断源产生请求
到请求进入CPU的过程:

以INT0为例,INT0产生中断源,
经过TCON寄存器中的IT0为选择是下边沿触发
还是
低电平触发的中断请求 (当然IT0是程序人工设置的),

当中断请求到达IE0的时候,
IE0会被硬件置1(当CPU响应此中断请求时,IE0被硬件置0),
然后就到 IE寄存器的地方了,
EX0是外部中断INT0的开关,
而 EA 是所有中断的总开关,这都由 IE寄存器控制,
最后经过 IP寄存器
设置优先级,这个一般比较少用,
默认的优先级为,INT0 > T0 > INT1 > T1 >串口中断。
最后把中断请求传给CPU。

5.中断特寄存器

TCON寄存器


IE寄存器

EA:中断的总开关,EA=1才能允许中断传给CPU

ES:串行口中断开关

ET1:定时器1中断开关

EX1:外部中断1开关

ET0:定时器0中断开关

EX0:外部中断0开关

IP优先级寄存器
(对应为设置成1说明优先级设置成高,8051只有高低两种优先级)

6.中断的优先级

8051只有高低两种优先级,
默认下优先级从高到低:INT0 > T0 > INT1 > T1 > 串行中断。

1.高优先级的中断可以打断低优先级的中断。

2.正在响应的中断,不能被同级或者低级的中断打断。

3.同时发生几个中断,先响应优先级高的中断

7.中断服务程序的编写

中断服务程序就是中断发生后,CPU去执行的函数。

1.中断服务函数没有返回值

2.中断服务函数不能传入参数

例如:

void  函数名 (void)  interrupt  x  using  y

{



}
 

x 范围为0~4,分别代表5个中断源,例如外部中断INT0就是0,T0就是1,INT1就是2,T1就是3,串行中断就是4

y 的范围为0~3,分别表示4组工作寄存器,不写就用0. 不写也可以

8.外部中断实现代码

 #include<reg52.h>
sbit LED=P1^0;
void main()
{
	IT0=0;  //中断触发方式为低电平触发,IT0=1则为下边沿触发
	EX0=1;  //打开外部中断0
	EA=1;    //打开中断总开关
	while(1)
	{
		LED=1;   //在没有中断发生时,LED关闭
	}
}
 
void INTERR(void) interrupt 0
{
	LED=0;//有中断发生时,LED亮起
}

把开发板的
P3.2用杜邦线接到GND上,
就会触发中断,发现LED亮起来了。
(为什么是P3.2?因为由最上面的原理图可知道INT0的引脚是P3.2)

9.定时器/计数器中断工作原理

1.由最上面的最小系统原理图可以看出,
定时器T0和T1分别对应的引脚是P3.4和P3.5

2.定时器/计数器 的
计数脉冲来源可以有两个,
一个是芯片内部晶振振荡器输出脉冲12分频后的脉冲,
一个是从外部接入的外部脉冲

3.TLx和THx寄存器,x=0,1。

以TL0和TH0为例,
TL0和TH0 都是8位寄存器(8051的寄存器都是8位),
所以TL0和TH0形成高八位和低八位寄存器,用于计数,一共16位。

2^16=65536,
所以 TL0和TH0加一起最大能计数的值是0~65536,一共65536.

4.定时器/计数器的两个寄存器:
TCON和TMOD,
其中TCON用于开启定时器/计数器中断,
TMOD用于设置定时器/计数器的工作方式(TCON上面 已经说过了)

TMOD寄存器:


(由图:低八位为定时器T0,高八位为定时器T1)

GATE:门控制。

当GATE=1:
INTx引脚为高电平且TRx 要同时为1,定时器Tx才启动。

当GATE=0:
只要TRx =1,定时器Tx就启动,不用理会INTx引脚的电平高低。

C/T:决定是使用 定时功能,还是 计数功能

当C/T=0:
定时功能。加1计数器
对芯片晶振12分频的脉冲计数,一个脉冲过来,就加一,直到 TFx 加满了溢出。
(TFx在TCON寄存器中)

当C/T=1:
计数功能。加1计数器
对来自输入引脚T0(P3.4)或T1(P3.5)的外部脉冲进行计数,
一个脉冲加一,直到TFx加满溢出。

10.定时器/计数器定时数值的计算

例:
我要定时10ms。晶振频率是12M,
工作模式在方式1

f = 12M/12 =1M (因为要12分频),
也就是说 1秒 1000000个机器周期,
10ms有10000个机器周期。

65536 - 10000 = 55536 ,意思是
计数器从65536 一直减到 55536 所用的时间就是10ms。

55536的十六进制是0xD8F0

所以设置
TH0 = 0XD8,TL0=0XF0

下面给出代码

或者直接下载一个C51定时器计算器:


定时器/计数器代码

 #include<reg52.h>
sbit LED0=P1^0;
unsigned char i;
 
void main()
{
	TMOD=0X01;  //设置使用定时器0,16位的定时/计数寄存器
	TL0=0xD8;    //低八位赋初值
	TH0=0XF0;    //高八位赋初值
	ET0=1;          //开启定时器0中断
	TR0=1;         //运行定时器0
	EA=1;          //开启中断总开关
	while(1);
}
 
void Delay(void) interrupt 1 using 0
{
	i++;
	TR0=0;           //进入中断函数时,关闭定时器
	TL0=0XD8;    //重新赋初值
	TH0=0XF0;
	if(i==20)        //因为10ms一次处罚看不出明显结果,所以让20次触发才让灯变一次
	{
		LED0=~LED0;
	}
	TR0=1;     //重新开启定时器
}

本文标签: 知识点 单片机