PIC单片机

article/2025/10/25 7:19:44

       PIC芯片所用编译器是MPLAB X IDE,刚开始接触PIC单片机,也是一脸茫然,然后查阅资料逐渐了解、运用编译器,这里我就不说编译器怎么使用了,下面我将以PIC12LF1822芯片为例,简单来说说我见解,分别说说时钟、串口、定时器、ADC、触摸按键。

一、时钟

     时钟一般有内部时钟(系统时钟)、外部时钟。单片机时钟可选择系统时钟、外部时钟。时钟相当于单片机的心脏,每跳动一下,整个单片机的各个电路就同步的动作一下。

  时钟配置

   配置PIC12LF1822时钟,一般只配置OSCCON寄存器就可以实现一些简单的功能,OSCCON寄存器如下图

     时钟初始化:                     

void Init_Fosc()
{OSCCON = 0xf0;//时钟频率32MH,内部时钟;
}

二、串口通信(EUSART)

      当今单片机一般都是用的异步串行通信,至于什么是异步串口通信这里就不累赘了。(关于串口可以看我另一个文章)

  配置串口

       一般配置串口会去配置单片机的哪个管脚为数据发送脚、数据接收脚、设置波特率、发送中断使能位、接受中断使能位、发送中断标志位、接收中断标志位。

      PIC12LF1822的波特率计算公式:

             波特率 = 系统时钟/(4[n+1]) 将计算出来的n值放入,波特率的高8位和低8位;

             比如我们把波特率定位9600,时钟定为4MHz。计算出 n = 25,则波特率寄存器装值如下:

                            SPBRGH=0;
                            SPBRGL=0x19;//Baud Rate is 9600

串口通信代码如下:

#include <xc.h> 
char ch;
void Init_Uart(void)
{RXDTSEL = 0;    //RA1->RxTXCKSEL = 0;    //RA0->TxTXSTA = 0x2c;   // Slave mode and Transmit enabledRCSTA = 0x90;   // Enables receiverBAUDCON = 0x80; //Uart enabled SPBRGH = 0;SPBRGL = 0x19;  //Baud Rate is 9600RCIE = 1;       //open Uart recive interputTXIE = 0;       //close Uart trismit interput
}void main(void)
{Init_Uart();while(1);return;
}void interrupt ISR(void)       //????????? 
{ if(RCIE==1)  //串口接受中断{ch = RCREG;RCIE = 0;TXIE = 1;       //open Uart trismit interputTXREG = d         while(TXIF == 0);   //wait TrismitTXIF = 0;}}

三、定时器 

      定时器是用来计时、计数的,几乎任何单片机程序都会用到定时器。配置定时器一般会配置时钟选择、中断使能、中断标志位、装初值、预分频等。定时器一般溢出中断后需要重新赋初值。

定时器与预分频器

        我在最开始学单片机始终没搞明白预分频,其实预分频也挺好理解的。在没有预分频器情况下。开启定时器每隔一个指令周期定时器就加一。假设时钟是4MHz  ,定时器时钟 = 系统时钟/4,也就是每隔 1us 定时器加一。如果有了预分频器假设预分频器设置成2分频,定时器就 每隔2us定时器加一。如果预分频器设置成4分频,定时器就 每隔4us定时器加一,以此类推。下图以预分频和周期来分析定时器:

定时器0(Time0)的简单代码如下:

void Init_Timer0(void)
{    OPTION_REG=0x87;   //设置预分频位256TMR0IE=1;          //Timer0溢出中断使能 TMR0IF=0;          //清空Timer0中断标志位TMR0=61;           //给Timer0赋初值,使Timer0溢出时间为50ms
}
void interrupt ISR(void)       //?中断函数
{ if(TMR0IF==1){/*该处写中断后你想实现的代码,并清零中断标志位、给Timer0重新装初值*/TMR0IF=0;TMR0=61;    //重新装初值    }
}

四、ADC 

      ADC即模/数转换器,把模拟信号转化为数字信号。数字量就是用 0和1 组成二进制代码表示某个信号大小的量。AD转换一般通过采样、量化、编码三个步骤。

 配置ADC

      ADC控制寄存器图如下:

 

ADC简单代码如下:

void AD_Init()
{ ANSELA = 0x01;   //RA0为模拟口TRISA = 0x01;    //RA0为输入ADCON0 = 0x01;  //选择通道AN0即RA0管脚,使能ADCADCON1 = 0x20;  //左对齐,时钟为F OSC /32
}
unsigned int AD_get_value()
{unsigned int value = 0;ADCON0bits.ADGO=1;          //开始转换while(ADCON0bits.GO==1);    //等待转换结束value=(unsigned int)ADRESH;  //强制类型转换,因为ADRESH是字符型的只能表示8位二进制。//所以必须转换成可以容纳10位二进制的整型value= value<<2;             // 将高两位左移8位value += ADRESL;             //低八位加入ADRESL的值return value;
}
unsigned int AD_average_value()
{unsigned int AD_value[10] = {0};unsigned int AD_average_value = 0;unsigned int i;for(i=0;i<10;i++){AD_value[i] = AD_get_value();AD_average_value += AD_value[i];}AD_average_value = AD_average_value/10;return AD_average_value;
}

 

五、触摸按键

按键触摸原理

   记录电容充放电的次数,当手触摸时电容充放电次数低于平均值,具体原理看《AN1101》、《AN1103电容触摸传感的软件处理》。

配置触摸按键步骤

  1. 设置芯片哪个管脚为触摸脚

     

  2. 将Timer1时钟源设置为电容式传感振荡器。

Timer1来计电容充放电的次数,由Timer0来计时。Timer0每隔段时间触发一次中断,来读取Timer1充放电的次数。必须设置Timer0的预分频器,使得Timer0比Timer1先溢出。value = TMR1L + (unsigned int)(TMR1H << 8)。

 

      3.判断当前频率次数是否低于正常的未触压的平均值。

触摸按键代码如下

#include <xc.h>  
#define true 1
#define false 0
unsigned char flag;
static int index;
static int num;
long raw[2] = {0};
long average[2] = {0};
long trip[2] = {2256,7000};
unsigned int CPS[2] = {0x02,0x03};
void init(void)
{/*init_fosc*/OSCCON = 0x6a;//4MHz/*init_interrupt*/INTCON = 0xc0;//open interrupts/*init_gpio*/ANSELA = 0x14;//RA0,RA5 is Digital,RA2,RA4 is  Analog inputTRISA = 0x16; //RA1,RA2,RA4 is input,RA0,RA5 is output/*init_uart*//*RXDTSEL=0;//RA1->RxTXCKSEL=0;//RA0->TxTXSTA=0x2c;//?????????RCSTA=0x90;//?????????BAUDCON=0x80;//baud raie control registerSPBRGH=0;SPBRGL=0x19;//Baud Rate is 9600RCIE=1; //open Uart recive interputTXIE=0; //close Uart trismit interput*//*init_Timer0; interrupt function need clear interrupt Flag bit*/OPTION_REG=0x87; //Prescaler is 256TMR0IE=1;//Timer0 Overflow Interrupt Enable TMR0IF=0;//clear Timer0 Overflow Interrupt Flag bitTMR0=61;//give Timer0 initial value,so 50ms/*init_timer1*/T1CON=0xc5; //enable Timer1 , Clock Prescale is 1:1TMR1IF=0;//clear Timer1 Overflow Interrupt Flag bitTMR1IE=1;//Enables the Timer1 overflow interruptTMR1H=0;//give Timer1 initial value,so 500msTMR1L=0;/*touch_init*/CPSCON0=0x8c;CPSCON1=0x02;
}void putch(unsigned char byte) //重定义
{TXREG = byte;         //Uart_Data while(TXIF == 0);   //等待发送TXIF = 0;
}void main(void)
{init();flag = false;index = 0;num = 0;//PORTA = 0x21;unsigned int i;while(1){   if(flag){TMR0IE=0;   //close Timer0 Overflow Interruptflag = false;if(raw[index] < average[index] - trip[index]){switch(index){case 0://printf("The bot button is pressed\r\n");PORTA |= 0x20;break;case 1://printf("The top button is pressed\r\n");PORTA |= 0x01;break;default:break;            }}else{if((raw[0] > average[0] - trip[0]) && (raw[1] > average[1] - trip[1])){PORTA = 0x00;}average[index] = average[index] + (raw[index] - average[index])/16;}index++;if(index >= 2)index = 0;TMR0IE=1;  //close Timer0 Overflow InterruptTMR0IF=0;  //clear Timer0 Overflow Interrupt Flag bitTMR0=61;   //give Timer0 initial value,so 50msTMR1IF=0;TMR1H=0;   //give Timer1 initial valueTMR1L=0;}            }return;
}void interrupt ISR(void)     
{ if(TMR0IF==1){flag = true;raw[num] = TMR1L + (unsigned int)(TMR1H << 8);num++;if(num>=2){num = 0;}CPSCON1 = CPS[num];TMR0IF=0;//clear Timer0 Overflow Interrupt Flag bitTMR0=61;//give Timer0 initial value,so 50msTMR1IF=0;TMR1H=0;//give Timer1 initial valueTMR1L=0;}if(TMR1IF==1){TMR1IF=0;//clear Timer1 Overflow Interrupt Flag bitTMR1H=0;//give Timer1 initial value,so 100msTMR1L=0;} 
}

 


http://chatgpt.dhexx.cn/article/j4MZdRtq.shtml

相关文章

PIC单片机应用开发实践教程(六): 代码配置器(MCC)

源码基于 PIC16F15355开发板&#xff0c;想了解详情&#xff0c;请点 PIC16F15355开发板 1、简介 MPLAB 代码配置器&#xff08;MPLAB Code Configurator&#xff0c;MCC&#xff09;通过图形用户界面&#xff08;Graphical User Interface&#xff0c;GUI&#xff09;生成驱…

【PIC】单片机基本概述

1. 公司 PIC 单片机是 Microchip&#xff08;微芯&#xff09; 公司的产品&#xff0c;始于1989年。 2. 精简指令集技术 传统的单片机采用复杂指令集&#xff08;Complex Instruction Set Computer, CISC&#xff09;结构&#xff0c;通常有50~110条。而 PIC 采用精简指令集&…

PIC单片机应用开发实践教程(二): 新建工程

源码基于 PIC16F15355开发板&#xff0c;想了解详情&#xff0c;请点 PIC16F15355开发板 1 打开MPLAB X IDE File---New Project Microchip Embedded --- Standalone Project 选择所用MCU对应型号 点击 Finish 后&#xff0c;工程就建好了 2 添加main.c文件 3 添加main.h文件 …

PIC单片机的入门认识(以PIC12为学习目标)

1.学习PIC12针脚定义 针脚1及针脚8可接电源5V和地线。针脚2.3可外接晶振。 针脚4为复位脚&#xff0c;当单片机正常运行时接高电平&#xff0c;若有一个低电平输入&#xff0c;单片机便复位。 针脚5则为单片机的I/O脚&#xff0c;可控制它为输入或输出&#xff0c;输入0&…

PIC单片机应用开发实践教程(七):PIC16F153xx——时钟使用

源码基于 PIC16F15355开发板&#xff0c;想了解详情&#xff0c;请点 PIC16F15355开发板 PIC16F15355 内部晶振框图如下&#xff0c;从框图中我们知道MCU时钟来源有3个&#xff1a;外部时钟&#xff0c;内部时钟&#xff0c;Timer1 内部时钟源&#xff08;INTERNAL CLOCK SOUR…

PIC单片机入门教程(二)—— 安装集成开发环境(MPLAB X IDE)

PIC单片机入门教程&#xff08;二&#xff09;—— 安装集成开发环境&#xff08;MPLAB X IDE&#xff09; 教程中使用的电脑运行Windows 10 专业版 64位系统 1、下载 MPLAB X IDE v4.05 历史版本&#xff1a;http://www.microchip.com/development-tools/pic-and-dspic-downl…

PIC单片机-Mplab的使用与PIC单片机介绍

内容包括Mplab IDE与Mplab X IDE的使用&#xff0c;触摸功能实践&#xff0c;PIC单片机C与汇编混合编程&#xff0c;PIC单片机介绍等。紫色文字是超链接&#xff0c;点击自动跳转至相关博文。持续更新&#xff0c;原创不易&#xff01; 目录&#xff1a; 一、Mplab IDE的使用…

PIC16F887 实战编程 单片机编程 基础实验教程

文章目录 2 PIC工程建立与仿真3 单片机基础寄存器操作&#xff1a;3.1 IO3.2 模拟输入电压读取3.3 外部中断3.4 定时器中断3.5 串口UART3.6 IIC通信 4 实际项目5 如何阅读代码6 如何把代码放到MPLAB V5.0xc8 v2.0上工作&#xff1f;6.1 短暂的回顾6.2 xc8 v2.0程序结构6.3 移植…

通俗易懂讲PIC单片机:从一窍不通到入门进步

单片机入门不难------谈PIC系列&#xff08;转自矿石收音机论坛---崂山&#xff09;十年前的老帖子&#xff0c;讲得通俗易懂&#xff0c;分享之。 请看图1 这个8条腿的小螃蟹就是我们的第一顿饭&#xff0c;只要把它吃下去&#xff0c;以后的大餐就好办了。第1、8条腿接电源 …

PIC单片机应用开发实践教程(五): 烧录器简介

源码基于 PIC16F15355开发板&#xff0c;想了解详情&#xff0c;请点 PIC16F15355开发板 ​​​​​​​ PIC单片机&#xff0c;无论是8位的10/12/16/18系列&#xff0c;还是16位PIC24/dsPIC33系列&#xff0c;常用的烧录器如下&#xff1a;PICkit3&#xff0c;PICkit4&#…

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…

PIC单片机应用开发实践教程(三): MCU配置位与烧录

1 编译 工程建好并把相应的 .c和.h文件都加载到工程后&#xff0c;如下图 试试编译&#xff0c;如果没有语法错误&#xff0c;编译结果如下 到这里&#xff0c;是不是可以进行烧录了呢&#xff1f;不急&#xff0c;还有很重要的一个步骤&#xff0c;MCU配置位的设置&#xff0…

PIC单片机应用开发实践教程(一):MPLAB X IDE 开发环境安装

源码基于 PIC16F15355开发板&#xff0c;想了解详情&#xff0c;请点 PIC16F15355开发板 1 准备电脑一台 2 下载开发环境 MPLAB-X-IDE 点Download后&#xff0c;自动下载。 3 下载C编译器&#xff08;以8位MCU用的xc8编译器为例&#xff09; MPLAB XC8 Compiler 4 安装MP…

PIC单片机入门教程(一)—— 准备工作

PIC单片机入门教程&#xff08;一&#xff09;—— 准备工作 1、电脑一台&#xff08;推荐运行Windows 7 旗舰版 64位系统&#xff09; 2、选择合适的烧录/调试工具 2.1 “Device Support.html”文件列举了所有器件能支持哪些烧录/调试工具&#xff0c;文件官方版本说明包里 下…

PIC单片机入门教程(三)—— 安装编译器(MPLAB XC Compilers)

PIC单片机入门教程&#xff08;三&#xff09;—— 安装编译器&#xff08;MPLAB XC Compilers&#xff09; 1、下载编译器&#xff08;MPLAB XC Compilers&#xff09; XC8、XC16和XC32对应8位、16位和32位PIC单片机&#xff0c;按实际使用的单片机选择下载最新版本即可。 截…

PIC单片机入门教程(四)—— 第一个工程

PIC单片机入门教程&#xff08;四&#xff09;—— 第一个工程 1、新建工程 1.1 菜单栏“文件”->“新建项目” 1.2 “Microchip嵌入式”->“独立项目”->“下一步” 1.3 在器件栏直接输入你的单片机型号&#xff0c;这里以PIC12F675为例。输入“PIC12F675”->“下…

PIC单片机入门_指令系统

1.前文回顾 前面学习了PIC单片机的系统框架&#xff0c;也介绍了程序存储器、数据存储器的组织形式。这里需要补充一点的就是寻址方式&#xff0c;之前仅仅提到了立即数寻址、直接寻址。其实还有几个比较重要的寻址方式&#xff0c;PC相对寻址&间接寻址&#xff01; 1.1 PC…

Demand management

需求管理&#xff08;Demand Management&#xff09;用于连接计划需求&#xff0c;销售需求和物料计划&#xff08;MPS和MRP&#xff09;。

Data Quality Services

Data Quality Services 简介 SQL Server 2012 其他版本 使用 Data Quality Services (DQS) 提供的数据质量解决方案&#xff0c;数据专员或 IT 专业人员可以维护数据的质量并确保数据满足业务使用的要求。 DQS 是一种知识驱动型解决方案&#xff0c;该解决方案通过计算机辅助方…