《PIC16系列单片机C程序设计与proteus仿真》学习之2----TMR0定时器中断
pic16单片机控制led灯组的硬件电路板的设计
pic16单片机控制led灯组的硬件电路板的设计中括号内的主题是"[pic16单片机控制led灯组的硬件电路板的设计]"第一步:介绍pic16单片机控制led灯组的背景和目的(150-200字)在现代电子产品中,led灯组广泛应用于照明、指示和显示等领域。
为了实现对led灯组的精确控制,我们可以使用pic16系列单片机作为控制芯片,搭建一个硬件电路板。
该硬件电路板的设计将能够实现对多个led灯的独立控制,使其能够按照设计需求展示不同的亮度、颜色或者变化模式。
本文将详细介绍该硬件电路板的设计步骤和实现过程。
第二步:设计硬件电路板的基本原理(200-300字)在这个硬件电路板中,我们将使用pic16单片机作为主控制芯片,在其周围布置所需要的外围器件。
主要包括电源电路、时钟电路、复位电路和与led灯组连接的驱动电路。
首先,我们需要为pic16单片机提供稳定的电源电压。
这可以通过一个稳压器和滤波电容来实现。
其次,我们需要为pic16单片机提供一个稳定的时钟信号,这可以通过一个晶振和时钟电容来实现。
此外,复位电路也是必不可少的,它可以确保系统在上电或者出现异常情况时能够正常运行。
最后,我们需要设计与led灯组连接的驱动电路,这将包括电流限制电阻和驱动晶体管等元件,以实现对led灯的控制。
第三步:详细介绍硬件电路板的设计步骤(800-1000字)设计这个硬件电路板的第一步是确定需要控制的led灯的数量。
这将决定我们使用的pic16单片机的引脚数量。
然后,我们需要根据实际需求确定led灯的工作电压和电流。
这将决定我们选择的驱动电路的参数和元件。
接下来,我们可以绘制整个硬件电路板的原理图。
在原理图中,我们需要包括pic16单片机、外部晶振、稳压器、电池或者直流电源、电流限制电阻、驱动晶体管和led灯等元件。
绘制完成后,我们需要进行电路板的布局设计和走线。
这将决定整个电路板的大小和连接方式。
完成布局设计后,我们需要制作电路板的成板图文件。
《PIC16系列单片机C程序设计与proteus仿真》学习之8--FLASH_ROM的读写
//877A的程序存储器FLASH_ROM的读/写,写操作要求一次性写入4个字,其地址要连续,且地址最低位必须依次为0b00,0b01,0b10,0b11//并且要求芯片的配置位的写使能在相应的程序中允许写//FLASH_ROM的读、写宏定义调用格式如下:FLASH_WRITE(addr,value);unsigned int FLASH_READ(addr);//宏定义FLASH_READ将读出的FLASH_ROM中指定单元的内容以无符号的整形值返回,addr范围0x0000~0x1FFF, value值范围0x0000~0x3FFF注意:由于程序存储器是14位,因此读出的结果必须是整型,而不能为字符型。
#include<pic.h>__CONFIG(0X3F39);main(void){char aa;unsigned int bb;bb=FLASH_READ(0X74D);FLASH_WRITE(0X50,0X30F0);FLASH_WRITE(0X51,0X0084);FLASH_WRITE(0X52,0X3005);FLASH_WRITE(0X53,0X0086);while(EEIF==0);NOP();while(1);}在程序存储器用DW方式存取数据:#include<pic.h>__CONFIG(0X3F39);extern const LLL;main(void){unsigned int x,y;unsigned char i;x=&LLL; //得到汇编定义的标号LLL值,即标号的PC地址for(i=0;i<8;i++){y=FLASH_READ(x+i); //根据i的值读取DW定义的程序存储器的数据}while(1);}# asm_LLLDW 0X1000,0X1100,0X1110,0X1111,0X2000,0X2200,0X2220,0X2222#endasm。
单片机的C语言程序设计与应用——基于Proteus仿真(第2版)
单片机的C语言程序设计与应用——基于Proteus仿真(第2版)单片机的C语言程序设计与应用——基于Proteus仿真(第2版)单片机的C语言程序设计是嵌入式系统开发的基础,也是现代电子产品设计中不可或缺的重要环节。
借助Proteus仿真软件,可以更加方便、快捷地进行单片机程序的开发与调试。
本文将介绍单片机的C语言程序设计与应用,以及如何在Proteus仿真环境中进行程序的调试。
一、单片机的C语言程序设计基础C语言是一种高级编程语言,被广泛应用于单片机程序设计中。
在进行单片机的C语言程序设计之前,我们需要掌握一些基本概念和常用语法。
1. 数据类型与变量在C语言中,需要首先定义所使用的数据类型和变量。
常见的数据类型包括整型、浮点型、字符型等。
通过定义变量,并为其分配内存空间,我们可以在程序中存储和处理数据。
2. 控制语句与循环结构控制语句可以用来控制程序的执行流程和逻辑。
常见的控制语句包括条件语句(如if-else语句)、选择语句(如switch语句)等。
循环结构可以用来重复执行一段代码,提高程序的效率。
3. 函数与库函数函数是C语言程序的基本模块,可以封装一段特定的功能。
通过自定义函数和调用库函数,我们可以实现各种功能的组合与调用。
二、Proteus仿真环境的使用Proteus是一款强大的电子设计自动化软件,常用于单片机程序的仿真和调试。
在进行单片机的C语言程序设计时,我们可以借助Proteus 提供的仿真环境进行代码的调试和性能分析。
1. 新建项目与配置在Proteus中,首先需要新建一个项目,并配置所使用的单片机型号和外部电路等。
通过添加合适的元件和连接引脚,可以搭建出一个完整的单片机电路。
2. 编写C语言代码在Proteus的项目中,可以添加一个“C源文件”来编写自己的C语言代码。
通过编写代码,可以实现所需的功能和逻辑。
在编写代码时,需要注意与所使用的单片机型号和引脚连接的兼容性。
3. 仿真与调试在编写完C语言代码后,我们可以进行仿真和调试。
Proteus仿真PIC的C语言程序
Proteus仿真PIC的C语言程序目录PICC开发环境配置 (1)使用USART同步发送数据 (5)使用MSSP模块的SPI模式扩展接口 (8)ADC模块应用示例 (12)TMR0计数器 (16)TMR1时钟(使用内部时钟) (21)TMR1时钟(使用外部晶振) (25)TMR2中断产生方波 (29)CCP输出比较模式应用 (33)CCP捕捉模式应用 (38)PICC开发环境配置2009年5月2日目前已有2,086人读过本文阅读评论发表评论在前面的一段时间里,ANY电子使用Proteus软件带你一起学习了PIC单片机的汇编语言程序的书写。
但是目前在单片机的应用开发中,绝大部分的应用都是使用C语言程序实现。
所以,在学习汇编语言熟悉了PIC单片机的基本结构之后,我们就需要面对一个单片机开发的重要问题:使用C语言开发应用。
在下面的一段时间里,我们将通过一个个具体的实例,一点点逐一向你介绍如何使用PIC 单片机的C语言在PIC的C语言环境里开发C语言程序。
需要注意的是,因为PICC开发工具应用更为广泛,所以在这里,我们将使用PICC开发工具,而不是PIC官方的C语言开发工具。
事实上,PICC开发工具其实更像PIC官方MPLAB集成开发环境的一个插件,所有关于PICC开发PIC单片机C语言程序的使用几乎都是在MPLAB中进行的;PICC没有自己独立的界面和环境。
PICC开发工具是由Hi-tech公司开发推出的,其官方网站地址是:/。
目前在中国大陆,作为学习和科研之用,可以使用其简易版本,或者是面向教育用户的版本;除此之外,你还可以在网上搜索并下载网友提供的各种破解版本。
不过需要说明的是,使用这些版本只可用来学习和科研,如果移作它用,请购买正式版本;否则,由此造成的一切后果,ANY电子不负任何责任。
安装好PICC开发工具(ANY电子安装的是9.60版本)之后,就可以打开MPLAB集成开发环境对开发语言进行配置了。
《PIC16系列单片机C程序设计与proteus仿真》学习之3---用TMR0对外部计数作为按键
//用TMR0对外部计数作为按键,每按一下,LED闪亮//为了让RA4按键产生中断,则设置TMR0为外部计数,下降沿计数,预分频比为1:1,并将初值设置为0xFF,//这样只要一有按键,就产生中断,进入中断后,必须把TMR0重新赋值0xFF,这样下次一按键才能进入中断。
//RA4引脚的接一上拉电阻是必须的#include<pic.h>#include"DELAY.h"//把DELAY函数放在头文件中。
__CONFIG(0x3f71);//配置为设定:XT,WDT,off等#define LED RB1char A; //全局变量,保存LED状态void interrupt ISR(void);void DELAY(unsigned int);void main(void){TRISB1=0; //设RB1为输出,其余B口未设置,采用上电默认值,均为输入OPTION=0B00111000;//TMR0对外部脉冲计数,下降沿计数,预分频给WDT,则TMR0分频比为1:1INTCON=0B10100000;//允许TMR0溢出中断TMR0=0xFF;//TMR0赋初值LED=1;A=1;while(1);//原地等待}void interrupt ISR(void){if(T0IF==1){DELAY(30);//防抖,延时30MST0IF=0;TMR0=0xFF;//TMR0赋初值,必须!!!if(A==1){A=0;LED=0;}else{A=1;LED=1;}}}DELAY.h头文件中的内容:void DELAY(unsigned int n){unsigned int j;char k;for(j=0;j<n;j++)for(k=246;k>0;k--) NOP();}PROTUES如下:若当按下按键后,LED灭,此时示波器波形为:可以看出每一格代表20MS,未按键时,RA4(蓝线)处于高电平,TMR0=0xFF,按下S1后,RA4从高变低,TMR0计数值加1,马上溢出进入中断,延时120ms(书上说是30ms,我想是执行了赋初值语句、IF语句等需要耗费一定时间)后让RB1(黄线)电平翻转。
PIC16程序设计及应用
PIC16程序设计及应用PIC16程序设计及应用第一章简介本文档旨在介绍PIC16系列微控制器的程序设计及应用。
针对初学者和有一定基础的开发人员,详细讲解了PIC16微控制器的相关知识和使用方法。
第二章 PIC16微控制器基础1.PIC16微控制器概述1.1.什么是PIC16微控制器1.2.PIC16微控制器的特点和优势1.3.PIC16微控制器的应用领域2.PIC16微控制器的硬件结构2.1.CPU和存储器单元2.2.输入输出端口2.3.定时器和计数器2.4.串行通信接口2.5.其他外设模块3.PIC16微控制器的指令集3.1.指令的格式和操作类型3.2.常用指令的详细介绍3.3.寄存器和存储器的访问方法第三章 PIC16程序设计基础1.开发环境搭建1.1.编程工具的选择1.2.编程环境的配置2.PIC16程序结构和编写规范2.1.基本程序框架和流程2.2.常用编程指导原则3.输入输出操作3.1.数字输入输出3.2.模拟输入输出3.3.中断输入输出4.定时器和计数器的应用4.1.延时功能的实现4.2.定时器中断的使用4.3.计数器的应用案例5.串行通信接口的使用5.1.串口通信的原理和标准5.2.串口通信的配置和编程6.其他外设模块的应用6.1.脉宽调制模块(PWM)6.2.电源管理6.3.LCD显示控制第四章 PIC16程序的调试和优化1.调试方法和工具1.1.硬件调试工具1.2.软件调试工具2.程序优化技巧2.1.代码效率的优化2.2.内存使用的优化附件:________本文档涉及的附件包括:________1.示例代码2.应用案例3.参考资料法律名词及注释:________1.版权:________指宪法或法律规定的对作品的独占权利,包括复制、发行、展览、表演、广播、改编等权利。
2.商标:________指用于标识商品和服务来源的标志,如商号、商品名称、服务名称、包装等。
pic16 c语言实例
pic16 c语言实例摘要:1.PIC16 单片机简介2.C 语言编程基础3.PIC16 C 语言编程实例详解4.总结正文:【1.PIC16 单片机简介】PIC16 系列单片机是由美国Microchip 公司推出的一款16 位微控制器(Microcontroller Unit, MCU)。
它具有高性能、低功耗、成本低的特点,广泛应用于嵌入式系统、自动控制、智能家居等领域。
【2.C 语言编程基础】C 语言是一种通用的高级程序设计语言,广泛应用于各种领域,如操作系统、嵌入式系统、游戏开发等。
C 语言的特点是语法简洁、执行效率高、跨平台等。
【3.PIC16 C 语言编程实例详解】以PIC16F877A 单片机为例,这是一个常见的PIC16 系列单片机型号。
下面是一个简单的PIC16 C 语言编程实例:```c#include <reg52.h> // 包含头文件,定义了PIC16F877A 单片机的寄存器sbit led = P1^0; // 定义一个名为led 的位变量,对应P1.0 端口,用于控制LED 灯的开关void delay(unsigned int ms) // 延时函数{unsigned int i, j;for (i = ms; i > 0; i--)for (j = 114; j > 0; j--);}void main(){while (1) // 无限循环{led = 0; // LED 灯熄灭delay(500); // 延时500msled = 1; // LED 灯点亮delay(500); // 延时500ms}}```这个例子中,我们首先引入了PIC16F877A 单片机的寄存器定义头文件,然后定义了一个位变量led,用于控制P1.0 端口的LED 灯的开关。
接着,我们编写了一个延时函数,用于控制程序的执行速度。
最后,在主函数中,我们使用一个无限循环,通过切换LED 灯的状态,实现了一个简单的闪烁效果。
PIC16程序设计及应用简版
PIC16程序设计及应用PIC16程序设计及应用简介PIC16(Peripheral Interface Controller)是一种微控制器,由美国Microchip公司推出。
它采用RISC架构,具有较低的功耗、高速执行、丰富的外设等特点。
PIC16系列微控制器常应用于各种嵌入式系统中,例如家电控制、汽车电子、安防设备等领域。
本文档将介绍PIC16程序设计的基本概念及应用。
PIC16架构概述PIC16微控制器采用Harvard结构,具有独立的程序存储器和数据存储器。
它采用8位指令集,具有128个字节的RAM和4KB的闪存。
PIC16还拥有多种外设,例如定时器、串口通信接口、模拟比较器等。
PIC16程序设计基础1. 开发环境搭建要进行PIC16程序设计,首先需要安装PIC16开发环境。
Microchip官方提供了一款集成开发环境MPLAB X,可以用于编写、调试和PIC16程序。
安装完成后,还需要配合相应型号的编程器才能对PIC16进行编程。
2. 编写第一个程序下面将介绍一个简单的PIC16程序示例。
首先,我们需要创建一个新的源文件并命名为`mn.c`。
```cinclude <xc.h>void mn(void) {TRISBbits.TRISB0 = 0; // 将RB0引脚设置为输出模式 while (1) {TB0 = 1; // 将RB0引脚输出高电平__delay_ms(1000); // 延时1秒TB0 = 0; // 将RB0引脚输出低电平__delay_ms(1000); // 延时1秒}}```上述程序使用了XC8编译器提供的部分库函数。
首先,我们将RB0引脚设为输出模式,并在一个无限循环中不断将RB0引脚输出高低电平。
3. 编译和程序编译PIC16程序可通过MPLAB X提供的编译器进行,具体方法如下:1. 打开MPLAB X并创建一个新的项目。
2. 将前面编写的`mn.c`文件添加到项目中。
《PIC系列单片机C程序设计方案与proteus仿真》学习之、看门狗定时器(WDT)和EEPPROM的读写
学习之6---看门狗定时器(WDT)//PIC.H中定义了宏#define CLRWDT() asm("clrwdt")因此在PICC的c语言中可以直接使用CLRWDT()对WDT清0//若单片机WDT使能,在适当位置加入CLRWDT(),程序进入正常运行时,每隔一定时间均会执行CLRWDT()语句对WDT清0,芯片不会复位//如果程序陷入死循环,不会执行到CLRWDT()语句,则超出所设定的时间后,WDT溢出使芯片复位,从头(000H)开始执行,单片机恢复正常运行//PIC16F单片机,看门狗定时器的启用只能在芯片的烧写时确定,即无法用软件来开启或关闭WDT,但在PIC16f88X中可以。
//PIC16单片机的WDT基本溢出时间为18MS,由RC充放电时间确定,在-40~85度之间变化时,WDT基本溢出时间在7-33ms变化#include<pic.h>__CONFIG(0X3F3D)。
//开启WTDvoid DELAY(unsigned int)。
#define LED1 RB1main(void){TRISB=0B11111101。
OPTION=0B11111011。
//WDT的分频比为1:8,最大复位时间为18*8=144ms if(TO==0)// 若写成T0,则编译出错。
{LED1=1。
//看门狗定时器溢出,仿真时溢出TO不会清零 }elseLED1=0。
while(1){DELAY(100)。
//模拟一个运行100ms的子程序 CLRWDT()。
DELAY(200)。
//模拟一个运行200ms的子程序,此时会产生溢出(200ms>144ms)CLRWDT()。
}。
}void DELAY(unsigned int n) {unsigned int j。
char k。
for(j=0。
j<n。
j++) for(k=246。
k>0。
PIC单片机自学笔记之TMR0数字钟
PIC自学笔记之TMR0数字时钟实验环境:Proteus编程语言:汇编编程环境:MPLAB单片机:PIC16F877晶振:4MHz首先声明一点:该数字时钟并不能精确地显示时间,因为定时器置初值的过程中会造成无法弥补的误差。
虽然如此,该文作为一篇针对对TMR0定时器应用,键盘扫描模块和数码管显示模块的一个整合应用,我想应该还算得上比较成功的一次实验。
因而传上来,希望能为刚接触PIC单片机的朋友们做个参考。
功能说明:该数字时钟实验,以定时器0为时钟源,采用1/256预分频,初始时间设定在了该实验完成的那一刻。
时钟的显示是通过八个七段数码管,由八个74HC573来驱动,在驱动器的选择上,选择了74HC138译码器,通过PORTE 的三个I/O口来控制,键盘模块在主程序中,通过循环扫描的方式来获取键盘信息,其中,KEY1是总控制键,按一下可进入分钟的设置,按两下进入小时的设置,按三下退出设置;KEY2和KEY3分别是‘加’和‘减’操作键。
操作流程为,首先按KEY1选择设置分钟还是小时,然后通过KEY2或KEY3调整其值(注:单纯的按KEY2或KEY3不会对时钟进行设置)Proteus仿真图键盘电路仿真效果图部分程序源代码list p=16f877INCLUDE P16F877.INCSECOND equ 20hMINUTE equ 21hHOUR equ 22hBSTA TUS equ 23hBW equ 24hBPCH equ 25hBFSR equ 26hD20 equ 27hCOM0 EQU 28H;公共单元COM1 EQU 29HCOM2 EQU 2AHCOM3 EQU 2BHCOM4 EQU 2CHCOM5 EQU 2DHCOM6 EQU 2EHDIS0 EQU 2FH;显示寄存器单元DIS1 EQU 30HDIS2 EQU 31HDIS3 EQU 32HDIS4 EQU 33HDIS5 EQU 34HDISC EQU 35HDELA Y1 EQU 36H;延时寄存器单元DELA Y2 EQU 37HKEYCOM0 EQU 38H;键盘键值单元KEYCOM1 EQU 39HFLAG EQU 3AH;键盘标志单元KEYDELY EQU 3BHORG 000HGOTO MAINORG 004H;中断入口,此处只用了定时器0的中断TMR0INT:MOVWF BWSW APF STA TUS,0CLRF STA TUSMOVWF BSTA TUSMOVF FSR,0MOVWF BFSRMOVF PCLA TH,0MOVWF BPCHCLRF PCLA TH;以上是入中断前的现场保护;************************BCF STA TUS,RP1;以下开始为时钟计算单元BCF STA TUS,RP0BTFSS INTCON,5;判断定时器0的中断是否被允许,也可以不要,但又的话更稳定GOTO INTOUTBTFSS INTCON,2;判断定时器0溢出标志位GOTO INTOUTBCF INTCON,2;清定时器0中断标志位MOVLW H'3C';定时器0赋初值MOVWF TMR0DECFSZ D20GOTO INTOUTMOVLW D'20';一秒定时到MOVWF D20INCF SECONDMOVLW D'60'XORWF SECOND,0BTFSS STA TUS,ZGOTO DISW;显示CLRF SECONDINCF MINUTEMOVLW D'60'XORWF MINUTE,0BTFSS STA TUS,ZGOTO DISWCLRF MINUTEINCF HOURMOVLW D'24'XORWF HOUR,0BTFSS STA TUS,ZGOTO DISWCLRF HOURDISW:CALL DIS;显示子程序;************************INTOUT: MOVF BPCH,0;中断返回,恢复现场MOVWF PCLA THMOVF BFSR,0MOVWF FSRSW APF BSTA TUS,0MOVWF STA TUSSW APF BW,1SW APF BW,0RETFIEMAIN:BANKSEL PORTA;初始化各相关寄存器clrf PORTAclrf PORTDCLRF PORTEMOVLW H'F0'MOVWF PORTBmovlw h'a0'movwf INTCONMOVLW H'3C'MOVWF TMR0MOVLW D'21'MOVWF D20CLRF SECONDMOVLW D'17';设置开机显示时间小时值MOVWF HOURMOVLW D'24';设置开机显示分钟值MOVWF MINUTECLRF DIS0;CLRF DIS1MOVLW D'4'MOVWF DIS2MOVLW D'2'MOVWF DIS3MOVLW D'7'MOVWF DIS4MOVLW D'1'MOVWF DIS5BANKSEL TRISAMOVLW H'07';定时器0设置为内部时钟源,1/256预分频MOVWF OPTION_REGCLRF TRISECLRF TRISDMOVLW H'F0'MOVWF TRISBCLRF PIE1CLRF PIE2BANKSEL PORTAMOVLW H'02'MOVWF PORTE;数码管选择MOVLW H'40'MOVWF PORTDMOVLW H'05'MOVWF PORTECALL DISGOTO KEYKEYDIS: BTFSS FLAG,0GOTO KEYCALL DISGOTO KEYDIS: MOVF SECOND,0;显示处理MOVWF COM3CALL DIV10;除10子程序,商在COM3中,余数在COM5中MOVF COM5,0MOVWF DIS0MOVF COM3,0MOVWF DIS1MOVF MINUTE,0MOVWF COM3CALL DIV10MOVF COM5,0MOVWF DIS2MOVF COM3,0MOVWF DIS3MOVF HOUR,0MOVWF COM3CALL DIV10MOVF COM5,0MOVWF DIS4MOVF COM3,0MOVWF DIS5MOVLW DIS0MOVWF FSRCLRF DISCDISLOOP: MOVF DISC,0MOVWF PORTEMOVF INDF,0CALL LEDISMOVWF PORTDINCF DISCINCF FSRMOVF DISC,0MOVWF PORTEMOVF INDF,0CALL LEDISMOVWF PORTDINCF DISCINCF DISCINCF FSRMOVLW D'9'XORWF DISC,0BTFSS STA TUS,ZGOTO DISLOOPRETURNLEDIS:ADDWF PCLRETLW H'3F';0RETLW H'06';1RETLW H'5B';2RETLW H'4F';3RETLW H'66';4RETLW H'6D';5RETLW H'7D';6RETLW H'07';7RETLW H'7F';8RETLW H'6F';9KEY: MOVLW KEYCOM0;键盘扫描程序CALL KEYREAD;调用读PORTB状态程序BTFSC STA TUS,ZGOTO KEYCALL DELA Y5MS;延时5MS消抖MOVLW KEYCOM0CALL KEYREADBTFSC STA TUS,ZGOTO KEYBTFSC KEYCOM0,7;确认有键按下后,进而判断是哪个键被按下GOTO KEY0;KEY1处理子程序BTFSC KEYCOM0,6GOTO KEY ADD;加处理BTFSS KEYCOM0,5GOTO KEYGOTO KEYSUB;减处理KEY0: BTFSS PORTB,7GOTO KEY0;等待按键释放BTFSC FLAG,0;FLAG,0在KEY1第一次被按下后被置一,在第三次按下时清零GOTO KEY1BSF FLAG,0BCF INTCON,5BCF INTCON,2KEYLP: BTFSS FLAG,2GOTO KEYGOTO KEYOUTKEY1: INCF FLAGBSF FLAG,0GOTO KEYLPKEY ADD: BTFSS FLAG,0GOTO KEYKADD: BTFSS PORTB,6GOTO KADDMOVLW MINUTEBTFSC FLAG,1MOVLW HOURMOVWF FSRINCF INDFMOVLW D'60'BTFSC FLAG,1;FLAG,1是分和时区分标志MOVLW D'24'XORWF INDF,0BTFSC STA TUS,ZCLRF INDFGOTO KEYDISKEYSUB: BTFSS FLAG,0GOTO KEYKSUB: BTFSS PORTB,5GOTO KSUBMOVLW MINUTEBTFSC FLAG,1MOVLW HOURMOVWF FSRDECF INDFMOVLW D'59'BTFSC FLAG,1MOVLW D'23'BTFSC INDF,7MOVWF INDFCLRWGOTO KEYDISDIV10: MOVLW D'10';除十子程序MOVWF COM4CLRF COM5MOVLW D'8'MOVWF COM6DIV101: BCF STA TUS,CRLF COM3RLF COM5BSF COM3,0MOVF COM4,0SUBWF COM5BTFSS STA TUS,CCALL ADDDECFSZ COM6GOTO DIV101RETURNADD:MOVF COM4,0ADDWF COM5BCF COM3,0RETURNDELA Y5MS:;5MS延时MOVLW D'75'MOVWF DELA Y1DLOOP: MOVLW D'100'MOVWF DELA Y2DLOOP1: DECFSZ DELA Y2GOTO DLOOP1DECFSZ DELA Y1GOTO DLOOPRETURNKEYREAD:MOVWF FSR;读PORTB状态MOVF PORTB,0ADDLW H'F0'XORLW H'F0'MOVWF INDFRETURNKEYOUT: CLRF FLAGBSF INTCON,5GOTO KEYEND。
《PIC16系列单片机C程序设计与proteus仿真》学习之4----TMR1定时器
/**用TMR1延时中断,通过RB0输出脉冲,每隔100MS让LED闪亮,采用中断方式**//*若定时器TMR1延时100MS,8位pic单片机晶振4MHZ,则指令周期Tcy=1us,计算如下:1.设预分频比为K,则65536*K*Tcy=100_000us,得K=1.52,要取大于此值的最小分频比,即K=22.计算延时常数X,(65536-X)*2*Tcy=100_000us,四舍五入取整,得X=15536.*/#include<pic.h>__CONFIG(0x3F71);#define T1_100MS 15536#define LED RB0char A;void interrupt ISR(void);void main(void){TRISB0=0;TMR1H=T1_100MS>>8;//取延时常数的高字节TMR1L=T1_100MS; //取延时常数的低字节TMR1IE=1; //TMR1终端使能INTCON=0b11000000;//GIE、PEIE置1才能进入TMR1中断T1CON=0b00010001;//TMR1预分频系数为1:2,内部延时,开始工作A=1;LED=1;while(1);}void interrupt ISR(void){if(TMR1IF==1){TMR1IF=0;TMR1H=T1_100MS>>8; //延时常数重新赋值TMR1L=T1_100MS; //整型数赋给字符型变量,只赋整型的低字节if(A==1){A=0;LED=0;}else{A=1;LED=1;}}}ROTUES如下图:示波器波形:照理说,应该脉冲周期是200ms,可为什么示波器显示的不对呢???有空好好研究下PS:见书P121-P123TMR1可以外接低频振荡器,当TMR1的振荡器使能时(T1OSCEN位置1),T1OSI和T1OSO 引脚自动被设定为输入,此时其相应的TRIS值被忽略。
PIC16单片机课设智能时钟报告
《PIC单片机》课程设计学生姓名:学号:0112007XX指导教师:2014年12月30日目录1、硬件介绍 ......................................................................................................................... - 2 -1.1电源模块 ........................................................................................................................ - 2 -1.2 LCD模块 ........................................................................................................................ - 2 -1.3矩阵按键模块 ................................................................................................................ - 4 -1.4时钟模块(DS1307)+温度模块(TC74) ................................................................ - 4 -1.4.1时钟模块(DS1307) ................................................................................................ - 4 -1.4.2温度模块(TC74)...................................................................................................... - 5 -1.6 PROTEUS仿真图............................................................................................................. - 6 -2、软件介绍 ......................................................................................................................... - 7 -2.1 Main程序........................................................................................................................ - 8 -2.2 初始化............................................................................................................................ - 8 -2.3 自定义字符 .................................................................................................................... - 9 -2.4 显示欢迎语 .................................................................................................................. - 10 -2.5 时间及温度显示 .......................................................................................................... - 11 -2.6 中断设置...................................................................................................................... - 12 -2.6.1按键功能说明............................................................................................................ - 13 -2.6.2按键修改说明............................................................................................................ - 15 -2.6.3光标移动说明............................................................................................................ - 16 -2.7蜂鸣器设置音乐 ........................................................................................................... - 16 -3、设计结果 ....................................................................................................................... - 16 -4、设计体会 ....................................................................................................................... - 17 -1、硬件介绍这次课设所用到的硬件模块有,PIC16F887单片机芯片,LCD1602芯片,4×4键盘,DS1307时钟芯片,TC74温度计芯片,还有PWM控制的蜂鸣器模块。
《PIC16系列单片机C程序设计与proteus仿真》学习之9-SLEEP工作方式 单片机进入休眠
//SLEEP工作方式,单片机进入休眠,可以节省电源,提高A/D转换精度(此时AD转换必须选择内部RC作为A/D转换的时钟源)//SLEEP工作方式相爱,芯片的振荡器停诊,因此没有系统时钟。
在刚进入休眠工作模式下,如看门狗定时器是能状态,系统会自动把看门狗定时器的当前计数值清零//使其重新计数,在SLEEP模式下,I/O端口保持执行SLEEP指令之前的状态。
//INTCON.GIE=1时,唤醒SLEEP计数之后,先执行SLEEP之后的一条语句,然后进入中断服务程序若不希望执行SLEEP之后的那条语句,可加上NOP指令//INTCON.GIN=0,则唤醒SLEEP,但不进入中断。
//INTCON.INTE=0,则不管GIE为何值,按键时都不能唤醒SLEEP//INT中断与休眠#include<pic.h>__CONFIG(0X3F39);//调试用void DELAY_I(unsigned int);void interrupt INT_ISR(void);#define LED1 RB1#define LED2 RB2void main(void){OPTION=0b1001101;//RB0/INT下降沿中断TRISB=0b11111001;//设置RB0/RB1为输出LED1=0;LED2=0;INTE=1;//中断控制寄存器INTCON的位4INTE(INT引脚中断使能)GIE=1;//位7全局中断使能SLEEP();//进入休眠工作方式NOP();//SLEEP之后要加上NOP语句LED1=1;//唤醒后LED1亮while(1); //等待中断}void interrupt INT_ISR(void){char x;if(INTF){LED2=1;DELAY_I(30);INTF=0;}}void DELAY_I(unsigned int n) {unsigned int j;char k;for(j=0;j<n;j++)for(k=246;k>0;k--) NOP();}proteus运行图:设置图:。
PIC16程序设计及应用
PIC16程序设计及应用PIC16程序设计及应用引言PIC16是一种微控制器,它在嵌入式系统中有着广泛的应用。
本文将介绍PIC16程序设计的基本知识和应用场景,帮助读者了解和掌握PIC16的编程技巧和应用方法。
本文将以Markdown文本格式输出,方便读者阅读和理解。
什么是PIC16PIC16是微芯科技(Microchip Technology)推出的一种8位微控制器。
它具有低功耗、高性能和丰富的外设特性,适用于各种嵌入式应用中。
PIC16微控制器可以通过编程实现各种功能,如数据采集、通信、控制等。
因此,学习PIC16程序设计具有重要的意义。
PIC16程序设计基础1. 开发环境搭建在开始PIC16程序设计之前,我们需要搭建PIC16的开发环境。
首先,我们需要安装MPLAB X IDE(Integrated Development Environment),这是用于PIC16开发的集成开发环境。
其次,我们需要选择合适的编译器和调试工具。
最常用的编译器是XC8,它支持C语言编程。
调试工具可以使用MPLAB ICD等。
安装好开发环境后,我们可以开始编写程序了。
2. 程序结构每个PIC16程序都需要遵循一定的程序结构。
一个典型的PIC16程序包含以下几个部分:- 引用库文件:包含一些常用的库文件,以便在编程中使用预定义的函数和变量。
- 定义引脚:定义用于输入输出的引脚。
- 初始化:进行一些初始化工作,如配置引脚功能、初始化外设等。
- 主函数:程序的入口,包含了程序的主要逻辑。
- 中断处理函数(可选):处理来自外部的中断信号。
3. 常用函数和指令PIC16的编程主要使用C语言进行。
在编程过程中,我们会使用到一些常用的函数和指令,如GPIO控制、定时器操作、串口通信等。
这些函数和指令可以通过引用库文件进行调用。
以下是一些常用的函数和指令示例:```cinclude <pic16.h>void mn(){TRISB0 = 0; // 将B0引脚设置为输出PORTB0 = 1; // 将B0引脚输出高电平}```4. 调试和仿真在PIC16程序开发过程中,调试和仿真是非常重要的环节。
PIC16F87X单片机的定时器-计数器的应用
PIC16F87X 单片机的定时器/计数器的应用
PIC16F87X 单片机内部配置了3 个定时器/计数器,分别记为TMR0、TMR1、TMR2。
这3 个定时器/计数器模块不仅在电路结构上不相同,而且其在设计的初衷和使用上也各有不同。
·定时器/计数器TMR0。
定时器/计数器TMR0 是3 个同类模块中最常用的器件,与定时器/计数器TMR0 相关的寄存器共有4 个,分别为累加计数寄存器TMR0、选项寄存器OPTION REG、中断控制寄存器INTCON 和端口RA 方向寄存器TRISA。
·定时器/计数器TMR1。
定时器/计数器TMR1 是一个由两个8 位可读写的寄存器(TMR01H 和TMRIL)组成的16 位定时器/计数器,它带有一个3 位的可编程预分频器和一个内置的低功耗低频时基振荡器。
PIC单片机学习笔记之万年历
PIC单片机自学笔记之万年历实验环境:Proteus编程语言:汇编编程环境:MPLAB IDE单片机:PIC16F877晶振:20MHz实验目的用的定时器定时扫描的方式消除键盘抖动的影响,提高了程序的运行速率;可对分钟、小时、日期、月份和年份进行调节。
实验效果图如图1和图2.图1—系统开机效果图图2—调整时间后的显示状态PCF8563芯片概述:PCF8563 有16 个位寄存器:一个可自动增量的地址寄存器,一个内置32.768KHz的振荡器(带有一个内部集成的电容)一个分频器(用于给实时时钟RTC 提供源时钟)一个可编程时钟输出,一个定时器,一个报警器,一个掉电检测器和一个400KHz I2C 总线接口。
所有16 个寄存器设计成可寻址的8 位并行寄存器,但不是所有位都有用。
前两个寄存器(内存地址 00H,01H)用于控制寄存器和状态寄存器,内存地址 02H~08H 用于时钟计数器(秒~年计数器),地址09H~0CH 用于报警寄存器(定义报警条件),地址 0DH 控制CLKOUT 管脚的输出频率,地址0EH 和 0FH 分别用于定时器控制寄存器和定时器寄存器。
秒、分钟、小时、日、月、年、分钟报警、小时报警、日报警寄存器,编码格式为BCD,星期和星期报警寄存器不以 BCD 格式编码。
当一个RTC 寄存器被读时,所有计数器的内容被锁存,因此,在传送条件下,可以禁止对时钟日历芯片的错读。
MAX7219概述:MAX7219/MAX7221是一种集成化的串行输入/输出共阴极显示驱动器,它连接微处理器与8位数字的7段数字LED显示,也可以连接条线图显示器或者64个独立的LED。
其上包括一个片上的B型BCD编码器、多路扫描回路,段字驱动器,而且还有一个8*8的静态RAM用来存储每一个数据。
只有一个外部寄存器用来设置各个LED的段电流。
MAX7221与SPI™QSPI™以及MICROWIRE™相兼容,同时它有限制回转电流的段驱动来减少EMI(电磁干扰)。
pic16 c语言实例
pic16 c语言实例如何使用PIC16 C语言编程实现中括号内的主题PIC16系列是一种常见的微控制器,广泛应用于各种嵌入式系统中。
它的编程语言是汇编语言和C语言,本文将以中括号内的内容为主题,介绍如何使用PIC16 C语言编程来实现这个主题。
第一步:初始化在使用PIC16 C语言编程之前,首先需要对微控制器进行初始化设置。
这包括配置时钟源、IO引脚、中断等。
通过设置合适的初始化程序,可以确保微控制器正常运行,并且能够与外部设备进行通信。
第二步:引入必要的库文件在开始主题的编程之前,需要引入相应的库文件。
这些库文件通常包含了一些常用的函数和宏定义,可以简化编程过程。
例如,如果需要使用串口通信,可以引入串口库文件,而不必自己编写相应的函数。
第三步:定义和初始化变量在编程过程中,需要使用各种不同类型的变量来存储数据。
在开始主题的编程之前,需要定义和初始化相应的变量。
例如,如果主题是“温度监测”,那么需要定义一个浮点型变量来存储温度值,并初始化为0。
第四步:编写主题相关的函数一个主题通常涉及多个功能和操作,为了方便管理和调用,可以将相关的代码封装在一个函数或多个函数中。
例如,如果主题是“温度监测”,则可以编写一个函数来读取温度传感器的数值,并返回温度值。
第五步:编写主程序在PIC16 C语言编程中,主程序是整个程序的入口点。
在主程序中,可以定义多个函数调用和逻辑控制语句,以实现所需的功能。
通过调用之前编写的函数,可以实现主题的具体功能。
例如,如果主题是“温度监测”,则可以在主程序中通过循环不停地调用温度读取函数,并将温度值打印出来。
第六步:调试和测试编写完主题相关的代码后,需要进行调试和测试,以确保程序的正确性和稳定性。
在PIC16 C语言编程中,可以使用调试工具或者逐步调试的方法,逐行执行代码,检查程序的运行状态和输出结果。
如果发现问题,可以通过修改代码或重新调整硬件来解决。
第七步:优化和改进在调试和测试的过程中,可能会发现一些问题或不足之处。
《PIC16系列单片机C程序设计与proteus仿真》学习之2----TMR0定时器中断
/**用TMR0延时中断,产生脉冲**//**设定时器TMR0延时10MS,8位pic单片机晶振4MHZ,则指令周期Tcy=1us,计算如下:1.设预分频比为K,则256*K*Tcy=10_000us,得K=39.06,要取大于此值的最小分频比,即K=642.计算延时常数X,(256-X)*64*Tcy=10_000us,得X=99.75,四舍五入取整,得X=100. */#include<pic.h>__CONFIG(0x3f71);#define LED RB0#define T0_10MS 100 //定义TMR0延时10MS的时间常数char A;void interrupt ISR(void);void main(void){RISB0=0; //设定RB0位输出,其余B口未设置,采用上电默认值,为输入OPTION=0b10000101;//RBPU=1:B口上拉使能,INTEDG=0:下降沿触发,T0CS=0:对内部指令周期计数,T0SE=0:RA4/T0CKI的上升沿计数,PSA=0:预分频分配位给TMRO,PS2PS1PS0=101:TMR0比率为1:64INTCON=0b10100000;//GIE=1:允许全局中断使能,PEIE=0:禁止外设中断使能,T0IE/TMR0IE=1:允许TMR0溢出中断使能,INTE=0:禁止INT引脚中断使能//RBIE=0:禁止RB口高4位电平变化使能,T0IF/TMR0IF=0:TMR0溢出中断标志位--未溢出//INTF=0:未发生INT中断,RBIF=0:RB7:RB4引脚的逻辑状态未发生变化TMR0=T0_10MS; //TMR0赋初值LED=1;A=1;while(1); //原地等待}void interrupt ISR(void){if(T0IF==1){T0IF=0;TMR0=T0_10MS;//TMR0赋初值,必须if(A==1){A=0;LED=0;}else{A=1;LED=1;}}}proteus如下:(已修改)第一步:初步画好仿真图,设置好PIC参数(晶振,配置位)并运行,如下:第二步:设置ANALOGUE ANALYSIS(我们主要看RB0的模拟电压情况),设置方法如下:1.右击---Edit Graph---起始时间50m,终止时间150m---OK2.右击---Add Traces---Name为RB0,Probe P1为RB0---OK3.右击---Edit Graph---Set Y-scales---若此时显示为灰色不可输入状态,那就点确定,会弹出一个窗口“Resimulate?”,点击确定,方波图就出来了,不过默认是0~5V,你现在就可以重新修改Y-scales,如下图:先打勾“Lock values”,在设置Min -1,Max 6----Ok----又会弹出“resimulate?”,确定即可。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/**用TMR0延时中断,产生脉冲**/
/**
设定时器TMR0延时10MS,8位pic单片机晶振4MHZ,则指令周期Tcy=1us,计算如下:1.设预分频比为K,则256*K*Tcy=10_000us,得K=39.06,要取大于此值的最小分频比,即K=64
2.计算延时常数X,(256-X)*64*Tcy=10_000us,得X=99.75,四舍五入取整,得X=100. */
#include<pic.h>
__CONFIG(0x3f71);
#define LED RB0
#define T0_10MS 100 //定义TMR0延时10MS的时间常数
char A;
void interrupt ISR(void);
void main(void)
{
RISB0=0; //设定RB0位输出,其余B口未设置,采用上电默认值,为输入
OPTION=0b10000101;//RBPU=1:B口上拉使能,INTEDG=0:下降沿触发,T0CS=0:对内部指令周期计数,T0SE=0:RA4/T0CKI的上升沿计数,PSA=0:预分频分配位给TMRO,PS2PS1PS0=101:TMR0比率为1:64
INTCON=0b10100000;//GIE=1:允许全局中断使能,PEIE=0:禁止外设中断使能,T0IE/TMR0IE=1:允许TMR0溢出中断使能,INTE=0:禁止INT引脚中断使能//RBIE=0:禁止RB口高4位电平变化使能,T0IF/TMR0IF=0:TMR0溢出中断标志位--未溢出
//INTF=0:未发生INT中断,RBIF=0:RB7:RB4引脚的逻辑状态未发生变化
TMR0=T0_10MS; //TMR0赋初值
LED=1;
A=1;
while(1); //原地等待
}
void interrupt ISR(void)
{
if(T0IF==1)
{
T0IF=0;
TMR0=T0_10MS;//TMR0赋初值,必须
if(A==1)
{
A=0;
LED=0;
}
else
{
A=1;
LED=1;
}
}
}
proteus如下:(已修改)
第一步:初步画好仿真图,设置好PIC参数(晶振,配置位)并运行,如下:
第二步:设置ANALOGUE ANALYSIS(我们主要看RB0的模拟电压情况),设置方法如下:
1.右击---Edit Graph---起始时间50m,终止时间150m---OK
2.右击---Add Traces---Name为RB0,Probe P1为RB0---OK
3.右击---Edit Graph---Set Y-scales---若此时显示为灰色不可输入状态,那就点确定,会弹出一个窗口“Resimulate?”,点击确定,方波图就出来了,不过默认是0~5V,你现在就可以重新修改Y-scales,如下图:
先打勾“Lock values”,在设置Min -1,Max 6----Ok----又会弹出“resimulate?”,确定即可。
最后效果图为:
示波器图为:
若示波器不小心X掉了,可以在运行的状态下(不运行不会出现该选项)通过菜单Debug---3.Digital Oscilloscope来调出来
ps:详情请参见书P117。
如有疑惑,可以互相讨论,共同进步!。