PIC16F877A与EEPROM进行SPI通信C程序
pic单片机16F877与spi接口的eeprom读写C程序
TRISC4=1;
SSPCON=0b00100000;
INTCON=0x00;
SSPSTAT=0b11000000;
ADCON1=0b00000110;
TRISA1=0;
}
//*----spi comuncation
void spi_com(unsigned char x)
{
SSPBUF=x;
TRISD=0b00110000;
unsigned char d=4,one,ten,hund,thou;
unsigned char seg8[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,
0x07,0x7F,0x67};//显示比划代码
one=x%10;
ten=x/10%10;
while(SSPIF==0);
SSPIF=0;
}
//-----------spi enable
void spi_en()
{
RA1=0;
spi_com(0x06);//WREN code
RA1=1;
nop();
}
//send data ========
void send(unsigned char data,unsigned char add)
delay(300);
//for see to delay
RD2=0;//stop display ten
delay(4);
//stop to delay
PORTB=seg8[hund];
//display hund code to PORTB
RD1=1;
//begain to display
PIC16F877A功能及其编程
4.1.1 端口A
因此,在使用RA口时,除了要设置TRISA外,有 时相关寄存器也要设置。
注意:在上电复位时,与AN有关的端口的默认 设置是作为模拟端口,即ADCON1(见4.6)中默认 值为0b00xx0000,这个值的设置结果是除RA4外的所 有的RA引脚都作为模拟输入。
信的时钟线; RC7/RX/DT:IO引脚、异步串行通信的接收、同步串行通
信的数据线。
4.1.4 端口D
端口D有8个引脚,它除了作为普通IO口外, 还能作为并行从动口使用。
4.1.5 端口E 端口E只有3个引脚,它们都可以作为AD转换
的模拟电压输入口,功能如下:
RE0/RD/AN5:IO引脚、并行从动口的读控制、 模拟电压输入通道AN5;
➢ 中断的特点:可返回性。中断处理结束后必须能 回到原先的程序,并且能继续运行原先的程序,
这就需要在中断时能进行现场保护与恢复。
中断的执行过程
➢ 中断发生:程序执行到某行,突然事件(能够产 生中断的事件)发生,产生中断。
➢ 断点保护:CPU自动将中断时刻即将要执行的下 一条指令的地址压入堆栈。
➢ 中断响应:CPU自动将PC强制设为0X0004,且GIE =0。执行中断服务程序(自动完成现场保护与恢 复,手动清中断标志位)。
将被调试系统占用,因此在调试时此二个引脚暂 不能使用。
3、8个引脚具有内部弱上拉使能控制 由OPTION_REG寄存器的第7位RBPU控制,如果弱 上拉使能,作为输入的RB口在端口悬空时将被上拉 到高电平。以RB0为例,如下图所示:
4、RB0/INT具有外部中断功能。
5、RB的的高4位还具有电平变化中断功能
ADIE
PIC16F877 MSSP模块之SPI通信
PIC16F877 MSSP 模块之SPI 通信SPI 模式允许同时、同步发送和接收8 位数据。
支持SPI 的所有四种模式。
一般用以下三个引脚来完成通信:串行数据输出(SDO) 串行数据输入(SDI) 串行时钟(SCK)当工作在从动模式时,可能还需要第4 个引脚:从动选择(SS)结构框图:SSP 模块由一个发送/接收移位寄存器(SSPSR)和一个缓冲寄存器(SSPBUF)组成。
SSPSR 用于器件输入和输出数据的移位,高位在前。
在新的数据接收完毕前,SSPBUF 保存上次写入SSPSR 的数据。
一旦8 位新数据接收完毕,该字节被送入SSPBUF 寄存器。
同时缓冲区满标志位BF(SSPSTAT )和中断标志位SSPIF 置1。
这种双重缓冲接收方式,允许接收数据被读走之前,开始接收下一个数据。
在数据发送/接收期间,任何试图写SSPBUF 寄存器的操作都无效,却会将写冲突检测位WCOL(SSPCON)置1。
此时用户必须用软件将WCOL 位清零,以判别下一次对SSPBUF 的写操作是否成功完成。
为确保应用软件有效地接收数据,应该在新数据写入SSPBUF 之前,将SSPBUF 中的数据读走。
缓冲区满标志位BF(SSPSTAT)用于表示SSPBUF 是否已经载入了接收的数据(发送完成)。
当SSPBUF 中的数据被读取后,BF 位即被清零。
如果SPI 仅仅作为一个发送器,则不必理会这一位。
通常可用SSP 中断来判断发送或接收是否完成。
如果需要接收数据,可从SSPBUF 中读取。
SSP 中断一般用来确定发送/接收何时完成。
必须对SSPBUF 进行读和/写。
如果不打算使用中断方法,用软件查询方法同样可确保不会发生写冲突。
主控模式的操作因为主控制器控制着SCK 信号,所以它可以在任何时候启。
pic16f877a编程实例
pic16f877a编程实例pic16f877a是一款常用的单片机,被广泛应用于嵌入式系统中。
它具有多种功能和强大的性能,可以实现各种应用需求。
本文将以pic16f877a编程实例为主题,介绍其基本特性和常见应用。
pic16f877a是一款8位单片机,采用哈佛架构,具有高性能和低功耗的特点。
它内置了8KB的程序存储器,368字节的数据存储器,以及35个I/O引脚,可以满足大多数嵌入式系统的需求。
我们来看一个简单的实例,通过pic16f877a控制LED灯的开关。
```c#include <pic16f877a.h>void main() {TRISB0 = 0; // 设置RB0为输出引脚while(1) {RB0 = 1; // 将RB0引脚电平设置为高,LED灯亮__delay_ms(1000); // 延时1秒RB0 = 0; // 将RB0引脚电平设置为低,LED灯灭__delay_ms(1000); // 延时1秒}}```在上面的程序中,我们首先将RB0引脚设置为输出引脚,然后进入一个无限循环。
在循环中,我们将RB0引脚电平设置为高,LED灯亮起,然后延时1秒;然后将RB0引脚电平设置为低,LED灯熄灭,再次延时1秒。
通过不断重复这个过程,我们可以实现LED灯的闪烁效果。
除了控制LED灯,pic16f877a还可以用来控制其他外设,如蜂鸣器、液晶显示屏等。
下面是一个使用pic16f877a控制蜂鸣器的实例。
```c#include <pic16f877a.h>void main() {TRISB0 = 0; // 设置RB0为输出引脚while(1) {RB0 = 1; // 将RB0引脚电平设置为高,蜂鸣器鸣叫__delay_ms(1000); // 延时1秒RB0 = 0; // 将RB0引脚电平设置为低,蜂鸣器停止鸣叫__delay_ms(1000); // 延时1秒}}```在上面的程序中,我们同样将RB0引脚设置为输出引脚,并进入一个无限循环。
第四章PIC16F877A功能及其编程
WDT倍率 1:01
采用1:40M2 Hz晶 最振大,1:延用04时TM多R少0?
1:08 1:16 1:32 1:64 1:128
TMR0的预分频系数范围为2-256,如何获得1:1的倍率?
例:假设晶振振荡频率fosc=4MHz,求TMR0最大延 时时间是多少?
信的时钟线; RC7/RX/DT:IO引脚、异步串行通信的接收、同步串行通
信的数据线。
4.1.4 端口D
端口D有8个引脚,它除了作为普通IO口外, 还能作为并行从动口使用。
4.1.5 端口E 端口E只有3个引脚,它们都可以作为AD转换
的模拟电压输入口,功能如下:
RE0/RD/AN5:IO引脚、并行从动口的读控制、 模拟电压输入通道AN5;
与中断直接相关的位为INTEDG,它涉及到外 部中断(RB0/INT)的中断边沿选择,0为下降沿。
OPTION_REG=0b10111111; //等效 INTEDG=0
注意: ➢ 进入中断后硬件自动屏蔽全局中断,即中断后GIE=0,
中断返回后自动恢复全局中断允许,GIE=1。
➢ 因此,PIC16单片机不允许中断嵌套!也就是说,在 中断服务程序未退出时,即使有新的中断发生,也不 能进入中断。等当前的中断处理完成退出中断后才能 重新进入中断。
工作原理:递加计数。即由计数初值开始,每来若 干个计数脉冲(和预分频比有关),计数值+1,直 到255。若再加1,溢出,同时使计数当前值等于0
TMR0有溢出中断功能,T0IF将自动置1
若要对外部脉冲计数,必须 ①编程OPTION_REG ,(<T0CS>)置1 ②编程TRISA , RA4/T0CKI引脚设置为输入 ③硬件电路:符合一定要求的外部脉冲送RA4/T0CKI
PIC单片机的C语言编程
PIC单片机的C语言编程简介PIC(Peripheral Interface Controller)是一种广泛使用的单片机系列,由美国微芯科技公司(Microchip Technology Inc.)开发和生产。
其特点是体积小、功耗低、功能强大,并且具有高性价比,因此在嵌入式系统领域得到了广泛的应用。
在PIC单片机的编程中,C语言是最常用的编程语言之一。
本文将介绍如何在PIC单片机上使用C语言进行编程。
准备工作在开始C语言编程之前,我们需要准备以下工具和设备:1.PIC单片机开发板:选择一款适合你的需求的PIC单片机开发板,例如PIC16F877A。
2.编程软件:Microchip公司的MPLAB IDE是最常用的PIC单片机编程软件之一,可以在官方网站上免费下载安装。
3.编程语言:C语言是PIC单片机常用的编程语言,具有丰富的库函数和易于学习的语法。
第一个C程序编写第一个C程序是入门PIC单片机编程的第一步。
以下是一个简单的LED闪烁程序示例:#include <xc.h>// 包含使用于PIC单片机的头文件#define _XTAL_FREQ 4000000 // 定义晶振频率为4MHz// 主函数void main(void){TRISB = 0b00000000; // 将PORTB所有引脚设为输出PORTB = 0b00000001; // 将RB0引脚输出高电平while(1){PORTBbits.RB0 = 1; // RB0引脚输出高电平__delay_ms(1000); // 延时1秒PORTBbits.RB0 = 0; // RB0引脚输出低电平__delay_ms(1000); // 延时1秒}}在这个程序中,我们使用了xc.h头文件来包含适用于PIC单片机的库函数和宏定义。
使用#define指令定义了晶振频率为4MHz,可以根据自己的实际情况进行修改。
在main函数中,通过TRISB寄存器将PORTB所有引脚设置为输出模式,并使用PORTB寄存器将RB0引脚输出高电平。
PIC16F877A开发学习板用户手册
KEY_LED 实验步骤: 短接跳线 J23 将 hex 文件下载到单片机中 实验现象:按下 GPIO 键,松开后,led 点亮;按下 INT 健,松开后,led 灭 KEY_ZTJ 10、 矩阵键盘实验 KEY_JZH 实验步骤: 短接跳线 J50 的 LED_ON 和中间脚 将 hex 文件下载到单片机中 实验现象:按下按键,数码管显示键值 11、 定时器/计数器 T0 实验 T0_DSQ 实验步骤: 短接跳线 J23 将 hex 文件下载到单片机中 实验现象:下载代码,运行程序,LED 闪烁 T0_JS_1 实验步骤: 短接跳线 J50 的 LED_ON 和中间脚
断电后数据保持,上电后,从断电时的值开始加(写入 24C02 的数据为 1 递加到 99,LCD1602 从 24C02 中读数据之后显示)
AT24C02 实验步骤: 短接跳线 J18 上面两个引脚和 J22 上面两个引脚 将 hex 文件下载到单片机中 将 1602 液晶屏插入 1602 接口 如果此时没有显示则按复位键便可正常显示 实验现象:1602 第一行显示数值,数值从 1 加到 99, 断电后数据保持,上电后,从断电时的值开始加 17、 模数转换 AD 实验 AD_1
将 hex 文件下载到单片机中 实验现象:LED 灯依次点亮 2、 数码管实验 SMG 实验步骤: 短接跳线 J50 的 LED_ON 和中间脚 将 hex 文件下载到单片机中 实验现象:8 个数码管依次显示 0~7 SMG_JT 实验步骤: 短接跳线 J50 的 LED_ON 和中间脚 将 hex 文件下载到单片机中 实验现象:数码管静态显示一个数字 74HC595_SMG 实验步骤: 短接跳线 J50 的 LED_ON 和中间脚 将 hex 文件下载到单片机中 实验现象:8 位数码管显示 0-7 3、 蜂鸣器实验 BUZZER 实验步骤: 短接跳线 J6
PIC16F877A单片机中文文献
PIC16F877A单片机是microchip公司的产品,它采用14位的RISC指令系统,内部集成了A/D转换器、EEPROM、模拟比较器、带比较和捕捉功能的定时器/计数器、PWM输出、异步串行通信电路等。
1.程序存储器程序存储器和堆栈PIC16F877A单片机内部具有8K×14位的Flash程序存储器,程序存储器具有13位宽度的程序计数器地址范围:0000H-1FFFH。
由程序计数器提供13条地址线进行单元选择,每个单元宽14位,即PIC16F877A的指令字节宽度为14位,能够存放一条PIC单片机系统指令。
在系统上电或其他复位情况下,程序计数器均从0000H地址单元开始工作。
如果遇到调用子程序或系统发生事件中断时,将把当前程序断点处的地址送入8级×14位的堆栈区域进行保护。
堆栈是一个独立的存储区域,在调用的子程序或中断服务程序执行完后,再恢复断点地址。
通过14位程序总线,取出对应程序之灵的机器码,送入指令存储器,将组成的操作码和操作数进行有效分离。
如果操作数为地址,则进入地址复用器;如果操作数为数据,则进入数据复用器。
而操作码将在指令译码和控制单元中转化为相应的功能操作。
PIC的多数指令均是顺序执行,即使条件跳转也是隔行间接跳转。
具有大范围转移功能的指令只有两条:无条件GOTO语句和调用子程序CALL语句。
但它们受到2KB范围的约束。
所以必须将整个程序存储器以2KB为单位进行分页。
PIC16F877A单片机的上电复位地址是0000H,中端口地址是0004H,中断产生时PC指针会自动指向该地址。
在进行中断应用时,特别是涉及多个中断同时打开时,必须要逐个对中断标志进行判断。
编程时,在0000H-0003H单元内要放置一条GOTO跳转指令,跳转到主程序,以避开0004H存储器单元。
2.数据存储器数据存储器PIC单片机的数据存储器与传统的MCS-51单片机一样,在配置结构上可分为通用寄存器和特殊功能寄存器两大类。
PIC16F877ASPI通信C程序
TRISC=0b00010001;//C口SDO为输出SDI为输入,SCK为输出,RC1输出RC0输入开
TRISD=0; //D口全为输出
PORTD=0;
SSPEN=1;//相应的引脚为一般的I/O口
CKP=1;//空闲时钟为高电平
SMP=1;//在数据信号的末端采样
number如果接受与发送的数据不相等则发生错误error1
#include<pic.h>
//注意RB0要接下拉电阻
__CONFIG(0x3F39);
void CSH(void);//初始化子程序
void DELAY(unsigned int n);//函数声明
char SPI_WRITE(char R); //SPI发送函数
A=SPI_WRITE(number);//发送数据
RC2=1;//完成写操作
DELAY(5);
}
void interrupt ISR(void)
{char a;int k;
if(INTF==1)
{
for (k=1024;k>0;k--)NOP();//DELAY(30);//防抖动
INTF=0;//清标志位
}
void WRITE(char number)
{char A;
RC2=0;//片选信号,低电平有效
SPI_WRITE(0b00000110);//允许写入
RC2=1;//完成写使能
RC2=0;//片选信号,低电平有效
A=SPI_WRITE(0b00000010);//写指令
lcd1602_pic16f877a_程序_代码
uint i;
uchar j;
for(i=0;i<2;i++)
{
j&=0x00;
j|=(dat&0xf0);
PORT=j;
PORT&=0x0f;//清高四位
PORT|=(dat&0xf0);//写高四位
if(x==1)
RS=1;
else
RS=0;
delay(3);
EN=1;
delay(3);
EN=0;
lcd_write(0x01,0);//显示清零,数据指针d location(uint x,uint y)
{
if(x==1)
{
lcd_write(0x80+y,0);
}
if(x==2)
{
lcd_write(0xc0+y,0);
}
}
void lcd_prins(uint x,uint y,uint z)//这里不能用uchar z,否则当z=6578,即四位或五位数时,放不下而导致出错
//lcd_single_prins(uint x,uint y,uint z);
////
//2013,01,07 //
/***********************************************/
#define uchar unsigned char
#define uint unsigned int
void delay(uint x);
void lcd_write(uchar dat,uchar x);
//延时函数
void delay(uint x)
{
PIC16F877A单片机中文文献
PIC16F877A单片机是microchip公司的产品,它采用14位的RISC指令系统,内部集成了A/D转换器、EEPROM、模拟比较器、带比较和捕捉功能的定时器/计数器、PWM输出、异步串行通信电路等。
1.程序存储器程序存储器和堆栈PIC16F877A单片机内部具有8K×14位的Flash程序存储器,程序存储器具有13位宽度的程序计数器地址范围:0000H-1FFFH。
由程序计数器提供13条地址线进行单元选择,每个单元宽14位,即PIC16F877A的指令字节宽度为14位,能够存放一条PIC单片机系统指令。
在系统上电或其他复位情况下,程序计数器均从0000H地址单元开始工作。
如果遇到调用子程序或系统发生事件中断时,将把当前程序断点处的地址送入8级×14位的堆栈区域进行保护。
堆栈是一个独立的存储区域,在调用的子程序或中断服务程序执行完后,再恢复断点地址。
通过14位程序总线,取出对应程序之灵的机器码,送入指令存储器,将组成的操作码和操作数进行有效分离。
如果操作数为地址,则进入地址复用器;如果操作数为数据,则进入数据复用器。
而操作码将在指令译码和控制单元中转化为相应的功能操作。
PIC的多数指令均是顺序执行,即使条件跳转也是隔行间接跳转。
具有大范围转移功能的指令只有两条:无条件GOTO语句和调用子程序CALL语句。
但它们受到2KB范围的约束。
所以必须将整个程序存储器以2KB为单位进行分页。
PIC16F877A单片机的上电复位地址是0000H,中端口地址是0004H,中断产生时PC指针会自动指向该地址。
在进行中断应用时,特别是涉及多个中断同时打开时,必须要逐个对中断标志进行判断。
编程时,在0000H-0003H单元内要放置一条GOTO跳转指令,跳转到主程序,以避开0004H存储器单元。
2.数据存储器数据存储器PIC单片机的数据存储器与传统的MCS-51单片机一样,在配置结构上可分为通用寄存器和特殊功能寄存器两大类。
基于PIC16F877A时钟程序实验C程序
TMR1CS=0;
T1CKPS1=1;
T1CKPS0=1;
TMR1H=0x0B;
TMR1L=0xE9;
T1SYNC=0Βιβλιοθήκη TMR1ON=1; TMR1IF=0;
TMR1IE=1;
PEIE=1;
GIE=1;
while(1)
U5C=0; //U5A=1,U5B=1,U5C=0,选通数码管的个位进行显示
PORTD=LED[j%10];
}
}
}
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《《
{
U5A=0; //U5A=0,U5B=1,U5C=0,选通数码管的十位进行显示
U5B=1; //U5A=0,U5B=1,U5C=0,选通数码管的十位进行显示
U5C=0; //U5A=0,U5B=1,U5C=0,选通数码管的十位进行显示
PORTD=0x00;
PORTB=0x00;
TMR1CS=0;
T1CKPS1=1;
T1CKPS0=1;
TMR1H=0x0B;
TMR1L=0xE9;
T1SYNC=0;
TMR1ON=1;
TMR1IF=0;
TMR1IE=1;
PEIE=1;
GIE=1;
while(1)
{
PORTD=0x00; //关一次显示,以免显示出鬼影
if(j>59)j=0;
if(++d>3) d=1;
if(d==2) //如果d=2,显示十位
PIC单片机与串行闪存的SPI接口设计
PIC单片机与串行闪存的SPI接口设计以性能稳定、品种众多等特点在工业控制、仪器仪表、家电、通信等领域得到广泛应用。
虽然无数型号自身集成了存储器,但在无数状况下难以满足系统对大容量存储的要求,需要外扩非易失性的存储器。
与并行Flash存储器相比,串行Flash存储器占用引脚少,体积小,易于扩展,接线容易,工作牢靠,故而越来越多地应用在各类产品和工业测控系统中。
本文主要研究PIC16F877A单片机与串行闪存M25P16之间的SPI 通信,在要求大容量数据存储且MCU引脚资源有限的状况下具有有用价值。
1 SPI工作原理SPI(Serial Peripheral Interface)是一种常用的串行通信协议,用于MCU系统与外围设备的通信,可用来衔接存储器、A/D转换器、D/A 转换器、实时时钟、驱动器、,甚至其他处理器。
SPI主要用法4个信号:MOSI(主机输出/从机输人)、MISO(主机输入/从机输出)、SCK(串行时钟)和CS(片选)。
其中,SCK由主机产生,作为传输的同步时钟,控制全部数据传输。
主机通过触发从设备的CS打算二者之间的SPI传输是否能够举行。
主机和外设都包含1个串行移位寄存器。
主机通过向自己的SPI串行寄存器写入1个字节来发起1次传输,然后通过MOSI 信号线将数据传给外设,同时外设将自己移位寄存器中的内容通过MISO信号线返回给主机,1所示。
这样,两个移位寄存器中的内容就交换了。
也就是说,外设的写操作和读操作是同步完成的。
在实际应用中,假如只举行写操作,则主机只需忽视收到的字节即可;假如主机要读外设的数据,必需发送1个字节来引发从机的传输,发送的这个字节可以是随意数据。
2 M25P16简介M25P16是16 Mb的串行闪存,具有先进的写庇护机制,支持速度高达第1页共5页。
如何利用PIC16F877A单片机读写AT24C系列储存器
如何利用PIC16F877A单片机读写AT24C系列储存器
AT24C系列在增强型PIC实验板上编程的硬件原理图如下图所示,U7为实验板上24C02芯片,SDA与单片机的RB5口相连,SCL与单片机RB4相连,七段数码管D5、D7、D8组成了显示单元,字形码的数据通过RC口送入,各数码管的显示片选信号分别不同的RA口进行控制。
在MPLab IDE软件中新建工程,加入源程序代码,同时进行芯片型号的选择和配置位的设置,我们实验所用的芯片型号为PIC16F877A。
编写的程序代码如下,其中程序流程图如下图所示。
软件代码
编好程序后将编译好的HEX码通过ICD2仿真烧写器烧入单片机芯片,上电运行,主程序中在O×01地址写入了“O×55”,在O×02地址写入了“O×aa”,然后在while循环中读出O×02地址的值,也就是我们之前写入的“O×55”,读出后显示在数码管上,我们可以看到数码管显示“170”,即“O×aa”相应的十进制数。
最新PIC16F877A单片机中文文献
PIC16F877A单片机是microchip公司的产品,它采用14位的RISC指令系统,内部集成了A/D转换器、EEPROM、模拟比较器、带比较和捕捉功能的定时器/计数器、PWM输出、异步串行通信电路等。
1.程序存储器程序存储器和堆栈PIC16F877A单片机内部具有8K×14位的Flash程序存储器,程序存储器具有13位宽度的程序计数器地址范围:0000H-1FFFH。
由程序计数器提供13条地址线进行单元选择,每个单元宽14位,即PIC16F877A的指令字节宽度为14位,能够存放一条PIC单片机系统指令。
在系统上电或其他复位情况下,程序计数器均从0000H地址单元开始工作。
如果遇到调用子程序或系统发生事件中断时,将把当前程序断点处的地址送入8级×14位的堆栈区域进行保护。
堆栈是一个独立的存储区域,在调用的子程序或中断服务程序执行完后,再恢复断点地址。
通过14位程序总线,取出对应程序之灵的机器码,送入指令存储器,将组成的操作码和操作数进行有效分离。
如果操作数为地址,则进入地址复用器;如果操作数为数据,则进入数据复用器。
而操作码将在指令译码和控制单元中转化为相应的功能操作。
PIC的多数指令均是顺序执行,即使条件跳转也是隔行间接跳转。
具有大范围转移功能的指令只有两条:无条件GOTO语句和调用子程序CALL语句。
但它们受到2KB范围的约束。
所以必须将整个程序存储器以2KB为单位进行分页。
PIC16F877A单片机的上电复位地址是0000H,中端口地址是0004H,中断产生时PC指针会自动指向该地址。
在进行中断应用时,特别是涉及多个中断同时打开时,必须要逐个对中断标志进行判断。
编程时,在0000H-0003H单元内要放置一条GOTO跳转指令,跳转到主程序,以避开0004H存储器单元。
2.数据存储器数据存储器PIC单片机的数据存储器与传统的MCS-51单片机一样,在配置结构上可分为通用寄存器和特殊功能寄存器两大类。
PIC16F877原理简介
PIC16F877原理简介1.1 PIC16F877特性:PIC16F877是由Microchip公司所生产开发的新产品,属于PICmicro系列单片微机,具有Flash program程序内存功能,可以重复烧录程序,适合教学、开发新产品等用途;而其内建ICD(In Circuit Debug)功能,可以让使用者直接在单片机电路或产品上,进行如暂停微处理器执行、观看缓存器内容等,让使用者能快速地进行程序除错与开发。
如图1为PIC16F877的40根接脚图,PDIP是指一般最常见的DIP(Dual In Line Package)包装,而PIC单片机也有PLCC(Plastic Leaded Chip Carrier)与QFP(Quad Flat Package)两种形式的包装,依照不同的需求,寻找不同的包装形式。
如图所示,每根接脚都有其特定功能,例如Pin11与Pin32(VDD)为正电源接脚,Pin12与Pin31(VSS)为地线接脚;而有些接脚有两种甚至三种以上功能,例如Pin2(RA0/AN0)代表PORTA的第一支接脚,在系统重置(Reset)后,可自动成为模拟输入接脚,接收模拟讯号,也可经由程序规划为数字输出输入接脚。
图1. 40引脚PIC16F877接脚说明图2. 28引脚PIC16F877接脚图说明图3. 44引脚PIC16F877脚位图说明图4. 44引脚PIC16F877引脚图说明PIC16F877属于闪控式(Flash)单片机,可以重复烧录,其ROM的容量总共是8K words,以2K为一个page,区分为4个pages;内部RAM总共有512个字节(00f~1FFh),以128个字节为一个Bank,共区分为4个Bank,如图5所示,每个Bank的前半段都有其特殊用途,分别连接到其特殊功能模块,例如I/O、CCP、Timer、USART、MSSP等。
图5. PIC16F877的RAM配置图(图片来源:Microchip PIC16F87X Data Sheet)1.2 特殊内嵌功能PIC16F877属于内嵌功能较多的单片机,除了CPU、POM、RAM、I/O等基本构造外,还包括以下各种功能,简介如下:A/D converter:模拟数字转换器,最多可以读取8组模拟输入讯号。
PIC16F877A-SPI-TC77(温度传感器)
PIC16F877A-SPI-TC77(温度传感器)---------------------------------借鉴,TCK(0-1024℃)分辨率:0.25℃TC77:分辨率0.0625℃#include#define CS RC2void initPORT();void initMSSP();void delay(unsigned char time);void display(float data);float ReadTC77();const unsigned chardisp[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void main(){float temp;initPORT();initMSSP();while(1){temp=ReadTC77();display(temp);}}/*初始化PIC 单片机端口*/void initPORT(){TRISB=0x00; //控制段选PORTB=0x00;TRISC=0xf0; //与温度传感器连接PORTC=0x00;TRISA=0x00; //控制位选PORTA=0xff;}/*初始化MSSP 模块的SPI 模式*/void initMSSP() {SSPSTAT=0x00;SSPCON=0x30;SSPIF=0;}/*读取温度传感器的13 位数值并且转换成浮点类型*/float ReadTC77(){float result,PowerTwo=1;unsigned char count,HighByte,LowByte;CS=0;SSPBUF=0;while(!SSPIF){}HighByte=SSPBUF; //获取温度寄存器的高字节SSPIF=0;SSPBUF=0;while(!SSPIF){}LowByte=SSPBUF; //获取温度寄存器的低字节SSPIF=0;CS=1;for(count=0;count>count))result+=PowerTwo;PowerTwo=PowerTwo/2.; //注意,不能换成.2,否则会出错} return result; //返回转换浮点结果}/*液晶显示*/void display(float data){unsignedintconver,First,Second,Third,Fourth;conver=data*100;First=conver/1000;Second=conv er/100%10;Third=conver/10%10;Fourth=conver%10;PORTA=0xfe; //显示十位PORTB=disp[First];delay(2);PORTB=0x00;PORTA=0xfd; //显示个位。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include<pic.h>
__CONFIG(0x3F39);
void CSH(void); //初始化子程序
void DELAY(unsigned int n);//函数声明
char SPI_WRITE(char R); //SPI发送函数
void WRITE(char number); //SPI写函数
void READ(void); //SPI接收函数
void interrupt ISR(void);//按键中断程序
int b=0;
bit ERROR; //标志位
char B;
char number;//存放PORTD的数,全局变量
void main(void)
{
CSH(); //初始化
number=0x0D;
while(1)
{
if(b==1) //若按键,则进行读写操作
{
WRITE(number); //发送数据
// RB5=1;
DELAY(1);
ERROR=0; //错误标志位清零
READ(); //读取数据
if(B!=number) //如果接受与发送的数据不相等,则发生错误
{ERROR=1;};
DELAY(1);
// RB6=1;
if(ERROR==1) //若发生错误,灯亮
{RB4=1;}
b=0;
PORTD=number; //D口显示发送的数据
}
}
}
//初始化程序
void CSH(void)
{ OPTION_REG=0b01000000;
INTCON=0b10010000;//中断初始化关++++++++
TRISB=1; //RB0口为输入关++++++++++++
TRISC=0b00010001;//C口SDO为输出SDI为输入,SCK为输出,RC1输出RC0输入开TRISD=0; //D口全为输出
PORTD=0;
SSPEN=1; //相应的引脚为一般的I/O口
CKP=1; //空闲时钟为高电平
SMP=1; //在数据信号的末端采样
CKE=1; //下降沿发送数据
SSPCON+=0b0001; //主控模式,时钟为fosc/16 }
char SPI_WRITE(char R )
{ char BUF;
SSPBUF=R; //要发的数写入SSPBUF寄存器
while(BF==0);//等待发送完毕
BUF=SSPBUF;
return(BUF);
}
void WRITE(char number)
{ char A;
RC2=0; //片选信号,低电平有效
SPI_WRITE(0b00000110); //允许写入
RC2=1; //完成写使能
RC2=0; //片选信号,低电平有效
A=SPI_WRITE(0b00000010); //写指令
A=SPI_WRITE(0b00000100); //写数据的地址
A=SPI_WRITE(number); //发送数据
RC2=1; //完成写操作
DELAY(5);
}
void interrupt ISR(void)
{ char a;int k;
if(INTF==1)
{
for (k=1024;k>0;k--)NOP();//DELAY(30);//防抖动
INTF=0; //清标志位
b=1;
}
}
//延时(n)ms
void DELAY(unsigned int n)
{unsigned int j;
char k;
for (j=0;j<n;j++)
for (k=246;k>0;k--)NOP();
}
void READ(void)
{
RC2=0; //片选信号,低电平有效
B=SPI_WRITE(0b00000011); //写读取数据指令B=SPI_WRITE(0b00000100); //写读取数据地址B=SPI_WRITE(0); //发空数据,为了读取数据RC2=1; //完成读写操作
DELAY(1);
}。