我是靠谱客的博主 活力摩托,最近开发中收集的这篇文章主要介绍【51单片机】59s倒计时器的设计【仿真】【proteus】,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

关键词

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】所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部