Пример программы для компилятора “Bascom-8051”

'--------------------------------------------------------------

' (c) 1999 By Kulish Mikhail

'--------------------------------------------------------------

' Монитор микросхемы прямого частотного синтеза AD9850

' с последовательной загрузкой данных. Кварц = 64 МГц

' Обеспечивает ввод значения частоты в килигерцах

' с помощью эмулятора терминала с клавиатуры компьютера

'--------------------------------------------------------------

N_inp Alias Scon.0 'бит "Есть ввод" (RI)

'---------------------

Dim Temp As Byte : Dim Rang As Byte 'временные данные

Dim Tmp As Byte 'временные данные

'---------------------

Dim R_bd As Long '32-разр. двоичный код загрузки

'---------------------

Dim R_frq As Single 'регистр значения частоты

Dim R_fld As Single 'регистр* кода загрузки

Dim Templ As Single

'---------------------

'подключение синтезатора AD9850

B_data Alias P3.3 : B_clk Alias P3.2 : B_fqud Alias P3.1 : B_res Alias P3.4

Config Timer0 = Timer , Gate = Internal , Mode = 1 : Start Timer0

'---------------------

' TIMER2 в режиме 16-бит. таймера с внутр. тактир. для синхронизации UART

Config Timer2 = Timer , Gate = Internal , Mode = 2

$baud = 9600 'скорость 9.6 кБ

$crystal = 12000000 'при кварце 12 МГц

'---------------------

'назначение режимов прерываний

On Timer0 Timer_0_int Nosave 'вектор прерывания

Enable Timer0 'разрешить прерывания таймера 0

Enable Interrupts 'вообще разрешить прерывания

Th0 = &HD8 : Tl0 = &HFD 'чтобы прерыв. наступила не позже 10 мс

'------------------------------------------

'очистка памяти

Clr_mem:

$asm

Mov R0 , #&hff ;так оформляется ассемблерная вставка

Clrmem:

Mov @r0 , #0

Djnz R0 , Clrmem

$end Asm

'------------------------------------------

'подготовить линии управления к работе

'можно записывать операторы в одну строку

Reset B_data : Reset B_clk : Reset B_fqud : Reset B_res

'---------------------

'главный цикл

Mc:

Do

Idle 'останов пока не разбудит прерывание

'---------------------

If N_inp = 1 Then 'если что-то принято?

N_inp = 0 'очистим без анализа

Waitms 100 'ждем 100 миллисекунд

Input “Enter f(kHz)=” , R_frq 'ввод частоты

'чтобы получить код загрузки умножим на число:

R_fld = R_frq * 67109 ' 2^32 / Fclk = 4294967296 / 6400 kHz

R_bd = R_fld 'преобр. в целое 32-разр. число

Gosub Sload_9850 'загрузка новых данных

Print “OK” 'подтверждение установки частоты

End If

'---------------------

Loop

'------------------------------------------

'подпрограммы загрузки данных в синтезатор

Sload_9850:

Set B_fqud : Reset B_fqud 'сбросить интерфейс

Set B_clk : Reset B_clk 'защелкнуть код последовательного режима

Set B_fqud : Reset B_fqud 'разрешить последовательный режим

'выдвинуть данные из R_bd в режиме 3 (мл. сначала , _/\_)

Shiftout B_data , B_clk , R_bd , 3

'выдвинуть последний байт с режимом и фазой

Temp = 0 : Shiftout B_data , B_clk , Temp , 3

Set B_fqud : Reset B_fqud 'исполнять загруженные данные

Return

'---------------------------------------------------

'обработка прерывания таймера 0

Timer_0_int:

Th0 = &HD8 : Tl0 = &HFD

Return

'------------------------------------------

Возврат