开发STC89C51系列单片机需要的单片机技术
- 端口操作:控制单片机的输入输出端口,与外界进行通信。
- 中断优先级:当多个中断同时发生时,确定哪个中断优先级更高,优先响应。
- 时钟模块:控制单片机的时钟,可以精确计时。
- PWM技术:实现模拟信号输出,例如控制电机的转速。
- ADC技术:实现模拟信号采集,例如读取温度传感器的数据。
1. 端口操作
在单片机开发中,我们经常需要控制单片机的输入输出端口,与外界进行通信。STC89C51系列单片机共有4个I/O口,每个口下面有8个引脚,分别为P0、P1、P2和P3。其中,P0口的为普通I/O口,P2口的07引脚为普通I/O口,P3口的03引脚为普通I/O口,P3口的4~7引脚为双重功能管脚,可以作为外部中断、定时器/计数器、串口等功能使用。
在C语言中,控制单片机端口的操作需要使用特殊的语句和函数,这里我们介绍几个常用的方法:
1.1. 设置端口方向
在使用单片机的I/O口之前,需要先设置端口方向,即设置引脚是输入还是输出。STC89C51系列单片机的I/O口默认为输出,如果需要将其设置为输入,则需要使用以下语句:
P1 = P1 | 0x80; //将P1.7引脚设置为输入
其中,0x80表示二进制的10000000,即将P1口的第7个引脚(从右向左数)设置为1,即输入模式。如果需要将某个引脚设置为输出模式,则需要将对应的位设置为0:
P1 = P1 & 0x7F; //将P1.7引脚设置为输出
其中,0x7F表示二进制的01111111,即将P1口的第7个引脚(从右向左数)设置为0,即输出模式。
1.2. 读取端口状态
在使用单片机的I/O口时,需要读取端口的状态,判断其是高电平还是低电平。可以使用以下语句:
if (P1 & 0x80) //判断P1.7引脚是否为高电平
{//如果是高电平,则执行某些操作
}
else
{//如果是低电平,则执行其他操作
}
其中,&是按位与运算符,用于将P1口的状态和0x80进行按位与运算,结果为1表示P1.7引脚为高电平,结果为0表示P1.7引脚为低电平。
1.3. 控制端口状态
在使用单片机的I/O口时,还需要控制端口的状态,将其设置为高电平或低电平。可以使用以下语句:
P1 = P1 | 0x80; //将P1.7引脚设置为高电平
其中,|是按位或运算符,用于将P1口的状态和0x80进行按位或运算,将P1.7引脚的状态设置为1,即高电平。如果需要将P1.7引脚设置为低电平,则需要将对应的位设置为0:
P1 = P1 & 0x7F; //将P1.7引脚设置为低电平
其中,&是按位与运算符,用于将P1口的状态和0x7F进行按位与运算,将P1.7引脚的状态设置为0,即低电平。
1.4. 实现按键检测
在单片机开发中,常常需要实现按键检测功能。可以将按键连接到单片机的某个引脚上,然后使用下降沿触发的方式检测按键按下事件。下面是一个简单的示例代码,用于检测P3.2引脚上的按键是否按下:
#include <STC89C5xRC.H>void main()
{P3 = P3 | 0x04; //将P3.2引脚设置为输入while (1){if ((P3 & 0x04) == 0) //检测P3.2引脚是否为低电平{delay(10); //延时一段时间,以消除按键抖动if ((P3 & 0x04) == 0) //再次检测P3.2引脚是否为低电平{//执行按键按下操作}}}
}
其中,delay()函数是用于延时的自定义函数,具体实现方法可以参考第3节。这段代码中,首先将P3.2引脚设置为输入模式,然后在一个无限循环中不断检测P3.2引脚的状态。如果P3.2引脚为低电平,说明按键被按下,此时需要再次检测P3.2引脚的状态,以消除按键抖动。如果再次检测到P3.2引脚为低电平,则说明按键按下事件发生,此时可以执行相应的操作。
2. 中断处理
中断是单片机开发中的重要概念,可以让单片机在执行程序的过程中立即响应某些事件,并执行相应的操作。在STC89C51系列单片机中,有多种中断类型可供选择,包括外部中断、定时器/计数器中断、串口中断等。
下面我们将介绍如何使用C语言编写中断处理程序,并实现定时器中断、外部中断和串口中断等常见功能。
2.1. 定时器/计数器中断
STC89C51系列单片机内置了两个定时器/计数器,分别为Timer0和Timer1。这两个定时器/计数器可以用于生成定时中断,实现周期性任务的处理。
下面是一个示例代码,用于设置Timer0为10ms定时器,并在定时器中断中执行相应的操作:
#include <STC89C5xRC.H>void Timer0_init()
{TMOD = TMOD & 0xF0; //将T0的工作方式设置为模式1TMOD = TMOD | 0x01;TH0 = 0x3C; //设置初值,定时10msTL0 = 0xB0;ET0 = 1; //使能Timer0中断TR0 = 1; //启动Timer0EA = 1; //全局中断使能
}void Timer0_interrupt() interrupt 1
{//执行定时器中断操作
}void main()
{Timer0_init();while (1){//执行主程序操作}
}
这段代码中,首先定义了一个名为Timer0_init()的函数,用于初始化Timer0,并将其设置为10ms定时器。在Timer0_init()函数中,首先将T0的工作方式设置为模式1,然后设置初值为0x3CB0,使Timer0每10ms产生一次中断。接着使能Timer0中断和全局中断使能,并启动Timer0。
在主函数中,首先调用Timer0_init()函数进行初始化操作,然后进入一个无限循环,执行主程序操作。当Timer0产生定时中断时,会自动跳转到名为Timer0_interrupt()的中断处理函数中执行相应的操作。
2.2. 外部中断
STC89C51系列单片机共有4个外部中断,分别为INT0、INT1、INT2和INT3。这些外部中断可以用于检测外部事件的发生,如按键按下、传感器触发等。
下面是一个示例代码,用于设置INT0为下降沿触发外部中断,并在中断处理函数中执行相应的操作:
#include <STC89C5xRC.H>void INT0_init()
{IT0 = 1; //将INT0设置为下降沿触发EX0 = 1; //使能INT0中断EA = 1; //全局中断使能
}void INT0_interrupt() interrupt 0
{//执行INT0中断操作
}void main()
{INT0_init();while (1){//执行主程序操作}
}
这段代码中,首先定义了一个名为INT0_init()的函数,用于初始化INT0,并将其设置为下降沿触发外部中断。在INT0_init()函数中,将IT0设置为1,表示将INT0设置为下降沿触发;然后使能INT0中断和全局中断使能。
在主函数中,首先调用INT0_init()函数进行初始化操作,然后进入一个无限循环,执行主程序操作。当INT0触发外部中断时,会自动跳转到名为INT0_interrupt()的中断处理函数中执行相应的操作。
2.3. 串口中断
STC89C51系列单片机内置了一个UART串口通信模块,可以通过串口发送和接收数据。在使用串口通信时,常常需要使用中断来实现异步通信。
下面是一个示例代码,用于设置串口为异步通信模式,并在串口中断中执行相应的操作:
#include <STC89C5xRC.H>void UART_init()
{SCON = 0x50; //设置串口为异步通信模式,波特率为9600TMOD = TMOD & 0x0F; //将T1的工作方式设置为模式2TMOD = TMOD | 0x20;TH1 = 0xFD; //设置波特率,实际波特率为9600TL1 = 0xFD;ET1 = 0; //禁止T1中断,使能串口中断ES = 1; //使能串口中断EA = 1; //全局中断使能
}void UART_interrupt() interrupt 4
{//执行串口中断操作
}void main()
{UART_init();while (1){//执行主程序操作}
}
这段代码中,首先定义了一个名为UART_init()的函数,用于初始化UART串口,并将其设置为异步通信模式。在UART_init()函数中,首先将SCON寄存器设置为0x50,表示设置串口为异步通信模式,波特率为9600。然后将T1的工作方式设置为模式2,并设置TH1和TL1的初值,使串口实际波特率为9600。接着禁止T1中断,使能串口中断和全局中断使能。
在主函数中,首先调用UART_init()函数进行初始化操作,然后进入一个无限循环,执行主程序操作。当串口收到数据时,会自动跳转到名为UART_interrupt()的中断处理函数中执行相应的操作。
- 结论
本文介绍了STC89C51系列单片机的基本概念和常用编程技术,包括GPIO、中断和定时器/计数器等。这些技术是开发STC89C51系列单片机的基础,掌握这些技术可以有效提高单片机开发的效率和质量。
当然,本文只是介绍了STC89C51系列单片机的基本概念和常用编程技术,并不能涵盖所有单片机开发所需要的知识,读者还需要进一步学习和掌握其他相关知识。例如,可以深入了解单片机的存储器结构和地址映射机制,了解如何使用定时器/计数器来实现PWM控制和周期性任务调度,了解如何使用ADC模块进行模拟信号采集等。
另外,需要注意的是,本文中的代码仅供参考,实际开发中需要根据具体需求进行修改和优化。同时,在编写单片机程序时,还需要注意编写高效、可靠的代码,避免出现死循环、内存泄漏等问题,确保程序的稳定性和可靠性。
总之,STC89C51系列单片机是一款功能强大、易于学习的单片机,掌握它的基本概念和常用编程技术可以为单片机开发带来很大的便利和效率提升。希望本文能够为读者在学习和使用STC89C51系列单片机时提供一些帮助和参考。
相关文章:
开发STC89C51系列单片机需要的单片机技术
端口操作:控制单片机的输入输出端口,与外界进行通信。中断优先级:当多个中断同时发生时,确定哪个中断优先级更高,优先响应。时钟模块:控制单片机的时钟,可以精确计时。PWM技术:实现模…...
分布式键值存储是什么?(分布式键值存储大值)
文章目录 什么是分布式键值存储?分布式键值存储“大值”指什么? 什么是分布式键值存储? 分布式键值存储是一种分布式数据存储系统,它将数据存储为键值对的形式,并将这些键值对分散在多个节点上。每个节点都可以独立地…...
多线程(线程同步和互斥+线程安全+条件变量)
线程互斥 线程互斥: 任何时刻,保证只有一个执行流进入临界区访问临界资源,通常对临界资源起到保护作用 相关概念 临界资源: 一次仅允许一个进程使用的共享资源临界区: 每个线程内部,访问临界资源的代码&am…...
Flutter学习——开发Flutter需要的技能
第二章 Flutter开发所需要掌握的知识 文章目录 第二章 Flutter开发所需要掌握的知识前言一、开发语言Dart语言Android/Ios知识 二、组件学习三、调试与性能优化总结 前言 上一章,介绍了Flutter的来源和平台支持及特点,这一章,来梳理一下学习…...
SPSS如何进行因子分析和主成分分析之案例实训?
文章目录 0.引言1.因子分析2.主成分分析 0.引言 因科研等多场景需要进行数据统计分析,笔者对SPSS进行了学习,本文通过《SPSS统计分析从入门到精通》及其配套素材结合网上相关资料进行学习笔记总结,本文对因子分析和主成分分析进行阐述。 1.因…...
图标字体与HTML转义字符:网页设计中的两个关键概念
在网页设计中,图标字体和HTML转义字符是两个重要的概念。图标字体用于显示网页的图标,可以让用户更加直观地理解网页的内容。而HTML转义字符则用于在网页中插入特殊的字符,以保证网页的安全性和可读性。 一、图标字体 在网页中显示图标&#…...
Elasticsearch详解
文章目录 概览使用与ES交互索引创建索引查询索引删除文档创建修改文档局部修改文档查询文档删除全查询 整合SpringBootpom依赖application.ymlElasticsearchAutoConfigurationElasticsearchPropertiesElasticsearchConstantPersonSearchPageHelperPersonServiceBaseElasticsear…...
学习笔记(13)网络基础
目录 1,get与post的区别2,JSON解析2.1,JSON.stringify2.2,JSON.parse 3,cookie3.1,set方法3.2,cookie方法用于设置响应头, 4,http模块4.1,请求报文和响应报文…...
LeertCode 134 加油站
题目: 在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。给定两个整数数组 …...
python文件操作的基本流程
引入 程序运行过程中产生的数据会保存到内存中,如果想要永久保存下来,就必须将数据存放在硬盘上,应用程序如果想要操作计算机的硬件就必须通过操作系统,文件就是操作系统提供给应用程序来操作硬盘的虚拟概念,应用程序…...
1. 两数之和
原题链接: 1. 两数之和 https://leetcode.cn/problems/two-sum/ 完成情况: ##1. n 2 n^2 n2复杂度 2.HashMap进行优化 3.空间换时间方法 即,构建一个 1 0 − 9 10^-9 10−9 到 1 0 9 10^9 109这个大的数组,然后把数填进去&…...
操作系统:06 进程通信
1 基本概念 进程间通信是指两个或多个进程之间交互数据的过程,因为进程之间是相互独立的,为了协同工作必须进行进程间交互数据 2 进程间通信的分类 2.1 简单的进程间通信: 信号(携带附加数据)、文件、命令行参数、环境变量表 2.2 传统的进…...
WRF模式
随着生态文明建设和“碳中和”战略的持续推进,我国及全球气候变化及应对是政府、科学界及商业界关注的焦点。气候是多个领域(生态、水资源、风资源及碳中和等问题)的主要驱动因素,合理认知气候变化有利于解释生态环境变化机理及过…...
2直接连接的网络与VLAN划分【实验】【计算机网络】
2直接连接的网络与VLAN划分【实验】【计算机网络】 前言推荐2直接连接的网络与VLAN划分2.1共享式以太网和交换式以太网实验目的实验内容及实验环境实验原理共享式以太网交换式以太网 实验过程搭建实验环境初始化序训练操作共享式以太网-操作交换式以太网查看共享式以太网冲突查…...
【Linux0.11代码分析】04 之 head.s 启动流程
【Linux0.11代码分析】04 之 head.s 启动流程 一、boot/head.s 系列文章如下: 系列文章汇总:《【Linux0.11代码分析】之 系列文章链接汇总(全)》 . 1.《【Linux0.11代码分析】01 之 代码目录分析》 2.《【Linux0.11代码分析】02 之…...
自动化测试和selenium的使用
目录 自动化测试定义 为什么选择selenium来作为我们web自动化测试的工具? 自动化测试定位元素 使用cssSelector定位 使用XPath 定位 操作测试对象 模拟手动从键盘输入 点击对象 获取页面文本 清除对象输入的文本内容 添加等待(三种方式&#…...
Ubuntu常用终端操作
终端快捷键 打开 Ctrlaltt:打开终端(默认路径为家目录) Ctrlshiftn:打开终端(与当前终端处于同一路径下) Ctrlshiftt:打开终端(在大终端下面创建小终端) alt数字 关闭 exitCtrld 窗口切换 …...
Spring Security 6.x 系列【34】认证篇之前后端分离场景下的集成方案
有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.0.4 本系列Spring Security 版本 6.0.2 源码地址:https://gitee.com/pearl-organization/study-spring-security-demo 文章目录 1. 前言2. 案例演示2.1 未认证2.2 认证成功2.3 认证失败2.4 权限不足2.5 注…...
Qt之QTextToSpeech 让你的应用程序说话
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言QTextToSpeech基础使用1.创建一个QTextToSpeech对象2.朗读文字3.朗读文件和状态信息4.设置QTTS(QTextToSpeech)属性5.输出支持区域的设置列表、语言6.实现小数点朗读QTextToSpeech项目(练习)…...
为什么程序员喜欢用Linux?
Linux哪些行业在运用? Linux系统运用极其广泛,不少用户只知道windows,是因为,Linux的运用主要是在企业端。现在科技极其发达,我们手机在手,就能干很多事情,只需点一点屏幕,轻松完成…...
leetcode 598. 范围求和 II
题目描述解题思路执行结果 leetcode 598. 范围求和 II 题目描述 范围求和 II 给你一个 m x n 的矩阵 M ,初始化时所有的 0 和一个操作数组 op ,其中 ops[i] [ai, bi] 意味着当所有的 0 < x < ai 和 0 < y < bi 时, M[x][y] 应该…...
javaweb前置知识
1.CSS CSS的角色:页面显示的美观风格CSS的基础语法:标签样式;类样式;ID样式;组合样式;嵌入式样式表;内部样式表;外部样式表盒子模型:border、margin、padding定位和浮动…...
基于微信小程序的酒店预定管理系统设计与实现
第1章 绪论 1 1.1开发背景与意义 1 1.2开发方法 1 1.3论文结构 1 2系统开发技术与环境 3 2.1 系统开发语言 3 2.2 系统开发工具 3 2.3 系统页面技术 3 2.4 系统数据库的选择 4 2.5 系统的运行环境 4 2.5.1 硬件环境 4 2.5.2 软件环境 4 3系统分析 5 3.1可行性分析 5 3.1.1 经济…...
26. Service——深入学习
本章讲解知识点 Service 会话保持机制Service 的多端口设置Service 支持的网络协议Kubernetes 的服务发现机制Headless ServiceEndpoint Slices这一节我们来讲讲 Service 更多细节 1. Service 会话保持机制 Service 支持通过设置 sessionAffinity 实现基于客户端 IP 的会话保…...
【算法】Check If Word Is Valid After Substitutions 检查替换后的词是否有效
文章目录 Check If Word Is Valid After Substitutions 检查替换后的词是否有效问题描述:分析代码 Tag Check If Word Is Valid After Substitutions 检查替换后的词是否有效 问题描述: 给你一个字符串 s ,请你判断它是否 有效 。 字符串 s…...
基于jenkinsfile布置java工程
需求 通过jenkins发布java项目到服务器 预备环境 项目地址: https://gitee.com/asaland/sb-docker-appJenkins 2.387.3 通过Jenkinsfile实现方式 jenkins ui 配置pipeline 什么是pipeline? 直接看注释吧,简单点就是编排可以多个跨时间的构建代理…...
Spring JpaTransactionManager事务管理
首先,在做关于JpaTransactionManager之前,先对Jpa做一个简单的了解,他毕竟不如hibernate那么热门,其实二者很相识,只不过后期hibernate和JDO 版本都已经兼容了其Jpa,目前大家用的少了。 JPA全称Java Persi…...
全国职业院校技能大赛网络建设与运维赛项赛题(七)
全国职业院校技能大赛 网络建设与运维 赛题 (七)...
asp.net+sqlserver企业公司进销存管理系统
基于WEB的进销存管理系统主要企业内部提供服务,系统分为管理员,和员工2部分。 在本基于WEB的进销存管理系统中分为管理员,和普通用户2中模式,其中管理人员主要是对企业内商品类型。商品信息商品的出入库信息,以及员工…...
WxGL应用实例:绘制点云
WxGL附带了几个工具函数,其中read_pcfile用来解析.ply和.pcd格式的点云文件,该函数返回一个PointCloudData类实例,包含以下属性: PointCloudData.ok - 数据是否可用,布尔型PointCloudData.info - 数据可用性说明&…...
殡葬网站建设/whois查询
JEPF软件快速开发平台学习心得之请假单功能的完成(一)首先我也是点一次接触这个软件快速开发平台,我在学习这个平台的同时简单记录下我对这个平台是如何一步步熟悉或者是上手的,也有简单的一点总结和学习心得,希望对你…...
网站seo优化报告/免费网络推广方式
转载自:http://blog.csdn.net/zhangdaiscott/article/details/18220411 1、JavaScript视频教程 链接: http://pan.baidu.com/s/1gd57FVH 密码: d9ei 2、JPA视频教程 链接: http://pan.baidu.com/s/1dDCx1fj 密码: fwwd 3、马士兵hibernate视频教程 链接:…...
wordpress清理/网站主页
1、打开终端; 2、输入"IDLE3" 转载于:https://www.cnblogs.com/wus0ng/p/10353430.html...
去哪里学做网站app/爱站工具网
PHP调用MYSQL存储过程实例 标签: mysql存储phpsqlquerycmd2010-09-26 11:10 11552人阅读 评论(3) 收藏 举报实例一:无参的存储过程$conn mysql_connect(localhost,root,root) or die ("数据连接错误!!!");mysql_select_db(test,$conn);$sql …...
wordpress框架文件上传/台州百度快照优化公司
1 介绍 sentinal,中文名是哨兵 哨兵是redis集群架构中非常重要的一个组件,主要功能如下: (1)集群监控,负责监控redis master和slave进程是否正常工作 (2)消息通知,如果…...
保险做的好的网站有哪些内容/网站关键词优化网站推广
今天要做的是获取UG安装目录中的后处理文件,后处理文件以“*.pui”为后缀。这里我要做的就是批量获取UG安装目录中符合后缀名的文件名称,然后将这些名称提供给UG对话框进行显示。获取UG安装路径用户可能把UG安装在任何目录,所以没法指定固定…...