Что такое однокристальный микрокомпьютер? Пришло время играть!

задняя часть
Что такое однокристальный микрокомпьютер? Пришло время играть!

«Это 9-й день моего участия в ноябрьском испытании обновлений, ознакомьтесь с подробностями события:Вызов последнего обновления 2021 г."

Что такое однокристальный микрокомпьютер? Пришло время играть!

Сердце микроконтроллера — часы.

image-20210930092936969

Выполните первое задание, данное учителем:

Первый свет: вкл на 1 с, выкл на 1 с, вкл на 1 с, выкл на 1 с, цикл. Второй свет: вкл на 2 с, выкл на 2 с, вкл на 2 с, выкл на 2 с, петля. Третий индикатор: горит 4 с, гаснет 4 с, горит 4 с, гаснет 4 с, петля. Таким образом, самый тупой способ — управлять каждым светодиодом пошагово с задержкой в ​​1 секунду.

Вы сильный человек, сильный человек в своей области, поэтому, используя самый эффективный метод, в чем разница между вышеуказанным методом и методом насильственного решения? Как только тема изменится, она снова будет отодвинута, так что это всегда практика студентов колледжей, здесь нет двух пунктов (я говорю о студентах колледжей, у которых нет занятия)

Измените задачу на следующую:

Первый свет: горит на 2 мс, , гаснет на 2 мс, , горит на 2 мс, , выключается на 2 мс, цикл . Второй свет: горит на 7 мс, , не горит на 7 мс, , горит на 7 мс, , не горит на 7 мс, цикл . Третий индикатор: горит 97 мс, не горит 97 мс, горит 97 мс, не горит 97 мс, цикл. Как написать такую ​​задачу без таймера?

В аппарате нет трех огней, только два, извините

image-20210930151534888

image-20210930154707010

Сбор занимает много времениНо в этот промежуток времени невооруженным глазом мелькание не видно, оно всегда яркое


Но вы можете почувствовать, как он вспыхивает сквозь ореол

STC15_LED.c

#include <STC15.h>
#include "all.h"
sbit LED1 = P3^2;
sbit LED2 = P3^3;

void main()
{
	static u16 count = 0;//静态计数器
	P3M1 = 0;
	P3M0 = 0;//设置IO口模式标准IO口
	while(1)
     {
		count++;
		if(count % 110 == 0)//亮2ms灭2ms
		{
			LED1 =~ LED1; 
		}
		if(count % 375 == 0)//亮7ms灭7ms
		{
			LED2 =~ LED2; 
			count = count%8250;//把范围卡死在0-8250
		}
	}
}

all.h

#include<STC15.h>

typedef unsigned char     u8;
typedef unsigned short    u16;
typedef unsigned long     u32;

традиционное случайное программирование

1. Весь код пишется в одном файле. 2. Каждое движение - задержка, пока смерть и т.д. 3. Чередуйте вызовы между функциями. 4. Тратить ресурсы прерываний, чтобы компенсировать вышеуказанные проблемы! 5. Крайне низкая эффективность выполнения программы. 6. Портативность программы очень низкая, а читабельность кода крайне плохая!

Не смотри на сильных, оглянись, правил нет, просто вздохни от умиления

Традиционное модульное программирование:

1. Запишите код в отдельный файл для каждого схемного модуля и при необходимости включите его. 2. Используйте время таймера для распределения времени задачи. 3. Функции между файлами могут вызывать друг друга. 4. Данные между модулями вызывают друг друга. 5. Жесткой спецификации требований к написанию кода нет, читабельность невысокая. 6. Высокая эффективность программы и высокая переносимость программы. недостаток:Управление какое-то сумбурное

В стране сильных не так уж плохо, чтобы обычные студенты приезжали сюда, хотя бы задумайтесь об этом, самое смешное, что я когда-либо видел, это то, что некоторые преподаватели всегда программируют без правил.

Фреймворковое программирование

1. Пишите коды в отдельные файлы для каждого схемного модуля, и все включают друг друга. 2. Таймер или ЦП для распределения времени задачи. 3. Функции нельзя вызывать между файлами иерархически и на одном уровне. 4. Основной файл отвечает за взаимодействие кэшированных данных каждого подфайла. 5. Стандартизируйте требования к написанию кода в одном формате. Легко читать! 6. Эффективность программы очень высока, поэтому вся плата разработки может работать согласованно! 7. Часть оборудования работает неправильно и не может влиять на другое оборудование. 8. Функциями и данными можно управлять отдельно без ограничений по времени.

Я еще не достиг этой стадии. Эта стадия - вопрос опыта и исследования. В основном это оружие людей, которые работали несколько лет. Мне здесь не место, но это не значит, что я не тоскую для этого.

image-20210930203255413

распределение данных

image-20210930203728019

Функция «сторожевой таймер» микроконтроллера

В проекте MCU, чтобы программа MCU не убежала, а также чтобы мы не писали "мертвые" неэффективные коды, мы можем вовремя обнаружить проблемы с помощью сброса сторожевого таймера.

Вероятность встретить убегающую одночиповую программу ниже, чем вероятность купить лотерейных билетов на 5 млн. Невозможно провести экспериментальное моделирование, а истекает время только программного моделирования.

Конфигурация сторожевого регистра (STC-ISP также может быть изменена)

1. Рассчитайте время синхронизации сторожевого устройства и определите значение коэффициента частотного деления.

2. Регистр конфигурации программного или аппаратного обеспечения, время запуска сторожевого таймера

3. Прежде чем таймер переполнится, очистите счетчик сторожевого таймера (накормите собаку).

4. Загрузите программу в микроконтроллер и снова выполните сброс макетной платы.

5. Смоделируйте ситуацию, когда вы не можете вовремя «покормить собаку».

обращать внимание: Если программное обеспечение устанавливает коэффициент деления частоты, аппаратная настройка интернет-провайдера недействительна.

image-20211002144916853

image-20211002144938063


На самом деле мерцание очень быстрое.Может быть я выронил кадр,когда делал гифку.Пример переполнения сторожевого таймера я покажу сразу.

image-20211002152726883

Образец переполнения также перезапускается как сумасшедший


//看门狗
void WDT_CONTR_Allot()
{
	static xdata u16 count = 0;
	count++;
	if(count>1000)
	{		
		LED2 = ~LED2;
		count = 0;//超过1000计数器清零
		WDT_CONTR=0x34;	//启动看门狗和喂狗
	}
}
image-20211002161108722

Функция пробуждения по таймеру выключения однокристального микрокомпьютера

Специальный таймер пробуждения при отключении питания для микроконтроллера: WKTCH, WKTCL

1. Специальный 15-битный таймер для пробуждения после выключения регулирования мощности: WKTCH (семь старших бит), WKTCL (младшие восемь бит)

2.ПервыйДля настройки этого регистра нужно вычесть 1, и максимальное значение 32768-1

3. Старший бит этого регистра равен 1, таймер пробуждения при отключении питания позволяет

4. Время отключения питания

image-20211001130748397

5.ЗаднийУстановите первый бит PD регистра PCON в 1, микроконтроллер переходит в режим пониженного энергопотребления.

6. Войдите в режим отключения питания, сразу же запустится таймер пробуждения.

7. После пробуждения микроконтроллер выполняет следующую инструкцию в момент отключения питания

image-20211002164610281

image-20211002165809801

image-20211002203529919

image-20211002205200456

void main()
{
	u16 count = 0;
	SN74LS244_IO_Mode();
	P3M1 = 0;
	P3M0 = 0;
	count = 500;
	while(count--)
	{
		LED2 = ~LED2;
	}		
	WKTCH = 0xc4;//掉电唤醒定时器高字节
	WKTCL = 0x72;//掉电唤醒定时器低字节
	PCON |= 0x02;
	count = 500;
	while(count--)
	{
		LED2 = ~LED2;
	}
	while(1)
    {
		SMG_Allot();
		WDT_CONTR_Allot();
	}
}