单片机之汇编语言和C语言(以PIC单片机为例)

目录

  • 计算机语言
    • 计算机语言类别
    • 中断
    • 定时/计数器
  • C语言数据类型
  • C语言动态数组
  • C语言中void什么意思
  • C语言宏定义
  • 单片机C语言的扩充数据类型
  • 单片机C语言的运算符
  • 单片机C语言的基本语句
  • 单片机汇编语言基本语句(PIC)
  • PIC单片机基础概念
    • PIC16F887(40引脚图)
    • 引脚汇总
    • 设计框图
    • I/O端口寄存器
    • OPTION寄存器
    • IINTCON 寄存器
    • OPTION_REG选项寄存器
    • 发送寄存器
    • 接受寄存器
    • 串口寄存器
  • 常见函数
    • 延迟函数
    • 开关函数
    • 中断服务程序
  • 推荐练习

计算机语言

计算机语言类别

1、机器语言:用机器指令(0和1)编写,计算机能看懂并执行,机器语言
是计算机的最爱。
2、汇编语言:即第二代计算机语言,用一些容易理解和记忆的字母,单词来代替一个特定的指令,比如:用“ADD”代表数字逻辑上的加减,“ MOV”代表数据传递等等,通过这种方法。
3、高级语言(如C语言):用接近人类习惯的自然语言和数学语言编写,采用软件编译成计算机能认识的机器语言。(生成HEX文件)

中断

CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生);CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务);待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断。

定时/计数器

• 定时功能
所谓定时功能就是通过来自单片机内部的时钟脉冲作计数脉冲,使计数器计数,即每个机器周期计数器加1,计数值达到予置值后,定时/计数模块产生溢出。
• 计数器功能
所谓计数是指对外部事件进行计数。外部事件的发生以输入脉冲表示,因此计数功能的实质就是对外来脉冲进行计数。

C语言数据类型

在这里插入图片描述

C语言动态数组

动态数组是指在声明时没有确定数组大小的数组,即忽略圆括号中的下标;当要用它时,可随时用ReDim语句(C语言中用malloc语句)重新指出数组的大小。使用动态数组的优点是可以根据用户需要,有效利用存储空间。

C语言中void什么意思

void是是C语言的一个关键字,其含义为空。在C语言中,单独的void有两种用途,均用于函数中。
1、用于函数返回值。
形式为
void main(…);
代表函数没有返回值。在这样的函数中,调用return语句时,不需要也不可以有参数。注意,写成main(…); 的形式,在部分编译器中可以编译成功,但并不是没有返回值,而是有一个默认的整型(int)返回值的意思。
2、用于函数参数列表。
当函数没有参数时,需要定义为xxx func_name(void); 的形式,表示本函数不需要任何参数。注意,如果写成xxx func_name(); 的形式,与void不同,不是没有参数,而是函数参数不定,可以接收任何长度的参数。

C语言宏定义

就是强制性的字符替换,比如说你要用a代表6,那么后面所有是a的地方都是用字符6替换掉就可以了,这个是不进行运算只是替换。比如define a (a+b)那么后面所有a的地方都可以全部替换成(a+b)但是你不能用a+b的结果。

宏定义又称为预定义,它有很多功能。首先他能定义常量,这样我们可以集中统一修改。其次,它还能定义函数(预定义)。总之,熟悉它会很方便。

宏定义写法:
#号是预处理指令,用#开头。
#define ON (新的名称 ) 1(原来的名称)
作用:在程序书写时可用新的名称代替原来的名称书写,以达到简化或
直观的效果。编译器在预处理的时候,自动将新的名称还原为原来的名
称。
书写位置:源程序开头,函数的外面

单片机C语言的扩充数据类型

• sfr:特殊功能寄存器声明
• sfr16:sfr的16位数据声明
• sbit:特殊功能位声明
• bit:位变量声明
例:
•sfr SCON = 0X98;
• sfr16 T2 = 0xCC;
• sbit OV = PSW^2;

单片机C语言的运算符

与C语言基本相同

+ - * / (加 减 乘 除)
> >= < <= (大于 大于等于 小于 小于等于)
== != (测试等于 测试不等于)
&& || ! (逻辑与 逻辑或 逻辑非 )
>> << (位右移 位左移)
& | (按位与 按位或)
^ ~ (按位异或 按位取反)

单片机C语言的基本语句

与标准C语言基本相同:
• if 选择语言

if(表达式)语句1
[else语句2]

其中if语句中的“表达式”可以是关系表达式、逻辑表达式,甚至是数值表
达式。
• while 循环语言

while (关系表达式或逻辑值) 
{
语句1; 
语句2; 
语句3; 
……语句n; 
}

特点:先判断条件表达式,后执行语句。
原则:若条件表达式的值为真,那么执行语句。否则跳出while 语句
• for 循环语言

For (表达式1;表达式2;表达式3)
{ 语句(内部可为空)}

执行过程:
1.求解一次表达式1.
2.求解表达式2,若其值为真(非0 即为真),则执行for中语句。然后执行第3步。否则结束for 语句,直接跳出,不再执行第3步。
3.求解表达式3.
4.跳到第2步重复执行。
• switch/case 多分支选择语言
switch的用法是判断case后面的表达式和switch后面的表达式是否相匹配,一旦case匹配,就会顺序执行后面的程序代码,而不管后面的case是否匹配,直到遇见break。
语句表达式:

switch{
case 常量1: 语句体1case 常量2: 语句体2case 常量3: 语句体3case 常量4: 语句体4....default : 语句体;
}

• do-while 循环语言

单片机汇编语言基本语句(PIC)

1.ADDWF f, d ,f寄存器内容与W寄存器相加,d=1时结果放在f,d=0是结果在W,影响STATUS的C,DC和Z标志。该条指令影响的状态与MCS51一致,有进位时C=1,有半进位时DC=1;否则相反。结果为0时Z标志置位。
2.ANDWF f, d ,f寄存器内容与W寄存器相与,d=1时结果回存至f,d=0时结果存至W,结果影响STATUS的Z标志位。
3.CLRF ( CLEAR File Register), 清空页寄存器,STATUS的Z标志位置位
4.CLRW (CLEAR WREG),清空W寄存器,STATUS的Z标志位置位,可以用MOVLW 0H等同使用
5.COMF f, d,f寄存器内容取反,d=1时结果存至f寄存器,d=0时结果存至W寄存器。影响Z标志位。
6.DECF f, d,f寄存器内容自减1,d=1时结果存放于f;d=0时结果存放于w,影响STATUS的Z标志位。
7.DECFSZ f, d f寄存器内容自减1,为0则跳行,d=1时结果在f寄存器;d=0时结果在W寄存器。不影响标志位。
8.INCF f, d,f寄存器内容自加1,d=1时结果回存至f,d=0时结果在W。影响Z标志位。
9.INCFSZ f, d,f寄存器内容自加1,结果为0则跳行。d=1时结果回存至f;d=0时结果存至W寄存器。该指令不影响标志位。
10.IORWF f, d,f寄存器内容与W寄存器相或,d=1时结果回存至f,d=0时结果存至W,结果影响STATUS的Z标志位。
11.MOVF f, d,当d=1时,f寄存器内容不变,d=0时f寄存器内容复制到W寄存器。当d=1时,只改变Z标志位,可以用与判断f寄存器内容是否为0。
12.MOVWF , f (MOVE WREG to File Register),很常用的一条指令,将W寄存器的内容保存到RAM中去
13.NOP,没什么可说的,空操作而已,但是确实很常用的语句,短延时必须的。
14.RLF f, d,循环左移指令,f的最高位移到C,原来C的内容移到f的最低位。与MSC51的循环左移指令功能一致。结果影响C标志。
15.RRF f, d, 循环右移指令,f的最低位移到C,原来C的内容移到f的最高位。与MCS51的循环右移指令功能一直。结果影响C标志。
16.SUBWF f, d ,f-W结果存放取决于d,当d=1时结果存在f里,0时存在W里,指令影响STATUS的C、DC、Z标志位,有借位时C=0,有半借位时DC=0;无借位和半借位时真好相反。这点与MCS51系列的单片机有些不同,用时需注意。当两数相等时Z=1。
17.SWAWF f, d, 字节交换指令,f的高低字节交换,结果不影响标志位。该条指令在中断断点保存和恢复中很重要,而且只能使用該指令。在下篇將給出介紹。
18.XORWF f, d,f寄存器内容与W寄存器异或,d=1时结果存至f,d=0时结果存至W,影响STATUS的Z标志位,该条指令我常用来比较是否与一个数相等,利用同0异1的原理。
19.BCF f, b,清零f寄存器的第b位。指令不影响任何标志位,四条位操作指令在程序设计中有极其重要的作用,被广泛应用。
20.BSF f, b,置位f寄存器的第b位。指令不影响任何标志位。
21.BTFSC f, b,测试f寄存器的第b位,为0则跳行,指令不影响任何标志位。
22.BTFSS f, b,测试f寄存器的第b位,为1则跳行,指令不影响任何标志位。
23.ADDLW k,W加立即数k,结果在W寄存器内,有进位,半进位时C,DC为1,否则0;结果为0时Z=1。
24.ANDLW k,W与立即数k相与,结果在W寄存器,影响Z标志位。
25.CALL k,调用子程序,k为子程序的入口地址,不影响任何标志位,但是改指令执行需要两个指令周期,因为在跳转之前需要保存当前得返回地址。
26.CLRWDT 看门狗定时器清0,影响STATUS寄存器的TO和PD标志位。两个标志位均置位。
27.GOTO k,跳转到指定地址处,不影响标志位。双周期指令。
28.IORLW k,W寄存器与立即数k相或,结果在W寄存器,影响Z标志位。
29.MOVLW k,立即数k赋给W寄存器,不影响标志位。
30.RETFIE,中断返回指令,没啥说的。中断服务程序最后一句。
31.RETLW k,立即数k送W寄存器,子程序返回,该条指令很特别哈,也比较有意思的饿,查表必用。
32.RETURN,子程序返回指令。
33.SLEEP,进入休眠模式。影响STATUS的TO和PD标志位,TO=1,PD=0。
34.SUBLW, k,立即数减去W,结果在W寄存器,标志位影响与SUBWF指令一致,不再赘述。
35.XORLW k,立即数k与W寄存器异或,结果在W寄存器,影响Z标志位。

PIC单片机基础概念

PIC16F887(40引脚图)

在这里插入图片描述

引脚汇总

在这里插入图片描述

设计框图

在这里插入图片描述

I/O端口寄存器

在这里插入图片描述

OPTION寄存器

在这里插入图片描述
在这里插入图片描述

IINTCON 寄存器

在这里插入图片描述
在这里插入图片描述

OPTION_REG选项寄存器

在这里插入图片描述
在这里插入图片描述

发送寄存器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

接受寄存器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

串口寄存器

在这里插入图片描述
在这里插入图片描述

常见函数

延迟函数

void delay()
{
int i; //定义整形变量
for (i = 10000;i--; ); //延时
}

开关函数

void scan()
{if (RB0 == 0)               //判断B0是否按下result = 0x1;if (RB1 == 0)               //判断B1是否按下result = 0x2;if (RB2 == 0)               //判断B2是否按下result = 0x3;if (RB3 == 0)               //判断B3是否按下result = 0x4;
}

中断服务程序

void interrupt isr(void)
{
static uint tmr0_count=0; 
if(T0IE&&T0IF) //判断是否为TMR0中断{
T0IF=0; //清TMR0中断标志位(必须用软件清零)
TMR0=TMR0+58; //TMR0重新赋初值 
if(++tmr0_count>=2500) //定时2500次{
tmr0_count=0;
PORTD=~PORTD; //PORTD口输出2Hz方波} }
}

推荐练习

无论是汇编语言还是C语言等单片机编程,除了查看相关数据百度外,也要通过大量的练习进行掌握,我推荐可以去牛客网(点击可直达)看看,他们现在的题库内容很丰富,属于国内做的很好的了,里面的资源也是全部免费的,很好的一个平台,欢迎大家进入学习查看。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/250847.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【转】PIC单片机C语言简记

1.PICC安装&#xff1a; PICC编译器可以直接挂接在MPLAB-IDE集成开发平台下&#xff0c;实现一体化的编译连接和原代码调试。使用MPLAB-IDE内的调试工具ICE2000 、ICD2 和软件模拟器都可以实现原代码级的程序调试&#xff0c;非常方便。 首先必须在你的计算机中安装 PICC 编…

PIC单片机入门_C语言编程技术

1.为什么也是C语言&#xff1f; 用C 语言来开发单片机系统软件最大的好处是编写代码效率高、软件调试直观、维护升级方便、代码的重复利用率高等&#xff0c;因此C 语言编程在单片机系统设计中越来越广泛的运用。PIC 单片机的软件开发&#xff0c;同样可以用C 语言实现。 Micro…

PIC单片机与PIC单片机C语言编程简介

对于计算机学院与电子学院相关的同学来说&#xff0c;单片机一定不是一个陌生的概念。在大学的学习生涯中&#xff0c;经常用于教学的是MCS-51系列单片机。其实&#xff0c;除了MCS-51单片机外&#xff0c;还有一类单片机——PIC单片机。 PIC单片机&#xff0c;英文名为Periphe…

Python知识回顾(10)

Day 10 本节主要讲解的是Python中文件操作(IO 技术)方面的知识。 文章目录 1.文件的处理1.1.1 文本文件和二进制文件1.1.2 文件操作相关模块概述1.3 创建文件对象 open()1.4 文本文件的写入1.5 常用编码介绍1.5.1 中文乱码问题1.5.2 write()/writelines()写入数据1.5.3 close(…

安卓手机阅读器_得到电纸书阅读器到底如何,值不值得买?使用一个月后,我告诉你答案!...

1 电纸书墨水屏的发展 一直以来,这世界上只有两种电纸书阅读器(电子书阅读器),一种是Kindle,另一种是其他。当然索尼的电子纸也不错,不过它的定位和价格已经不是普通的看电子书了。 自2007年第一代Kindle问世,如今已经将近13年过去了。Kindle有了更高的知名度,也有了更…

HNU-电子测试平台与工具2-串口实验5次

计算机串口使用与测量 【实验属于电子测试平台与工具】 湖南大学信息科学与工程学院 计科 210X wolf (学号 202108010XXX) 0.环境搭建 在实验开始之前,安装好Ubuntu 20.04操作系统。(这个没有难度) 但要提醒的是,这个ubuntu是xubuntu,而且虚拟硬盘只有10GB的大小…

Java开发 - 让你少走弯路的Redis的主从复制

前言 大家举举手&#xff0c;让我看看还有多少人不会配置Redis的主从&#xff0c;主主这些的。故事发生在前段时间&#xff0c;小伙伴看到了博主的MySQL主从&#xff0c;就问博主有没有Redis的主从配置教程&#xff0c;本以为网上到处都是教程的博主打开网页一搜&#xff0c;好…

程序员の诗 - 启蒙

启蒙 一入挨踢&#xff08;IT&#xff09;门&#xff0c;从此断红尘。 网络席卷人生路&#xff0c;代码看似少年梦。 面朝电脑黑眼圈&#xff0c;一坐又是一整天。 错把代码当成梦&#xff0c;写尽半生皆是空。 然&#xff0c; 机器识 0 1&#xff0c;吾辈创世界&#xf…

linux恶搞指令

alias 指令 linux命令提供了一个有用的工具alias,让我们将需要频繁使用但又过于冗长的命令设置一个别名&#xff0c;以后只需要输入一个简单的别名就可以达到同样的作用 alias 查看当前设置的所有别名 alias cdtest‘cd /src/www/app/account’ 等号两边不能有空格 unalias c…

我爱优雅的代码,我爱搞笑的诗词

天王盖地府&#xff0c;小鸡炖蘑菇&#xff0c;拿了此大奖&#xff0c;才是最幸福。 也不知道什么原因&#xff0c;平时总爱写写各种好玩的东西&#xff0c;作为程序员&#xff0c;也许是一个放松的方式吧&#xff0c;我不喜欢做一个只会写代码的码农&#xff0c;我喜欢能在各个…

用计算机术语写诗,网上盛行写诗软件 电脑作诗毫无逻辑令人喷饭

自从“诗坛芙蓉”赵丽华(BLOG)红遍网络之后&#xff0c;诗歌——一个几乎被忽略的文学体裁又重新引起了大家的关注。 昨日(27日)&#xff0c;记者在浏览网站时发现&#xff0c;目前网络上一款写诗软件十分盛行&#xff0c; 只要输入几个关键字&#xff0c;电脑就自动写出一首诗…

机器学习知识经验分享之五:R语言安装

python语言用于深度学习较为广泛&#xff0c;R语言用于机器学习领域中的数据预测和数据处理算法较多&#xff0c;后续将更多分享机器学习数据预测相关知识的分享&#xff0c;有需要的朋友可持续关注&#xff0c;有疑问可以关注后私信留言。 目录 一、R语言介绍 二、R语言安装…

上海斯歌K2 x 赛博威 | 战略合作深度交流暨签约仪式

2月16日&#xff0c;上海斯歌K2与赛博威进行了战略合作深度交流&#xff0c;并在赛博威广州科学城办公室举办战略合作签约仪式。 为满足客户在数智化建设过程中的多元化需求&#xff0c;上海斯歌K2与赛博威曾多次产生交集。凭借双方多年合作的良好基础&#xff0c;自2022年始&a…

Eclipse教程 Ⅸ

今天继续来学习Eclipse 快速修复、Eclipse 浏览菜单、Eclipse 查找以及Eclipse 悬浮提示的内容&#xff01;老规矩&#xff0c;废话不多说&#xff0c;开始吧。 Eclipse 快速修复 使用快速修复 在 Eclipse 编辑器中当你输入字母时&#xff0c;编辑器会对你输入的内容进行错误…

matplotlib常用功能汇总

文章目录 1.IDE里的1.1 显示模式&#xff08;plt.ion()和plt.ioff()&#xff09;1.2 backend说明 2 jupyter里的3 通用的3.1 cmap3.2 subplot()相关3.3 绘制动态图&#xff08;Animation类&#xff09;3.4 matplotlib利用rcParams配置样式参数 4. 与opencv连用可能遭遇的问题1.…

再谈Linux epoll惊群问题的原因和解决方案

差别是什么&#xff1f;差别只是西装&#xff01; 缘起 近期排查了一个问题&#xff0c;epoll惊群的问题&#xff0c;起初我并不认为这是惊群导致&#xff0c;因为从现象上看&#xff0c;只是体现了CPU不均衡。一共fork了20个Server进程&#xff0c;在请求负载中等的时候&…

自适应网格搜索的多目标粒子群优化(MOPSO)

此博客中对文档的翻译为博主自己学习时意译的&#xff0c;仅用于学习用途&#xff0c;如有侵权请联系博主删除。如果有不足的地方&#xff0c;欢迎大家评论指出&#xff0c;与博主共同学习。 MOPSO对多目标粒子群优化的一个小建议 这篇文章提出了一个建议是扩展粒子群优化的启…

Python 极简socket多人聊天群

前言 别看目录又臭又长&#xff0c;其实可以直接从 第二章 开始看&#xff0c;因为 第一章 主要讲述socket的基础概念。但如果你只是想参考一下&#xff0c;可以直接跳到最后一章。 整个项目只使用了python的标准库&#xff0c;并建议初学者看完第一章 注&#xff1a;写这篇教程…

微信群机器人微云助手微小云如何设置群内积分兑换

经常有用户咨询我们询问积分有什么用,小编沉思之后只能说,没什么卵用…… 不过现在不一样了,微小云在新版本中推出了积分商城,积分商城可以让群友使用群内产生的积分兑换礼品了 具体怎么使用呢 首先点击登录的机器人,然后就可以看到积分商城的设置部分了 积分商城一共有4个功…

【继承】【群主发红包案例】

一、题目要求&#xff1a; 群主发普通红包。某群有多名成员&#xff0c;群主给成员发普通红包。普通红包的规则: ①.群主的- -笔金额&#xff0c; 从群主余额中扣除&#xff0c;平均分成n等份&#xff0c;让成员领取。 ②.成员领取红包后&#xff0c;保存到成员余额中。 请…