/***********************************************/ //作者: 元培电信1601旺仔 2018/1/6 /***********************************************/ #include "reg52.h" typedef unsigned int u16; typedef unsigned char u8; #define N 2500 sbit LSA=P2^2; sbit LSB=P2^3; sbit LSC=P2^4; u8 code smgduan[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f};//显示0~9的值 u16 number[9]; u16 minute,sec,mse,i,a; //这里的minute是分计时部分,sec是秒部分,mse是毫秒部分 void _time(); void timedeal(); void display(); void main() { minute=0;sec=0;mse=0; i=0;a=0; _time(); timedeal(); while(1) { timedeal(); display(); } } void timedeal() { number[0]=mse%10; //时,分,秒每个两位 number[1]=mse/10; number[3]=sec%10; number[4]=sec/10; number[6]=minute%10; number[7]=minute/10; } void display() { if(a==5) { mse++; a=0; } if(mse>99) { mse=0; sec++; } if(sec>60) { sec=0; minute++; } if(minute>60) { minute=0; sec=0; mse=0; } } void _time() { TMOD=0x01;//定义为定时器0为方式1,16位 TH0=(65536-N)/256; //计时到65536则溢出 ,则N多少为时间,也可以TH0=(-5000)<<8 TL0=(65536-N)%256; EA=1;//总中段 ET0=1;//开定时器0的中断 TR0=1;//启动 } void T0_time() interrupt 1 { TH0=(65536-N)/256; //计时到65536则溢出 ,则N多少为时间,也可以TH0=(-5000)<<8 TL0=(65536-N)%256; P2=i<<2; //因为位选定义的是P2^2 ,P2^3, P2^4,所以i要左移两位对P2口进行操作 if(i==1) { P0=smgduan[number[i]]|0x80; } //这个是毫秒部位的的那个小数点 else if(i==2||i==5) // 当扫描到两个单位之间的分隔 “-”时就不是显示时间数了 { //要显示“——“,所以是要数码管的g段亮,因为开发板板数码 P0=0x40; //管是共阴的,所以是0x40,就是 0100 0000 } else{ P0=smgduan[number[i]];} i++; if(i==8) i=0; a++; }
基于51的数码管计数器
猜你喜欢
转载自blog.csdn.net/mcuwangzai/article/details/78995000
今日推荐
周排行