最近刚刚学会单片机技术(简单的)
然后学会了用定时器
于是设计电路编程序
仿真
用的是AT89S52
然后串行驱动4联的74HC164
控制数码管显示
计数使用的是6级4520四位二进制计数器
最高可以计数到16MHz
4520输出用74HC165并转串进到P0中读取信息
然后在单片机内部,
用T2定时器控制1s计时
用脉冲数来确定频率
请无视那里的几个开关和一些无关的东西。。
上图:
程序:
#include<AT89X52.h>
#define CLK P2_1
#define DISP P2_0
#define uint unsigned int
#define uchar unsigned char
#define ICLK P3_0
#define ISW P3_1
#define IIN P3_2
#define VCLK P3_3
#define VSW P3_4
#define VIN P3_5
#define FOREVER for(;;)
#define delay(x) for(a=1;a<=(x);a++);
#define FBSW P1_0
#define FBCLK P1_1
#define CTR P1_2
#define FBIN P1_3
#define PRS_LED P3_7
int bitsss(int a,int b){
return (a & (1<<b))>>b;
}
int put(uchar p){
CLK=0;DISP=p;CLK=1;
}
void show(uchar a,uchar pos){
put(pos);
if((a==2)||(a==3)||(a==4)||(a==5)||(a==6)||(a==8)||(a==9))put(1);else put(0);
if((a==4)||(a==5)||(a==6)||(a==8)||(a==9)||(a==0))put(1);else put(0);
if((a==2)||(a==6)||(a==8)||(a==0))put(1);else put(0);
if((a==2)||(a==3)||(a==5)||(a==6)||(a==8)||(a==9)||(a==0))put(1);else put(0);
if((a==1)||(a==3)||(a==4)||(a==5)||(a==6)||(a==7)||(a==8)||(a==9)||(a==0))put(1);else put(0);
if((a==1)||(a==2)||(a==3)||(a==4)||(a==7)||(a==8)||(a==9)||(a==0))put(1);else put(0);
if((a==2)||(a==3)||(a==5)||(a==6)||(a==7)||(a==8)||(a==9)||(a==0))put(1);else put(0);
} //倒序,低位在前
void Iadj(int a){
ISW=0;
ICLK=0;IIN=bitsss(a,9);ICLK=1;
ICLK=0;IIN=bitsss(a,8);ICLK=1;
ICLK=0;IIN=bitsss(a,7);ICLK=1;
ICLK=0;IIN=bitsss(a,6);ICLK=1;
ICLK=0;IIN=bitsss(a,5);ICLK=1;
ICLK=0;IIN=bitsss(a,4);ICLK=1;
ICLK=0;IIN=bitsss(a,3);ICLK=1;
ICLK=0;IIN=bitsss(a,2);ICLK=1;
ICLK=0;IIN=bitsss(a,1);ICLK=1;
ICLK=0;IIN=bitsss(a,0);ICLK=1;
ISW=1;
}
void Vadj(int a){
VSW=0;
VCLK=0;VIN=bitsss(a,9);VCLK=1;
VCLK=0;VIN=bitsss(a,8);VCLK=1;
VCLK=0;VIN=bitsss(a,7);VCLK=1;
VCLK=0;VIN=bitsss(a,6);VCLK=1;
VCLK=0;VIN=bitsss(a,5);VCLK=1;
VCLK=0;VIN=bitsss(a,4);VCLK=1;
VCLK=0;VIN=bitsss(a,3);VCLK=1;
VCLK=0;VIN=bitsss(a,2);VCLK=1;
VCLK=0;VIN=bitsss(a,1);VCLK=1;
VCLK=0;VIN=bitsss(a,0);VCLK=1;
VSW=1;
}
int t,t0,t1;
uchar keeping;
long freq;
int main(){
int a=5,i;
P0=P1=P2=P3=0;
CLK=0;
ISW=1;IIN=0;ICLK=0;
RCAP2H=0x10;
RCAP2L=0x00;
TMOD=1;
TR2=1;
ET2=1;
EA=1;
for(i=0;i<=1023;i++){
Iadj(i);
for(a=1;a<=1000;a++);
}
while(1){
if(P0_0==1){
TR0=1;
ET0=1;
//inc(freq);
//set(freq);
keeping=0;t0=1;
while((P0_0)){};
TR0=0;
ET0=0;
}
}
FOREVER;
return 0;
}
timer2() interrupt 5
{
long extf=0;
char a,i;
TF2=0;
t++;
if(t==30)
{
FBSW=0;FBSW=1;
for(i=23;i>=0;i--){
FBCLK=1;a=FBIN;extf+=(1<<(i-1))*a;FBCLK=0;
}
CTR=1;CTR=0;
t=0;
show(extf%10,0);
show(extf%100/10,0);
show(extf%1000/100,0);
show(extf/1000,0);
}
}
timer0() interrupt 1
{
if(!keeping){
TH0=0x10;
TL0=0x00;
t0++;
if(t0==15){
keeping=1;
TH0=0;
TL0=0;
}
}
else{
TH0=0x00;
TL0=0x00;
}
}
200字以内,仅用于支线交流,主线讨论请采用回复功能。