Why spend $10.00 on a musical card when you can produce the tune yourself.
This project uses just 4 components and a small prototype PC board to produce a project that will teach you a lot about programming.
The circuit uses a piezo diaphragm connected to pins 3 and 5.
That’s the only component.
All the work is done by the program.
The project is so easy, we don’t need to provide any construction details.
You can also get the Happy Birthday tune and use the same circuit.

The PIC chip on a prototype PC board
Here are the files:
Here is the program.
You must use the .hex file to “burn” the chip or the .asm file as these are laid out so that the compiler and programmer can understand the data.
The following program is just for viewing.
;*******************************
;IT'S A SMALL WORLD TUNE *
; 14-5-2010 *
; *
;********************************
list p=12F629
radix dec
include "p12f629.inc"
errorlevel -302 ; Don't complain about BANK 1
__CONFIG _MCLRE_OFF & _CP_OFF
& _WDT_OFF & _INTRC_OSC_NOCLKOUT ;Internal osc.
;==================================
;
; Configuration Bits
;
;==================================
note equ 21h ;value of HIGH and LOW for note
gap equ 22h ;gap between notes - uses delay "gap_1"
loops equ 23h ;loops of HIGH/LOW for 250mS or other duration
temp1 equ 24h ;temp file for note
jump equ 25h
D1 equ 26h ;used in 250mS delay
D2 equ 27h ;used in 250mS delay
D3 equ 28h ;used in 250mS delay
gapDela equ 29h ;used in gap delay
tempA equ 2Ah ;used in gap delay
extend equ 2Bh ;used to increase number of loops
;************************
;Beginning of program
;************************
org 0x00
nop
nop
nop
nop
nop
SetUp bsf status, rp0 ;Bank 1
call 0x3FF ;retrieve factory calibration value
movwf OSCCAL ;update register with factory cal value
movlw b'00001011' ;Set TRIS
movwf TRISIO ;GP2,4 outputs
bcf status, rp0 ;bank 0
movlw 07h ;turn off Comparator
movwf CMCON ;must be placed in bank 0
clrf jump ;jump value for table
goto M1
;********************************
;* Delays
;********************************
;gap_1 produces the gap between notes - 3rd byte in the table
gap_1 movlw .2
movwf gapDela
gap_1a decfsz tempA
goto gap_1a
decfsz gapDela,1 ;produces loops
goto gap_1a
decfsz gap,1 ;
goto gap_1
retlw 00
;250mS second delay
_250mS nop
goto $+1
decfsz D1,1
goto _250mS
decfsz D2,1
goto _250mS
retlw 00
;****************************************************************
;* Table *
;****************************************************************
;table values are as follows:
;1st value = value of HIGH and LOW for note
;2nd value = value to create 48mS note
;3rd value = gap between notes
table1 addwf pcl,f ;02h,1 add W to program counter
nop
retlw .14 ;loops - cycles of HIGH/LOW "E" It's
retlw .84 ;note - value of HIGH/LOW
retlw .50 ;gap between notes - uses "gap_1" delay
retlw .14 ; "F" - A
retlw .80
retlw .50
retlw .30 ;"G" world
retlw .142
retlw .50
retlw .30 ;"E" of
retlw .84
retlw .50
retlw .30 ;"C" laugh
retlw .105
retlw .50
retlw .14 ;"D"- ter
retlw .94
retlw .50
retlw .14 ;"C" a
retlw .105
retlw .50
retlw .30 ;"C" world
retlw .105
retlw .50
retlw .30 ;"B" of
retlw .113
retlw .50
retlw .40 ;"B" tears
retlw .113
retlw .50
retlw .14 ;"D"- It's
retlw .94
retlw .50
retlw .15 ;"E" a
retlw .84
retlw .50
retlw .30 ; "F" - world
retlw .80
retlw .50
retlw .30 ;"D"- of
retlw .94
retlw .50
retlw .40 ;"B" hopes
retlw .113
retlw .50
retlw .14 ;"C" and
retlw .105
retlw .50
retlw .14 ;"B" a
retlw .113
retlw .50
retlw .30 ;"A" world
retlw .126
retlw .20
retlw .30 ;"G" of
retlw .142
retlw .50
retlw .30 ;"G" fears
retlw .142
retlw .50
retlw .15 ;"E" There's
retlw .84
retlw .50
retlw .15 ; "F" - so
retlw .80
retlw .50
retlw .30 ;"G" much
retlw .142
retlw .50
retlw .14 ;"C" that
retlw .105
retlw .50
retlw .14 ;"D"- we
retlw .94
retlw .50
retlw .30 ;"E" share
retlw .84
retlw .50
retlw .14 ;"D"- that
retlw .94
retlw .50
retlw .14 ;"C" it's
retlw .105
retlw .50
retlw .15 ;"A" time
retlw .126
retlw .20
retlw .14 ;"D"- we're
retlw .94
retlw .50
retlw .15 ;"E" a
retlw .84
retlw .50
retlw .30 ; "F" - ware
retlw .80
retlw .50
retlw .14 ;"E" It's
retlw .84
retlw .50
retlw .14 ;"D" A
retlw .94
retlw .50
retlw .30 ;"G" small
retlw .142
retlw .50
retlw .14 ; "F" - world
retlw .80
retlw .50
retlw .30 ; "E" - af
retlw .84
retlw .50
retlw .14 ;"D" ter
retlw .94
retlw .50
retlw .60 ;"C" all
retlw .105
retlw .240
retlw .45 ;"C" It's
retlw .105
retlw .50
retlw .14 ;"C" a
retlw .105
retlw .50
retlw .30 ; "E" - small
retlw .84
retlw .50
retlw .30 ;"C" world
retlw .105
retlw .50
retlw .45 ;"D" af
retlw .94
retlw .50
retlw .15 ;"D" ter
retlw .94
retlw .50
retlw .60 ;"D" all
retlw .94
retlw .240
retlw .48 ; "D" -It's
retlw .94
retlw .50
retlw .14 ;"D"- A
retlw .94
retlw .50
retlw .30 ;"F" small
retlw .80
retlw .50
retlw .24 ;"D" word
retlw .94
retlw .50
retlw .48 ;"E" af
retlw .84
retlw .50
retlw .14 ;"E" ter
retlw .84
retlw .20
retlw .48 ; "E" - all
retlw .84
retlw .240
retlw .48 ;"E"- It's
retlw .84
retlw .20
retlw .14 ;"E" A
retlw .84
retlw .20
retlw .50 ;"G+" small
retlw .71
retlw .20
retlw .24 ;"E" world
retlw .84
retlw .20
retlw .48 ;"F" af
retlw .80
retlw .20
retlw .14 ; "F" -ter
retlw .80
retlw .20
retlw .14 ; "F" - all
retlw .80
retlw .240
retlw .30 ;"E" it's
retlw .84
retlw .20
retlw .14 ;"D"- A
retlw .94
retlw .50
retlw .40 ;"G" small
retlw .142
retlw .50
retlw .40 ;"B" small
retlw .113
retlw .50
retlw .55 ;"C" word
retlw .105
retlw .50
retlw 0FFh
M1 call _250mS
call _250mS
Main incf jump,1 ;increment pointer
movf jump,w
call table1
movwf loops ;first value from table
movlw 0ffh
xorwf loops,w ;see if value is "0ffh"
btfsc status,z
goto SetUp
incf jump,1
movf jump,w
call table1
movwf temp1 ;temp for note for HIGH/LOW
eee movlw 10
movwf extend
ttt movf temp1,w
movwf note
bsf gpio,2
bcf gpio,4
goto $+1
goto $+1
goto $+1
decfsz note,1
goto $-4
movf temp1,w
movwf note
bcf gpio,2
bsf gpio,4
goto $+1
goto $+1
goto $+1
decfsz note,1
goto $-4
decfsz extend,1
goto ttt
decfsz loops,f
goto eee
incf jump,1 ;look for gap value
movf jump,w
call table1
movwf gap
bcf gpio,2 ;to produce silence
bcf gpio,4 ;to produce silence
call gap_1 ;mS gap
goto Main
END
This project provides you with the tools to create your own tune or download one of the “old favourites” and annoy everyone in the household with its incessant playing.
Quick Links
Legal Stuff
Social Media