【Proteus仿真】51单片机定时器计数+共阴数码管驱动显示
- 📌相关篇《【Proteus仿真】51单片机定时器使用》
- 🔖Proteus仿真基础实验-
定时器计数+共阴数码管驱动显示60秒倒计时
。 - 🌿Proteus8.12平台
- 🌿本实验代码基于VSM Studio,采用SDCC编译器。
- 🎬仿真演示:
📝示例代码
/* Main.c file generated by New Project wizard
*
* Created: 2023-5-22
* Processor: 80C52
* Compiler: SDCC for 8051
* Author:Perseverance52
*/
#include <mcs51reg.h>
#define FOSC 11059200L
#define T1MS (65536-FOSC/12/1000) //1ms timer
#define wei1 (P2_0)
#define wei2 (P2_1)
#define LED (P2_2)
static unsigned int count = 0;
static unsigned int cnt = 0;
unsigned char __code table[] = {//
0x3f,0x06,0x5b,0x4f,// 0 1 2 3
0x66,0x6d,0x7d,0x07,// 4 5 6 7
0x7f,0x6f // 8 9
};
void delayms(unsigned int ms)
{
unsigned int x;
unsigned int y;
for (y=ms; y>0; y--)
{
for (x=227; x>0; x--)
;
}
}
void led_off()
{
wei1= 1;
wei2= 1;
}
void Display()
{
wei1=0,wei2=1;
P0= table[cnt/10];
delayms(10);
led_off();
delayms(2); //消隐
wei1=1,wei2=0;
P0= table[cnt%10];
delayms(10);
led_off();
delayms(2); //消隐
}
/*------------------------------------------------
定时器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TL0 = T1MS; //initial timer0 low byte
TH0 = T1MS >> 8; //initial timer0 high byte
TR0 = 1; //timer0 start running
ET0 = 1; //enable timer0 interrupt
EA = 1; //open global interrupt switch
}
/*------------------------------------------------
定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) __interrupt 1 __using 1
{
TL0 = T1MS; //reload timer0 low byte
TH0 = T1MS >> 8; //reload timer0 high byte
if (count-- == 0) //1ms * 1000 -> 1s
{
count = 1000; //reset counter
LED = ! LED; //指示灯反相,可以看到闪烁
if(cnt-- == 0)cnt = 60;
}
}
void main(void)
{
Init_Timer0();
led_off();
while (1)
{
Display();
}
}
📚仿真资源
链接: https://pan.baidu.com/s/1HCdxOd3oXimHhc_pR__MUQ
提取码: svcs