
MCU 51
文章平均质量分 86
Phenixyf
这个作者很懒,什么都没留下…
展开
-
单片机3.3V GPIO 控制 5V 通断
HUB-RPA项目中,F340 GPIO 输出只有3.3V,用它来控制USB 5V的通断,只用一个PMOS 有问题,电路修改如下后,可正常控制USB 5V的通断。原创 2020-09-23 16:31:16 · 7701 阅读 · 0 评论 -
C语言strcat()函数:连接字符串
头文件:#include strcat() 函数用来连接字符串,其原型为: char *strcat(char *dest, const char *src);【参数】dest 为目的字符串指针,src 为源字符串指针。strcat() 会将参数 src 字符串复制到参数 dest 所指的字符串尾部;dest 最后的结束字符 NULL 会被覆盖掉,并在连接后的转载 2017-03-31 14:30:53 · 826 阅读 · 0 评论 -
关于C51的中断函数要注意的几个问题 -----中断中调用函数参数错误问题
关于C51的中断函数要注意的几个问题(高手绕行) 最近在虾潭逛,发现一些小虾米对C51中断函数有些不了解,今天周末,抽空发个技术帖子,希望对小虾米有所帮助,如有错误之处,还请指正,就当抛砖引玉吧! C51的中断函数的格式为: void FuncIr(void) interrupt x [using y] 以下是梦游的一些分析:转载 2017-10-17 17:30:49 · 11276 阅读 · 0 评论 -
GPIO 按键及矩阵键盘程序------/* 自己实验确认并总结 */
新型的按键扫描程序不过入式处理器上面我在网上游逛了很久,也看过不少源程序了,没有发现这种按键处理办法的踪迹,所以,我将他共享出来,和广大同僚们共勉。我非常坚信这种按键处理办法的便捷和高效,你可以移植到任何一种嵌,因为C语言强大的可移植性。同时,这里面用到了一些分层的思想,在单片机当中也是相当有用的,也是本文的另外一个重点。对于老鸟,我建议直接看那两个表达式,然后自己想想就会懂的了,原创 2017-07-25 17:54:39 · 20048 阅读 · 2 评论 -
float转char
将浮点型a转换为4个字符型c[4](可以通过串口发送),再转换为浮点型b输出:123456.000000#include "stdio.h"main(){//float转charfloat a = 123456;float b = 0;int i = 0;char *pc = (char*)&a;for(i=0; ic[i] = *(pc+i);转载 2016-11-25 10:05:30 · 9599 阅读 · 0 评论 -
RTOS介绍
转自:http://bbs.21ic.com/icview-738690-1-1.html转载 2018-01-24 16:55:45 · 1250 阅读 · 0 评论 -
立即寻址,直接寻址,间接寻址
立即寻址就是指令当中自带数据,直接读取,最快;直接寻址就是指令中存放的是地址,直接解析这个地址;间接寻址就只指令中存放的是地址的地址,或者是存放地址的寄存器,最慢。总共有14个16位寄存器,8个8位寄存器 通用寄存器: 数据寄存器: AH(8位) AL(8位) AX(16位) (AX和AL又称累加器) BH(8位) BL(8位) BX(16位) (BX又称基址寄存器,唯一作为...转载 2018-06-22 14:36:29 · 10295 阅读 · 0 评论 -
ARM Linker的使用及功能
原文地址:ARM Linker的使用及功能作者:蒙人4252.1 关于ArmLinkArmLink可以:1. 把多个目标文件及库文件(在ARM或THUMB代码中)连接与为一个可执行的映像文件。2. 把多个目标文件部分地连接成为一个目标文件以作为下一步连接操作中的输入部分。3. 指定内存中代码和数据的存放位置。4. ...转载 2018-08-27 18:59:32 · 818 阅读 · 0 评论 -
RAM、SRAM、SDRAM、ROM、EPROM、EEPROM、Flash存储器区别
常见存储器概念:RAM、SRAM、SDRAM、ROM、EPROM、EEPROM、Flash存储器可以分为很多种类,其中根据掉电数据是否丢失可以分为RAM(随机存取存储器)和ROM(只读存储器),其中RAM的访问速度比较快,但掉电后数据会丢失,而ROM掉电后数据不会丢失。 在单片机中,RAM主要是做运行时数据存储器,FLASH主要是程序存储器,EEPROM主要是用以在程序运行保存一些需要掉电...转载 2018-08-23 15:42:00 · 2773 阅读 · 0 评论 -
STemWin介绍
本期教程开始带领大家了解一下STemWin的基本知识,其实确切的讲应该叫emWin基础知识,由于教程使用的开发板是ST的微控制器,所以就把名字统一命名成STemWin(为什么叫STemWin,在下面会有详细的讲解)。1.1 STemWin,emWin,μCGUI之间的关系1.2 SEGGER公司介绍1.3 STemWin介绍1.4 STM32F103和407跑STemWin性...转载 2018-08-20 18:26:12 · 28353 阅读 · 3 评论 -
4*4矩阵键盘的扫描原理
初学者肯定要经历的一个实验就是4*4矩阵键盘的代码编写,大部分都是在学校里面,有现成的实验箱,基本不需要自己动脑子。上次遇到一个哥们,他说他用的是8031的实验箱,我当时就晕了。8031是8051的前身,那个芯片连ROM都没有,可以想象我们的学校都在拿什么教育祖国的花朵。废话少说,先上图: 对初学者来说这篇文章会有点难,可以先研究一下如何用51单片机点亮一个发光二极转载 2017-07-27 10:18:33 · 44054 阅读 · 5 评论 -
矩阵键盘扫描程序实例
使用芯片STM8S003所用端口:PD2~PD6, PA1~PA3其中,PD3~PD6为输出,PA1~PA3 / PD2为输入(默认上拉)/* PortCom BIT7 BIT6 BIT5 BIT4 BIT3 BIT2 BIT1 BIT0 PD6 PD5 PD4 PD3 PD2 PA3 PA2 PA1 */程序原创 2017-07-28 17:30:29 · 2899 阅读 · 0 评论 -
C 指针经验总结 ----- /*自己总结*/
指看下面的例子char *a1;char *a2;char b1;switch(b1){ case 0x01: a1 = &b1; break; case 0x02: a2 = &b2; break; default break;}当b1等于0x01时 a1指向b1,此时*a1 = 0x01即b1的值。当b1等于0x02时 a2指向b1原创 2017-04-01 17:53:48 · 327 阅读 · 0 评论 -
51 单片机简单的多任务调度例子
看大家都在学操作系统,我也想学学。所以想用51写一个来玩玩,发现比较郁闷。 弄了几下,不想再弄了,51弄这个没啥意思。我用的89S52,除了速度慢,RAM资源太少之外,其它都还过得去。弄了一点代码出来,放在那也没啥用,不如拿上来给新手看看,一个任务调度的雏形是什么样子的~~~~~~~~~这些代码没有经过优化, 我只求实现任务切换的功能。 利用定时器2产生10mS的定时中转载 2017-06-05 11:37:18 · 8915 阅读 · 2 评论 -
经典按键扫描程序
经典按键扫描程序 核心算法:unsigned char Trg;unsigned char Cont;void KeyRead( void ){ unsigned char ReadData = PINB^0xff; // 1 Trg = ReadData & (ReadData ^ Cont); //2 Cont =ReadD转载 2017-06-01 16:10:22 · 5677 阅读 · 0 评论 -
C语言指针的形象理解-----/*自己编写*/
链表指针是C语言的一个难点,但也是重点,学懂了非常有用。要仔细讲就必须先讲变量、指针。什么是变量?所谓变量,不要浅显的认为会变得量就是变量。套用我们院长的问话:“教室变不变?”变,因为每天有不同的人在里面上课,但又不变,因为教室始终在那,没有变大或变小。这就是变量:有一个不变的地址和一块可变的存储空间。正常情况下,我们只看到变量这个房间里面的东西,也就是其内容,但不会关注变量的地址,但原创 2017-06-07 17:00:06 · 911 阅读 · 1 评论 -
[define的用法]define用法集锦
篇一 : define用法集锦Definition:The #define DirectiveYou can use the #define directive to give a meaningful name to a constant in your program. The two forms of the syntax are:Syntax#def转载 2017-06-30 09:47:51 · 16671 阅读 · 1 评论 -
F340使用注意事项(USB初始化与timer启动冲突、浮点运算等)
原创 2017-06-14 15:19:38 · 318 阅读 · 0 评论 -
51定时器初始化步骤
定时器初始化需要六步:void TimerInit(){TMOD = 0X01;TH0 = (65536 - X) /256;//(65536-X)为定时器初值,如定时10ms,则X=1000TL0 = (65536 - X)%256;EA = 1;ET0 = 1;TR0 = 1;}中断函数:void Timer0 interrupt 1{原创 2017-06-26 16:39:55 · 24259 阅读 · 4 评论 -
单片机串口接收多字节数据
http://bbs.elecfans.com/jishu_409918_1_1.html各位大侠看一下,我下面的程序为什么不能接收两个字节的数据呢?#include#define uchar unsigned char#define uint unsigned intvoid rs232_init();uchar flag,i,g,d;uchar code table转载 2017-07-14 16:52:13 · 18077 阅读 · 0 评论 -
4X4矩阵键盘扫描程序
4X4矩阵键盘扫描:1. 4根行线的GIO均设为Output,根列线的GIO均设为Input;2. 4根行线的GIO分别置为0111、1011、1101、1110,读逐一读取列线GIO的值,可确定是哪一个按键;电路图如下:注意:1. 图中用作输入的GIO,一定要有一个上拉电阻。2. 芯片中的每一个引脚是否用作了GPIO转载 2017-07-27 19:22:05 · 3949 阅读 · 0 评论 -
RAM,SRAM,SDRAM工作原理(很长)
存储原理: 为了便于不同层次的读者都能基本的理解本文,所以我先来介绍一下很多用户都知道的东西。RAM主要的作用就是存储代码和数据供CPU在需要的时候调用。但是这些数据并不是像用袋子盛米那么简单,更像是 图书馆中用有格子的书架存放书籍一样,不但要放进去还要能够在需要的时候准确的调用出来,虽然都是书但是每本书是不同的。对于RAM等存储器来说也是一样的,虽然存储的都是代表0和1的代码,但是不同的组...转载 2018-08-23 15:48:08 · 5480 阅读 · 0 评论 -
堆和栈的详细说明 --解决大数组定义时栈溢出的两种方法
1. 数据结构上:栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在 WINDOWS下,栈的大小是1M(也有的说是2M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。 堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系...转载 2018-09-19 10:22:56 · 1281 阅读 · 0 评论 -
分页内存管理——虚拟地址到物理地址的转换
引子:这是逻辑地址(虚拟地址),包括程序中打印的变量地址显示的都是逻辑地址,并不是内存空间上的物理地址。每条指令在被执行时,读取操作数时需要给出操作数所在的内存地址,这个地址不能是物理主存地址,因为该程序在哪种硬件设置的机器上运行并不能事前确定,那操作系统就不能在此给出对应于某台机器的物理地址。一、物理内存和虚拟内存我们先来了解一下,什么是物理内存,什么又是虚拟内存? 1.物理内...转载 2019-01-01 13:33:48 · 1390 阅读 · 0 评论 -
单片机的启动代码
对于熟悉电脑的伙伴们来说,BIOS(那个蓝色的界面)可能不会太陌生吧,这货就是电脑的启动代码。没有BIOS的电脑,那注定是一块板砖!BIOS主要是做一些开机前的准备工作,例如系统时间设定、启动顺序。。。扯远了!其实电脑本身就是从单片机而来,那么单片机也是有启动代码的,只是我们绝大部分情况不去关心它。启动代码究竟都干了些什么工作,为何需要它?想想你在c语言中用到了什么东西,而这些东西却是拿来...转载 2019-03-20 23:33:05 · 875 阅读 · 0 评论 -
程序的编译、链接和启动分析
本篇文章以STM32为硬件平台,使用GNU GCC作为开发工具,详细分析Compile 、Link 、Loader的过程以及Image(二进制程序)启动的详细分析。整个过程分析涉及到RW可读写段从Flash到Mem的Copy,BSS段的初始化,Stack和Heap的初始化,C库函数移植、利用Semihosting 实现基本的IO等内容。基本可以让你从更深刻的层面理解Source -> Com...转载 2019-04-08 12:48:52 · 1327 阅读 · 0 评论 -
程序的编译,装载与链接过程
程序编译四个过程:前言:经过扫描,语法分析,语义分析,源代码优化,代码生成和目标代码优化,编译器忙活了这么多个步骤以后,源代码终于可以被编译成了目标代码。但是这个目标代码有一个问题:index和array的地址还没有确定。如果我们要把目标代码使用汇编器编译成能够执行的指令,那么index和array的地址应该从哪里得到呢还有and so on?事实上,定义其他模块的全局变量和函数在最终运行...转载 2019-04-12 17:33:00 · 360 阅读 · 0 评论 -
详解#program
C和C++的每个实现对它的主机或操作系统都支持一些独有的特征。例如,某些程序须对存放数据的存储器区域进行精确的控制,或必须控制特定函数接受参量的方式。#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。语法#pragma 语言符号字符串语言符号字符串是给...转载 2019-04-25 22:06:16 · 7251 阅读 · 0 评论 -
__asm__ __volatile__内嵌汇编用法简述
__asm__ __volatile__内嵌汇编用法简述 在阅读C/C++原码时经常会遇到内联汇编的情况,下面简要介绍下__asm__ __volatile__内嵌汇编用法。因为我们华清远见教学平台是ARM体系结构的,所以下面的示例都是用ARM汇编。带有C/C++表达式的内联汇编格式为:__asm__ __volatile__("Instruction List" : Output : I...转载 2019-05-09 10:37:48 · 9664 阅读 · 1 评论 -
内联汇编 - 从头开始
对于 C/C++ 程序员来说,内联汇编并不是一个新特性,它可以帮助我们充分利用计算能力。然而,大多数程序员很少有机会实际使用该特性。事实上,内联汇编只为特定的要求提供服务,在涉及先进的高层编程语言时尤其如此。本文介绍了 IBM Power 处理器架构的两个场景。使用本文提供的示例,我们可以发现在什么地方应用了内联汇编。场景 1:更好的库C/C++ 编程语言支持逻辑运算。在本例中,用户使...转载 2019-05-09 11:26:55 · 10391 阅读 · 0 评论 -
译:GCC内联汇编入门
原文: GCC-Inline-Assembly-HOWTO1. 简介(Introduction.)1.1 Copyright and License.Copyright (C)2017 桂糊涂Copyright (C)2003 Sandeep S.This document is free; you can redistribute and/or modify this unde...转载 2019-05-09 11:28:23 · 820 阅读 · 0 评论 -
内存寻址之分页机制
写在前面:分页机制完成线性地址到物理地址的转换 80x86 规定分页机制是可选的。分段和分页没有什么必然联系,分段可以说是 Intel 的 CPU 一直保持着的一种机制,而分页只是保护模式下的一种内存管理策略。想开启分页机制,CPU必须工作在保护模式,而工作在保护模式可以不开启分页。分页机制由控制寄存器 CR0 中的 PG 位启用,如PG=1则启用分页机制,把线性地址转换为物理地址;如果PG...转载 2019-01-01 13:32:35 · 404 阅读 · 1 评论 -
C进阶之:内存对齐
什么是内存对齐? 内存对齐可以用一句话来概括: “数据项只能存储在地址是数据项大小的整数倍的内存位置上”。例如int类型占用4个字节,地址只能在0,4,8等位置上。 不同类型的数据在内存中按照一定的规则排列,而不一定是顺序的一个接一个的排列,这就是所谓的内存对齐。如下Test1和Test2所占的内存空间是不同的。struct Test1{ char c1; short ...转载 2019-01-01 13:29:44 · 228 阅读 · 0 评论 -
c语言内存对齐
一、什么是对齐,以及为什么要对齐: 1. 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。 2. 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只...转载 2019-01-01 13:28:55 · 242 阅读 · 0 评论 -
程序各个段text,data,bss,stack,heap
网上找了一堆资料学习一下,了解这些,有助于规化程序结构,优化代码;使用gcc编译出来的程序,用size可以查看程序结构和大小,如 1: #size hello 2: Text data bss dec hex filename 3: 778 200 4 982 3D6 hello所以一个可执行的程序文件,结构分三部分:.text 代码段,用...转载 2018-12-04 13:12:55 · 1382 阅读 · 0 评论 -
AVR-GCC Makefile 中文翻译
这段时间一直弄AVR单片机,以前只用汇编编过程,但是没有用过C语言,最近用了C语言,学了一下Makefile ,GCC 。用AVR_studio4.12可以自己生成Makefile, 用了一下,其实所有的想要的功能都可以实现。但是我是个爱钻牛角尖人,呵呵。看了一下 WINAVR Makefile 的模板我觉得写得很好,学习了一下,翻译了一下,加上很多我的理解和注释。把它共享给大家,共同进步。这个M...转载 2018-12-04 13:30:24 · 931 阅读 · 0 评论 -
Internal vs. external RAM
Obviously, the constraints are much harder to satisfy in the default configuration where only internal RAM is available. Extreme care must be taken to avoid a stack-heap collision, both by making sure...转载 2018-12-06 09:15:05 · 594 阅读 · 0 评论 -
C函数之memcpy()函数用法
函数原型void *memcpy(void*dest, const void *src, size_t n);功能由src指向地址为起始地址的连续n个字节的数据复制到以destin指向地址为起始地址的空间内。头文件#include<string.h>返回值 函数返回一个指向dest的指针。说明 1.source和destin所指内存区域不能重叠,...转载 2018-12-06 17:23:30 · 950 阅读 · 0 评论 -
C定义变量,申请内存,初始化值位置,外部RAM和Flash的使用 总结
Part1: 初始化的变量如下定义一个变量,定义时就初始化int a = 0x5A; 在单片机内是如下操作的。flash中没有 a, 只有 a 初始值 0x5A;因 a 是初始化了的变量,所以变量 a 会被放在flahs的.data区域; 注意flash的.data区域和linker script定义的.data区域的联系及区别。Linker script中可以...原创 2018-12-10 16:58:05 · 3031 阅读 · 0 评论 -
一个程序在计算机中到底是如何运行的?
在《载入内存,让程序运行起来》一节中讲到,程序是保存在硬盘中的,要载入内存才能运行,CPU也被设计为只能从内存中读取数据和指令。对于CPU来说,内存仅仅是一个存放指令和数据的地方,并不能在内存中完成计算功能,例如要计算 a = b + c,必须将 a、b、c 都读取到CPU内部才能进行加法运算。为了了解具体的运算过程,我们不妨先来看一下CPU的结构。CPU是一个复杂的计算机部件,它内部又包含很...转载 2019-01-01 13:21:44 · 1334 阅读 · 1 评论