本帖最后由 小分子 于 2016-8-1 21:36 编辑
- /****************************
- 用Timer0实现简单的1S倒计时
- *****************************/
- #include <reg52.h>
- #define uchar unsigned char
- void Timer0Init(); //定时器0初始化函数声明
- void SecProcess(); //倒计时处理函数声明
- void main()
- {
- Timer0Init();
- SecProcess();
- }
- void Timer0Init()
- {
- TMOD = 0x01; //定时器0工作模式为1
- TH0 = 0x4B; //定时为50MS,定时器初始值为=65536-(0.05/(12/110592))= 19240
- TL0 = 0x28;
- TR0 = 1; //开启定时器0
- }
- void SecProcess()
- {
- uchar count = 0; //用于计数,从而达到1S定时
- uchar sec = 0; //记录经过的秒数
- uchar code SecValue[]={ 0x8e,0x86,0xa1,0xc6,
- 0x83,0x88,0x90,0x80,
- 0xf8,0x82,0x92,0x99,
- 0xb0,0xa4,0xf9,0xc0};
- P1 = 0xFF; //使P1口初始化
- while (1)
- {
- if(TF0 == 1) //判断T0是否溢出
- {
- TF0 = 0; //在T0溢出后,使TF0位清零
- TH0 = 0x4B; //再次写入初值,否则计数器溢出后将从0计数,这样定时就不是50MS
- TL0 = 0x28;
- count++; //计数值自加1
- if(count >= 20) //判定T0溢出是否达到20次(是否到达1S)
- { //对于溢出判断定时,只能这样判断count >= 20;但是不能写成count == 20。
- count = 0; //达到20次后,计数清零
- P1 = SecValue[sec]; //将秒数对应的显示值传到P1口
- sec++; //秒数自动加1
- if(sec >= 16) //秒数超过对应值后,自动清零
- {
- sec = 0;
- }
- }
- }
- }
-
- }
|