PIC16F877 Program for 1 KHz Square Wave Generation

PIC16F877 Program for 1 KHz square  Wave Generation: Here is the steps for PIC16F877 Program for Generating a square wave of 1 KHz .

Square  Wave Generation using PIC16F877

Square Wave Generation Using PIC16F877
Square Wave Generation Using PIC16F877

1 kHz Square Wave with PIC16F877 (Assembly)
Assumptions:
• Oscillator Fosc=4 MHzF_{osc} = 4 \, \text{MHz}Fosc=4MHz → instruction cycle Tcy=1 μsT_{cy} = 1 \, \mu sTcy=1μs.
• We want 1 kHz square wave → Period = 1 ms → Half-period = 0.5 ms = 500 µs.
• Timer0 with prescaler 1:4 → tick = 4 μs4 \, \mu s4μs.
• Required ticks = 500/4=125500 / 4 = 125500/4=125.
• Preload value = 256−125=131(0x83)256 – 125 = 131 (0x83)256−125=131(0x83).
So → On every Timer0 overflow, we toggle the pin (RB0).

;===========================================
; PIC16F877 – 1 kHz square Wave, 50% duty
; Using Timer0 interrupt, output on RB0
; Fosc = 4 MHz
;===========================================

    LIST P=16F877
    INCLUDE <P16F877.INC>
    __CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _LVP_OFF

    CBLOCK 0x20
    ; No variables needed
    ENDC

;——————————————-
ORG 0x00
GOTO MAIN

    ORG 0x04          ; Interrupt vector
    GOTO ISR

;——————————————-
MAIN:
BSF STATUS, RP0 ; Bank1
CLRF TRISB ; PORTB as output
BCF STATUS, RP0 ; Back to Bank0
CLRF PORTB ; Clear PORTB

    ; Setup Timer0
    MOVLW b'00000001' ; PSA=0 (assign prescaler), PS=001 (1:4), T0CS=0 (internal clk)
    OPTION_REG = 0x81 ; Actually OPTION<2:0>=001 -> PS=1:4, bit PSA=0
                      ; T0CS=0 (internal clock)

    MOVLW 0x83        ; Preload value = 131
    MOVWF TMR0

    ; Enable interrupts
    BSF INTCON, T0IE  ; Enable TMR0 overflow interrupt
    BSF INTCON, GIE   ; Global interrupt enable

LOOP:
GOTO LOOP ; Main loop does nothing

;——————————————-
; Interrupt Service Routine
ISR:
BCF INTCON, T0IF ; Clear TMR0 interrupt flag

    MOVLW 0x83        ; Reload TMR0 with 131
    MOVWF TMR0

    ; Toggle RB0
    MOVF PORTB, W     ; Read PORTB
    XORLW 0x01        ; Toggle bit0
    MOVWF PORTB

    RETFIE

;——————————————-
END

  • Timer0 is configured with prescaler 1:4.
  • TMR0 is preloaded with 0x83 (131) so that after 125 ticks (500 µs), it overflows.
  • On each overflow, the ISR reloads TMR0 and toggles RB0.
  • Thus, RB0 goes HIGH for 500 µs, LOW for 500 µs → 1 kHz square  wave, 50% duty cycle.

Join EEE Made Easy Telegram channel

Join EEE Made Easy Whatsapp Channel

Download EEE Made Easy Ebook PDF Free

Read Also

  1. PIC16F877

More on Microcontrollers

  1. Features of AVR|AVR Microcontrollers
  2. 8051 ARCHITECTURE|8051 Microcontroller Architecture
  3. 8051 Microcontroller Architecture|RISC and CISC CPU Architectures|HARVARD & VON- NEUMANN CPU Architecture
  4. Microprocessor VS Microcontroller| Comparison of Microprocessor and Microcontroller|Difference between Microprocessor and Microcontroller
  5. Addressing modes of 8051 Microcontroller|8051 Addressing Modes
  6. 8051 Microcontroller Instruction Set|KSEB Sub Engineer Notes
  7. 8051 Microcontroller MCQ|8051 Questions and Answers
  8. Microcontroller|Types of microcontroller
  9. 8051 Microcontroller Notes pdf|8051 microcontroller pdf
  10. Interrupts in 8051|Interrupts in 8051 Microcontroller
  11. 25 MCQs on 8051 Microcontroller

Latest Posts in EEE Made Easy

Leave a Comment