概述
关键词
51单片机;仿真;proteus;59s倒计时器
设计要求
设计一个59s倒计时器,使用两位共阳极LED数码管将其显示出来。
硬件设计
在的基础上去掉了按键
程序设计
使用定时器中断,设定100ms,每次加到10的时候就停止就是1s的了
/*
选用的是共阳极数码管,那么需要找到对应的共阳极数码管数字显示的十六进制
*/
#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倒计时器的设计【仿真】【proteus】所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复