
- •А.В. Шарапов
- •1. Основные этапы выполнения курсового проекта по проектированию микропроцессорных систем
- •1.1 Конкретизация технического задания
- •1.2. Разработка функциональной схемы устройства,
- •1.3. Разработка схемы алгоритма прикладной программы
- •1.4. Разработка принципиальной электрической схемы
- •1.5. Разработка прикладной программы
- •1.6. Оформление и защита проекта
- •2. Варианты заданий на курсовое проектирование
- •3. Средства разработки программы на языке си, компиляторы и симуляторы
- •4. Язык си для микроконтроллеров
- •Структура программы на языке Си
- •Пункт 4. Объявление переменных
- •5. Загрузка программы в микроконтроллер
- •6. Моделирование работы микроконтроллера avrс помощью симулятораvmlab
- •Программа работы
- •Xdisp lcd(16 2 250k) pa0 pa1 pa2 pa7 pa6 pa5 pa4 nc3 nc2 nc1 nc0
- •Void main(void){
- •If(pind.6){
- •Контрольные вопросы
- •8. Пример выполнения курсового проекта измеритель частоты сети
- •Обоснование алгоритма решения задачи
- •Разработка прикладной программы
- •Version : от 17 до 120 Гц
- •0X41,0xA0,0x42,0xA1,0xE0,0x45,0xA3,0xA4,
- •Моделирование работы устройства с помощью proteus
- •Приложение а
- •2009 Приложение б
- •Приложение в
- •Приложение г
- •Приложение д
- •Приложение ж
- •Приложение и
- •Приложение к
- •Литература
Структура программы на языке Си
Программа на Си имеет определенную структуру:
1) заголовок;
2) включение необходимых внешних файлов;
3) ваши определения для удобства работы;
4) объявление глобальных переменных (глобальные переменные объявляются вне какой-либо функции, т.е. не после фигурной скобки {, доступны в любом месте программы, значит можно читать их значения и присваивать им значения там, где требуется);
5) описание функций-обработчиков прерываний;
6) описание других функций, используемых в программе;
7) функция main (это единственный обязательный пункт).
Функция имеет { "тело" } в фигурных скобках. Тело – это код на Си, определяющий то, что делает функция. Знак ; после функции не ставится.
Программа на Си начинает работу с функции main(), по необходимости из main() вызываются другие функции программы, по завершении работы функции программа возвращается в main() в то место, откуда функция была вызвана.
main(){ ... какой то код программы ...
вызов функции_1; //программа перейдет в функцию_1
строка программы; // будет выполняться после возврата ... какой то код программы ...
}
Функции могут вызываться не только из main(), но и из других функций. Кроме того, описанный выше ход программы может нарушаться прерываниями.
Приведем пример программы на Си с описанной выше структурой (текст в рамке). По мере надобности программа будет разрываться обычным текстом, а затем продолжаться.
|
|
|
|
/* Пункт 1. Заголовок программы Он оформляется как комментарий, и обычно содержит информацию: - о названии, назначении, версии и авторе программы; - краткое описание алгоритма программы; - пояснения о назначении выводов МК; - другие сведения, которые вы считает полезным указать. */ // комментарий после двух косых черт пишут в одну строку!
// Пункт 2. Включение внешних файлов #include <mega16.h> /* перед компиляцией препроцессор компилятора вставит вместо этой строчки содержимое (текст) заголовочного файла mega16.h - этот файл содержит перечень регистров, имеющихся в МК ATmega16, и соответствие их названий их физическим адресам в МК. Посмотрите его содержание, вызвав CVAVR\inc\mega16.h */ //delay functions #include <delay.h> /* перед компиляцией препроцессор компилятора вставит вместо этой строчки текст "хидера" delay.h - этот файл содержит функции для создания пауз в программе. Теперь, чтобы сделать паузу вам нужно лишь написать: delay_us(N); // сделать паузу N (число) мкс delay_ms(x); // сделать паузу x мс x - может быть переменная или число от 0 до 65535 (тип unsigned int), например, delay_ms(peremennaya)*/
// Пункт 3. Определения пользователя // AD7896 control signals PORTB bit allocation #define ADC_BUSY PINB.0 #define NCONVST PORTB.1 /* после этих двух строк, перед компиляцией, препроцессор компилятора заменит в тексте программы ADC_BUSY на PINB.0 и NCONVST на PORTB.1. Таким образом, вместо того, чтобы помнить, что вывод занятости AD7896 подключен к ножке PB0, вы можете проверять значение осмысленного понятия ADC_BUSY - "АЦП занят", а вместо управления абстрактной ножкой PB1 (через PORTB.1) можете управлять "НьюКонвекшнСтат" - NCONVST - "стартовать новое АЦ преобразование" #define – Это удобно, но вовсе не обязательно. */ |
|
|
|
|