求好心耐心的学长帮我看看一个基于51单片机的程序。不知道哪里的原因。没有结果。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcden=P2^7;
sbit lcdrs=P2^6;
sbit lcdwr=P2^5;
uint num,fcnt=0,a1=0,b1;
uint a,b,c,d,e,f,g;
float f1;
float fun1();
uint pinlu(float n); //分频各位分离显示
void delay(int m); //延时函数
void write_com(uchar com); //命令函数
void write_data(uchar date) ; //数据函数
void init1(); //固定显示内容
void init(); //1602初始化函数
void init2() //定时器初始化函数 //用定时器步骤1确定TMOD工作方式
{ //2装初值,3开EA,4开ET,5开TR.
TMOD=0x1a; //定时/计数器0以方式2(八位重装)用于定时, GATE位为是否受外部中断的控制
TH1=(65536-10000)/256; // 定时/计数器1以方式1(十六位)用于定时 C/T位为定时计数选择,1计数
TL1=(65536-10000)%256; //IT为触发方式 ,1为边沿
EA=1;
ET1=1; //开定时器1中断
TR1=1; //启动定时器1
EX0=1; //开外部中断0
IT0=1; //外部中断0边沿触发
ET0=1; //开定时器0中断
TH0=0; //定时/计数器0的初值均为0
TL0=0;
}
void main(void)
{
init2(); //定时器初始化
// while(1)
{
if(num==100) //1秒时间到
{
if(fcnt<11) fun1(); //fcnt<11为1秒内小于10个脉冲。转去fun1求低频
else f1=(fcnt-1)/10; //否则是求高频
}
init(); //1602初始化函数
init1(); //固定显示内容
pinlu(f1); //分频各位分离显示
while(1)
{
switch(a) //万位
{case 0 :delay(5);write_com(0x87);delay(5);write_data('0');delay(5);break;
case 1 :delay(5);write_com(0x87);delay(5);write_data('1');delay(5);break;
case 2 :delay(5);write_com(0x87);delay(5);write_data('2');delay(5);break;
case 3 :delay(5);write_com(0x87);delay(5);write_data('3');delay(5);break;
case 4 :delay(5);write_com(0x87);delay(5);write_data('4');delay(5);break;
case 5 :delay(5);write_com(0x87);delay(5);write_data('5');delay(5);break;
case 6 :delay(5);write_com(0x87);delay(5);write_data('6');delay(5);break;
case 7 :delay(5);write_com(0x87);delay(5);write_data('7');delay(5);break;
case 8 :delay(5);write_com(0x87);delay(5);write_data('8');delay(5);break;
case 9 :delay(5);write_com(0x87);delay(5);write_data('9');delay(5);break;
default :delay(5);write_com(0x87);delay(5);write_data('*');delay(5);break;
}
switch(b) //千位
{case 0 :delay(5);write_com(0x88);delay(5);write_data('0');delay(5);break;
case 1 :delay(5);write_com(0x88);delay(5);write_data('1');delay(5);break;
case 2 :delay(5);write_com(0x88);delay(5);write_data('2');delay(5);break;
case 3 :delay(5);write_com(0x88);delay(5);write_data('3');delay(5);break;
case 4 :delay(5);write_com(0x88);delay(5);write_data('4');delay(5);break;
case 5 :delay(5);write_com(0x88);delay(5);write_data('5');delay(5);break;
case 6 :delay(5);write_com(0x88);delay(5);write_data('6');delay(5);break;
case 7 :delay(5);write_com(0x88);delay(5);write_data('7');delay(5);break;
case 8 :delay(5);write_com(0x88);delay(5);write_data('8');delay(5);break;
case 9 :delay(5);write_com(0x88);delay(5);write_data('9');delay(5);break;
default :delay(5);write_com(0x88);delay(5);write_data('*');delay(5);break;
}
switch(c) //百位
{case 0 :delay(5);write_com(0x89);delay(5);write_data('0');delay(5);break;
case 1 :delay(5);write_com(0x89);delay(5);write_data('1');delay(5);break;
case 2 :delay(5);write_com(0x89);delay(5);write_data('2');delay(5);break;
case 3 :delay(5);write_com(0x89);delay(5);write_data('3');delay(5);break;
case 4 :delay(5);write_com(0x89);delay(5);write_data('4');delay(5);break;
case 5 :delay(5);write_com(0x89);delay(5);write_data('5');delay(5);break;
case 6 :delay(5);write_com(0x89);delay(5);write_data('6');delay(5);break;
case 7 :delay(5);write_com(0x89);delay(5);write_data('7');delay(5);break;
case 8 :delay(5);write_com(0x89);delay(5);write_data('8');delay(5);break;
case 9 :delay(5);write_com(0x89);delay(5);write_data('9');delay(5);break;
default :delay(5);write_com(0x89);delay(5);write_data('*');delay(5);break;
}
switch(d) //十位
{case 0 :delay(5);write_com(0x8a);delay(5);write_data('0');delay(5);break;
case 1 :delay(5);write_com(0x8a);delay(5);write_data('1');delay(5);break;
case 2 :delay(5);write_com(0x8a);delay(5);write_data('2');delay(5);break;
case 3 :delay(5);write_com(0x8a);delay(5);write_data('3');delay(5);break;
case 4 :delay(5);write_com(0x8a);delay(5);write_data('4');delay(5);break;
case 5 :delay(5);write_com(0x8a);delay(5);write_data('5');delay(5);break;
case 6 :delay(5);write_com(0x8a);delay(5);write_data('6');delay(5);break;
case 7 :delay(5);write_com(0x8a);delay(5);write_data('7');delay(5);break;
case 8 :delay(5);write_com(0x8a);delay(5);write_data('8');delay(5);break;
case 9 :delay(5);write_com(0x8a);delay(5);write_data('9');delay(5);break;
default :delay(5);write_com(0x8a);delay(5);write_data('*');delay(5);break;
}
switch(e) //个位
{case 0 :delay(5);write_com(0x8b);delay(5);write_data('0');delay(5);break;
case 1 :delay(5);write_com(0x8b);delay(5);write_data('1');delay(5);break;
case 2 :delay(5);write_com(0x8b);delay(5);write_data('2');delay(5);break;
case 3 :delay(5);write_com(0x8b);delay(5);write_data('3');delay(5);break;
case 4 :delay(5);write_com(0x8b);delay(5);write_data('4');delay(5);break;
case 5 :delay(5);write_com(0x8b);delay(5);write_data('5');delay(5);break;
case 6 :delay(5);write_com(0x8b);delay(5);write_data('6');delay(5);break;
case 7 :delay(5);write_com(0x8b);delay(5);write_data('7');delay(5);break;
case 8 :delay(5);write_com(0x8b);delay(5);write_data('8');delay(5);break;
case 9 :delay(5);write_com(0x8b);delay(5);write_data('9');delay(5);break;
default :delay(5);write_com(0x8b);delay(5);write_data('*');delay(5);break;
}
switch(f) //小数位位
{case 0 :delay(5);write_com(0x8d);delay(5);write_data('0');delay(5);break;
case 1 :delay(5);write_com(0x8d);delay(5);write_data('1');delay(5);break;
case 2 :delay(5);write_com(0x8d);delay(5);write_data('2');delay(5);break;
case 3 :delay(5);write_com(0x8d);delay(5);write_data('3');delay(5);break;
case 4 :delay(5);write_com(0x8d);delay(5);write_data('4');delay(5);break;
case 5 :delay(5);write_com(0x8d);delay(5);write_data('5');delay(5);break;
case 6 :delay(5);write_com(0x8d);delay(5);write_data('6');delay(5);break;
case 7 :delay(5);write_com(0x8d);delay(5);write_data('7');delay(5);break;
case 8 :delay(5);write_com(0x8d);delay(5);write_data('8');delay(5);break;
case 9 :delay(5);write_com(0x8d);delay(5);write_data('9');delay(5);break;
default :delay(5);write_com(0x8d);delay(5);write_data('0');delay(5);break;
}
}
}
}
void external0()interrupt 0 //外部中断0中断序号
{
fcnt++; //高频频率
}
void T1_time() interrupt 3 //定时器1中断序号 定一秒时间
{
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
num++;
}
float fun1() //求低频时的频率
{
while(1)
{ //同时由软件将外部中断0的中断请求标志清除 //当外部输入信号再次出现下降沿时,
if (IE0==1){TR0=1;IE0=0;}
while(1) //启动定时/计数器0,定时器0受外部中断
{
if(IE0==1){TR0=0;b1=TL0;f1=1000000/(a1*256+b1);} // 低频频率 //外部中断0请求标志,为1则来了外部中断0,
return f1; //关闭定时/计数器0,计算频率影响
}
}
}
void T0_time() interrupt 1 //定时器0中断
{
a1++; //定时口0计的时间为(a*256+b)us
}
void init() //初始化函数
{
lcden=0;
delay(15);
write_com(0x38); //16*2显示,5*7点阵,8位数据接口
delay(15);
write_com(0x38); //16*2显示,5*7点阵,8位数据接口
write_com(0x0c); //开显示,不显光标
// write_com(0x06); //写一个字符数据指针加1
write_com(0x01); //整屏移动,显示清零,数据指针清零
}
void init1()
{
delay(5);write_com(0x8f);delay(5);write_data('z');delay(5);
delay(5);write_com(0x8e);delay(5);write_data('H');delay(5);
// write_com(0xcf);write_data('z');delay(5);
// write_com(0xce);write_data('H');delay(5);
// write_com(0xcd);write_data('K');delay(5);
write_com(0x8c);write_data('.');delay(5);
}
void write_data(uchar date) //数据函数
{
lcdrs=1; //写数据
lcdwr=0; //写
P0=date;
delay(5);
lcden=1; //高脉冲
delay(5);
lcden=0;
}
void write_com(uchar com) //命令函数
{
lcdrs=0; //写命令
lcdwr=0; //写
P0=com;
delay(5);
lcden=1; //高脉冲
delay(5);
lcden=0;
}
void delay(int m)
{
int i,j;
for(i=m;i>0;i--)
for(j=110;j>0;j--);
}
uint pinlu(float n)
{
long z;
n=n*10;
z=(long)n; //本程序要特别注意数据类型的转换问题int为短整型,long为长整形。
a= z/100000; //万位
b=(z%100000)/10000; //千位
c=(z%10000)/1000; //百位
d=(z%1000)/100; //十位
e=(z%100)/10; //个位
f=z%10; //小数位
return a,b,c,d,e,f;
}
|