单片机论坛

标题: 开启PIC单片机学习之路,记录PIC单片机的学习的点点滴滴,与大家分享 [打印本页]

作者: bbxyliyang    时间: 2019-10-12 21:10
标题: 开启PIC单片机学习之路,记录PIC单片机的学习的点点滴滴,与大家分享
本帖最后由 bbxyliyang 于 2019-10-12 21:12 编辑

第一天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、文件添加完成后,点击编译按钮 进行编译,编译通过后会在环境下方提示编译信息,
 8、 编译成功后,可以进行下载和在线调试,下载按钮 用于将程序下载到单片机内部,调试按钮  用于在线调试程序,注意,点击调试按钮程序不会下载到单片机内。
  注意接下来以测试程序来讲解这款单片机的使用,在此之前先来了解一下《配置位》,在开发环境中,点击运行窗口->PIC存取器视图->配置位,即可在环境下方调出配置窗口,Option下面的定义可以修改,
这里说一下时钟配置和看门狗配置,FOSC用于配置系统时钟,WDTE用于看门狗的配置,如果你想使用外部晶振就选择XT即可,同理,看门狗的开启和关闭,以及开启后的设置也可以通过WDTE来配置,这里我们选择关闭看门狗,只需将WDT选项选择为OFF即可,注意,这里选择好之后,必须点击输出生成源代码,会自动生成源码,生成的源码拷贝到你的项目文件中才有效。
  至于一些详细的配置请自行参见手册。
  生成代码
 

PIC单片机编译环境的安装.doc

793.5 KB, 下载次数: 11, 下载积分: 黑币 -5


作者: taotie    时间: 2019-10-13 09:49
个人看法:
呵呵~~麻烦!不如用Proteus 8 配置xc8编译器爽快。
作者: bbxyliyang    时间: 2019-10-13 10:05
第二天开始第一个程序
今天的任务,点亮一个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>//头文件包含
//芯片配置字定义
#pragmaconfig FOSC = XT        // OscillatorSelection bits (XT oscillator: Crystal/resonator on RA6/OSC2/CLKOUT andRA7/OSC1/CLKIN)
#pragmaconfig WDTE = OFF       // Watchdog TimerEnable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCONregister)
#pragmaconfig PWRTE = OFF      // Power-up TimerEnable bit (PWRT disabled)
#pragmaconfig MCLRE = ON       // RE3/MCLR pinfunction select bit (RE3/MCLR pin function is MCLR)
#pragmaconfig CP = OFF         // CodeProtection bit (Program memory code protection is disabled)
#pragmaconfig CPD = OFF        // Data CodeProtection bit (Data memory code protection is disabled)
#pragmaconfig BOREN = ON       // Brown OutReset Selection bits (BOR enabled)
#pragmaconfig IESO = ON        // InternalExternal Switchover bit (Internal/External Switchover mode is enabled)
#pragmaconfig FCMEN = ON       // Fail-SafeClock Monitor Enabled bit (Fail-Safe Clock Monitor is enabled)
#pragmaconfig LVP = ON         // Low VoltageProgramming Enable bit (RB3/PGM pin has PGM function, low voltage programmingenabled)
#pragmaconfig BOR4V = BOR40V   // Brown-outReset Selection bit (Brown-out Reset set to 4.0V)
#pragmaconfig WRT = OFF        // Flash ProgramMemory Self Write Enable bits (Write protection off)
voidmain()
{
//   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 (XToscillator: Crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDTdisabled and can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRTdisabled)
#pragma config MCLRE = ON       // RE3/MCLR pin function select bit(RE3/MCLR pin function is MCLR)
#pragma config CP = OFF         // Code Protection bit (Program memorycode protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Datamemory code protection is disabled)
#pragma config BOREN = ON       // Brown Out Reset Selection bits (BORenabled)
#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-outReset set to 4.0V)
#pragma config WRT = OFF        // Flash Program Memory Self WriteEnable 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);
         }
}

作者: bbxyliyang    时间: 2019-10-13 10:42
taotie 发表于 2019-10-13 09:49
个人看法:
呵呵~~麻烦!不如用Proteus 8 配置xc8编译器爽快。

您好,这方面的资料吗,给我们分享下!
作者: taotie    时间: 2019-10-14 09:34
bbxyliyang 发表于 2019-10-13 10:42
您好,这方面的资料吗,给我们分享下!

在这个页面添加编译器路径就可以了~~



作者: bbxyliyang    时间: 2019-10-15 17:19
第三天 定时器的学习
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 interruptisr(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;      
    }
  }
}

作者: f15067460282    时间: 2019-10-17 08:57
给你 点赞  一起学习
作者: f15067460282    时间: 2019-10-17 09:08
等你继续更新

作者: son2011    时间: 2019-10-17 10:22
我也是才开始学PIC,多多交流
作者: bbxyliyang    时间: 2019-10-17 23:11
son2011 发表于 2019-10-17 10:22
我也是才开始学PIC,多多交流

技术在于交流,我会继续更新下去!帮助需要帮助的人!
作者: bbxyliyang    时间: 2019-10-17 23:15
f15067460282 发表于 2019-10-17 09:08
等你继续更新

好的,技术在于交流,我会继续更新下去,希望能帮助需要帮助的人!
作者: bbxyliyang    时间: 2019-10-20 09:36
这几天比较忙,没有跟时间更新,我把前3章WORD上传下,方便大家学习。

PIC单片机从入门到精通.doc

1.21 MB, 下载次数: 3, 下载积分: 黑币 -5






欢迎光临 单片机论坛 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1