我使用的是stc89c52rc单片机,程序是从网上找的,自己又改了一些,但是原程序有两个问题,第一是缺少“51hei.h”头文件,二是我不知道“guandz()”是什么意思,有什么功能?我改过的程序如下:
#include<reg51.h>
#include"51hei.h"
#define uchar unsigned char
#define FOSC 11059200L
#define T1MS (65536-FOSC*50/12/1000)
uchar counter1;
sbit wei1=P2^0;
sbit wei2=P2^1;
sbit wei3=P2^2;
sbit wei4=P2^3;
//uchar dis[6];
unsigned int counter2=0,tmp;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
0xf8,0x80,0x90};
unsigned int dis[6];
void init();
void delay(uchar);
//void display(uchar);
void jishu();
void delay1(uchar i)
{
uchar j,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
void display(uchar n)
{
dis[0]=n/10000; //获取计数值万位
dis[5]=n%10000;
dis[1]=dis[5]/1000; // 获取计数值千位
dis[5]=dis[5]%1000;
dis[2]=dis[5]/100; // 获取计数值百位
dis[5]=dis[5]%100;
dis[3]=dis[5]/10; // 获取计数值十位
dis[4]=dis[5]%10; // 获取计数值个位
P0=table[dis[1]];
wei1 = 0;
delay1(2);
wei1 = 1;
P0=table[dis[2]];
wei2 = 0;
delay1(2);
wei2 = 1;
P0=table[dis[3]];
wei3 = 0;
delay1(2);
wei3 = 1;
P0=table[dis[4]];
wei4 = 0;
delay1(2);
wei4 = 1;
}
void main()
{//guandz();
init();
while(1)
{
jishu();
display(counter2);
}
}
//定时器0和外部中断0初始化
void init()
{
EA=1;
EX0=1;
ET0=1;
IT0=1;
TMOD=0x01;
TL0 = T1MS;
TH0 = T1MS >> 8;
TR0=1;
}
//延时程序
void delay(uchar x)
{
uchar a,b;
for(a=x;a>0;a--)
for(b=20;b>0;b--);
}
//外部中断0中断程序
void external0() interrupt 0
{
tmp++;
}
//定时器0中断程序
void timer0() interrupt 1
{
TL0 = T1MS;
TH0 = T1MS >> 8;
counter1++;
}
//显示程序
void jishu()
{
if(counter1==20) //定时50ms,执行20次中断表示1s到达
{
counter2=tmp;
tmp=0;
counter1=0;
}
//else
//display(counter2);
}
我将程序下载到单片机,然后接入函数发生器测试,结果是LED数码管只能显示0-255Hz,超过255又从0重新开始,然后继续增大频率就是0-255的循环。求问大神有什么解决办法? |