前言
之前对PIC单片机的介绍内容到定时器,接下来的内容没有介绍,主要是在忙一些其他的东西,所以没有写成博客。同时这些知识点有很多我还没有系统性整理。这次写这个博客相对于自己复习并整理一遍PIC单片机的基础知识,同时介绍一下单片机编程的基本思路。哈哈哈,当然能力有限,可能也会存在一些不周到或者错误的地方,请大家多多指正。
一、计算机原理基础知识
(1)计算机的两大架构
冯诺依曼架构和哈佛架构
冯诺依曼架构和哈佛结构的区别在于程序存储器和数据存储器是否通过同一个总线与CPU进行通讯。
哈佛结构优点在于取数据和取程序指令能够并行执行,执行效率很高。但是同时由于数据存储器和程序存储器相互分离,地址编码上会比较复杂一些。
(2)计算机中各个外设与CPU的连接方式
连接方式为:总线 分别有数据总线,地址总线,控制总线
(3)机器周期和指令周期
机器周期是指计算机内部振荡电路产生的振荡周期。指令周期是一条单指令的长度。(跳转指令为双指令周期指令)
Tosc:振荡器时钟周期,也称为机器周期
Tcy:指令周期
Tcy=4Tosc
例如晶振为4MHZ,则此时指令周期则为1us
(4)I/O复用
对于计算机的I/O口有时候不单单只有一个功能。这种对于同一个I/O口,但是其端口功能有多个的叫做I/O口的复用属性。在单片机中尤为凸显,请看下面的图片。
上面图片中每一个斜杆后面的字符就代表这个I/O口的复用具备的功能。
(5)计算机与数据存储器之间总线的宽度可以认为计算机的位数。
计算机的位数也叫字长,是指处理器一次运算所能处理的二进制数的位数;
在PIC16中,1 Byte=8 bit 即一个字节等于 8位;而1 word =14 bit 即一个字为十四位
二、C语言基本知识复习
编程注意事项:尽可能用加减法替代乘除法,因为PIC16没有对应的乘除指令,只能通过移位的方式实现乘除法,占据较大CPU性能。同时均可能的减少浮点数的使用,利用放大的思想进行浮点数的运算。
单片机的程序组成
------配置位--------头文件-----------宏定义-----------全局变量和函数的声明--------------主函数=============子函数
/*
**配置位**,单片机使用前要对单片机进行一个功能的配置,例如晶振选择啊,复位啊,看门狗之类的进行配置
*/
// PIC16F887 Configuration Bit Settings
// 'C' source line config statements
// 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 = OFF // 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)
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
/*引入头文件 一般都是xc.h对于目前简单的程序架构来说,不会涉及到自己去写头文件的情况*/
#include <xc.h>
//宏定义,一般来说宏定义的目的就是做到一改全改,当然有时候宏定义也可以作为一个类函数体 通常宏定义用于我们时钟的赋初值(ps:类似数电中的预置数)或者是对于一些引脚的取名字,起到易于辨识的目的 注意宏定义后面不允许使用;
#define T0_10MS 100
#define LED0 RD0
#define LED1 RD1
#define LED2 RD2
//实现功能:单片机的RD0、RD1、RD2分别接一个LED,让TMR0处于定时模式,让三个LED分别每隔10ms、100ms以及1s闪亮。
//经过计算,10ms 预分频选择64 (预分频选择101)初始值为100
//下面就是子函数的声明;
void __interrupt() INT_SER(void);//中断函数,中断函数并不是一个能够被调用的函数,它是一个特殊的函数。当满足一定条件后会自动进入中断函数
//全局变量的声明
char L;
//主函数,也就是程序的入口
void main(void) {
TRISD=0B00000000;
OPTION_REG=0B10000101;// 10,000,101; 000中第一个0表示选择内部时钟,第二0这里没有用到随意 第三0表示把预分频器给TMR0
INTCON=0B10100000;
TMR0=T0_10MS;
PORTD=0;
LED0=1;L=1;
while(1);
return;
}
//子函数的定义,对子函数进行书写
void __interrupt() INT_SER(void){
static char M =0;
static int N =0;
if(T0IF==1){
PORTD=0;
T0IF=0;
TMR0=T0_10MS;
if(L==1){
LED0=1;
L=0;
}
else{
LED0=0;
L=1;
}
M++;
N++;
if(M==10){
M=0;
LED1=1;
}
if(N==100){
N=0;
LED2=1;
}
}
}
xc8变量类型及其特点
注意一个特殊的变量:位变量 它的大小为一位 同时它必须为全局变量
__bit a;位变量的声明 两条下划线加bit
变量修饰关键词
课本P45面有详细介绍和说明
这里强调一个就是const
通常来说变量都被存储在RAM中,但是加了const后就被存储在ROM当中