Protues教程第三讲:“挑战10秒”网红按钮的实现

描述

视频教程:https://www.bilibili.com/video/BV1m741187ga

什么是网红按钮? 

ProtuesProtues

51内核单片机定时器的计算(以12M晶振为例); 晶振           12MHz =12000000Hz 时钟周期  1/12000000   s(晶振的倒数) 机器周期是 12/12000000 s (标准框架下51单片机一个机器是12个时钟周期) 因为定时器是每个机器周期加1所以定时时间为 N*时钟机器周期时间=所定时间T 所以要经过的机器周期是N*(12/12000000 s)=T                       N=t/(12/12000000 ) 初值等于 65536-N(因为16位的定时器65535再加1才溢出) 例如: 需要定时1ms=0.001s  =时间(s)*(晶振/12) 0.001/(12/12000000 )=0.001*(12000000 /12)=0.001*1000000=1000 初值y=65536-1000=64536=0XFC18 

ProtuesProtuesProtues
#include "reg52.h"
#define uchar unsigned char
#define uint unsigned int
#define SEG P0
sbit SCAN1 = P2^0;
sbit SCAN2 = P2^1;
sbit SCAN3 = P2^2;
sbit SCAN4 = P2^3;
sbit key = P3^0;
sbit Bepp = P3^7;
uchar number;
uchar flag;
uchar distab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
int display=0;//数码管刷新
int The_Time;//显示时间 单位10ms
int dis_value;//计数频率 10ms
void delay(uint j)                        //1ms
{
        uchar i=250;
        for(;j >0;j--)
{
                while(--i);
                i=249;
                while(--i);
                i=250;
        }
}


void Key_Scan()
{
	if(key==0)
	{
		delay(20);
		if(key==0)
		{
			while(key==0);
			if(flag==0)
			{
				flag=1;
				The_Time = 0;
			}else
			{
				flag=0;
			}
		}
	}
	
}


void Key_INT( )  interrupt 0  // 这里0对应下表
{
	Bepp = ~ Bepp;
	  
				if(flag==0)
			{
				flag=1;
				The_Time = 0;
			}else
			{
				flag=0;
			}
}

void main()
{
	TMOD |= 0x01;	  //开启定时器0  0x10时使用定时器1  0x11时启动两个
	TH0=0XFC;	//给定时器赋初值,定时1ms   TH1
	TL0=0X18;	 //TL1
	EA=1;            //总中断打开
	ET0=1;           //定时器0中断打开    ET1
	TR0=1;           //定时器0开关打开    TR1
	EX0=1;       //外部中断0开()  EX1 为外部中断1 (P3^3)
	IT0=1;        //低电平触发   IT1为中断1
	while(1)
	{
		

		
	}
	
}


void Timer0() interrupt 1     //参考上图  定时器1时为3
{
	static uint i;   //定义一个自变形变量
	TH0=0XFC;	//给定时器赋初值,定时1ms    TH1
	TL0=0X18;   //TL1
	i++;
	dis_value++;
	if(i==2)
	{
	i=0;
	SEG = 0XFF;
	switch(number)
	{

     case 0:SCAN4=1;SCAN3=0;SCAN2=0;SCAN1=0;SEG=distab[The_Time%10];break;
	
     case 1:SCAN4=0;SCAN3=1;SCAN2=0;SCAN1=0;;SEG=distab[The_Time/10%10];break;

     case 2:SCAN4=0;SCAN3=0;SCAN2=1;SCAN1=0;SEG=distab[The_Time/100%10]& 0x7f;break;

     case 3:SCAN4=0;SCAN3=0;SCAN2=0;SCAN1=1;;SEG=distab[The_Time/1000];break;

     default:break;
			
    }		
		number++;
    if(number >3)number=0;
	}	
	
	
	if(dis_value==10)
	{
		dis_value = 0;
		
		if(The_Time< 9999 && flag == 1)
		{
			The_Time++;
		}
		
	}
}

     审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分