Turbo51 Code Examples
Examine 8051 projects and learn the tricks
Here are some test projects suitable for any 8051 microcontroller to show how to use Turbo51. They can also be used to quickly see the generated code. The assembler files can also serve as 8051 code examples.
Example 1
This is a '8051 hello world' example.
Example2
This is a simple example. It shows basic features of Turbo51.
Example 3
This example is part of some real 8051 project. It shows how to use Turbo51 and its features.
Example 4
This example demonstrates sets and inline procedures/functions.
Example 5
Display controller - another real 8051 project.
Example 6
Keyboard/RS232 interface controller - simple 8051 project.
Example 7
Communication controller - complex 8051 project using interrupts, RS485 serial communication, DAC conversions, I2C, EEPROM, etc.
8051 calculator example in Turbo51
This is an example of a simple 8051 calculator - it should work on any 8051 microcontroller, just adjust oscillator frequency and baud rate formula. Below you can see compiled code. This is a simple 8051 code example - to show how simple can be programming with Turbo51.
Program Calculator;
Const
Osc = 22118400;
BaudRateTimerValue = Byte (- Osc div 12 div 32 div 19200);
Var SerialPort: Text;
Num1, Num2: LongInt;
Procedure WriteToSerialPort; Assembler;
Asm
CLR TI
MOV SBUF, A
@WaitLoop:
JNB TI, @WaitLoop
end;
Function ReadFromSerialPort: Char;
Var ByteResult: Byte absolute Result;
begin
While not RI do;
RI := False;
ByteResult := SBUF;
{ Echo character }
Asm
MOV A, Result
LCALL WriteToSerialPort
end;
end;
Procedure Init;
begin
TL1 := BaudRateTimerValue;
TH1 := BaudRateTimerValue;
TMOD := %00100001; { Timer1: no GATE, 8 bit timer, autoreload }
SCON := %01010000; { Serial Mode 1, Enable Reception }
TI := True; { Indicate TX ready }
TR1 := True; { Enable timer 1 }
end;
{$DefaultFile On }
begin
Init;
Assign (CurrentIO, ReadFromSerialPort, WriteToSerialPort);
Writeln ('Turbo51 IO file demo - integer calculator');
Repeat
Write ('Enter first number: ');
Readln (Num1);
Write ('Enter second number: ');
Readln (Num2);
Writeln (Num1, ' + ', Num2, ' = ', Num1 + Num2);
Writeln (Num1, ' - ', Num2, ' = ', Num1 - Num2);
Writeln (Num1, ' * ', Num2, ' = ', Num1 * Num2);
until False;
end.
Compiled code looks like this:
; Turbo51 version 0.1.3.10, Copyright 2000 - 2011 Igor Funa
$REGISTERBANK (0)
_CODE SEGMENT CODE
_CONST SEGMENT CODE
_DATA SEGMENT DATA
EXTRN DATA (CurrentIO)
EXTRN IDATA (StackStart)
EXTRN CODE (sysWriteStr_CODE)
EXTRN CODE (sysWriteLine)
EXTRN CODE (sysReadLongInt)
EXTRN CODE (sysStore_Long0_To_IDATA)
EXTRN CODE (sysReadLine)
EXTRN CODE (sysLoad_Long0_From_IDATA)
EXTRN CODE (sysPushLongIntBCD)
EXTRN CODE (sysWriteDecimalPushedBytes)
EXTRN CODE (sysLoad_Long1_From_IDATA)
EXTRN CODE (sysLongAddition)
EXTRN CODE (sysLongSubtraction)
EXTRN CODE (sysLongMultiplication)
; Program Calculator;
;
; Const
RSEG _CONST
; Osc = 22118400;
; BaudRateTimerValue = Byte (- Osc div 12 div 32 div 19200);
;
; Var SerialPort: Text;
; Num1, Num2: LongInt;
RSEG _DATA
Num1: DS 4
Num2: DS 4
;
; Procedure WriteToSerialPort; Assembler;
RSEG _CODE
USING 0
WriteToSerialPort:
; Asm
; CLR TI
CLR SCON.1
; MOV SBUF, A
MOV SBUF, A
; @WaitLoop:
L_0111:
; JNB TI, @WaitLoop
JNB SCON.1, L_0111
; end;
RET
;
; Function ReadFromSerialPort: Char;
RSEG _DATA
ReadFromSerialPort_Result: DS 1
; Var ByteResult: Byte absolute Result;
ByteResult EQU ReadFromSerialPort_Result
RSEG _CODE
ReadFromSerialPort:
; begin
; While not RI do;
L_0115:
JNB SCON.0, L_0115
; RI := False;
CLR SCON.0
; ByteResult := SBUF;
MOV ReadFromSerialPort_Result, SBUF
;
; { Echo character }
;
; Asm
; MOV A, Result
MOV A, ReadFromSerialPort_Result
; LCALL WriteToSerialPort
LCALL WriteToSerialPort
; end;
; end;
MOV A, ReadFromSerialPort_Result
RET
;
;
; Procedure Init;
Init:
; begin
; TL1 := BaudRateTimerValue;
MOV TL1, #$FD
; TH1 := BaudRateTimerValue;
MOV TH1, #$FD
; TMOD := %00100001; { Timer1: no GATE, 8 bit timer, autoreload }
MOV TMOD, #$21
; SCON := %01010000; { Serial Mode 1, Enable Reception }
MOV SCON, #$50
; TI := True; { Indicate TX ready }
SETB SCON.1
; TR1 := True; { Enable timer 1 }
SETB TCON.6
; end;
RET
RSEG _CONST
C_0435: DB 41, 'Turbo51 IO file demo - integer calculator'
C_045F: DB 20, 'Enter first number: '
C_0474: DB 21, 'Enter second number: '
C_048A: DB 3, ' + '
C_048E: DB 3, ' = '
C_0492: DB 3, ' - '
C_0496: DB 3, ' * '
CSEG AT $0000
Calculator:
;
; {$DefaultFile On }
;
; begin
MOV SP, #StackStart-1
; Init;
LCALL Init
; Assign (CurrentIO, ReadFromSerialPort, WriteToSerialPort);
MOV CurrentIO, #LOW (WriteToSerialPort)
MOV CurrentIO+1, #HIGH (WriteToSerialPort)
MOV CurrentIO+2, #LOW (ReadFromSerialPort)
MOV CurrentIO+3, #HIGH (ReadFromSerialPort)
;
; Writeln ('Turbo51 IO file demo - integer calculator');
MOV DPTR, #C_0435
MOV R6, #0
LCALL sysWriteStr_CODE
LCALL sysWriteLine
; Repeat
L_001D:
; Write ('Enter first number: ');
MOV DPTR, #C_045F
MOV R6, #0
LCALL sysWriteStr_CODE
; Readln (Num1);
LCALL sysReadLongInt
MOV R0, #Num1
LCALL sysStore_Long0_To_IDATA
LCALL sysReadLine
; Write ('Enter second number: ');
MOV DPTR, #C_0474
MOV R6, #0
LCALL sysWriteStr_CODE
; Readln (Num2);
LCALL sysReadLongInt
MOV R0, #Num2
LCALL sysStore_Long0_To_IDATA
LCALL sysReadLine
; Writeln (Num1, ' + ', Num2, ' = ', Num1 + Num2);
MOV R0, #Num1
LCALL sysLoad_Long0_From_IDATA
LCALL sysPushLongIntBCD
MOV R6, #0
LCALL sysWriteDecimalPushedBytes
MOV DPTR, #C_048A
MOV R6, #0
LCALL sysWriteStr_CODE
MOV R0, #Num2
LCALL sysLoad_Long0_From_IDATA
LCALL sysPushLongIntBCD
MOV R6, #0
LCALL sysWriteDecimalPushedBytes
MOV DPTR, #C_048E
MOV R6, #0
LCALL sysWriteStr_CODE
MOV R0, #Num1
LCALL sysLoad_Long0_From_IDATA
MOV R0, #Num2
LCALL sysLoad_Long1_From_IDATA
LCALL sysLongAddition
LCALL sysPushLongIntBCD
MOV R6, #0
LCALL sysWriteDecimalPushedBytes
LCALL sysWriteLine
; Writeln (Num1, ' - ', Num2, ' = ', Num1 - Num2);
MOV R0, #Num1
LCALL sysLoad_Long0_From_IDATA
LCALL sysPushLongIntBCD
MOV R6, #0
LCALL sysWriteDecimalPushedBytes
MOV DPTR, #C_0492
MOV R6, #0
LCALL sysWriteStr_CODE
MOV R0, #Num2
LCALL sysLoad_Long0_From_IDATA
LCALL sysPushLongIntBCD
MOV R6, #0
LCALL sysWriteDecimalPushedBytes
MOV DPTR, #C_048E
MOV R6, #0
LCALL sysWriteStr_CODE
MOV R0, #Num1
LCALL sysLoad_Long0_From_IDATA
MOV R0, #Num2
LCALL sysLoad_Long1_From_IDATA
CLR C
LCALL sysLongSubtraction
LCALL sysPushLongIntBCD
MOV R6, #0
LCALL sysWriteDecimalPushedBytes
LCALL sysWriteLine
; Writeln (Num1, ' * ', Num2, ' = ', Num1 * Num2);
MOV R0, #Num1
LCALL sysLoad_Long0_From_IDATA
LCALL sysPushLongIntBCD
MOV R6, #0
LCALL sysWriteDecimalPushedBytes
MOV DPTR, #C_0496
MOV R6, #0
LCALL sysWriteStr_CODE
MOV R0, #Num2
LCALL sysLoad_Long0_From_IDATA
LCALL sysPushLongIntBCD
MOV R6, #0
LCALL sysWriteDecimalPushedBytes
MOV DPTR, #C_048E
MOV R6, #0
LCALL sysWriteStr_CODE
MOV R0, #Num1
LCALL sysLoad_Long0_From_IDATA
MOV R0, #Num2
LCALL sysLoad_Long1_From_IDATA
LCALL sysLongMultiplication
LCALL sysPushLongIntBCD
MOV R6, #0
LCALL sysWriteDecimalPushedBytes
LCALL sysWriteLine
; until False;
LJMP L_001D
; end.
END
