本帖最后由 CListery 于 2024-7-1 15:23 编辑
第十六集:
1. 定时器的使用场景和使用方式
2. 学习定时器\计数器 T0 的使用
3. 89C52 系列通过 T2 定时器实现刷新数码管
- #include <reg52.h>
-
- typedef unsigned char BYTE;
- typedef unsigned int WORD;
- typedef unsigned long DWORD;
-
- void delay_ms(BYTE ms)
- {
- BYTE i;
- while(ms--)
- {
- for(i=0;i<120;i++);
- }
- }
-
- void delay_sec(WORD sec)
- {
- WORD i;
- while(sec--)
- {
- i = 0;
- while(++i);
- }
- }
-
- #define SHARE P2
-
- #define CONTROL P0
-
- sbit ADD_TIGGER = P3^0;
- sbit SUB_TIGGER = P3^1;
- sbit ZERO_TIGGER = P3^2;
-
- BYTE NUM_MAP[10] = {
- 0x3F, // 0
- 0x6, // 1
- 0x5B, // 2
- 0x4F, // 3
- 0x66, // 4
- 0x6D, // 5
- 0x7D, // 6
- 0x7, // 7
- 0x7F, // 8
- 0x6F, // 9
- };
-
- BYTE UNIT_MAP[8] = {
- 0x7F,
- 0xBF,
- 0xDF,
- 0xEF,
- 0xF7,
- 0xFB,
- 0xFD,
- 0xFE,
- };
-
- void shadowDelay()
- {
- delay_ms(1);// 产生残影
- }
-
- sfr IPH = 0xB7;
- sfr AUXR = 0x8E;
-
- long PASS_COUNT = 0;
- void main()
- {
- AUXR |= 0x80; //定时器时钟1T模式
- TMOD &= 0xF0; //设置定时器模式
- TL0 = 0xCD; //设置定时初始值
- TH0 = 0xD4; //设置定时初始值
- TF0 = 0; //清除TF0标志
- TR0 = 1; //定时器0开始计时
-
- EA = 1; // 中断总开关
- ET0 = 1; // T0 中断开关
-
- while(1)
- {
- if(ADD_TIGGER == 0)
- {
- delay_ms(10);
- if(ADD_TIGGER == 0)
- {
- PASS_COUNT++;
- delay_ms(50);
- }
- }
- else if(SUB_TIGGER == 0)
- {
- delay_ms(10);
- if(SUB_TIGGER == 0)
- {
- PASS_COUNT--;
- delay_ms(50);
- }
- }
- else if(ZERO_TIGGER == 0)
- {
- delay_ms(10);
- while(ZERO_TIGGER == 0)
- PASS_COUNT = 0;
- }
- }
- }
-
- void Timer0_Isr(void) interrupt 1
- {
- long TMP = 0;
- long complement = 0;
-
- if(PASS_COUNT >= 99999999)
- PASS_COUNT = 99999999;
-
- if(PASS_COUNT < -9999999)
- PASS_COUNT = -9999999;
-
- if(PASS_COUNT < 0)
- {
- // complement = ~PASS_COUNT + 1;
- // TMP = (unsigned long)complement;
- TMP = -PASS_COUNT;
-
- SHARE = UNIT_MAP[7];
- CONTROL = 0x40;
- shadowDelay();
- }
- else
- {
- TMP = PASS_COUNT;
- }
-
- if(TMP >= 0)
- {
- BYTE gw = TMP % 10; // 个位数
- SHARE = UNIT_MAP[0];
- CONTROL = NUM_MAP[gw];
- shadowDelay();
- }
- if(TMP > 9)
- {
- BYTE sw = TMP / 10 % 10; // 十位数
- SHARE = UNIT_MAP[1];
- CONTROL = NUM_MAP[sw];
- shadowDelay();
- }
- if(TMP > 99)
- {
- BYTE bw = TMP / 100 % 10; // 百位数
- SHARE = UNIT_MAP[2];
- CONTROL = NUM_MAP[bw];
- shadowDelay();
- }
- if(TMP > 999)
- {
- BYTE qw = TMP / 1000 % 10;
- SHARE = UNIT_MAP[3];
- CONTROL = NUM_MAP[qw];
- shadowDelay();
- }
- if(TMP > 9999)
- {
- BYTE ww = TMP / 10000 % 10;
- SHARE = UNIT_MAP[4];
- CONTROL = NUM_MAP[ww];
- shadowDelay();
- }
- if(TMP > 99999)
- {
- BYTE sww = TMP / 100000 % 10;
- SHARE = UNIT_MAP[5];
- CONTROL = NUM_MAP[sww];
- shadowDelay();
- }
- if(TMP > 999999)
- {
- BYTE bww = TMP / 1000000 % 10;
- SHARE = UNIT_MAP[6];
- CONTROL = NUM_MAP[bww];
- shadowDelay();
- }
- if(TMP > 9999999)
- {
- BYTE qww = TMP / 10000000 % 10;
- SHARE = UNIT_MAP[7];
- CONTROL = NUM_MAP[qww];
- shadowDelay();
- }
- }
-
复制代码
4. 更新开发板配套代码
- #include <STC32G.H>
- #include <STC32_STC8_USB.H>
- #include "delay_24mhz.h"
-
- char *USER_DEVICEDESC = NULL;
- char *USER_PRODUCTDESC = NULL;
-
- char *USER_STCISPCMD = "@STCISP#";
-
- #define ADD_TIGGER P34
- #define SUB_TIGGER P35
- #define ZERO_TIGGER P32
-
- long PASS_COUNT = 0;
-
- #define SHARE P7
- #define CONTROL P6
-
- BYTE NUM_DATA[11] = {
- 0xFF, //
- 0xC0, // 0
- 0xF9, // 1
- 0xA4, // 2
- 0xB0, // 3
- 0x99, // 4
- 0x92, // 5
- 0x82, // 6
- 0xF8, // 7
- 0x80, // 8
- 0x90 // 9
- };
-
- BYTE UNIT_MAP[8] = {
- 0xFE, //
- 0xFD, //
- 0xFB, //
- 0xF7, //
- 0xEF, //
- 0xDF, //
- 0xBF, //
- 0x7F //
- };
-
- BYTE DATA[8] = {
- 0xFF,
- 0xFF,
- 0xFF,
- 0xFF,
- 0xFF,
- 0xFF,
- 0xFF,
- 0xFF,
- };
-
- void sys_init()
- {
- WTST = 0;
- EAXFR = 1;
- CKCON = 0;
- }
-
- void set_interrupt()
- {
- AUXR &= 0x7F; // 设置T0为12T模式,即12分频
- TMOD &= 0xF0; // 设置T0为16位自动重载定时器模式且无需上拉 INT0 引脚
-
- // 设置定时 1ms
- TL0 = 0x30; // 定时器T0设置低八位起始值
- TH0 = 0xF8; // 定时器T0设置高八位起始值
-
- TF0 = 0; // T0 溢出标志
- TR0 = 1; // T0 运行控制位
-
- ET0 = 1; // T0 开关
- EA = 1; // 中断总开关
- }
-
- long TMP = 0;
- BYTE pos = 0;
- BYTE unit = 0;
- unsigned long pow = 0;
-
- void main()
- {
- sys_init();
- usb_init();
-
- set_interrupt();
-
- P7M0 = 0;
- P7M1 = 0;
- P6M0 = 0;
- P6M1 = 0;
- P3M0 = 0x00;
- P3M1 = 0x00;
-
- P3PU |= 0x30;
-
- while (1)
- {
- if (ADD_TIGGER == 0)
- {
- delay_ms(10);
- if (ADD_TIGGER == 0)
- {
- PASS_COUNT++;
- delay_ms(10);
- }
- }
- else if (SUB_TIGGER == 0)
- {
- delay_ms(10);
- if (SUB_TIGGER == 0)
- {
- PASS_COUNT--;
- delay_ms(10);
- }
- }
- else if (ZERO_TIGGER == 0)
- {
- delay_ms(10);
- while (ZERO_TIGGER == 0)
- ;
- PASS_COUNT = 0;
- }
-
- if (PASS_COUNT >= 99999999)
- PASS_COUNT = 99999999;
-
- if (PASS_COUNT < -9999999)
- PASS_COUNT = -9999999;
-
- TMP = PASS_COUNT < 0 ? -PASS_COUNT : PASS_COUNT;
-
- for (pos = 0; pos < 8; pos++)
- {
- pow = pos > 0 ? 10 : 1;
- for (unit = 1; unit < pos; unit++)
- {
- pow *= 10;
- }
- if (pos == 7)
- {
- if (PASS_COUNT < 0)
- {
- DATA[7] = 0xBF;
- continue;
- }
- }
- DATA[pos] = NUM_DATA[(TMP / pow) % 10 + (TMP > (pow - 1) ? 1 : 0)];
- }
- }
- }
-
- BYTE index = 0;
-
- void T0_run(void) interrupt 1
- {
- SHARE = UNIT_MAP[index];
- CONTROL = DATA[index];
- index++;
- if (index > 7)
- {
- index = 0;
- }
- }
复制代码
|