当前位置:文档之家› PIC16F877A之定时TMR0

PIC16F877A之定时TMR0

PIC16F877A之定时TMR0

PIC16F877A之定时TMR0

编写下面的实验程序实现的功能是让RC 口所带的8 个LED 一个接一个的

全亮起来,最后达到全亮后再一个一个的灭下去,这样反复循环,使用定时器

查询方式控制延时,而不使用定时器的中断。中断程序会在以后陆续写到上面

tmr0 equ 01hpcl equ 02hstatus equ 03hoption_reg equ 81hintcon equ 0bhportc equ 07htrisc equ 87htmr0data equ 15hcount equ 20hrp0 equ 5horg 0000hnopgoto mainorg 0005hmain nopbsf status,rp0movlw 00hmovwf triscmovlw 07hmovwf option_regbcf status,rp0clrf countloop1movf count,0call readmovwf portcincf count,1movlw 0fhandwf count,1call delaycall delaycall delaycall delaycall delaycall delaycall delaygoto loop1delaybcf intcon,2movlw tmr0datamovwf tmr0delay1btfss intcon,2goto delay1returnread addwf pcl,1retlw b’10000000’retlw b’11000000’retlw b’11100000’retlw b’11110000’retlw b’11111000’retlw b’11111100’retlw b’11111110’retlw b’11111111’retlw b’11111110’retlw b’11111100’retlw b’11111000’retlw b’11110000’retlw b’11100000’retlw b’11000000’retlw b’10000000’retlw b’00000000’end本程序利用的16F877A 的TMR0,具体如何设置请查找

16F877C 中的INTCON、OPTION_REG 、TMR0 等相关特殊工作寄存器的功

能说明。推荐李学海老师编写的PIC 单片机实用教程。

PIC16F877A与PC机串行通信C语言源程序

PIC16F877A与PC机串行通信C语言源程 序 //*******串口通信程序********* //*******定义变量************* #include ; #define unchar unsigned char #define uint unsigned int unchar RC_label;//标志位起始位为1结束位为0 unchar caiji_label;//采集帧格式标志位正确为1错误为0 unchar data RC[100];//存储接收到的数据 unchar data TX1[100];//存储自身参数 unchar data TX2[100];//存储出错指示ERROR int RC_buff;// int i=0,j=0,k=0;// //*****变量定义完毕************ //*****子程序区****************

//*****串口初始化程序开始********** void initRS232() { //设置TXSTA CSRC=0;// TX9=0;//8位数据发送 TXEN=1;//发送使能 SYNC=0;//选择异步模式 BRGH=1;//高速 TRMT=1;//发送寄存器空 TX9D=0;// //设置RCSTA SPEN=1;//允许串口工作 RX9=0;//接收8位数据 SREN=1;// CREN=1;//使能连续接收 ADDEN=0;// FERR=0;// OERR=0;//无超速错误 RX9D=0;// TRISC=0X80;//设置C口 SPBRG=0X19;//设置波特率为9600

PIC16F877A与EEPROM进行SPI通信C程序

#include __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;

PIC16F877A的特殊功能配置

PIC16F877A的特殊功能配置CPU的特殊功能 BIT13CP:闪存程序存储器代码保护位 0:所有程序存储器代码保护 1:关闭代码保护 BIT12Unimplemented:读时为结果为1 BIT11DEBUG:在电路调试模式位 0:在电路调试功能有效,RB6和RB7专用于调试器 1:在电路调试功能失效,RB6和RB7用于本身的IO或其它功能BIT10-9WRT1-0:闪存程序存储器写使能位 WRT1WRT0说明 11写保护关闭,所有程序存储器由EECON控制写 100000h到00ffh写保护;0100h到1fffh由EECON控制写010000h到07ffh写保护;0800h到1fffh由EECON控制写000000h到0fffh写保护;1000h到1fffh由EECON控制写BIT8CPD:数据EEPROM存储器代码保护位 0:数据EEPROM存储器代码保护开启 1:数据EEPROM存储器代码保护关闭 BIT7LVP:低电压(单电源)的在线串行编程使能位 0:RB3/PGM是普通IO口功能,编程时MCLR管脚必须是高电压1:RB3/PGM是PGM功能,低电压编程使能 BIT6BOREN:欠压复位使能位 0:欠压复位失效 1:欠压复位使能 BIT5-4Unimplemented:读时结果为1 BIT3PWRTEN:上电延时定时器使能位 0:上电延时定时器使能 1:上电延时定时器失效 BIT2WDTEN:看门狗定时器使能位 0:看门狗失效 1:看门狗使能

BIT1-0:Fosc1:Fosc0:时钟源选择位 Fosc1Fosc0时钟源11RC振荡器 10外部石英高频晶振HS【频率范围见下表】01外部石英晶振XT【频率范围见下表】 00外部低频石英晶振LP【频率范围见下表】

PIC16F877A.H头文件详细注释

//PIC16F877A.H头文件详细注释 /* Header file for the Microchip * PIC 16F873A chip * PIC 16F874A chip * PIC 16F876A chip * PIC 16F877A chip * Midrange Microcontroller */ #if defined(_16F874A) || defined(_16F877A) #define __PINS_40 #endif static volatile unsigned char INDF @ 0x00; //间接寻址寄存器 static volatile unsigned char TMR0 @ 0x01; //定时器0 static volatile unsigned char PCL @ 0x02; //低8位程序计数器 static volatile unsigned char STA TUS @ 0x03; //程序状态寄存器 static unsigned char FSR @ 0x04; //特殊功能寄存器 static volatile unsigned char PORTA @ 0x05; //端口A寄存器 static volatile unsigned char PORTB @ 0x06; //端口B寄存器 static volatile unsigned char PORTC @ 0x07; //端口C寄存器 #ifdef __PINS_40 static volatile unsigned char PORTD @ 0x08; //端口D寄存器 static volatile unsigned char PORTE @ 0x09; //端口E寄存器 #endif static unsigned char PCLA TH @ 0x0A; //高5位程序计数器 static volatile unsigned char INTCON @ 0x0B; //中断控制寄存器 static volatile unsigned char PIR1 @ 0x0C; //中断标志寄存器PIR1 static volatile unsigned char PIR2 @ 0x0D; //中断标志寄存器PIR2 static volatile unsigned char TMR1L @ 0x0E; //低字节计数寄存器 static volatile unsigned char TMR1H @ 0x0F; //高字节计数寄存器 static volatile unsigned char T1CON @ 0x10; //TMR1控制寄存器 static volatile unsigned char TMR2 @ 0x11; //定时/计数器TMR2 static volatile unsigned char T2CON @ 0x12; //TMR2控制寄存器 static volatile unsigned char SSPBUF @ 0x13; //收/发数据缓冲器 static volatile unsigned char SSPCON @ 0x14; //同步串口控制寄存器,对MSSP模块的功能和指标进行设置和定义。 static volatile unsigned char CCPR1L @ 0x15; //捕获/比较/PWM寄存器低字节 static volatile unsigned char CCPR1H @ 0x16; //捕获/比较/PWM寄存器低字节 static volatile unsigned char CCP1CON @ 0x17; //CCP1CON寄存器 static volatile unsigned char RCSTA @ 0x18; //USART接收控制兼状态寄存器 static volatile unsigned char TXREG @ 0x19; //USART发生缓冲器 static volatile unsigned char RCREG @ 0x1A; //USART接收缓冲器 static volatile unsigned char CCPR2L @ 0x1B; //捕获/比较/PWM寄存器低字节 static volatile unsigned char CCPR2H @ 0x1C; //捕获/比较/PWM寄存器低字节 static volatile unsigned char CCP2CON @ 0x1D; //CCP2CON寄存器 static volatile unsigned char ADRESH @ 0x1E; //ADC转换结果寄存器高字节 static volatile unsigned char ADCON0 @ 0x1F; //A/D转换器开关位。

PIC16F877A定时器的学习

PIC16F877A定时器的学习 由于实时数据的仿真需要用到定时器产生数据,今天晚上完成 PIC16F877A 产生正弦波形,并将波形数据发送到上位机!这是一个三角波的 仿真程序,并通过串口发送到上位机 #include #include #include #include “main.h”#include“t232.h”#include“lcd.h”#include“timer.h” //define global variable bank1 uchar flag =0 ;//利用flag 判断中断时间是否到了!bank1 char dat[6] ; bank2 char str[]=“shan dong qing gong ye xue yuan”;bank2 char str1[]=“Starting........”;bank2 char str2[]=“Capturing.......”;bank2 char str3[]=“Stop..........” ;//bank2 float test = 0;//bank2 float t1 ;bank2 uchar t1 =0 ;bank2 uchar t2=0 ;bank1 uchar state = READY ;//当前状态bank1 uchar frame[3] ;//帧缓冲bank1 uchar temp ;//ms 级延时程序void DelayMS(uint ms){ uint i; while(ms--){ for(i=0;i//10us 级延时程序void Delay10US(uint us){ uchar i; for(i=0;iwhile(1) {while((t1>=-20)&&(state==CAPTURE)){t1++ ;sprintf(dat,”(%d)”,t1) ;send_str(dat) ;if(t1==20)break ;}while((t1} tips:感谢大家的阅读,本文由我司收集整编。仅供参阅!

PIC16F877A数字时钟时钟程序

;Digit clock ;----------------------------------------------- ;DA TE :20101205 ;Author:Tang HS ;M C U :PIC16F877A ;FileName : ClockPIC.ASM ;----------------------------------------------------------- ;Date: {2010/12/07.14:35}-V er01--CS-ICD:0xAFCE---ISP:0xb7ce---- ;功能: 1.LED显示:时分秒;格式:[ hh mm ss ] 备注:按键未定义 ;------------------------------------------------------------ ;----------------------------------------------------------- ;Date: {2010/12/07.22:15}-V er01--CS-ICD:0xAFCE---ISP:0xb7ce---- ;功能: 1.LED显示:时分秒;格式:[ hh mm ss ] 备注:按键未定义 ; 2.RB0-SET_KEY;RB1-ADD_KEY;RB2-SUB_KEY;RB3-EXIT_KEY ;------------------------------------------------------------ ;Date: {2010/12/09.18:06}-V er02--CS-ICD:0xAFCE---ISP:0xef0e---- ;************************************************************ ;Date: {2010/12/10.00:47}-V er03--CS-ICD:0xb08d---ISP:0xfaa7---- ;功能: 1.LED显示:时分秒;格式:[ hh mm ss ] 备注:按键未定义 ; 2.RB0-SET_KEY;RB1-ADD_KEY;RB2-SUB_KEY;RB3-EXIT_KEY 都OK ; 3.MOVLW 纠正MOVV REG,1 引起的SUB_不良; ;-------------------------------------------------------------- ;Date: {2010/12/10.13:10}-V er03.1--CS-ICD:0xb08b---ISP:0xfaa4---- ; 4.时差。50ms原来计数20次改为19次;250us原来计数200次改为197次;--------------------------------------------------------------- ;Date: {2010/12/10.17:30}-V er03.2--CS-ICD:0x296B---ISP:0x7387---- ; 5.在Set_ini中--增加CALL SET_Flag;指定Flag,1=1;标志位- ---解决Ver03.1-第一次按SET键时不能调HourL&HourH的问题 ;------------------------------------------------------------ ;************************************************ ;程序清单 ;************************************************** __CONFIG 3F39H;设置配置位中振荡方式为XT,其它全部禁止或关闭 ;************************************************ ;----------------------------------------------- include P16F877A.INC ;----------------------------------------------- ;-----------------ram varable------------------------------ HourH equ 20H ; HourL equ 21H ; MinH equ 22H ; MinL equ 23H ; SecH equ 24h ;

[PIC16F877A+汇编语言]DS18B20温度采集程序

DS18B20温度采集程序[PIC16F877A+汇编语言] ;六位数码管显示温度结果,其中整数部分2位,小数部分4位 ;每次按下RB0键后进行一次温度转换。 ;硬件要求:把DS18B20插在18B20插座上 ; 拨码开关S10第1位置ON,其他位置OFF ; 拨码开关S5、S6全部置ON,其他拨码开关全部置OFF ;*****************以下是暂存器的定义***************************** #INCLUDE #DEFINE DQ PORTA,0 ;18B20数据口 __CONFIG _DEBUG_OFF&_CP_ALL&_WRT_HALF&_CPD_ON&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_W DT_OFF&_HS_OSC ;调试模式关闭,写保护,一半ROM可在线改写,EEPROM加密,低压编程关闭,掉电检测关闭,上电延时开,看门狗关,4M晶振HS振荡 CBLOCK 20H DQ_DELAY1 DQ_DELAY2 TEMP TEMP1 TEMP2 ;存放采样到的温度值 TEMP3

COUNT COUNT1 ENDC TMR0_VALUE EQU 0AH ;寄存器初值为6,预分频比1:4,中断一次时间为4*(256-6)=1000us DQ_DELAY_VALUE1 EQU 0FAH DQ_DELAY_VALUE2 EQU 4H ;**********************以下是程序的开始************************ ORG 00H NOP GOTO MAIN ;入口地址 ORG 04H RETFIE ;在中断入口出放置一条中断返回指令,防止干扰产生中断 TABLE ADDWF PCL,1 RETLW 0C0H ;0的编码(公阳极数码管) RETLW 0F9H ;1的编码 RETLW 0A4H ;2的编码 RETLW 0B0H ;3的编码 RETLW 99H ;4的编码 RETLW 92H ;5的编码 RETLW 082H ;6

PIC16F877A之定时TMR0

PIC16F877A之定时TMR0 编写下面的实验程序实现的功能是让RC 口所带的8 个LED 一个接一个的 全亮起来,最后达到全亮后再一个一个的灭下去,这样反复循环,使用定时器 查询方式控制延时,而不使用定时器的中断。中断程序会在以后陆续写到上面 来 tmr0 equ 01hpcl equ 02hstatus equ 03hoption_reg equ 81hintcon equ 0bhportc equ 07htrisc equ 87htmr0data equ 15hcount equ 20hrp0 equ 5horg 0000hnopgoto mainorg 0005hmain nopbsf status,rp0movlw 00hmovwf triscmovlw 07hmovwf option_regbcf status,rp0clrf countloop1movf count,0call readmovwf portcincf count,1movlw 0fhandwf count,1call delaycall delaycall delaycall delaycall delaycall delaycall delaygoto loop1delaybcf intcon,2movlw tmr0datamovwf tmr0delay1btfss intcon,2goto delay1returnread addwf pcl,1retlw b’10000000’retlw b’11000000’retlw b’11100000’retlw b’11110000’retlw b’11111000’retlw b’11111100’retlw b’11111110’retlw b’11111111’retlw b’11111110’retlw b’11111100’retlw b’11111000’retlw b’11110000’retlw b’11100000’retlw b’11000000’retlw b’10000000’retlw b’00000000’end本程序利用的16F877A 的TMR0,具体如何设置请查找 16F877C 中的INTCON、OPTION_REG 、TMR0 等相关特殊工作寄存器的功 能说明。推荐李学海老师编写的PIC 单片机实用教程。

pic16f877a程序笔记

流水灯程序设计 #include #define uchar unsigned char #define uint unsigned int __CONFIG(0x3B31); void delay(uint x) //循环程序 { uint a,b; for(a=x;a>0;a--) for(b=110;b>0;b--); } void main() { uchar i; TRISD=0x00; while(1) { PORTD=0x01; for(i=8;i>0;i--) { delay(200); PORTD=PORTD<<1; } } }

矩阵+蜂鸣器+ 数码管程序设计 #include #define uchar unsigned char #define uint unsigned int __CONFIG(0x3B31); const uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; uchar key_num; void delay(uint x); void init(); void scan(); void didi(uchar num); void disp(uchar num1,uchar num2,uchar num3,uchar num4,uchar num5,uchar num6); void main() { init(); while(1) { scan(); disp(key_num,2,3,4,5,6); } } void delay(uint x) { uint a,b; for(a=x;a>0;a--) for(b=110;b>0;b--); } void init() { TRISB=0xff; TRISD=0; TRISA=0; TRISE0=0; RE0=0; PORTD=0; PORTA=0; } void scan() { if(RB0==0) { delay(10);

pic16f877a程序

实验二程序清单: (1)编写程序使8个LED实现双跳灯显示 //===========led程序=========== #include //===========变量定义========== void delay(int z); //===========主程序============ main() { TRISD=0x00; while(1) { PORTD=0x03; delay(200); PORTD=0x0c; delay(200); PORTD=0x30; delay(200); PORTD=0xc0; delay(200); } } void delay(int z) { int x,y; for(x=z;x>0;x--) for(y=120;y>0;y--); } (2)编写程序实现8个LED灯高四位和低四位交替点亮//===========led程序===========

#include //===========变量定义========== void delay(int z); //===========主程序============ main() { TRISD=0x00; while(1) { PORTD=0xf0; delay(500); PORTD=0x0f; delay(500); } } void delay(int z) { int x,y; for(x=z;x>0;x--) for(y=120;y>0;y--); } (3)编写程序使第一次按下按键时单双星闪(1、3、5、7个 LED灯与2、4、6、8个LED交替点亮),第二次按下按钮时高四位的LED和低四位的LED交替点亮,这两种显示方式依次循环 #include //===========变量定义========== void delay(int z); void KEYSCAN(); #define shuru RB0 unsigned int i,j;

PIC16F877ASPI通信C程序

#include // 注意RB0要接下拉电阻 __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口全为输出

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单片机RAM数据存储器与程序存储器一样,在其512个地址空间进行类似区域划分,分为4个体,从左到右纪委体0、体1、体2和体3,每个体均为128×8位宽的存储单元。特殊功能寄

PIC16F877A.H头文件详细注释

PIC16F877A.H头文件详细注释 /* Header file for the Microchip * PIC 16F873A chip * PIC 16F874A chip * PIC 16F876A chip * PIC 16F877A chip * Midrange Microcontroller */ #if defined(_16F874A) || defined(_16F877A) #define __PINS_40 #endif static volatile unsigned char INDF @ 0x00; //间接寻址寄存器 static volatile unsigned char TMR0 @ 0x01; //定时器0 static volatile unsigned char PCL @ 0x02; //低8位程序计数器 static volatile unsigned char STA TUS @ 0x03; //程序状态寄存器 static unsigned char FSR @ 0x04; //特殊功能寄存器 static volatile unsigned char PORTA @ 0x05; //端口A寄存器 static volatile unsigned char PORTB @ 0x06; //端口B寄存器 static volatile unsigned char PORTC @ 0x07; //端口C寄存器 #ifdef __PINS_40 static volatile unsigned char PORTD @ 0x08; //端口D寄存器 static volatile unsigned char PORTE @ 0x09; //端口E寄存器 #endif static unsigned char PCLATH @ 0x0A; //高5位程序计数器 static volatile unsigned char INTCON @ 0x0B; //中断控制寄存器 static volatile unsigned char PIR1 @ 0x0C; //中断标志寄存器PIR1 static volatile unsigned char PIR2 @ 0x0D; //中断标志寄存器PIR2 static volatile unsigned char TMR1L @ 0x0E; //低字节计数寄存器 static volatile unsigned char TMR1H @ 0x0F; //高字节计数寄存器 static volatile unsigned char T1CON @ 0x10; //TMR1控制寄存器 static volatile unsigned char TMR2 @ 0x11; //定时/计数器TMR2 static volatile unsigned char T2CON @ 0x12; //TMR2控制寄存器 static volatile unsigned char SSPBUF @ 0x13; //收/发数据缓冲器 static volatile unsigned char SSPCON @ 0x14; //同步串口控制寄存器,对MSSP模块的功能和指标进行设置和定义。 static volatile unsigned char CCPR1L @ 0x15; //捕获/比较/PWM寄存器低字节 static volatile unsigned char CCPR1H @ 0x16; //捕获/比较/PWM寄存器低字节 static volatile unsigned char CCP1CON @ 0x17; //CCP1CON寄存器 static volatile unsigned char RCSTA @ 0x18; //USART接收控制兼状态寄存器 static volatile unsigned char TXREG @ 0x19; //USART发生缓冲器 static volatile unsigned char RCREG @ 0x1A; //USART接收缓冲器 static volatile unsigned char CCPR2L @ 0x1B; //捕获/比较/PWM寄存器低字节 static volatile unsigned char CCPR2H @ 0x1C; //捕获/比较/PWM寄存器低字节 static volatile unsigned char CCP2CON @ 0x1D; //CCP2CON寄存器 static volatile unsigned char ADRESH @ 0x1E; //ADC转换结果寄存器高字节

(完整word版)基于PIC16F877A的数字钟设计

电子工程系项目考核(报告)项目名称:数字时钟项目 姓名 班级 学号 课程名称

一、项目要求: 数码管默认显示00:00。数码管1,2 表示小时,数码管 3,4 表示分钟。如此,实现时钟功能。要求能够整点报时、闹钟提示;并附带有秒表功能。按键可以调整时钟时间、切换显示页面和设定闹钟时间等。 二、项目原理分析 在项目用的单片机开发板上单片机的IO 口接四位数码管的各段。同时开发板共阴数码管的阴极由138 译码器的输出端控制。在该项目中我采用了数码管的动态显示,即每位数码管点亮2ms 时间左右,由于人的视觉暂留现象及发光二极管的余辉效应,只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O 端口,而且功耗更低。在实现了数码管的动态显示的基础上在主程序中通过计算定时器1的中断次数,从而得到计时时间和秒表时间的基准时间。 同时在主程序中添加按键处理程序,实现时钟的开始、中断和校时,同时实现闹钟定时和切换显示等功能,还有秒表计时功能。 三、硬件电路图以及原理 3.1 硬件电路图如下:

3.2硬件原理: 该项目中,主要的功能模块有:数码管显示模块;按键模块;蜂鸣器模块。数码管显示模块主要是由芯片PIC16F877A内部的定时器 1的定时中断实现数码管的动态显示。按键模块主要利用矩阵式按键 实现多按键功能,矩阵式按键原理是在一端加高电平,然后检测另一 端是否为高电平来判断按键是否按下,通过不同的定义可以让按键实 现不同的功能。蜂鸣器模块通过三极管的开关作用和驱动作用由芯片 控鸣叫与否。 四、程序说明以及程序流程图 该时钟默认显示页面为时钟计时页面,按键SW1 控制时钟、秒表的开始和中断,按按键SW1一次,如果数码管在显示秒表,则开 始计秒功能;否则,开始正常计时;再按一次SW1则实现中断功能。 按键SW2实现是数码管的选位,从第一个数码管开始,按一次就选 中下一位数码管,循环选择。SW3实现的是加1功能,每按一次就 在SW2选中的位上加1。SW4是实现数码管切换显示功能,按一次 就进入闹钟调时的显示页面,再按一次就进入秒表显示页面,实现数

AD模数转换_PIC16F877A

从打开A/D通道或选择新的A/D通道到A/D转换器的内部保持电容充电至与输入的模拟电压相同的时间就是A/D采集时间,通常为20us左右,然后才能启动A/D转换。 在执行程序连续交替进行两路模拟输入信号的A/D转换时,GO位被置1后启动一次A/D 转换,只要等待一个T AD的时间,之后就可以修改CHS2:CHS0选择另外的输入信号通道而不会影响当前A/D转换的结果。 10位的A/D转换时间共需要12个T AD,T AD为一位的转换时间,对于887A来说,T AD最小为1.6us。 A/D转换过程如下: 1、有关的I/O口设置为输入(TRISA或TRISE) 2、对模拟引脚/基准电压/数字I/O进行设置,选择A/D结果格式(ADCON1) 3、选择A/D通道,选择A/D时钟,A/D模块使能 4、延时约20us,使得输入电压对保持电容充电达到稳定 5、开始A/D转换(ADGO=1) 6、A/D转换结束,ADGO自动清零,软件对PIR1的ADIF清零 7、读A/D转换结果(ADRESH、ADRESL) 如下程序: //A/D转换,对指定通道k进行A/D转换,结果以16位整数返回 //只进行AD通道等设置,ADCON1不在此设置 unsigned int_AD_SUB( char k) { char i; unsigned int x; ADCON0=0b 0100 0001; // T AD=8Tosc ADCON0 |=(k<<3); // 设置A/D转换通道,打开通道 for (i=1;i<5;i++) NOP( ); // 打开AD通道后延时20us左右 ADGO=1; // 开始A/D转换 while(ADGO= =1); // 等待A/D转换结束 ADIF=0; // 清A/D转换结束标志 x=0; x=ADRESH<<8; x|=ADRESL; return( x); }

PIC16F877A控制DS18B20汇编程序

;************************************************************************ ;功能实现:通过DS18B20来读取温度,显示在2位LED上,精确到1度 ;硬件连接:(1)RC0-RC7接共阳数码管的段码A-H ; RA0-RA3接共阳数码管的位码DIG0-DIG3 ;*********************************************************************** ;*********************************************************************** ;定义单片机型号为PIC16F877A ;程序包含文件:P16F877A.INC ;定义配置字 ;*********************************************************************** LIST P=16F877A ;定义本程序所使用的芯片为PIC16F877A #INCLUDE "P16F877A.INC" ;定义本程序包含该文件 __CONFIG 3F72H ;晶振配置HS,看门狗禁止,上电延时使能,掉电复位使能;低电压编程禁止,代码不保护 #DEFINE DQ PORTB,2 #DEFINE DIR TRISB,2 CBLOCK 20H Y1 Y2 COUNT1 COUNT2 COMD DATE BIN_L ;要进行转换的字节 GE ;转换后的个位 SHI ;转换后的十位 DATE_L DATE_H ENDC ;*********************************************************************** ;复位矢量定义(对于16F877A) ;*********************************************************************** ORG 0000H ;复位矢量地址

PIC16F877A例程---PWM(2)

PIC16F877A例程---PWM(2) #include//------------------------------------------------------------//使用PIC16F887 芯片,输出50khz 占空比50%的方波//----------------------------------------------------- -------//系统配置//__CONFIG(HS&PWRTEN&BOREN&PROTECT&WDTDIS); __CONFIG(INTIO & WDTDIS & PWRTEN & MCLRDIS & UNPROTECT & BORDIS & LVPDIS & IESODIS & FCMDIS); //-------------中断服务程序------------------------------------void interrupt isr(){ if(TMR2IE==1&&TMR2IF==1) { TMR2IF=0; }} void SpwmInit(){ OSCCON=0x7f;//using inner 8M osc TRISC1=1; TRISC2=1; //TRISD = 0; PR2=0x27; CCP1CON=0x0f|0x00; CCPR1L=0x14; TMR2IF=0; T2CON=0;GIE=0;TMR2IE=1; PEIE=1; TMR2ON=1;} main(){ SpwmInit();TRISC1=0; TRISC2=0; while(1) {;}} tips:感谢大家的阅读,本文由我司收集整编。仅供参阅!

相关主题
文本预览
相关文档 最新文档