单片机

51单片机学习笔记之基础部分

大城市里の小女人 提交于 2020-01-15 05:47:05
目录 一、普中单片机详解 二、51 单片机介绍 三、C 语言基础 四、单片机最小系统 五、开发软件安装与工程建立 从 0 开始,重新学单片机, from 0 to 100.    ---- 2019/1/14 一、普中单片机详解   电源接口 ( 火牛接口):额定电压 5V   ch340 : USB 转串口   DB9 串口: RS232 芯片,可用于下载程序,要用普通线   官方 STC 下载软件是软启动的,是手动下载的   晶振   温度传感器 DS18B20   红外   温度和红外不能插反,有方向   独立按键( 8 个 IO 口)   学会看原理图   交通灯( 10 个 LED )   AD/DA 转换( 0-5V ,模拟信号, SPI )   矩阵键盘( 16 个按键)   555 模块   时钟模块,有纽扣电池,断电也能走   595 模块: IO 口扩展   LED 模块: 245/573 芯片,驱动数码管   静态数码管 / 动态数码管   1602LCD :注意方向   12864LCD   TFT 彩屏(短接片的配置)   165 芯片:并转串   245 芯片:双向导通   24c02 : e2prom, 掉电不丢失   138 芯片: 38 译码器   点阵: 16*16 ,用 595 驱动   电机(五线四相等)   继电器模块   蜂鸣器模块  

基于stc15f2k60s2芯片单片机编程(秒表)

纵饮孤独 提交于 2020-01-15 00:30:32
用定时器做一个秒表,精确到0.1,S7按下,开始计时,S6按下清零 # include <stc15f2k60s2.h> # include <intrins.h> void Timer0Init ( ) ; void Timer1Init ( ) ; unsigned char abile [ ] = { 0XC0 , 0XF9 , 0XA4 , 0XB0 , 0X99 , 0X92 , 0X82 , 0XF8 , 0X80 , 0X90 , 0XBF , 0XFF } ; unsigned char saomiao [ ] = { 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff , 0xff } ; void Delay100us ( ) ; void shumaguan ( ) ; void anjian ( ) ; sbit S7 = P3 ^ 0 ; sbit S6 = P3 ^ 1 ; unsigned int y ; void main ( ) { P2 = 0XC0 ; P0 = 0X01 ; P2 = 0XFF ; P0 = 0XFF ; Timer0Init ( ) ; Timer1Init ( ) ; while ( 1 ) { shumaguan ( ) ; anjian ( ) ; Delay100us ( )

AVR单片机教程——LCD1602

生来就可爱ヽ(ⅴ<●) 提交于 2020-01-14 01:14:41
显示屏 开发板套件里有两块屏幕,大的是LCD(液晶显示),小的是OLED(有机发光二极管)。正与你所想的相反,短小精悍的比较贵,而本讲的主题——LCD1602——功能较少,使用起来也简单很多。 这块屏幕的显示是以字符为单位的。每个字符都是8像素高,5像素宽。1602这个名字,来源于显示字符的数量,共2行,每行16个字符。出售1602的商家提供了一份文档: 提取码8c1u 。 硬件 一个典型的1602显示屏有16个引脚(还有些模块是用串行总线驱动的): 名称 功能 连接 VSS 电源地 GND VDD 正电源 VCC(5V) VO 对比度调整 左侧的电位器,其左端接GND,右端接VCC RS 数据/ 指令 选择 PB0 R/ W 读/ 写 选择 PB1 E 使能 PB2 D0~D7 双向并行数据线 74HC595的输出,通过 exout_write 输出 A 背光LED正极 NPN三极管的发射极,其集电极接VCC,基极接BAK K 背光LED负极 GND 很复杂吧?好在开发板已经处理好了这些,我们只需要关注2组线: RS 、 R/W 、 E 这3根控制线,通过 DDRB 和 PORTB 来操控,和 D0 ~ D7 这8跟数据线,通过 exout_write 来以字节为单位输出(在这第一期的最后一篇中,我终于成功地将“尽量减少接线”的原则在第一期中贯彻到底了)。其他的还有对比度 CON

AVR单片机教程——小结

℡╲_俬逩灬. 提交于 2020-01-14 00:28:26
第一期挺让我失望的,是我太菜,没有把想讲的都讲出来。经常写了很多,然后一点一点删掉,最后就没多少了。 而且感觉难度不合适,处于很尴尬的位置。讲得简单,难的丢给库,库源码也不公开。作业题倒是难得一批,我自己都差点不会做。 以前看不起那些死讲知识点的书,现在明白,把知识点写活太难了。尤其是单片机这边,知识点本来就杂,难以组织。 本来想后面慢慢讲电路、总线、中断等的,但一觉得太累,二觉得讲不好,于是就改了计划。 目前暂定第二期有6讲: 定时器中断:中断基础、定时器工作模式、数码管自动扫描; UART杂谈:总线中断、收发缓冲区、多路发送; 矩阵键盘:SPI总线、74HC595、74HC165; DAC播放音乐:上位机程序、板载DAC、模拟电路; 示波器:OLED屏、移植第三方库、使用EEPROM; 走向高层:RTOS、C++工具、事件驱动架构。 AVR单片机教程就到这里。预计寒假写完,写完回去学语文了。我确实需要学学语文了。 如果几十年后我还记得我小时候干过这事儿的话,我会换一种单片机重新写一份好的教程的。 来源: https://www.cnblogs.com/jerry-fuyi/p/12081736.html

单片机零基础学习之从“点灯”入门STM32

痴心易碎 提交于 2020-01-14 00:05:24
本篇文章我们通过一个简单的例子来熟悉模块化编程以及利用库函数的方法进行开发使用STM32外设的基本流程。 首先,我们打开本讲的例程,在工程目录我们可以看到驱动分组下有 led、delay 两个.c源文件,其实,它们对应的还有两个头文件,它们就保存在我们的 DRIVER 文件夹下的 inc 文件夹中,同理,源文件就保存在 src 文件夹中。 我们在源文件里定义相关的函数,然后在对应的头文件里声明它,最后我们在想要调用此函数的源文件中包含该头文件即可,这就是模块化编程。这样做的好处就是代码整体框架结构清晰明了,便于我们进行后期维护与移植。 因此,这个知识点希望大家能够掌握。 下面我们就开始具体讲解如何驱动我们实验平台上的用户指示灯。首先,我们要明白,点灯它的本质是通过控制GPIO引脚这个基础外设输出高低电平,从而达到灯亮灭的效果,那么大家可能就要问了,之前说过,可以配置使用的通用 GPIO 引脚有37个,这么多GPIO口,我们该使用哪个呢? 通过观察下图,我们可以发现,用户灯的一端是与主控芯片的 PC13 这个引脚电气相连的,因此我们就是要配置这个管脚输出高低电平,那么究竟是那种电平会使灯变亮呢?这时就要看我们的驱动电路了,其实也很简单,用户灯其实就是个发光二极管 ,既然是二极管,那么它就具有单向导电性 ,它的正极 接了3.3V电压,我们需要点亮它就需要在负极输出低电平,也就是

【单片机笔记】上海移远公司NB-IOT模组 BC26 使用STM32 AT命令实现连接阿里云数据上传和下载

回眸只為那壹抹淺笑 提交于 2020-01-13 08:51:55
前言 在调试之前看这个数据手册一脸懵,特别是MQTT部分还是独立的,这个和前接触到的上海合宙的模块多少有点出处。另外就是那个AT命令的传入参数也是一脸懵,后来发现BC26的模块好像把MQTT部分单独的做成了支持阿里云服务器的功能。接触过阿里云的设备对接相比都知道,阿里云要求的是一机一密或者一型一密,这个在对于简单的成本低廉的MCU来说无疑是一个很大的考验。而BC26这块还是做的非常友好的,在MQTT部分只需要传入产品对应设备下的三元组即可,无需经过哈希算法计算密钥。 先上图: 连接及上传部分: 数据下载部分: 基本上通信也是非常稳定的,不过我这个地方信号贼差,以模块满格31来算,这里测试才有9,10的样子。 整体的应用层思路是这样的: 1、单片机控制模块自检 2、单片机控制模块连接阿里云 3、单片机控制模块定时发送数据并接收下发数据 看上面三个步骤虽然简洁明了,单是要做好单片机的应用底层也不是那么简单,为此我专门谢了一个对应BC26传输机制的地层代码,可以检测BC26模块的状态,连接状态,断线重连、超时复位等机制。详细请看下文代码: BC26底层驱动部分: C文件: #include "fy_bc26.h" static void ResetModule(void); static void CheckModule(void); static void SetCFUN(void);

心形灯的设计

允我心安 提交于 2020-01-13 07:50:35
设计一个心形灯,包含以下功能: 1、由32个LED灯组成心形流水灯,外接了4个按键,并且两个按键(开始和暂停)接在两个外部中断引脚上; 2、上电后心形灯先全亮5秒,后亮灭闪烁5秒,可以测试灯状态的好坏; 3、之后处于全灭等待状态,当按下开始按键后心形灯按照一定规律显示,规律自定义,创意越好分数越高; 4、当在任意状态下按下暂停键后心形灯停留在当前状态不再改变,再一次按下暂停键后则继续显示; 5、另外一个键为模式切换键,每按一次切换键则切换一次显示模式,切换键在灯运行状态和暂停状态均可切换; 6、第四个键为速度键,可以改变心形灯的亮灭切换速度,通过速度键可以切换不同的切换速度。 关键词: 心形流水灯,AT89C51,复位电路,时钟电路,电路仿真 绪论 一、随着现代科学技术的持续进步和发展以及人们生活水平的不断提高,以大规模、超大规模集成电路为首的电子工艺技术的使用也越来越广泛,结合单片机技术设计的电子电路也层出不穷。 LED彩灯由于其丰富的灯光色彩、低廉的造价以及控制简单等特点而得到了广泛的应用,用彩灯来装饰街道和城市建筑物已经成为一种时尚。利用控制电路可使彩灯按一定的规律不断的改变状态,不仅可以获得良好的观赏效果,而且可以省电。 彩灯的运用已经遍布于人们的生活中,从歌舞厅到卡拉OK包房,从节日的祝贺到日常生活中的点缀,这些不仅说明了我们对生活的要求有了质的飞跃

区分单片机RAM、ROM、Flash

≡放荡痞女 提交于 2020-01-13 07:17:56
最近搞毕设,又一次接触到51单片机系列了,但是由于之前学习单片机的时间过去的有点久,我对单片机的有些硬件知识记得有点模糊了,现在重新翻旧账出来复习复习。 单片机的RAM,学名叫随机存储器,就是一个可读可写而且速度还比较快的存储器,缺点是断电数据会丢失,在单片机中用作程序运行时所产生的中间变量的数据存储器。 ROM,只读存储器,从名字就可以看出ROM生产完成后就不能再写数据,只能读取数据。后来技术发展,出现了EPROM,EEPROM等可擦除重写的存储器,但是成本高,而且寿命限制大,所以一般用作存储不会频繁改动的程序指令和数据。 Flash,又称Flash EEPROM、Flash Memory,是一种新的存储结构,成本低、寿命大。 以下内容转载自 https://www.cnblogs.com/renchong/p/6594229.html 传送门: 为什么单片机中既有Flash又有EEPROM 单片机运行时的数据都存在于RAM(随机存储器)中,在掉电后RAM 中的数据是无法保留的,那么怎样使数据在掉电后不丢失呢?这就需要使用EEPROM 或FLASHROM 等存储器来实现。 插播一段:ROM最初不能编程,出厂什么内容就永远什么内容,不灵活。后来出现了PROM,可以自己写入一次,要是写错了,只能换一片。随着不断改进,终于出现了可多次擦除写入的EPROM

stm32之GPIO(二)

我只是一个虾纸丫 提交于 2020-01-12 23:23:30
  输入上拉:当IO口作为输入时,比如按键输入,而按键是与地连接,按下时为低电平,则没按下时该IO口应为高电平,上拉即是该IO口通过一个电阻与电源相连,则没按下时为高电平,按下即为低电平。 输入下拉:同理此时按键与电源相连,按下即为高电平,下拉就是该IO口通过一个电阻与地相连,没按下为低电平,按下为高电平。    推挽输出:作为普通的IO口输出高低电平   STM32的输入输出管脚有下面8种可能的配置:(4输入、2输出、2复用输出)     1、浮空输入_IN_FLOATING     2、带上拉输入_IPU     3、带下拉输入_IPD     4、模拟输入_AIN     5、开漏输出_OUT_OD     6、推挽输出_OUT_PP     7、复用功能的推挽输出_AF_PP     8、复用功能的开漏输出_AF_OD 上拉:输入高电平,然后接一个上拉电阻(起保护作用),上拉就表示该端口在默认情况下输入为高电平; 浮空:就相当于此端口在默认情况下什么都不接,呈高阻态; 开漏输出:就是不输出电压,低电平时接地,高电平时不接地。如果外接上拉电阻,则在输出高电平时电压会拉到上拉电阻的电压电压。这种方式适合在连接的外设电压比单片机电压低的时候; 推挽输出:就是单片机引脚可以直接输出高电平电压,低电平时接地,高电平时输出单片机电源电压。这种方式可以不接上上拉电阻

51单片机 特殊功能寄存器(SFR) SBUF使用方法

早过忘川 提交于 2020-01-12 13:39:08
51单片机 特殊功能寄存器(SFR) SBUF使用方法   串行口中有两个缓冲寄存器SBUF,一个是发送寄存器,一个是接收寄存器,在物理结构上是完全独立的。它们都是字节寻址的寄存器,字节地址均为99H。这个重叠的地址靠读/写指令区分:串行发送时,CPU向SBUF写入数据,此时99H表示发送SBUF;串行接收时,CPU从SBUF读出数据,此时99H表示接收SBUF。      单片机串口 # include <reg52.h> # include <absacc.h>    # define unit unsigned int    # define uchar unsigned char      uchar date ;   uchar recFlag ; //接收数据标识,0 未接收数据 1 接收数据       void init_serial ( ) ;    void send ( ) ;    void receive ( ) ;       main ( )    {    init_serial ( ) ;   IE = 0 ; //屏蔽中断    while ( 1 )    { receive ( ) ; send ( ) ; }    }       void init_serial ( ) //初始化串口    { TMOD = 0x20 ; /