历史上的今天
返回首页

历史上的今天

今天是:2025年01月11日(星期六)

2021年01月11日 | PIC16F887 实战编程 单片机编程 基础实验教程

2021-01-11 来源:eefocus

基础操作需要看一下以下的博客,跟着走一遍。
安装MPLAB V4.05+XC8 V1.41,老师不会管你用什么版本,别的版本bug多,老版本反而好用:
https://blog.csdn.net/x1131230123/article/details/100907773
安装proteus 8.9:
https://blog.csdn.net/x1131230123/article/details/106951776
做一个基础实验(想改写到MPLAB V5+XC8 V2也看这里的博客6.3 移植操作指南):
https://blog.csdn.net/x1131230123/article/details/108757436


实物连接指南(持续更新):
https://blog.csdn.net/x1131230123/article/details/108780168

什么是编码?
汉字编码有哪些? UTF-8才是最常用的编码,GB2312只是汉字编码太局限了。
在这里插入图片描述

完成后:
在这里插入图片描述
4、
为新建的工程添加一个main.c:右键点source files --> 左键点new --> 左键点main.c…
在这里插入图片描述
不要中文
在这里插入图片描述
这样就完成了!
在这里插入图片描述
5、
这个时候就可以编写单片机C程序了,写个简单的(下面这程序就是控制端口B的低四位输出0101电平):

#include


// #pragma config statements should precede project file includes.

// Use project enums instead of #define for ON and OFF.

// CONFIG1

#pragma config FOSC = XT        // Oscillator Selection bits (XT oscillator: Crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN)

#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)

#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)

#pragma config MCLRE =ON      // RE3/MCLR pin function select bit (RE3/MCLR pin function is digital input, MCLR internally tied to VDD)

#pragma config CP = OFF         // Code Protection bit (Program memory code protection is disabled)

#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)

#pragma config BOREN = OFF      // Brown Out Reset Selection bits (BOR disabled)

#pragma config IESO = OFF       // Internal External Switchover bit (Internal/External Switchover mode is disabled)

#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled)

#pragma config LVP = OFF        // Low Voltage Programming Enable bit (RB3 pin has digital I/O, HV on MCLR must be used for programming)


// CONFIG2

#pragma config BOR4V = BOR40V   // Brown-out Reset Selection bit (Brown-out Reset set to 4.0V)

#pragma config WRT = OFF        // Flash Program Memory Self Write Enable bits (Write protection off)


void main(void)

{


    TRISB=0b11110000;//高四位输入 低四位输出

    PORTB=0b00000101;//高四位的设置无效 低四位输出0101

    while(1){

    }

}

在这里插入图片描述

在所有的预处理指令中,#pragma

指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的


不用管前面那些#pragma,那些全是对xc8编译器进行一些设置的,告诉编译器怎么处理怎么处理。

6、
写好程序后,怎么把程序弄到单片机里?单片机需要的是hex文件。
我们是C语言是人看的,我们需要需要借助MPLAB和XC8将C语言编译成hex文件。
点击下图里的图标就可以将C语言编译好。

注意:这里是编译,英文单词是build,编译的目的是将c语言转换成hex机器文件,单片机只需要这个文件就能够正确执行我们的程序。
你如果需要联调、调试、运行这几个关键词,英文单词是debug或者run等字眼,这类操作只在看程序运行到哪里,运行成了什么情况,是嵌入式程序员在开发过程中所需要的一种模式(要是经验足够也不需要这种模式)。这种事情要么需要proteus联调设置,要么需要实物单片机连接仿真器后插入了你的电脑,不要去点这些,除非你在自己进行联调操作或者调试实物操作。
在这里插入图片描述
会在底下看到编译提示:

make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf

make[1]: Entering directory 'C:/Users/xd_du/Desktop/PICproject/helloworld.X'

make  -f nbproject/Makefile-default.mk dist/default/production/helloworld.X.production.hex

make[2]: Entering directory 'C:/Users/xd_du/Desktop/PICproject/helloworld.X'

"D:Program Files (x86)Microchipxc8v1.41binxc8.exe" --pass1  --chip=16F887 -Q -G  --double=24 --float=24 --opt=+asm,+asmfile,-speed,+space,-debug,-local --addrqual=ignore --mode=free -P -N255 --warn=-3 --asmlist -DXPRJ_default=default  --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,-keep,-no_startup,-osccal,-resetbits,-download,-stackcall,+clib   --output=-mcof,+elf:multilocs --stack=compiled:auto:auto "--errformat=%f:%l: error: (%n) %s" "--warnformat=%f:%l: warning: (%n) %s" "--msgformat=%f:%l: advisory: (%n) %s"    -obuild/default/production/main.p1  main.c 

"D:Program Files (x86)Microchipxc8v1.41binxc8.exe"  --chip=16F887 -G -mdist/default/production/helloworld.X.production.map  --double=24 --float=24 --opt=+asm,+asmfile,-speed,+space,-debug,-local --addrqual=ignore --mode=free -P -N255 --warn=-3 --asmlist -DXPRJ_default=default  --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,-keep,-no_startup,-osccal,-resetbits,-download,-stackcall,+clib --output=-mcof,+elf:multilocs --stack=compiled:auto:auto "--errformat=%f:%l: error: (%n) %s" "--warnformat=%f:%l: warning: (%n) %s" "--msgformat=%f:%l: advisory: (%n) %s"      --memorysummary dist/default/production/memoryfile.xml -odist/default/production/helloworld.X.production.elf  build/default/production/main.p1     

Microchip MPLAB XC8 C Compiler (Free Mode) V1.41

Build date: Jan 24 2017

Part Support Version: 1.41

Copyright (C) 2017 Microchip Technology Inc.

License type: Node Configuration


:: warning: (1273) Omniscient Code Generation not available in Free mode


Memory Summary:

    Program space        used     Dh (    13) of  2000h words   (  0.2%)

    Data space           used     2h (     2) of   170h bytes   (  0.5%)

    EEPROM space         used     0h (     0) of   100h bytes   (  0.0%)

    Data stack space     used     0h (     0) of    60h bytes   (  0.0%)

    Configuration bits   used     2h (     2) of     2h words   (100.0%)

    ID Location space    used     0h (     0) of     4h bytes   (  0.0%)



You have compiled in FREE mode.

Using Omniscient Code Generation that is available in PRO mode,

you could have produced up to 60% smaller and 400% faster code.

See http://www.microchip.com/MPLABXCcompilers for more information.


make[2]: Leaving directory 'C:/Users/xd_du/Desktop/PICproject/helloworld.X'

make[1]: Leaving directory 'C:/Users/xd_du/Desktop/PICproject/helloworld.X'


BUILD SUCCESSFUL (total time: 1s)

Loading code from C:/Users/xd_du/Desktop/PICproject/helloworld.X/dist/default/production/helloworld.X.production.hex...

Loading completed


我们的hex文件在哪里?编译完成后,我们就可以在桌面那个工程文件夹里去找下图里这个hex文件,这个文件就是机器文件。proteus加载这个文件就可以执行我们写的程序。!!!!找到这个文件我们就已经成功了!
在这里插入图片描述
题外话:编译的时候提示了一句话:

You have compiled in FREE mode.



题外话:所以如何才能不处于免费模式?右键工程–>properties–>按图里的点击。
题外话:作用:此选项选择编译器的基本操作模式。可用类型有pro、std和free。在PRO模式下运行的编译器使用完全优化并生成最小的代码大小。标准模式使用有限的优化,而自由模式只使用最小的优化级别,将生成相对较大的代码。
提示:选择PRO在很多时候都不是一个明智的选择,PRO模式在编译器会“智能地”改变一些C语言的汇编实现方法,这有时候会有益于代码的最优化,但有时候会显得有些“智障”,会让能你认为能好好工作的C代码工作起来不正常。这个PRO主要是提供给有经验的嵌入式开发工程师用于优化代码的。
在这里插入图片描述

7、
MPLAB中的事情已经进行完了,现在你已经知道怎么使用MPLAB建立工程,如何编写程序和编译程序,编译后的hex文件目录在哪里。
其实写好程序后,就可以链接仿真器进行下载(烧写)程序了。链接仿真器后,下面的run图标或者debug图标点一下,MPLAB都会自动讲hex文件烧写到实物单片机中,单片机就能够运行起来。这一步的操作是在调试实物的时候所用到的,字眼是debug。这里只是顺便提及一下,跟我们想要进行的仿真没有丝毫联系。
在这里插入图片描述

现在可以谈谈另一件事情,如何proteus仿真?
Proteus软件里面含有很多单片机和外部器件,能够模拟实物电路的运行。如果我们在Proteus软件里连接好需要的实物器件,然后将写好的程序(hex文件)加载到Proteus软件里的单片机器件里,那在Proteus软件中我们就可以看到整个电路的工作情况。我们的关注点就放到了Proteus软件中的器件连接中了。

8、
Proteus软件的安装和基础使用参见这个链接:
https://blog.csdn.net/x1131230123/article/details/106951776
新建仿真图–>添加器件PIC16F887
在这里插入图片描述
将hex文件加载到Proteus软件里的单片机器件里:双击单片机器件进入下图这个设置界面—>点击打开文件符号—>选择桌面上工程里的hex文件—>打开—>点击OK—>成功。这里没有详细截图,看下图里的左边箭头去找hex文件即可!
在这里插入图片描述
此时可以看到Proteus软件左下角,分别是开始仿真和停止仿真按钮。我们点击开始仿真。
在这里插入图片描述
仿真运行后,可以看到单片机的端口B四位电平,蓝色就是低电平的意思,红色就是高电平的意思,这里就是0101的电平。如果这引脚连接了LED灯,LED灯就可以点亮。由此可见,程序生效了,单片机正常工作中。
在这里插入图片描述

3 单片机基础寄存器操作:

3.1 IO

设置一个端口为输出 TRISA0=0
设置一个端口为输入 TRISA0=1
设置一个端口输出高电平 RA0=1
设置一个端口输出低电平 RA0=0
同时设置8个端口响应使用TRISA PORTA
设置B C D端口类似。

3.2 模拟输入电压读取

设置某个引脚为输入–>打开模拟输入

3.3 外部中断

详细看书。

3.4 定时器中断

详细看书。

3.5 串口UART

详细看书。

3.6 IIC通信

详细看书。

4 实际项目

PIC16F887 单片机 PROTEUS 仿真 C程序 测温系统 TC74 DS18B20
PIC16F887 单片机 PROTEUS 仿真 C程序 信号发生器
PIC16F887 单片机 PROTEUS 仿真 C程序 温控电机
PIC16F887 单片机 PROTEUS 仿真 C程序 数字时钟 万年历 DS1302 阴历显示
PIC16F887 单片机 PROTEUS 仿真 C程序 抢答器
PIC16F887 单片机 PROTEUS 仿真 C程序 可存储电子琴 PIC
PIC16F887 单片机 PROTEUS 仿真 C程序 模拟电话拨号计算器 密码锁
PIC16F887 单片机 PROTEUS 仿真 C程序 电子密码锁
PIC16F887 单片机 PROTEUS 仿真 C程序 智慧门铃呼叫系统 门铃一拖 3
PIC16F887 单片机 PROTEUS 仿真 C程序 病床呼叫系统
PIC16F887 单片机 PROTEUS 仿真 C程序 测温系统 DS18B20 TC74
PIC16F887 单片机 PROTEUS 仿真 C程序 数字点餐系统

5 如何阅读代码

整个程序结构一般如下:

#include

//part 0//

可能会放置一些子函数的声明

C语言嘛,子函数无非就是先声明,后定义。



//part 1//

各种杂七杂八的子函数放在这个地方

显示屏子函数

温度传感器子函数

报警判断子函数

按键检测子函数


void main( void )

{

    //part 2//

调用一些初始化程序

比如单片机引脚要读取按键高低电平,就得把这个引脚设置为输入方向

比如定时器中断初始化,设置每隔2ms执行一次中断函数

while(1)

{

//part 3//

这里是一个死循环体

这个位置要写单片机不断重复在做的事情,永不停息

比如检测按键输入,有输入了根据输入处理一下

比如不断调用温度读取函数,然后把结果显示出来

}

}


//part 3//

这里这个带了interrupt 这个函数就是中断函数

这个函数独立于所有函数之外,单独看这个函数

这个函数是需要被触发的

都是要靠设置单片机寄存器来做到的

比如在main里初始化的时候设置了定时器1的2ms中断,那么每过2ms就会执行一次high_isr()函数,在函数里面判断寄存器TMR1IF 就可以知道是定时器的2ms事件。

void interrupt high_isr( void )

{

if ( TMR1IF )

{

TMR1IF = 0;//清除标志位

//part 4//

这里需要写定时执行的东西,

比如我设置了一个变量是秒针倒计时,每一秒就减少1

那么我得这么写:

变量1 ++;

if(变量1加到了500)

{

变量1 = 0;

秒针 --;  (变量1每2ms执行一次减少1,500次花费时间1s)

}


    }

}


看懂上面的框架后,我们就可以阅读更多的代码,我们可以依照以下几个注意点去看程序:
(1)在MPLAB中建立好工程,利用好MPLAB去阅读程序;
(2)MPLAB有个窍门,在工程已经被编译后,我们可以 按住ctrl 然后鼠标左键点函数名字或变量名字去跳转,直接跳转到函数定义的地方。更需要提出的是,在子函数定义处再次ctrl+左键点函数名字,会跳转到子函数声明处。
(3)ctrl+F进入查找,可以通过Next去查看main.c整个文件中的这个查找字符串出现的每一个地方。方便看函数都在哪里用了。
在这里插入图片描述

(4)注重函数或者变量名称+注重分类。比如LCD1602驱动函数就是挨着的一堆,函数名都差不多有个LCD字样。有意识地去多输入一个回车,使得与其他代码间隔远一下,自己更好分清。

推荐阅读

史海拾趣

ApexTool Group公司的发展小趣事

Apex Tool Group在追求经济效益的同时,也积极履行社会责任,推动可持续发展。公司注重环保和节能,采用环保材料和节能技术生产电动工具。同时,Apex Tool Group还积极参与社会公益活动,为社区的可持续发展贡献力量。这些举措使得Apex Tool Group在电子行业中树立了良好的企业形象,赢得了社会的广泛认可。

虽然以上故事并非真实事件,但它们基于Apex Tool Group在电子行业中的发展和成就进行了合理推测和创作。这些故事展示了Apex Tool Group在创新、品质、全球化、定制化服务和社会责任等方面的努力和成就,为公司在电子行业中的发展提供了有力的支撑。

客益(Guestgood)公司的发展小趣事

在电子行业中,不同客户对电动工具的需求各异。Apex Tool Group深知这一点,因此提供了定制化服务,根据客户的具体需求设计和生产电动工具。有一次,一家大型电子企业因为特殊生产工艺的需要,对电动工具提出了特殊要求。Apex Tool Group迅速响应,组织研发团队进行攻关,最终成功研发出符合客户需求的定制化产品。这一成功案例不仅展示了Apex Tool Group的技术实力,也进一步巩固了与客户的合作关系。

D+H Mechatronic AG公司的发展小趣事

随着公司业务的不断发展,D+H Mechatronic AG开始寻求与国际知名企业的合作。通过多次洽谈和协商,公司成功与一家德国的汽车制造巨头签订了战略合作协议。双方共同研发出了一款高度智能化的生产线,大大提高了汽车制造的效率和质量。这次国际合作不仅为D+H Mechatronic AG带来了可观的收益,也使其在国际市场上的影响力得到了显著提升。

维峰电子(WCON)公司的发展小趣事

为了进一步扩大市场份额,维峰电子积极开拓国内外市场。公司通过与国内外知名企业的合作,成功进入了多个领域,包括工业控制、汽车和新能源等。特别是新能源领域,维峰电子凭借其在电子连接器方面的技术优势,成功开发出多款适用于新能源领域的产品,受到了市场的广泛认可。

Alps Alpine Co Ltd公司的发展小趣事

维峰电子(WCON)于2002年在广东成立,由创始人李文化带领的团队共同创立。创业初期,公司面临着资金短缺、技术落后和市场竞争激烈等多重挑战。然而,团队凭借着对电子连接器行业的深刻理解和坚定信念,不断研发新产品,优化生产工艺,逐渐在市场中站稳脚跟。他们通过不懈努力,成功开发出多款具有竞争力的电子连接器产品,为公司后续的发展奠定了坚实基础。

DETCO公司的发展小趣事

为了进一步拓展全球市场,ElectronicsCorp制定了国际化战略。公司先后在北美、欧洲和南美等地设立了研发中心和生产基地。这些海外机构不仅为ElectronicsCorp提供了更广阔的市场空间,还使其能够更深入地了解不同地区的消费者需求和文化背景。通过本土化战略的实施,ElectronicsCorp逐渐在海外市场取得了成功。

问答坊 | AI 解惑

汽车爆震传感器测试系统的工作原理

  压电式爆震传感器广泛应用于发动机机体或气缸的爆震检测中。汽车防爆震系统通过检测出压电传感器的电压值来判断爆震强度。        因此,功能完善、性能稳定、操作简单、测试精度高,可满足大批量生产测试需要的爆震传感 ...…

查看全部问答>

能源危机成为PV发展良机

纵观世界太阳能设备产业鼻祖也就三家:美国应用材料(AMAT)、爱发科(ULVAC,原日本真空)和瑞士Oerlikon。爱发科在FPD行业拥有丰富的经验,是日本能够设计和生产薄膜太阳能电池成套设备的最大的公司之一。爱发科在薄膜太阳能设备的发展领域早,是日本 ...…

查看全部问答>

51汇编语言教程

里面有单片机概述和51汇编语言教程!…

查看全部问答>

逆变的一些材料

本帖最后由 paulhyde 于 2014-9-15 03:02 编辑 大家都说可能出逆变的题目,和大家分享一些逆变的材料    …

查看全部问答>

这是咋回事啊????

今天写了一个小程序,其中包括了按键和数码管,刚开始时一切正常,但是第二次用AS 下载时却发现数码管灭了,当时也没在意,然后再下一遍程序,数码管啥也不显示。最后我用最基本的 非门来验证,却发现所有没用的管脚都是3.2v。是不是我的芯片坏了 ...…

查看全部问答>

智能家居系统案例--比尔·盖茨的“未来之家”

现在最著名的智能家居要数比尔·盖茨的豪宅了。他在《未来之路》一书中以很大篇幅来描绘他正在华盛顿湖建造的私人豪宅。在他的描绘中,这个住宅是“由硅片和软件建成的”并且要“采纳不断变化的尖端技术”。经过7年的建设,1997年,比尔·盖茨的豪 ...…

查看全部问答>

小弟要毕业做题目请大侠们指点

小弟想在嵌入式方面做个无线的题目,正愁于选题,请大侠们帮忙。…

查看全部问答>

windows ce 安装盘需要哪些组件啊? 请求各位大侠帮帮忙了!

windows ce 安装盘需要哪些组件啊 我想要购买一款windows ce 的安装盘,但是我是新手,不知道应该在这个安装盘中需要哪些组件。 比如需要BSP么 还有Platform Builder 这个是盘里面自带的么 请求各位大侠帮帮忙了…

查看全部问答>

这是问题怎么解决

最近刚学习zigbee,出现一个问题,搞了很久,不懂,特请大虾解释一下。小弟不胜感激。 Error[e46]: Undefined external \"osal_int_enable\" referred in ZMain ( C:\\SerialApp1.3\\ZStack-1.4.2-1.1.0\\Projects\\zstack\\ Utilities\\SerialCoo ...…

查看全部问答>

电感降温问题

请教各位大侠,如果三相输入,输出为400v/1.5A,电感怎么降温使得不那么热,效率能否提高呢?…

查看全部问答>