基于PIC16F877A的方波信号发生器电路设计

发布者:快乐航程最新更新时间:2012-11-27 来源: 21IC 关键字:PIC16F877A  方波信号发生器  定时器 手机看文章 扫描二维码
随时随地手机看文章

    在数字电路系统中,方波是经常使用的信号源,具有非常广泛的应用范围。在普通的电路设计中,经常利用555定时器构成多谐振荡器产生方波信号,虽然比较简单,但频率准确精度不高,若要产生不同频率的方波信号,更换电阻和电容又比较麻烦。基于这个出发点,本文采用单片机进行电路设计,利用软件编程控制代替硬件的更换,可灵活简单地产生不同频率的方波信号,而且电路更为简单、频率更准确、性能更稳定。

1 软件平台及芯片介绍
    目前的单片机有很多种型号,有Intel公司的8051系列、Motorola公司的M68系列、ATMEL公司的AT系列、Microchip公司的PIC系列等等。本文主要介绍Microchip公司开发的基于MPLAB-IDE 6.62集成开发环境的PIC单片机的电路设计。MPLAB-IDE集成开发软件是专门设计对PIC系列单片机进行文本编辑,在线调方式及编译的开发工具。PIC芯片采用PIC16F877A,40脚封装、具有5个输入/输出端口,每个端口中的每条引脚由用户按需要单独编程,设定为输出引脚或输入引脚。

2 方波信号发生器电路设计
2.1 硬件电路分析
    利用PIC16F877A中的定时器/计数器TMR0模块作为硬件定时器控制端口引脚RC0上产生不同频率的方波。由于TMR0为8位宽,有一个可选的预分频器,故可产生8种方波信号;同时通过设置不同的初始值,可产生不同的频率。本设计初始值设为131,计数125个指令周期产生溢出,即TMR0从计数到开始溢出需要125us。通过改变分频比,来达到产生不同频率的目的。TMR0溢出一次就使端口引脚RC0的输出电平反转一次,每反转两次引脚电平就形成方波信号的一个周期。当分频比为1:256时,TMRO的延时为125 us×256=32000 us,方波信号周期为32000 us×2=64000 us=64 ms,对应的方波信号频率为最低档的15.625 Hz;当分频比为1:2时,TMR0的延时为125 us×2=250 us,方波信号周期为250 us×2=500 us=0.5 ms,对应的方波信号频率为最高档的2000 Hz。改变TMR0的初始值,可分别产生15.625 Hz,32.25 Hz,62.5 Hz,125 Hz,250 Hz,500 Hz,1000 Hz,2000 Hz 8种方波信号。其工作原理如图1所示,接在端口引脚RB0上的按钮开关SW1作为循环切换控制开关;按在MCLR引脚上的按钮开关SW2用作单片机复位开关;端口RC0作为方波信号输出,并接上一个发光二极管和蜂呜器作为输出指示;R3和C1构成RC振荡方式,接在OSC1作为单片机系统时钟的输入,其优点是经济、节省成本。
 
图1 硬件电路工作原理示意图
2.2 软件设计
    在PIC16F877A单片机中,与定时器/计数器TMR0相关的特殊功能寄存器有4个,累加计数寄存器TMR0、中断控制寄存器INTCON、选项寄存器OPTION_REG和端口RA方向控制寄存器TRISA,其中选项寄存器OPTION_REG的各位含义为:
 
    当其第5位(TOCS)置1时,TMR0模块被设置为计数器模式,其分频比由OPTION_REG的D2:DO(PS2~PS0)决定,分别为1:2,1:4,1:8,1:16,1:32,1:64,1:128,1:256,由此可产生8种分频信号,即8种方波信号。其源程序采用汇编编语言编写,如下:

程序清单fbxh.asm
LIST    P=16F877A
INCLUDE "P16F877A.INC"
TMR0    EQU 01H
;定时器/计数器0寄存器地址
STATUS     EQU 3H
OPTION_REG EQU 81H
OPTION_B   EQU 22H
INTCON     EQU 0BH
PORTB      EQU 6H   ;端口B的地址
TRISB      EQU 86H
PORTC      EQU 7H   ;端口C的地址
TRISC      EQU 87H
TMR0B      EQU D\'256\'-D\'125\'
 ;定义TMR0初值
RP0 EQU 5H[page]
;*********主程序************
ORG 000H
MAIN NOP
BSF STATUS,RP0
MOVLW 0FEH
MOVWF TRISC
CLRF PORTC
MOVLW 0FFH
MOVWF TRISB
MOVLW 07H ;分频比设定为1:256
MOVWF OPTION_REG
BCF STATUS,RP0
KEYIN BTFSC PORTB,0 ;测试SW1是否按下?
GOTO LOOP
CALL DELAY
BTFSC PORTB,0
GOTO LOOP
CHECK BTFSS PORTB,0 ;测试SW1是否断开?
GOTO  CHECK
CALL DELAY
;调开延时子程序。消除断开抖动的影响
BTFSS PORTB,O
GOTO CHECK
BSF STATUS,RP0
DECF OPTION_REG,1
MOVF 07H
ANDWF OPTION_REG
MOVF OPTION_REG,1
BCF STATUS,2
GOTO MAIN
LOOP MOV LW01H
XORWF PORTC
BCF INTCON,2
MOVLW TMR0B
MOVWF TMR0
;重新启动定时器开始计数
TEST BTFSS INTCON,2
;检测TMR0溢出标志位
GOTO TEST
GOTO KEYIN
;*******TMR0延时子程序8 ms*******
DELAY
BSF STATUS,RP0
MOVF OPTION_REG,0
MOVWF OPTION_B
MOVLW 04H
MOVWF OPTION_REG
BCF STATUS,RP0
BCF INTC0N,2
MOVLW 06H
MOVWF TMR0
LOOP1 BTFSS INTCON,2
GOTO LOOP1
BSF STATUS,RP0
MOVF OPTION_B,0
MOVWF OPTION_REG
BCF STATUS,RP0
RETURN
; ***********************
END ;源程序结束

2.3 基于MPLAB-IDE6.62软件平台的编译与编程
(1)启动MPLAB-IDE6.62,创建工程项目FBXH,并创建源文件fbxh.asm,编译生成目标程序HEX文件。
(2)选择器件为PIC16F877A,选择通信接口(USB口),建立通信连接,设置MPLAB ICD2作为调试工具。设置调试选项,载入调试代码,调试代码会自动编程到程序存储器的顶层空间,用于MPLAB ICD2的调试,进行模拟仿真。
(3)仿真正确之后,选择器件配置电源和接口,并设置编程选项,进行编程下载程序,完成芯片程序的写入。

2.4 电路板的设计、安装与调试
     利用PROTEL99SE制作电路PCB板进行安装焊接,SW1,SW2选用按纽开关,SW1为循环切换控制开关,SW2为复位开关,POWER接5V电源,U1在安装时要采用IC座,便于更新或更换IC,LS1可连接到压电蜂鸣器,D0为发光二极管,有输出时D0点亮,OUT为输出端,用可示波器进行观察。调试完成之后,方波信号发生器的设计就全部完成了。

关键字:PIC16F877A  方波信号发生器  定时器 引用地址:基于PIC16F877A的方波信号发生器电路设计

上一篇:PIC16F874单片机在直流电机无级调速系统中的应用
下一篇:PIC16F877单片机与PC机通讯的汇编程序

推荐阅读最新更新时间:2024-03-16 13:14

单片机中断装初值时为什么要对256求模和求余
定时器工作在16位计数模式的时候有两个个参数TH跟TL 这2个参数都是8位(0-255)的,不能直接接受16位(0-65535)数据 为了使高8位赋值到TH里面就要采用除以256的方法,等效于 8(2的8次方=256),就相当于把高字8位移动到低8位的位置了 求余数是为了把低8位赋值到TL里面,当不能被256整除留下的余数范围只有0-255以内。所以可以直接赋值给TL了。 所以 TH0=(65536-50000)/256; TL0=(65536-50000)%6; 等效于 TH0=(65536-50000) 8; TL0=(65536-50000)&0x00ff; 在运算时 单片机在逻辑运算方面效率高于算术运算。
[单片机]
STM32定时器分时操作系统
前后台系统,RTOS与定时器任务管理系统 前后台系统   在裸机上写程序,通常把程序分为两部分:前台系统和后台系统。   简单的小系统通常是前后台系统,这样的程序包括一个死循环和若干个中断服务程序:应用程序是一个无限循环,循环中调用API函数完成所需的操作,这个大循环就叫做后台系统。中断服务程序用于处理系统的异步事件,也就是前台系统。前台是中断级,后台是任务级。 RTOS   RTOS全称为:Real Time OS,就是实时操作系统,强调的是:实时性。实时操作系统又分为硬实时和软实时。硬实时要求在规定的时间内必须完成操作 ,硬实时系统不允许超时,在软实时里面处理过程超时的后果就没有那么严格。在实时操作系统中,我们可以把要
[单片机]
一个关于STM32定时器的CCR清零话题
今天跟大家分享一个STM32应用开发过程中操作CCR寄存器遇到的小案例,是关于STM32定时器中的捕获寄存器清零的问题。 有人用STM32做输入捕获,在捕获的回调函数里先将捕捉到的CCR值放入缓冲区,然后打算将CCR寄存器清零。结果发现根本清不了。相关代码如下【基于STM32cube库】: voidHAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim) { if (htim- Instance == TIM4) { if (htim- Channel == HAL_TIM_ACTIVE_CHANNEL_1) { ccr_cur =__HAL_TIM_GE
[单片机]
一个关于STM32<font color='red'>定时器</font>的CCR清零话题
STM32 通用定时器与滴答定时器
STM32 通用定时器与滴答定时器 前言:STM32包括TIM1/TIM8两个高级定时器,TIM2~TIM5四个通用定时器,TIM6/TIM7两个基本定时器,还有使用非常方便的系统滴答定时器(systick),基本操作为:配置(使能时钟/设置工作方式及初值/配置中断/开启中断和时钟/使能定时器) 计数 产生中断。 一、通用定时器使用 void TimerConfig(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; // 使能时钟/复位/自动重装载设置/时钟预分频设置/采样分频/up/清除中断/开启时钟 RCC_APB1PeriphClock
[单片机]
单片机定时器实用方法总结
第一部分:51系列定时器 定时/计数器 0 和定时/计数器1都有4种定时模式。 16位定时器对内部机器周期进行技术,机器周期加1,定时器值加1,1MHZ模式下,一个机器周期为1us 。 定时器工作模式寄存器TMOD,不可位寻址,需整体赋值,高4位用于定时器1,第四位用于定时器0。 C/T:为定时器功能选择位,C/T=0对机器周期计数,C/T=1,对外部脉冲计数。 GATE:门控位,GATE=0,软件置位TRn即可启动计时器,GATE=1需外部中断引脚为高电平时才能软件置位TRn启动计时器,一般取GATE=0。 定时器控制寄存器TCON: TFn:Tn溢出标志位,当定时器溢出时,硬件置位TFn,中断使能的情况
[单片机]
单片机<font color='red'>定时器</font>实用方法总结
MSP430编程要点
1.要对MSP430要有本质的理解:对于MSP430的C程序编程,对于模块的初始化、数据的读写、信号输入输出都是对寄存器的操作。 2.要正确设置系统时钟。MSP430最大的特点是低耗,能实现低功耗的主要原因是引入了时钟系统的概念。正确设置系统时钟,才能正确把握定时器、UART、LCD显示的正确使用。 3.要具有模块化的编程思想。要用软件工程的方法,采用VC++的工程管理的概念及模块化的思想是嵌入式编程的最重思路。只有把平时各种模块例如按键、LCED、LED、UART、定时器等各功能程序模块化、文档化,这样才能积累丰富自己的经验,使编程变得迅速正确。 4.明确MSP430的程序框架。对于MSP430来说,事件触发结构是适
[单片机]
STM32的SysTick定时器与Delay延时函数
1.BB一下 原子哥的Delay延时函数,在没有使用OS的情况下,没有使用SysTick中断,而笔者希望通过该中断记录系统时间 不使用OS,使用SysTick中断 不使用OS,不使用SysTick中断 使用OS,使用SysTick中断 2.BB完了,上代码 2.1.不使用OS,使用SysTick中断 #define SYSTICK_INT_MS 500 /* 定义 SysTick 定时器 1/SYSTICK_INT_MS秒中断一次 */ static u8 fac_us=0; static u16 fac_ms=0; static u32 _tickMs = 0; void SysTick_Handler(void)
[单片机]
触摸传感器QST108与PIC16F877A单片机的接口设计
1 概 述 QST108是意法半导体公司针对人机界面的触摸按键控制而推出的电容触摸传感器。 其工作原理采用了美国昆腾公司的电荷转移电容专利技术(QProx),支持8个独立按键,且可选择按键状态检测输出或I2C总线控制2种正常工作方式;同时,通过软件命令可使其进入低功耗模式,当有按键按下时可被唤醒。QST108特有的相邻按键抑制算法使得一个按键在按下未松开时,其他按键处于无效状态;自校准和自动漂移补偿功能使其无须人工校准,从而进一步降低了QST108的应用难度。引脚配置如图1所示,各引脚功能如表1所列。 2 QST108的工作方式 2.1 按键状态检测输出方式 QST108具有按键状态检测输出
[单片机]
触摸传感器QST108与<font color='red'>PIC16F877A</font>单片机的接口设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved