//1.00->0.59(60进制+10进制)---核心思想
#include <reg52.h> //51.52单片机头文件
#define uint unsigned int //定义宏方便引用(可有可无)
uint num0,miaoshi,ge,miaoge; //博主英语实在不行,只能汉语言代替0
uint num=60; //博主调试了很长时间,发现num=60放在定时器里,导致每次溢出都会重置num,考虑好!
int num1;
sbit dula=P2^6; //申明段选寄存器
sbit wela=P2^7; //申明位选寄存器
sbit led1=P1^0; //这个灯可有可无
uint code store[]={ //不写,自动计算多少个
0x3f,0x06,0x5b,0x4f, //0xb0为1. 这里有个点 哈
0x66,0x6d,0x7d,0x07, //0xbf为0.
0x7f,0x6f,0xbf,0xb0
};
void delayms(uint xms) //空语句延时函数
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void display(uint ge,uint miaoge,uint miaoshi)//当一个工程足够大,你会发现函数特别重要
{ //这个是为了显示数码管的程序
dula=1;
P0=store[ge+10]; //故意设置ge+10;实现个位1和0
dula=0;
P0=0xff; //消影(数码管高速刷新,可能出现混乱的情况,将p0口放1,可以使数码管全灭)
wela=1;
P0=0xf7; //11110111;第四个数码管位选
wela=0;
delayms(5);
dula=1;
P0=store[miaoge]; //
dula=0;
P0=0xff;//消影
wela=1;
P0=0xef; //11101111第5个
wela=0;
delayms(5);
dula=1;
P0=store[miaoshi];
dula=0;
P0=0xff;
wela=1;
P0=0xdf;//11011111第六个
wela=0;
delayms(5);//总延迟修改值要小于中断一次的时间,否则混乱
//一般总时间要小于10ms;
}
void main()
{
TMOD=0X11; //工作方式位00010001 方式1
//51单片机定时器有4种工作方式
//闲谈:GATE---测量脉宽(一般将其置0)
//C/T 选0定时,选1计数
//方式1是16位定时器
//pow是c语言库函数,去查msdn
TH0=(65536-45872)/256;//这里我用50ms,可以换的
TL0=(65536-45872)%256;//( pow(2,16)-(50000/1.09) )%(pow(2,8))
//1.09是机器周期(12个时钟周期),这个要看你晶振,天翔板子是11.0592mhz
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
EA=1;//总开关
ET0=1;//定时器0控制打开
ET1=1;//定时器1控制打开
TR0=1;//定时器0溢出诊断
TR1=1;//同理
while(1) //卡死循环
{
display(ge,miaoge,miaoshi); //如果不调用函数,都在主函数中,显得特别罗嗦
}
}
void T0_time() interrupt 1 //t0中断序号为1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
num0++;
if(num0>=20)//(20*50ms==1s)
{
num0=0;//每一次溢出加一进来,num0++;然后重置
led1=~led1;//取反,实现灯的亮灭
}
}
void T1_time() interrupt 3
{
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
num1++;
if(num1>=20)//20*50ms=1s
{
num1=0; //同理
if(num<=0)
{
num=60;//千万不要再定时器中断中 定义值(因为每一次溢出都会进入定时器请求中断)
}
//相当于六十进制,实现1和0---这是思想的核心
ge=num/60; //如果60获取1.,如果小于60,则获取0.
//如果不写这个if else,miaoge位会出现6 因为60/10=6
if(num>=60)
{
miaoge=num%10;
miaoshi=num%10;
}
else
{
miaoge=num/10;
miaoshi=num%10;
}
num--; //每进入一次 num--,实现数字的倒计时
}
}


以上大致为实现效果,我太菜了,我不会上传视频!
关于脉冲这里
聊一下(其实用的很少)

将gate置1,此时左边初始化tr0为1,右边经过逻辑门,变成0
如果int0为0,则&这里过不去,开关打不开;
如果int0为1,则&为1,开关打开,不断计数,当出现低电平时,右边为0,自动断开
th0 tl0不再计数,可以取出它的值赋给某个变量
最后,感谢某位大佬教会我使用gitee+picgo;
本文介绍了一种使用51单片机实现60进制计数的方法,通过定时器中断和数码管显示实现了从1.00到0.59的倒计时功能。
2317

被折叠的 条评论
为什么被折叠?



