51单片机

51单片机 | 定时/计数器原理及结构(T0和T1)

生来就可爱ヽ(ⅴ<●) 提交于 2020-02-21 01:06:06
———————————————————————————————————————————— 定时 / 计数器结构(T0和T1) 16 位寄存器T0、T1分别由TH0、TL0和TH1、TL1四个8位计数器组成 定时器的区别: T0可分成2个独立的8位定时器,而定时器1则不能; T1可作为串口的波特率发生器,而定时器0则不能。 工作原理 用途:定时器和计数器 核心:加 1 计数器 原理:每来一个脉冲则加 1 计数器加 1 ,当加到全 1 时再来一个脉冲使加 1 计数器归零,同时加 1 计数器的溢出使TCON寄存器中的TF0(或TF1)置1,向CPU发出中断请求 脉冲来源: 定时器:脉冲来源是由系统的时钟晶振器输出脉冲源提供 计数器:脉冲来源是由T0或T1引脚(P3.4或P3.5)输入的外部脉冲源提供 注:T0或T1都不能同时既做定时器也做计数器 补充: 计数器工作原理: 用作计数器时,对T0或T1引脚的外部脉冲计数,如果前一个机器周期采样值为1,后一个机器周期采样值为0 ,则说明有一个脉冲,计数器加1。 在每个机器周期的 S5P2 期间采样引脚输入电平。新的计数初值于下一个机器周期的 S3P1 期间装入计数器。 此种方式需要两个机器周期来检测一个1->0负跳变信号,因此最高的计数频率为时钟频率的1/24。 S5P2: S5P2指的是第5个时钟周期的相位2。

51单片机putchar函数的说明

落花浮王杯 提交于 2020-02-03 15:50:59
原文 排版远些乱,整理了一下。 1 #include <reg51.h> 2 3 #define XON 0x11 /*串口流控制符 启动*/ 4 #define XOFF 0x13 /*串口流控制符 中断*/ 5 6 /* putchar (full version): expands '\n' into CR LF and handles 完整版 每次发送数据都要检查sbuf是否有中断信号 7 *XON/XOFF (Ctrl+S/Ctrl+Q) protocol XON启动 XOFF中断 通信协议*/ 8 char putchar (char c) 9 { 10 if (c == '\n') /*判断是否是换行符的原因,是因为字符串的标准格式是末尾为\r(回车符)\n(换行符)这两个字符*/ 11 { 12 if (RI)          /*判断接收标识符是否为1,若为1则说明SBUF接受到了信息*/ 13 { 14 if (SBUF == XOFF)  /*判断SBUF中的信息是否为中断信号 是则执行以下程序*/ 15 { 16 do 17 { 18 RI = 0; /*将接收标识符置1 可以继续接收信息*/ 19 while (!RI); /*判断是否接收到了信息,是则往下循环*/ 20 }while (SBUF != XON); /*判断接收的信息是否为启动信息

新概念51单片机C语言教程纠错(2)

自古美人都是妖i 提交于 2020-01-28 17:46:34
emmmmmmm,过年期间没怎么学51,最近几天被肺炎吓到了家里,才想起来拿起书本看一看,这一次的课本错误在按键部分,仍是郭天祥的《新概念51单片C语言教程》。 课本P82中间的例4.1.1给我们介绍了按键的用法,但是例子跑出来的仿真让人哭笑不得。下面上图!!P1是上电状态,P2是按动按键状态。 主要的现象是,在刚刚上电时点亮了两个数码管,而且没有什么具体意义,在按下按键时,可以实现数字加一(按动LCDEN),但是松开按键就会变成刚刚上电的样子。 在书中的代码示例是(左侧),更改后代码为右侧: 郭天祥代码的意思是,先打开数字锁存器(dula=1),然后输入数字(P0=table[]),再打开位置锁存器,把显示数字的位置移动,以便放入个位数字,这个想法是正确的。但是我们看到,郭先把数字放了进去,再去打开数位锁存器,这就造成了个位数挤到十位数,十位数初始没地放的情况,因而其仿真上电后是一团乱麻,只有在按着按键提供num时,程序才会正常工作。 右侧代码的改进之处是:先消影,打开数位锁存器,不会让十位数被挤走;这样就做到了“数有其位”,同时保证上电数字正确。 视频是修改代码后的演示。按动第一个按键实现加一,第二个减一,第三个清零,第四个基于单片机时钟实现每秒加一。 CSDN视频1 附:亲测可用的TX-1C开发板proteus仿真文件和几个跑过可用的hex文件。 欢迎下载:https:/

单片机定时器总结

[亡魂溺海] 提交于 2020-01-25 02:54:39
单片机定时器的使用可以说非常简单,只要掌握原理,有一点的C语言基础就行了。要点有以下几个: 1. 一定要知道英文缩写的原形,这样寄存器的名字就不用记了。 理解是最好的记忆方法。好的教材一定会给出所有英文缩写的原形。 2. 尽量用形像的方法记忆。 比如TCON和TMOD两个寄存器各位上的功能,教程一般有个图表,你就在学习中不断回忆那个图表的形像。 3. TMOD:定时器/计数器模式控制寄存器(TIMER/COUNTER MODE CONTROL REGISTER) 定时器/计数器模式控制寄存器TMOD是一个逐位定义的8位寄存器,但只能使用字节寻址,其字节地址为89H。其格式为:其中低四位定义定时器/计数器C/T0,高四位定义定时器/计数器C/T1,各位的说明: (1)GATE——门控制。 GATE=1时,由外部中断引脚INT0、INT1来启动定时器T0、T1。 当INT0引脚为高电平时TR0置位,启动定时器T0; 当INT1引脚为高电平时TR1置位,启动定时器T1。 GATE=0时,仅由TR0,TR1置位分别启动定时器T0、T1。 (2)C/T——功能选择位 C/T=0时为定时功能,C/T=1时为计数功能。 置位时选择计数功能,清零时选择定时功能。 (3)M0、M1——方式选择功能 由于有2位,因此有4种工作方式: M1M0 工作方式 计数器模式 TMOD(设置定时器模式) 0 0

APP同过ESP8266与51单片机通信

假如想象 提交于 2020-01-24 14:45:48
APP通过ESP8266与单片机通信 简述 本项目中是用ESP8266作为热点,工作在MODE2模式,手机作为station接入ESP8266的网络进行数据传输,同时,ESP8266与52单片机之间通过串口进行数据传输。 本项目中只需要APP向WIFI发送数据,所以在APP的程序中没有接收WIFI数据的程序。在文章最后,则是笔者在写代码的过程中遇到的一个问题,51单片机不能接收WIFI数据,但能向WIFI发送AT指令的问题。 手机端实现 建立连接线程 以下为APP与ESP8266建立连接的线程,建立连接时只要获取其对象即可。其中的IP和port为ESP8266的IP地址和端口号,IP一般默认为192.168.0.1,端口号默认为8080,端口号可以自己设置。 private class ConnectThred extends Thread{ private String ip; private int port; public ConnectThred(String ip,int port){ this.ip = ip; this.port = port; } public void run(){ //接收数据可用子线程也可直接在此线程操作 char[] buffer=new char[256];//定义数组接收输入流数据 String bufferString="";/

51单片机流水灯

安稳与你 提交于 2020-01-09 23:54:49
三种方法实现流水灯 1.位输出操作 流程图 Created with Raphaël 2.2.0 开始 开发板初始化 LED0亮一秒后熄灭 LED1亮一秒后熄灭 LED2亮一秒后熄灭 LED3亮一秒后熄灭 LED4亮一秒后熄灭 LED5亮一秒后熄灭 LED6亮一秒后熄灭 LED7亮一秒后熄灭 代码 //位操作输出 # include <reg52.h> # define uint unsigned int # define on 0 # define off 1 sbit LED0 = P1 ^ 0 ; sbit LED1 = P1 ^ 1 ; sbit LED2 = P1 ^ 2 ; sbit LED3 = P1 ^ 3 ; sbit LED4 = P1 ^ 4 ; sbit LED5 = P1 ^ 5 ; sbit LED6 = P1 ^ 6 ; sbit LED7 = P1 ^ 7 ; void delay ( uint xms ) //延时约xms毫秒 { uint i , j ; for ( i = xms ; i > 0 ; i -- ) for ( j = 112 ; j > 0 ; j -- ) ; //分号代表跑空,for语句不需要分号,112次表示一毫秒 } void main ( ) { while ( 1 ) { LED0 = on ; //P1^0=0;

51单片机复习:DS18B20

北战南征 提交于 2019-12-31 19:57:24
DS18B20温度传感器:(初始化,写字节,读字节,发送温度转换命令,发送读取温度命令,读取温度) 1.一些注意点: .适应电压范围更宽,电压范围:3.0~5.5V .测温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃ .可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃ 和0.0625℃,可实现高精度测温。 .在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms 内把温度值转换为数字,速度更快。(非常显然,分辨率越高,也就意味着精度越高,肯定耗费时间更多啦) .这里特别需要注意的是,DS18B20采用的是单总线 .注意不要接反 2.内部结构: .64位激光刻只读寄存器(rom) 64位光刻ROM的排列是:开始8位(28H)是产品类型标号(产品什么类型的),接着的48位是该DS18B20自身的序列号 (有了序列号同一类型就分得清了), 最后8位是前面56位的循环冗余校验码(也就是CRC,对通信的可靠性检查就需要‘校验’, 校验是从数据本身进行检查,它依靠某种数学上约定的形式进行检查,校验的结果是可靠或不可靠, 如果可靠就对数据进行处理,如果不可靠,就丢弃重发或者进行修复。)。 光刻ROM的作用是使每一个DS18B20都各不相同, 这样就可以 实现一根总线上挂接多个DS18B20的目的。 .温度转换规则

51单片机bit、sbin、sfr、sfr_16有什么区别?

南笙酒味 提交于 2019-12-20 23:12:42
51单片机bit、sbin、sfr、sfr_16区别分析 1.bit和sbit都是C51扩展的变量类型。 bit和int char之类的差不多,只不过char=8位, bit=1位而已。都是变量,编译器在编译过程中分配地址。除非你指定,否则这个地址是随机的。这个地址是整个可寻址空间,RAM+FLASH+扩展空间。bit只有0和1两种值,意义有点像Windows下VC中的BOOL。 sbit是对应可位寻址空间的一个位,可位寻址区:20H~2FH。一旦用了sbi xxx = REGE^6这样的定义,这个sbit量就确定地址了。sbit大部分是用在寄存器中的,方便对寄存器的某位进行操作的。 2.bit位标量 bit位标量是C51编译器的一种扩充数据类型,利用它可定义一个位标量,但不能定义位指针,也不能定义位数组。它的值是一个二进制位,不是0就是1,类似一些高级语言中的Boolean类型中的True和False。 3.sfr特殊功能寄存器 sfr也是一种扩充数据类型,点用一个内存单元,值域为0~255。利用它可以访问51单片机内部的所有特殊功能寄存器。如用sfr P1 = 0x90这一句定P1为P1端口在片内的寄存器,在后面的语句中我们用以用P1 = 255(对P1端口的所有引脚置高电平)之类的语句来操作特殊功能寄存器。 sfr P1 = 0x90; //定义P1 I/O 口,其地址90H

C51学习笔记

筅森魡賤 提交于 2019-12-15 21:03:36
一, C51内存结构深度剖析 二, reg51.头文件剖析 三, 浅淡变量类型及其作用域 四, C51常用头文件 五, 浅谈中断 六, C51编译器的限制 七, 小淡C51指针 八, 预处理命令 一,C51内存结构深度剖析 在编写应用程序时,定义一个变量,一个数组,或是说一个固定表格,到底存储在什么地方; 当定义变量大小超过MCU的内存范围时怎么办; 如何控制变量定义不超过存储范围; 以及如何定义变量才能使得变量访问速度最快,写出的程序运行效率最高。以下将一一解答。 1 六类关键字(六类存储类型) data idata xdata pdata code bdata code: code memory (程序存储器也即只读存储器)用来保存常量或是程序。code memory 采用16位地址线编码,可以是在片内,或是片外,大小被限制在64KB 作用:定义常量,如八段数码表或是编程使用的常,在定义时加上code 或明确指明定义的常量保存到code memory(只读) 使用方法: char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; 此关键字的使用方法等同于const data data memory (数据存储区)只能用于声明变量,不能用来声明函数,该区域位于片内,采用8位地址线编码

单片机期末复习

心不动则不痛 提交于 2019-12-05 18:17:55
一、硬件结构 1.1部分引脚说明 RST:复位引脚,两个机器周期的高电平后复位 ALE:锁存低八位地址 EA:高电平时,访问内部程序存储器(ROM) P0:双向IO口、分时复用-低八位地址,数据总线 P1:双向IO口 P2:双向IO口,访问外部存储器时,提供高八位地址总线 P3:双向IO口,有第二功能 1.2存储器 物理上分为:4 个空间 即片内ROM、 、 片外ROM(程序存储器) 片内RAM、 、 片外RAM(数据存储器) 逻辑上分为: : 3 个空间 , 程序内存(ROM) ( 片内 、 外 ) 统一编址 MOVC 数据存储器 ( 片内) ) MOV 数据存储器(片外) MOVX 1.2.1程序存储器(ROM 作用:存储用户程序和表格常数 特殊单元: 0000H:复位后从这里开始执行程序 中断单元: 外中断0 (INT0 ) 0003H 定时器0 (T0 ) 000BH 外中断1 (INT1 ) 0013H 定时器1 (T1 ) 001BH 串行口(UART ) 0023H 1.2.2内部数据存储器(RAM 通用工作寄存器组 00~1FH共32个,四组通用寄存器,即(四组R0~R7) 可以使用RS1(PSW.4)RS0(PSW.3)来切换寄存器区 RS1 RS0 寄存器区 内存地址 00 0区 00-07H 01 1区 08-0FH 10 2区 10-17H 11 3区 18