Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
dz.docx
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
142.35 Кб
Скачать

1. Основная программа.

2. Подпрограмма обработки прерывания.

H. Расчет времени задержек.

  1. Формирование задержки на 5,6 сек с помощью таймера tmr1.

Счетчик таймера TMR1 16-разрядный, следовательно, максимальное время его срабатывания при тактовой частоте 4 МГц составляет 65 536 мксек, но в составе таймера TMR1 имеется предделитель с максимальным коэффициентом деления 1:8, поэтому время срабатывания таймера можно довести до 65536 х 8 = 524 288 мксек. Однако этого недостаточно для получения требуемой задержки и потребуется :

5600000 : 524288 = 10,68 циклов.

Принимаем 11 циклов. Тогда максимальная задержка составит:

524288 х 11 = 5767168 мксек и для получения требуемой задержки надо компенсировать 167168 мксек. Предделитель позволит уменьшить число до:

167168 : 8 = 20896 мксек. Поэтом в счетчик таймера перед его пуском необходимо записать число: 65536 – 20896 = 44640, или в шестнадцатиричной форме AE60. Окончательно получим: для получения задержки в 5,6 сек необходимо включить предделитель на максимальный коэффициент деления 1:8, в каждом цикле в счетчик таймера записывать число AE60 и отработать 11 циклов таймера.

  1. Формирование задержки на 3,9 сек с помощью таймера tmr1.

Счетчик таймера TMR1 16-разрядный, следовательно, максимальное время его срабатывания при тактовой частоте 4 МГц составляет 65 536 мксек, но в составе таймера TMR1 имеется предделитель с максимальным коэффициентом деления 1:8, поэтому время срабатывания таймера можно довести до 65536 х 8 = 524 288 мксек. Однако этого недостаточно для получения требуемой задержки и потребуется :

3900000 : 524288 = 7,44 циклов.

Принимаем 8 циклов. Тогда максимальная задержка составит:

524288 х 8 = 4194304 мксек и для получения требуемой задержки надо компенсировать 294304 мксек. Предделитель позволит уменьшить число до:

294304 : 8 = 36788 мксек. Поэтом в счетчик таймера перед его пуском необходимо записать число: 65536 – 36788 = 28748, или в шестнадцатиричной форме 704C.

Окончательно получим: для получения задержки в 3,9 сек необходимо включить предделитель на максимальный коэффициент деления 1:8, в каждом цикле в счетчик таймера записывать число 704C и отработать 8 циклов таймера.

  1. Текст программы.

1:

2: //

3: #define XTAL_FREQ 4MHZ

4: #define byte unsigned char

5: #define word unsigned int

6: #include <pic.h>

7: #include <stdio.h>

8: __CONFIG(HS & WDTDIS & PWRTEN & LVPDIS & DUNPROTECT & PWRTEN);

9: char schet; //число циклов переполнения таймеров TMR0, TMR1, TMR2

10: char perep1; //программный счетчик первого уровня

11: char perep2; //программный счетчик второго уровня

12: char perep3; //программный счетчик третьего уровня

13: interrupt isr (void); //подключение подпрограммы обслуживания прерывания.

14: main(){

15:

16: ANSEL= 0x00; //включение PORTA в цифровой режим

17: TRISA= 0xFD; //настройка PORTA (RA1 на вывод, остальные разряды - на ввод

18: ANSELH=0x00; //включение PORTB в цифровой режим

19: TRISB =0xFF; //настройка PORTB на ввод

20: TRISC =0x00; //настройка PORTC на вывод

21: TRISD =0x00; // настройка PORTD на ввод

22: OPTION = 0x07; //подключение подтягивающих резисторов

23: // предделитель включен перед таймером TMR0, коэфф. деления 1:256

24: PORTC=0x00; // сброс выходного порта С

25: INTE = 1 ; // разрешение прерывания от внешнего источника

26: GIE = 1; //глобальное разрешение прерывания.

27: for (;;){ //бесконечный цикл

28: for (;!RD0;){ }

29: RA3 = RD0&&!RD1; //включение индикатора начала работы программы.

30: for (!RC4){

31: RС4 = RD0&&RB2&&!RB5; //включение гидростанции Кг

32: }

33: RC2 = 1; //включение индикации задержки на 8 сек с помощью TMR0

34: for(schet=0;schet<0x7B;schet++){ // 7B – число циклов срабатывания таймера

35: T0IF=0; //сброс флага таймера TMR0

36: TMR0=0x12; //пуск таймера TMR0

37: for(;!TOIF;){} //ожидание срабатывания таймера TMR0

38: }

39: RC2=0; //отключение индикации задержки

40: for(!RC5;) {

41: RC5 = (RB3&&RB1&&RC4&&!RB5) || (RB3&&RC4&&!RB5); //включение электрогидроклапана

42:

43: }

44: RC0 =0; // предварительное отключение Кп и Кр

45: RC1=0;

46: for(;!RC0;){

47: RC0=(RD0&&!RD1&&RD4&&RC5&&RC4&&!RC1&&!RB4) || (RD0&&!RD6&&!RD3&&RC5&&RC4&&!RC1&&!RB4) || (RD0&&!RD1&&RD6&&RD7&&RC5&&RC4&&!RC1&&!RB4);

48: } // булево уравнение для Кп (RC0)

49: RC2=1; // включение индикации задержки на 5,6 сек с помощью таймера TMR1

50: T1CON = 0x30; //включен предделитель 1:8, тактовый сигнал – внутренний, Fosc /4

51:

52: for(schet=0;schet<0x11;schet++){ // 11– число циклов срабатывания таймера

53:

54: TMR1IF = 0; // сброс флага таймера

55: TMR1H = 0xAE; // установка старшего байта счетчика таймера

56: TMR1L = 0x60; //установка младшего байта счетчика таймера

57: TMR1ON = 1; //пуск таймера TMR1

58:

59: for(;!TMR1IF;){} //ожидание срабатывания таймера TMR1

60: }

61: RC2 = 0; //отключение индикации задержки

62:

63: RC0 = 0; // отключение Кп

64: RC2 = 0; //отключение индикации задержки

65:

66: for(;!RC1;){

67: RC1=(RD0&&!RD7&&RC4&&RC0&&RC5&&!RB4) || (RD0&&!RD7&&RD2&&!RD5&&RC4&&RC0&&RC5&&!RB4) || (RD0&&!RB1&&RC4&&RC0&&RC5&&!RB4);

68: } // условие включения Кр

69: RC2 =1; // включение индикации задержки на 3,9 сек с помощью таймера TMR1

70: T1CON = 0x30; //включен предделитель 1:8, тактовый сигнал – внутренний, Fosc /4

71:

72: for (schet = 0x00; schet < 0x08; shet ++ ) { // 08– число циклов срабатывания таймера

73:

74: TMR1IF = 0; // сброс флага таймера

75: TMR1H = 0x70; // установка старшего байта счетчика таймера

76: TMR1L = 0x4C; //установка младшего байта счетчика таймера

77: TMR1ON = 1; //пуск таймера TMR1

78: for(;!TMR1IF;){} //ожидание срабатывания таймера TMR1

79: }

80:

81: RC1=0; //отключение Кр

82: PORTC = 0x00; // отключение всех устройств и индикаторов.

83:

84: } //конец цикла

85: } // конец main

86:

87:

88: interrupt isr (void)

89: {

90: if(INTF)

91: {PORTC = 0x00;

92: RC2 = 1;

93: INTF = 0;

94: for (perep3 = 0x00; perep3 <0x68; perep3 ++ {

95: for (perep2 = 0x00; perep2 <0xFF; perep2 ++ {

96: for (perep1 = 0x00; perep1 <0xFF; perep1 ++ { }

97: }

98: }

99: RC2 = 0;

100: RA1=0;

101: GIE = 1;

102: } // выход из прерывания.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]