关键词
51单片机;仿真;proteus;59s倒计时器
设计要求
设计一个59s倒计时器,使用两位共阳极LED数码管将其显示出来。
硬件设计
在的基础上去掉了按键
程序设计
使用定时器中断,设定100ms,每次加到10的时候就停止就是1s的了
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90/* 选用的是共阳极数码管,那么需要找到对应的共阳极数码管数字显示的十六进制 */ #include <reg52.h> #include "intrins.h" #define LED P0 typedef unsigned int u16; //对数据类型进行声明定义 typedef unsigned char u8; //段选 sbit CS1 = P2^0; sbit CS2 = P2^1; //按键 sbit key1 = P3^2; sbit key2 = P3^3; //8位led构成的数字显示 const u8 tab[]={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //定义定时器加减的变量,初始化为0 u8 count = 0; //定义十位和个位的变量 u8 count2; //十位 u8 count1; //个位 //定义时间,初始化为59秒 u8 time = 59; void Init_TIM() //定时器中断初始化 { TMOD|=0X01; //选择为定时器 0 模式,工作方式 1,仅用 TR0 打开启动。 TH0 = 0x3C; //定时50ms = 50 000us,2^16 -50 000 = 15536。 TL0 = 0xB0; //15536(十进制) = 3CB0(十六进制) ET0 = 1; //定时器中断1允许 TR0 = 1; //打开定时器中断 EA = 1; //打开总中断 } //出错,没有设置是那个定时器的高低位 void TIM_0(void) interrupt 1 { count++; if(count == 20) //50ms * 20v =1s { count =0; time--; if( time ==0) time =59; } TH0 = 0x3C; //15536(十进制) = 3CB0(十六进制) TL0 = 0xB0; } //在运行的时候突然想起来,没有去加限定 void Delay1ms() //@11.0592MHz { unsigned char i, j; _nop_(); //要使用intrins.h _nop_(); _nop_(); i = 11; j = 190; do { while (--j); } while (--i); } void main() { Init_TIM(); //外部中断初始化 while(1) { count2 = time/10; //十位 count1 = time%10; //个位 //十位选择,并显示 CS1 = 1; LED = tab[count2]; Delay1ms(); CS1 = 0; //个位选择,并显示 CS2 = 1; LED = tab[count1]; Delay1ms(); CS2 = 0; } }
最后
以上就是活力摩托最近收集整理的关于【51单片机】59s倒计时器的设计【仿真】【proteus】的全部内容,更多相关【51单片机】59s倒计时器内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复