单片机组合实验二——定时器,数码管显示

题目: 两个数码管,K1,K2两个按键,完成K1启动计数,K2暂停计数,每一秒钟数码管增加1,60秒钟后,蜂鸣器响一声,数码管回归0,重新计数。

代码

	#include"reg51.h"
	#include"intrins.h"
	#define seg1 P0
	#define seg2 P2
	typedef unsigned int u16;
	typedef unsigned char u8;
	u16 code smg[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};     //共阴极数码管编码
	sbit key1=P3^2;          //位定义
	sbit key2=P3^3;          //位定义
	sbit buzzer=P1^0;        //位定义
	u16 num=0;             
	u16 i=0;
	
	void delay(u16 i)   //延时函数(约10微秒)
	{
		while(i--);
	}
	
	void int_init()     //中断初始化函数
	{
		EA=1;           	//中断总允许位
		EX0=1;            //外部中断0允许位
		IT0=1;            //下降沿触发
		EX1=1;            //外部中断1允许位
		IT1=1;            //下降沿触发
	}
	
	void tim0_init()      //定时计数器初始化函数
	{
		ET0=1;              //定时计数器允许位 
		TMOD=0X01;          //定时器0方式一
		TH0=0XFC;           //高八位初始值
		TL0=0X18;           //低八位初始值
		TR0=0;              //关闭定时(需要按k1才将TR0置为1)
	}
	
	void display()       //数码管显示函数
	{
		seg1=~smg[num/10%10];  //十位
		delay(10);          //消影
		seg2=~smg[num%10];   //个位
		delay(10);          //消影
	}
	
	
	
	void main()          //主函数
	{
		int_init();
		tim0_init();
		while(1)
		{
			display();
		}
	}
	
	
	
	void int0() interrupt 0        //外部中断0服务函数
	{
		if(key1==0)                  //判断是否按下
		{
			delay(1000);               //消抖
			if(key1==0)
			{
				TR0=1;                  //开启计时
			}
		}
	}
	
		void int1() interrupt 2      //外部中断1服务韩素
	{
		if(key2==0)                   //判断k2是否按下
		{
			delay(1000);               //消抖
			if(key2==0)              
			{
				TR0=0;                    //关闭计时
			}
		}
	}
	
	void tim0() interrupt 1           //定时计数器服务函数
	{
		TH0=0XFC;                      //需要重新赋值高低8位
		TL0=0X18;
		if(i==1000)                     //循环多少次与初值有关
		{
			i=0;
			num++;
		}
		i++;
		if(num==61)                    //判断是否加到60
		{
			buzzer=0;                    //蜂鸣器
			delay(100000);
			buzzer=1;
			num=0;
		}
	}

仿真图

在这里插入图片描述
在这里插入图片描述

元器件

AT89C51(AT89C52)
BUTTON(按钮)
BUZZER(蜂鸣器)
RES(电阻)
PNP(三极管)
GROUND(地)
POWER(电源)
SEG CA(共阳极数码管)

备注

1.因为是 共阴极编码,而数码管是共阳极,所以需要取反
2.定时器初始化时将TR0设置为0是为了显示题目中的按k1开始计数

发布了11 篇原创文章 · 获赞 3 · 访问量 280

猜你喜欢

转载自blog.csdn.net/weixin_44871327/article/details/104458561