Исследование организации и работы последовательного периферийного интерфейса SP1
Курсовой проект - Компьютеры, программирование
Другие курсовые по предмету Компьютеры, программирование
?иод с резистором на 470 Ом в корпусе типоразмера 0805.F628A не содержит аппаратного I2C, поэтому он был реализован программно. Программный I2C был написан с нуля, он немного отличается от стандартного протокола, тем, что не ждёт подтверждения от слейва. Программный I2C будет рассмотрен в одной из следующих статей. На основе функций работы с I2C были реализованы следующие функции управления DS1307:
.void ds_write(unsigned char addr,unsigned char data)
.{
.i2c_start();
.i2c_write(0xD0);
.i2c_write(addr);
.i2c_write(data);
.i2c_stop();
.}
.
.unsigned char ds_read(unsigned char addr)
.{
.unsigned temp;
.i2c_start();
.i2c_write(0xD0);
.i2c_write(addr);
.i2c_stop();
.i2c_start();
.i2c_write(0xD1);
.temp=i2c_read(0);
.i2c_stop();
.return temp;
.}
.
.void ds_off()
.{
.ds_write(0x00,ds_read(0x00)|0x80);
.}
.
.void ds_on()
.{
.ds_write(0x00,ds_read(0x00)&~0x80);
.}
.
.void ds_init()
.{
.unsigned char i;
37.// устанавливаем режим 24 часа
.i=ds_read(0x02);
39.if((i&0x40)!=0)
.{
.ds_write(0x02,i&~0x40);
42.}
.// Если часы выключены - то включаем их
44.i=ds_read(0x00);
.if((i&0x80)!=0)
.{
.ds_write(0x00,i&~0x80);
.}
.}
.
.unsigned char IntToBoolInt(unsigned char data)
.{
.data=data0;
.return data/10*16+data;
55.}
ds_write(адрес,байт данных) - отправляет 1 байт данных по указанному адресу DS1307
байт данных ds_read(адрес) - считывает 1 байт данных из указанного адреса DS1307_off() - выключить DS1307_on() - включить DS1307_init() - инициализация DS1307
байт IntToBoolInt(байт) - функция перекодировки числа в двоично-десятичный вид
Во время инициализации проверяются и устанавливаются, если выключены следующие биты: бит отвечающий за 24-х часовой режим работы часов и бит отвечающий за включенное состояние часов. Были реализованы 2 функции для включения и отключения часов. DS1307 может отправлять и принимать как однобайтовые посылки, так и много байтовые, но для упрощения работы с часами функции для чтения и записи только однобайтовые. Для установки часов есть ещё функция для преобразования привычной десятичной формы представления числа в двоично-десятичную, в которой микросхема хранит показатели времени. Приведённых функция для работы с часами вполне достаточно.
В прошивки реализованы функции для считывания и вывода на дисплей времени -time() , даты - date(). В бесконечном цикле через некоторые промежутки времени эти функции вызываются для вывода времени и даты на дисплей. Рассмотрим, как устроена функция для чтения с последующим выводом текущего времени:
.void time()
.{
.unsigned char i;
.SetLCDPosition(1, 0);
.i=ds_read(0x02);
.buffer[0] = i/16+0;
.buffer[1] = i+0;
.buffer[2] = :;
.i=ds_read(0x01);
.buffer[3] = i/16+0;
.buffer[4] = i+0;
.buffer[5] = :;
.i=ds_read(0x00);
.buffer[6] = i/16+0;
.buffer[7] = i+0;
.buffer[8] = \0;
.ShowStr(buffer);
18.}
Происходит установка курсора на дисплее. Считываем значение регистра отвечающего за час и по пол байта, т.к. данные хранятся в двоично-десятичном виде, записываем в буфер. Далее добавляем разделитель в виде двоеточия. Считываем и записываем в буфер таким же образом значения минут и секунд. Выводим содержимое буфера на дисплей. Таким же образом устроена функция вывода текущей даты.
В прошивки есть функция для установки часов и минут - set_time(). Эта функция с помощью одной кнопки устанавливает время. Как это делается: нажимаем на кнопку - на дисплее высвечивается надпись Set hour : и количество часов, увеличиваем час по средством коротких нажатий на кнопку; установив час длительным нажатием переходим на установку минут, о чём свидетельствует надпись Set min :, таким же образом устанавливаем минуты, а длительным нажатием возвращаемся в бесконечный цикл к часам. Но т.к. эта функция большая приведём из неё только одну строчку, которая записывает в DS1307 значение минут:
.ds_write(0x02,IntToBoolInt(time));
Записываем в регистр, который соответствует минутам желаемое значение, предварительно приведённое к двоично-десятичному виду.
Назначение учебного стенда СУ-МК НТЦ-31.100
Учебный стенд СУ-МК НТЦ-31.100 (далее по тексту Стенд) предназначен для изучения устройства микроконтроллеров семейства AVR, современных компонент, входящих в состав типичных устройств, базирующихся на применении микропроцессорной техники, исследования законченных устройств на базе микропроцессоров, решения специфичных задач по управлению различными объектами, сбору, хранению и обработке информации.
Технические характеристики
Габаритные размеры 200 х 200 х 100 мм 2.2 Масса 0,5 кг 2.3 Напряжение питания 5 В 2.4 Потребляемый ток 0,45 А 2.5 Стенд построен на базе микроконтроллера ATMega128 2.6 Разрядность микроконтроллера 8 бит 2.7 Связь с компьютером по интерфейсам USB, RS-232
Органы управления стенда
Внешний вид передней панели стенда приведен на рисунке 10.
Рисунок 10 - Внешний вид передней панели учебного стенда СУ-МК НТЦ-31.100
На передней панели установлены следующие органы управления: 1 2 3 4 5 6 7 8
дискретный светодиодный индикатор (набор из 10 светодиодов ДСИ1 … ДСИ10) (1);
восьмисимвольный семисегментный светодиодный индикатор ССИ (2);
матричный жи?/p>