我们从2011年坚守至今,只想做存粹的技术论坛。  由于网站在外面,点击附件后要很长世间才弹出下载,请耐心等待,勿重复点击不要用Edge和IE浏览器下载,否则提示不安全下载不了

 找回密码
 立即注册
搜索
查看: 1395|回复: 6

[资料贡献] 基于51单片机的频率计(测量三角波方波锯齿波)

[复制链接]

该用户从未签到

13

主题

3

回帖

0

积分

二级逆天

积分
0

终身成就奖特殊贡献奖

QQ
发表于 2016-9-19 22:24:31 | 显示全部楼层 |阅读模式
基于51单片机的频率计(测量三角波方波锯齿波),内附仿真图,原理图(AD格式 频率计1602.SchDoc,PDF格式 频率计1602.pdf,protel99格式 频率计1602.sch,Word格式.doc),源程序代码。
程序代码如下:

//******************************************************************************************
//连接框图:       ___________________
//                |              P1.0 |->RS
//                |              P1.1 |->RW
//                |              P1.2 |->E
//                |              P0   |->DB
//                |                 P3.4 |->1~9999hz的输入
//                |              P3.5 |->1~9999KHZ输入 (分频后)
//******************************************************************************************
#include <reg52.h>
unsigned long int fre;
unsigned char time;
unsigned int count;
unsigned int count1;
//端口及函数说明----------------------------------------------------------------------------
sbit   LCD_RS=P1^0;      //片选信号
sbit   LCD_RW=P1^1;      //读写信号
sbit   LCD_E=P1^2;       //使能信号
#define LCD_DB     P0    //数据信号
unsigned char character[10]={0};//在屏幕上显示的字符串
unsigned char character_1[]={"fre= Hz"};
unsigned char FLAG = 0;
void LCD_init(void);//初始化函数   
void LCD_write_command(unsigned char command);//写指令函数     
void LCD_write_data(unsigned char dat);//写数据函数      
void LCD_disp_char(unsigned char x,unsigned char y,unsigned char dat);//在某个屏幕位置上显示一个字符,X(0-15),y(1-2)
void delay_n40us(unsigned int n);//延时函数   
void timer_init();            //中断初始化函数  
void delay_n40us(unsigned int n)          //延时函数
{
    unsigned int i;
    unsigned char j;            
    for(i=n;i>0;i--)
    for(j=0;j<2;j++);         
}
void delay_1s()
{
    unsigned int i,j;
    for(i = 0;i<100;i++)
        for(j = 0;j<1000;j++);
}                                      
void LCD_init(void)     //液晶初始化函数
{
    LCD_write_command(0x38);//设置8位格式,2行,5x7
    LCD_write_command(0x38);//设置8位格式,2行,5x7
    LCD_write_command(0x38);//设置8位格式,2行,5x7     切记要写三遍!!!!
    LCD_write_command(0x0c);//整体显示,关光标,不闪烁
    LCD_write_command(0x06);//设定输入方式,增量不移位
    LCD_write_command(0x01);//清除屏幕显示      
    delay_n40us(100);//清屏延时
}
void LCD_write_command(unsigned char dat)  //写命令函数
{
    LCD_DB=dat;
    LCD_RS=0;//指令     
    LCD_RW=0;//写入     
    LCD_E=1; //使能      
    LCD_E=0;
    delay_n40us(1);//写命令延时   
}     
void LCD_write_data(unsigned char dat)      //写数据函数
{
    LCD_DB=dat;
    LCD_RS=1;//数据      
    LCD_RW=0;//写入      
    LCD_E=1;//使能  
    LCD_E=0;
    delay_n40us(1);     //写数据延时
}
void LCD_disp_char(unsigned char x,unsigned char y,unsigned char dat)//显示一个字符
{
    unsigned char address;
    if(y==1)
             address=0x80+x;     //显示在第一排的时候的x的地址
    else
             address=0xc0+x;     //显示在第二排的时候的x的地址
    LCD_write_command(address);     //输入地址
    LCD_write_data(dat);         //输入数据
}
void LCD_disp_num(unsigned char x,unsigned char y,unsigned char dat)//显示一个数字
{
    unsigned char address;
    if(y==1)
             address=0x80+x;     //显示在第一排的时候的x的地址
    else
             address=0xc0+x;     //显示在第二排的时候的x的地址
    LCD_write_command(address);     //输入地址
    LCD_write_data(dat+48);         //输入数据
}
void dis_num(void)
{
    unsigned char i=0,j=0,k=0;
    LCD_write_command(0x01);//清除屏幕显示   
    character[0] = fre/1000000;
    character[1] = fre/100000%10;
    character[2] = fre/10000%10;
    character[3] = fre/1000%10;
    character[4] = fre/100%10;
    character[5] = fre/10%10;
    character[6] = fre%10;
    character[7] = 'H';
    character[8] = 'z';   
    for(i = 0;i<4;i++)         //显示fre
    {
         LCD_disp_char(i+0,1,character_1);
    }
    for(i = 0;i<10;i++)     //判断第一个不为0的数
    {
        if(character!=0)
            break;
    }
    k = 10-i-2;
    for(j = 0;j<k;j++)     //显示所有的数字
    {
            LCD_disp_num(4+j,1,character[i++]);   
    }
    for(i = 5;i<7;i++)     //显示Hz
    {
         LCD_disp_char(j+4,1,character_1);
        j++;
    }
}
void main()
{
    unsigned char i;
    LCD_init();
    timer_init();             //定时/计数器初始化  
    for(i = 0;i<4;i++)
    {
         LCD_disp_char(i+0,1,character_1);
    }
    while(1)
    {
        dis_num();         //显示
         delay_1s();            
    }                        
}
void timer_init(void)         //定时/计数器初始化
{
    TMOD=0x66;                //计数器0工作工作方式2,自动重装初值
    TH0=0;                    //计数器初值为0
    TL0=0;
    TR0=1;                    //计数器开始计数        
    ET0=1;                    //打开计数器0中断   
    TH1=0;                    //计数器初值为0
    TL1=0;
    TR1=1;                    //计数器开始计数        
    ET1=1;                    //打开计数器0中断   
    RCAP2H=(65536-62500)/256; //在程序初始化的时候给RCAP2L和RCAP2H赋值,
    RCAP2L=(65536-62500)%256; //TH2和TL2将会在中断产生时自动使TH2=RCAP2H,TL2=RCAP2L。
    TH2=RCAP2H;               //12M晶振下每次中断62.5ms
    TL2=RCAP2L;
    ET2=1;                    //打开定时器2中断     
    TR2=1;                    //定时器2开始计时  
    EA=1;                     //开总中断   
}
void timer2(void) interrupt 5 //定时器2中断(62.5ms)
{
    time++;
    TF2=0;                    //定时器2的中断标志位TF2不能够由硬件清零,所以要在中断服务程序中将其清零
    if (time==16)             //定时1s时间到  
    {
       time=0;                //计时清0         
       fre=(long)count*256+TL1;     //count*256强制转换成long型,否则将不产生进位 先判断分频后的
       FLAG = 0;

       if(fre<2000)//200K之后读取分频后的频率
       {
               fre = (long)count1*256+TL0;
            FLAG = 1;         
       }         
       count=0;               //清零计数器0计数      
       count1=0;
       EA=1;                  //开中断        
    }
}
void timer0(void) interrupt 1 //计数器0中断     
{
    count++;
}        
void timer1(void) interrupt 3 //计数器1中断
{
    count1++;
}

基于51单片机的频率计(测量三角波方波锯齿波).rar (215 KB, 下载次数: 1)
回复

使用道具 举报

  • TA的每日心情
    奋斗
    前天 11:51
  • 签到天数: 56 天

    [LV.5]常住居民I

    60

    主题

    1万

    回帖

    8389

    积分

    二级逆天

    积分
    8389

    终身成就奖特殊贡献奖原创先锋奖社区居民灌水天才奖优秀斑竹奖宣传大使奖忠实会员最爱沙发社区劳模

    QQ
    发表于 2016-9-19 22:41:32 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    1

    主题

    6

    回帖

    0

    积分

    一级逆天

    积分
    0

    终身成就奖

    QQ
    发表于 2016-9-19 22:42:20 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    5178

    回帖

    2062

    积分

    二级逆天

    积分
    2062

    社区居民忠实会员社区劳模特殊贡献奖最爱沙发终身成就奖优秀斑竹奖原创先锋奖

    QQ
    发表于 2016-9-20 08:10:27 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    20

    主题

    2875

    回帖

    3960

    积分

    二级逆天

    积分
    3960

    社区居民忠实会员社区劳模最爱沙发终身成就奖优秀斑竹奖

    QQ
    发表于 2016-9-20 08:52:01 | 显示全部楼层
    回复

    使用道具 举报

  • TA的每日心情
    开心
    3 天前
  • 签到天数: 114 天

    [LV.6]常住居民II

    9

    主题

    7703

    回帖

    5352

    积分

    二级逆天

    积分
    5352

    终身成就奖特殊贡献奖原创先锋奖优秀斑竹奖

    发表于 2023-1-29 03:16:59 | 显示全部楼层
    回复

    使用道具 举报

    该用户从未签到

    2

    主题

    884

    回帖

    0

    积分

    二级逆天

    积分
    0

    终身成就奖

    发表于 2023-2-18 21:13:27 | 显示全部楼层
    回复

    使用道具 举报

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

    本版积分规则

    论坛开启做任务可以
    额外奖励金币快速赚
    积分升级了


    Copyright ©2011-2024 NTpcb.com All Right Reserved.  Powered by Discuz! (NTpcb)

    本站信息均由会员发表,不代表NTpcb立场,如侵犯了您的权利请发帖投诉

    平平安安
    TOP
    快速回复 返回顶部 返回列表