标题:
单片机+ne555频率计电路+程序
[打印本页]
作者:
51设计
时间:
2020-2-27 10:27
标题:
单片机+ne555频率计电路+程序
X8J5LA_1RAZGN5Y5DCY83V6.png
(64.25 KB, 下载次数: 79)
下载附件
仿真
2020-2-27 10:23 上传
仿真
//包含头文件
#include <reg52.h>
#include <math.h>
//unsigned char code dispbit[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //反扫 (高位接高位)
unsigned char code dispbit[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; //正扫 (高位接低位)三级管
//unsigned char code dispbit[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //74hc04
unsigned char code dispcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管显示码0-9 (a b c d e f g dp)
unsigned char dispbuf[6]={0,0,0,0,0,0}; //显示数据暂存数组
unsigned char temp[6]; //频率值暂存数组
unsigned char T0count; //计数器计满次数,计满一次对应的脉冲数为65536个
unsigned int timecount; //定时器定时1秒的变量,每次对应为50ms,计20次对应就是1秒,然后计算一秒内的计数器脉冲个数
bit flag; //计时到1秒时该标志位置1,进行脉冲数的运算,得出结果送显示,然后该位清零,重新开始脉冲计数
unsigned long x; //计算脉冲的数据范围一般比较大,所以用无符号长整形变量定义该变量
sbit dian=P1^7; //位定义小数点,用于kHz显示
void display() //显示函数
{
unsigned int j; //定义变量用于显示延时
P2=~dispbit[7]; //选中位
P1=~0x8e; //显示字母“F”
for(j=50;j>0;j--); //延时
P1=~0xff; //关闭显示
P2=~dispbit[6]; //选中位
P1=~0xb7; //显示“=”
for(j=50;j>0;j--); //延时
P1=~0xff; //关闭显示
if(dispbuf[5]!=0) //如果十万位不为0
{
P2=~dispbit[5];
P1=~dispcode[dispbuf[5]]; //十万位正常显示数字
for(j=50;j>0;j--);
P1=~0xff;
}
if(dispbuf[5]!=0||dispbuf[4]!=0) //如果十万位和万位都不等于零
{
P2=~dispbit[4];
P1=~dispcode[dispbuf[4]]; //万位正常显示
for(j=50;j>0;j--);
P1=~0xff;
}
P2=~dispbit[3]; //同上
P1=~dispcode[dispbuf[3]];
dian=0; //该位显示小数点
for(j=50;j>0;j--);
P1=~0xff;
P2=~dispbit[2];
P1=~dispcode[dispbuf[2]];
for(j=50;j>0;j--);
P1=~0xff;
P2=~dispbit[1];
P1=~dispcode[dispbuf[1]];
for(j=50;j>0;j--);
P1=~0xff;
P2=~dispbit[0];
P1=~dispcode[dispbuf[0]];
for(j=50;j>0;j--);
P1=~0xff;
}
void main(void) //主函数
{
unsigned char i;
TMOD=0x15; //定义T1为定时模式,T0位计数模式
TH0=0;
TL0=0; //计数器清零
TH1=0x3c;
TL1=0xb0; //定时器赋值(定时50ms)
TR1=1; //打开定时器T1
TR0=1; //打开计数器T0
ET0=1; //打开中断允许
ET1=1; //打开中断允许
EA=1; //打开中断总开关
while(1) //进入循环,因为括号内为常数1,不会变化,所以该表达式一直成立,又称死循环
{
display(); //调用显示函数
if(flag) //判断1秒时间是否到
{
flag=0; //标志位清零,计算完脉冲数后重新开始计时计数
x=T0count*65536+TH0*256+TL0; //读取1秒时间内的计数个数(T0count为每次计数超过65536时进入计数中断加1)
for(i=0;i<6;i++) //for循环将暂存数组内数据清零
{
temp[i]=0;
}
i=0; //i清零
while(x/10) //将x拆分为6个一位数
{
temp[i]=x%10; //如果x/10不为0,将x除以10的余数赋值temp【i】
x=x/10; //然后将x/10的商赋值给x
i++; //i++
}
temp[i]=x; //着骂高位直接赋值给temp【i】
for(i=0;i<6;i++) //for循环用于将数据送入显示暂存数组
{
dispbuf[i]=temp[i]; //赋值语句
}
T0count=0; //计数器中断次数清零
TH0=0;
TL0=0; //计数器清零
TR0=1;
TR1=1; //重新打开定时计数器
}
}
}
void t0() interrupt 1 //计数器中断函数
{
T0count++; //计数超过65536,就产生一次中断
}
void t1() interrupt 3 //定时器中断函数
{
TH1=0x3c;
TL1=0xb0; //50ms进入一次中断,进入中断后要重新赋初值
timecount++; //每进一次中断就是50ms,该变量加一
if(timecount==20) //该变量加到20次时,代表1秒到了
{
TR0=0; //关闭计数器
TR1=0; //关闭定时器
timecount=0; //计时变量清零,准备下次定时
flag=1; //一秒时间到,该标志位置1,主函数中执行脉冲数运算与显示函数
}
}
/**************************这里是函数的结尾END***************************/
复制代码
作者:
3花木城
时间:
2022-1-5 13:11
用仿真7.5复制了楼主的出来,但是效果不好,有空找找原因
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1