找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2919|回复: 8
打印 上一主题 下一主题
收起左侧

基于51单片机数字频率计程序的纠错

[复制链接]
跳转到指定楼层
楼主
ID:99188 发表于 2016-1-5 16:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
50黑币
各位单片机爱好者,单片机课设我写了个基于51单片机数字频率计的C程序,用1602液晶显示测得的频率,用另外一个单片机产生可调方波。但下载到板子上之后数字全为零。后天就要交了。急用啊。多多帮忙
下面是我的程序
#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;
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:99188 发表于 2016-1-5 16:32 | 只看该作者
加一点产生方波的单片机用矩阵键盘控制频率
回复

使用道具 举报

板凳
ID:102114 发表于 2016-1-7 00:22 来自手机 | 只看该作者
等级不够看不太懂,好像fun1()死循环跳不出
回复

使用道具 举报

地板
ID:99188 发表于 2016-1-7 13:07 | 只看该作者
没有啊学长
回复

使用道具 举报

5#
ID:102114 发表于 2016-1-7 14:37 来自手机 | 只看该作者
2536583774 发表于 2016-1-7 13:07
没有啊学长

我错了,要回去再学学c语言才行
回复

使用道具 举报

6#
ID:96682 发表于 2016-1-7 15:13 | 只看该作者
源程序里表妹设置哪个端口用于频率探头
回复

使用道具 举报

7#
ID:99188 发表于 2016-1-8 16:01 | 只看该作者
不要吧。定时计数器0的外输入端口P3^4就是啊
回复

使用道具 举报

8#
ID:102465 发表于 2016-1-8 22:51 | 只看该作者
没看懂?
回复

使用道具 举报

9#
ID:99188 发表于 2016-1-9 12:40 | 只看该作者
那麻烦再看看吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表