基于51单片机的数字频率计设计 下载本文

内容发布更新时间 : 2024/12/23 4:10:07星期一 下面是文章的全部内容请认真阅读。

.

void Delay_ms(uint time) //延时函数 {

uint i,j;

for(i=time;i>0;i--) for(j=125;j>0;j--); }

void LED4_Display (void) { unsigned char code *led_table; // uchar i;

//显示第1位

led_table = LED_0F + LED[1]; i = *led_table; LED_OUT(0x04);

LED_OUT(i); RCLK = 0; RCLK = 1;

//显示第2位

led_table = LED_0F + LED[2]; i = *led_table; LED_OUT(0x08);

LED_OUT(i); RCLK = 0; RCLK = 1;

//显示第3位

led_table = LED_0F + LED[3]; i = *led_table; LED_OUT(0x01); LED_OUT(i);

RCLK = 0;

.

显示函数 查表指针 // .

}

RCLK = 1;

//显示第4位

led_table = LED_0F + LED[4]; i = *led_table; LED_OUT(0x02);

LED_OUT(i); RCLK = 0; RCLK = 1;

void LED_OUT(uchar X) //输出函数 {

uchar i;

for(i=8;i>=1;i--) {

if (X&0x80) DIO=1; else DIO=0; X<<=1; SCLK = 0; SCLK = 1; } }

void time0_init() {

TMOD|=0x01; TH0=0x3c; TL0=0xb0;

//定时器初始化(TIMER0)

//定时器0 定时模式 计数范围65536 //定时初值50ms

TR0=0; //暂停定时器0 }

void time1_init() //计数器初始化(T1) {

TMOD|=0x50; //定时器1 计数模式,计数范围65536 TH1=0; //计数初值0 TL1=0;

TR1=0; //暂停计数器

.

.

}

void str_init() //开中断 {

EA=1; ET0=1; ET1=1; }

void time0_event() interrupt 1 //定时器0中断 {

static uchar i; i++;

TH0=0x3c; //定时初值50ms TL0=0xb0;

if(i==20) //循环20次为1秒 {

i=0;

TR1=0; //停止计数 TR0=0; //停止定时

ff=(TH1*256+TL1); //求出频率值 就是1秒内脉冲次数 TH1=0; //计数值清零

TL1=0;

TH0=0x3c; //定时初值50ms TL0=0xb0;

start=1; //启动定时器开启变量 } }

void time1_event() interrupt 3 //定时器1中断 { int i=0xff; while(1) { P0=~i;

Delay_ms(500);

} }

void main()

.

.

{

uchar i,j;

uint a,b,c,d; uint ss[4];

time0_init(); //定时器初始化 time1_init();

str_init(); //开中断 while(1) {

if(start==1) {

TR0=1; //启动定时器 TR1=1; //启动计数器

start=0; //关闭启动变量位 保证1秒时间 }

j=0;

do //计算显示频率数值 {

ss[j]=ff; j++; }while(ff/=10);

a=ss[0]; b=ss[1]; c=ss[2]; d=ss[3]; LED[1]=b; LED[2]=a; LED[3]=d; LED[4]=c;

LED4_Display (); //调用显示函数 } }

.

.

.