2654|4

13

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

开启学习PIC之路,记录学习的点点滴滴,与大家分享 [复制链接]

本帖最后由 bbxyliyang01 于 2019-10-12 21:19 编辑

第一天PIC单片机编译环境的安装

  网上关于PIC单片机的入门或者学习资料相对较少,不像STM32、AVR或者51单片机那样丰富,所以我记录下我学习PIC单片机的点点滴滴,与大家共享下,技术在于交流,如我写的错误的地方,希望大家指正。

  来介绍一下我所使用的平台信息、调试工具。

  PIC单片机型号:PIC16F887

  开发环境:MPLAB X IDE v3.30

  下载工具:PIC Kit 3.5

  一、 安装开发环境

  我是直接在官网(www.microchip.com)上下载的MPLAB X IDE v3.30版本,400多兆,应该是最新版本了,安装过程中使用推荐选项就可以,还安装了一个XC8编译器(XC8_V1.31破解版)。如果大家需要软件,可以联系我们震撼科技工作室,QQ 515580142,我们可以把软件发给你。给大家介绍下我们震撼科技工作室,我们是几个刚大学毕业大学生创立,主要承接各种单片机设计制作,如原理图设计、电路板PCB绘制、单片机程序代写、实物制作等相关软硬件开发。

  二、 新建项目

  1、我安装开发环境的时候,选择了中文版本,进入开发环境后,点击:文件->新建项目,弹出如下界面:选择独立项目,然后点下一步。

  步骤一

  2、点击下一步后弹出如下界面:选择你使用的单片机型号,这里我使用的是PIC16F887单片机。

  步骤二

  3、继续点下一步,这里选择调试/下载工具,我使用的是PICkit3。

  步骤三

  4、下一步,这一步选择的是编译器,选择XC8编译器。

  步骤四

  5、最后一步,选择项目的保存目录,编码这里选择的是GB2312,这样做的目的是使项目中的中文字符能够被识别,否则,添加中文注释时会出现乱码。

  步骤五

  6、至此,项目新建完毕,界面如下,项目目录里面,我们目前只需要关注头文件和源文件即可,在头文件上右键可以选择添加现有的头文件,源文件同理。

  7、文件添加完成后,点击编译按钮http://editerupload.eepw.com.cn/201508/e489cd276e02dc488e051464eb6cc504.jpg 进行编译,编译通过后会在环境下方提示编译信息,

 8、 编译成功后,可以进行下载和在线调试,下载按钮http://editerupload.eepw.com.cn/201508/bc4612df82e6420b34e8f488789176d8.jpg 用于将程序下载到单片机内部,调试按钮http://editerupload.eepw.com.cn/201508/ceb2a9a3a209e432478ef8ce18db54d7.jpg 用于在线调试程序,注意,点击调试按钮程序不会下载到单片机内。

  注意接下来以测试程序来讲解这款单片机的使用,在此之前先来了解一下《配置位》,在开发环境中,点击运行窗口->PIC存取器视图->配置位,即可在环境下方调出配置窗口,Option下面的定义可以修改,

 

 

这里说一下时钟配置和看门狗配置,FOSC用于配置系统时钟,WDTE用于看门狗的配置,如果你想使用外部晶振就选择XT即可,同理,看门狗的开启和关闭,以及开启后的设置也可以通过WDTE来配置,这里我们选择关闭看门狗,只需将WDT选项选择为OFF即可,注意,这里选择好之后,必须点击输出生成源代码,会自动生成源码,生成的源码拷贝到你的项目文件中才有效。

  至于一些详细的配置请自行参见手册。

 

  生成代码

 

最新回复

这个要顶一下,以后越来越难得有共享精神   详情 回复 发表于 2019-12-21 20:44
点赞 关注(1)
 

回复
举报

5220

帖子

236

TA的资源

管理员

沙发
 

欢迎分享,学习中遇到什么问题也可以来论坛提问、讨论,论坛版主丁丁@dingzy_2002 在PIC单片机方面很有经验

加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
 
 

回复

13

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

第二天开始第一个程序

今天的任务,点亮一个LED,和编写一个流水灯程序。我们直接进入主题,先介绍下PIC单片机I/O口,I/O端口的寄存器复位后,默认为输入(输出高阻态),每一路I/O有方向控制寄存器TRISA~E和数据寄存器PORTA~E,为了实现I/O端口的功能必需先对端口进行初始化设置。 方向控制寄存器与数据寄存器都是8位的,方向控制寄存器中的每一位与数据寄存器中的每一位相对应;方向控制寄存器的相应位设置为1表示输入;设置为0表示输出;端口控制寄存器的相应位设置为1表示输出高电平,设置为0表示输出低电平。 这个需要我们记住。通用I/O接口的输出设计要点:1、输出电平的转换和匹配,我们PIC系统一般工作电源是5V,当连接的外围是9V、12V等于5V不同的电源时,需要考虑输出电平的转换。2、输出电流的驱动能力,每个I/O口允许最大25mA的灌电流和20mA的拉电流,可以直接驱动LED和继电器。因各端口结构不同,RB口提供的总灌电流和总拉电流可达150mA和100mA;其他端口为80mA和50mA;五个端口驱动电流之和不大于200mA。3、输出电平转换的延时,PIC单片机是一款高速单片机,当系统晶振为4MHZ时,执行一个指令的时间为0.25us,也就是说讲一个I/O置1,在置0,只需要0.25us。

  1. LED发光二级管电流硬件设计:二极管电流大于5MA,人眼睛就可以明显的观察到二极管的发光,导通电流越大,亮度越高。但最好不要超过10ma,否则可能会将二级管烧坏或IO口烧坏。我们在设计电路时,需要在电路中串接一个限流电阻,这个电流一般在330-1K之间。
  2. 软件设计,代码如下:

#include<pic.h> //头文件包含

//芯片配置字定义

#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 MCLR)

#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 = ON       // Brown Out Reset Selection bits (BOR enabled)

#pragma config IESO = ON        // Internal External Switchover bit (Internal/External Switchover mode is enabled)

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

#pragma config LVP = ON         // Low Voltage Programming Enable bit (RB3/PGM pin has PGM function, low voltage programming enabled)

#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()

{

//   TRISC=0xfe;//11111110端口操作

//   PORTC=0xfe;//00000001

   TRISC0=0;//位操作,类似51单片机sbit

   RC0=0;

   while(1);

}

实验效果如下:

流水灯程序如下:

#include<pic.h>

#define uchar unsigned char

#define uint  unsigned int

#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 MCLR)

#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 = ON       // Brown Out Reset Selection bits (BOR enabled)

#pragma config IESO = ON        // Internal External Switchover bit (Internal/External Switchover mode is enabled)

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

#pragma config LVP = ON         // Low Voltage Programming Enable bit (RB3/PGM pin has PGM function, low voltage programming enabled)

#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 delay_ms(uint x)

{

         uint a,b;

         for(a=x;a>0;a--)

                   for(b=110;b>0;b--);

}

void main()

{

         uchar position=0;

         TRISC=0x00;//设置为输出方式

         while(1)

         {

                   PORTC=~(1<<postion);

                   if(++position>=8)      postion=0;

                   delay_ms(1000);

         }

}

 

 

 
 
 

回复

13

帖子

0

TA的资源

一粒金砂(中级)

4
 

 

第三天 定时器的学习

3.1 定时/计数器功能

3.1.1定时功能

所谓定时功能就是通过来自单片机内部的时钟脉冲作计数脉冲,使计数器计数,即每个机器周期计数器加1,计数值达到予置值后,定时/计数模块产生溢出。

3.1.2计数器功能

所谓计数是指对外部事件进行计数。外部事件的发生以输入脉冲表示,因此计数功能的实质就是对外来脉冲进行计数。

3.2定时器应用的方法

在单片机中,每一个中断源都有一个相应的中断标志位,该中断标志将占据中断控制寄存器的一位,该中断标志位置1,就意味着有中断信号产生并向MCU申请中断,但这不代表MCU一定响应该中断。响应一个中断请求的条件:

响应A中断=全局中断允许标志(由用户软件设置)AND中断A允许标志位(由用户软件设置)AND中断A标志位(由用户软件设置或者符合中断条件时由硬件自动设置)。

我们今天的目的就是学习PIC单片机定时器0,实现让LED灯每隔1S亮一次。

接下来我们分析一下,指令周期就是单片机执行一个指令所花费的时间。这也是定时器定时的最小时间单位。时钟频率/4=指令频率。1/指令频率=指令周期。假设现在的时钟是4MHZ  ,4MHz的时钟经过4分频后变成了 1MHz 其周期为0.0000001s也就是1us,这个1us就是指令周期,这1us也就是定时器定时的最小单位。

1、定时器与预分频器

假设在没有预分频器情况下。开启定时器 每隔一个指令周期定时器就加一。假设时钟是4MHz  也就是每隔 1us 定时器加一。如果有了预分频器假设预分频器设置成2分频,定时器就 每隔2个指令周期定时器加一。如果预分频器设置成4分频,定时器就 每隔4个指令周期定时器加一,以此类推。

2、定时器中断标志位

如: TMR0 这个是8位的定时器,也就是8位的寄存器。8位的寄存器能代表的数值为0~255.也就是说定时器可以从0开始加一直加到255.到255后再加一就又变成0。此时TMR0定时器中断标志位 (TMR0IF)变成 1.(如果中断没有开启,并不执行中断程序。)

3、实例说明:

   假设时钟周期为4MHZ,每隔1秒点亮LED,每1秒灭掉LED。这样的程序要如何做到呢。

  1、得到指令周期

 4MHz/4=1MHz 

     1/1MHz=0.0000001s=1us

  2、得到预分频

     定时器定时的最大时间=预分频*256。256X256=65536us=65.536ms 这里面我们选择50ms。

 3计算定时器初始值=(定时器最大值+1)-(定时时间/预分频)。

     255+1=256

50000/256=195.3125

     256-195.3125=60.6875 四舍五入,定时器初始值为61

接下来我们就要开始编程,编程之前,我们讲下,几个重要的寄存器。

 

#include " pic.h"

//********************函数定义*********************  

//*************** 主程序 ********************

void main(void)

{  

  PSA=0;    //PSA等于0,分频

  PS0=1;

  PS1=1;

  PS2=1;

  T0CS=0;    //设为定时方式

  TMR0=61;   //设定定时初值    

  GIE=1;     //总中断允许

  T0IE=1;    //TMR0中断允许

  TRISC=0;      //PORTC设置为输出

  PORTC=0x0ff;  //PORTC输出1

  while(1)

  { 

  }

}

 

//*********************中断服务程序******************

void interrupt isr(void)

{

 static uint tmr0_count=0; 

if(T0IE&&T0IF)     //判断是否为TMR0中断

  {

    T0IF=0;     //清TMR0中断标志位(必须用软件清零)

    TMR0=61;    //TMR0重新赋初值

    if(++tmr0_count>=20)  //定时20次,就是1秒

    {

      tmr0_count=0;

      PORTC=~PORTC;      

    }

  }

}

 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

5
 

这个要顶一下,以后越来越难得有共享精神

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表