- UID
- 11895
- 阅读权限
- 55
- 推广
-
- 幽默
-
- 注册时间
- 2008-5-14
- 最后登录
- 1970-1-1
|
注册家电维修技术论坛,与同行畅聊维修技术,享更多技术论坛功能。
您需要 登录 才可以下载或查看,没有帐号?快速注册
x
本帖最后由 吕水波 于 2016-2-15 07:09 编辑
#include <reg52.h>//实验板12M晶振计数最高频率500kHz
//频率测量输入引脚 p3.5
sbit k100ms=P1^3;//100毫秒计数
sbit k1000ms=P1^7;//1000毫秒计数
unsigned int num;//计数值
unsigned char tt_n=2;//计数长度
unsigned char c_k,c_look;//任务切换
unsigned char code LED[]={0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,0x7a,0x20,0x60};
//数码管显示数组
void main(void)
{
unsigned char n;
TMOD=0x52; //定时器1设置为16位计数模式p3.5//定时器0设为8位自重装模式
TH0=TL0=0x24;//220us
RCAP2H=0x3c;//定时器2置值65536-50000=15536(0x3cb0)
RCAP2L=0xb0;//50ms
ET0=1;//打开定时器0中断
ET2=1;//打开定时器2中断
EA=1;//打开总中断
PT2=1;//定时器2设为高优先级
TR0=1;
TR1=1;//启动定时计数器1
TR2=1;//启动定时器2
while(1)
{ if(c_k==0){c_k=20;if(!k100ms)tt_n=2;if(!k1000ms)tt_n=20;}//档位切换
if(c_look==0)//六位数码显示
{c_look=10;
P2=0xff;//关所有显示
if(n==0&&tt_n==2){P0=LED[0]; P2=0x7f;}//计数时长为100毫秒时补零,将原数显示为它的十倍
if(n==1){P0=LED[num%10]; P2=0xbf;}//
if(n==2){P0=LED[(num/10)%10]; P2=0xdf;}
if(n==3){P0=LED[(num/100)%10]; P2=0xef;}
if(n==4){P0=LED[(num/1000)%10]; P2=0xf7;}
if(n==5){P0=LED[num/10000]; P2=0xfb;} //显示最高位
n=(n+1)%6;//n从零到五循环
}
}
}
timer0() interrupt 1
{ T0=!T0;//f=1000/(2*0.220)=2273 自测端口P3.4
if(c_look>0)c_look--;
if(c_k>0)c_k--;
}
timer2() interrupt 5//定时器2中断函数
{
static unsigned char tt=0;//
TF2=0;//复位定时器2
tt++;
if(tt>=tt_n)//计数长度100ms(tt_n=2) 1000ms(tt_n=20)
{
TR1=0;//关计数定时器
tt=0;
num=(TH1<<8)+TL1;//取计数定时器的值
TH1=TL1=0;//计数器清零
TR1=1;//起动计数
}
}
|
|