简易数字频率计c程序清单

时间:2019-05-14 03:59:50下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《简易数字频率计c程序清单》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《简易数字频率计c程序清单》。

第一篇:简易数字频率计c程序清单

河池学院2004届本科生毕业论文(设计)简易数字频率计

附件

源程序如下: #include unsigned char data key,flag_ft,point,buffer,j,INT1_ready,couter0,couter1,bus0,bus1,cycle;//键盘,频率判决结果,小数点位置标志,判决频率寄存,显示缓冲变量,边沿触发界定,定时器0定时寄存,定时器1定时寄存,显示刷新循环寄存CT0计数值寄存,CT1计数值寄存,显示循环变量 unsigned int data Z,delay,k,turn;//占空比,程序延迟循环变量,判断频率段跳转值,等于各测量值 float data T,F,T_T,F_F,W;//周期,频率,脉宽

unsigned char code BitTab[4]={0x7f,0xbf,0xdf,0xef};//位驱动码

unsigned char code DispTab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x80};//字形码 /*

0

.*/ unsigned char data DispBuf[4];//待显示数据寄存 sbit P2_0=P2^0;//位变量定义 sbit P2_1=P2^1;sbit P2_2=P2^2;sbit P2_3=P2^3;sbit P1_0=P1^0;sbit P1_1=P1^1;sbit P1_2=P1^2;sbit P1_3=P1^3;sbit P1_4=P1^4;sbit P1_5=P1^5;sbit P1_6=P1^6;sbit P1_7=P1^7;sbit P0_7=P0^7;sbit P3_3=P3^3;/////////////////////////////////////////////////////////////////// void Ft();//1KHZ/16KHZ门限频率判决函数 void Ft_10();//10KHZ门限频率判决函数 void test_af();//小于1KHZ的频率测量函数 void test_w();//小于10KHZ脉冲宽度测量函数 void test_bf();//1KHZ~16KHZ频率测量函数 void test_z();//占空比测量函数

void test_at();//小于1KHZ的周期测量函数 void test_bt();//1KHZ~16KHZ周期测量函数 void test_cf();//16KHZ以上频率测量函数 void test_ct();//16KHZ以上周期测量函数 void Display();//显示驱动函数

void Delay_5m();//软件延迟约5ms函数 void Measure();

//按键处理与对应测量函数 ///////////////////////////////////////////////////////////////////// void Ft()

//判决1KHZ/16KHZ 河池学院2004届本科生毕业论文(设计)简易数字频率计 {

//unsigned char p;

TMOD=0x15;

TL1=0xb0;

TH1=0x3c;

TH0=0;TL0=0;

TR1=1;

TR0=1;for(;TF1==0;);

TF1=0;for(;TF1==0;);

TF1=0;for(;TF1==0;);

TF1=0;

TR0=0;

TR1=0;

k=TL0|(TH0<<8);

if(k>131)flag_ft=3;

else if(k>10)flag_ft=2;

else flag_ft=1;} //////////////////////////////////////////////////////////////////////////////// void Ft_10()//判决10KHZ函数 {

TMOD=0X15;

TL1=0XC0;

TH1=0XE0;TH0=0;TL0=0;

TR1=1;

TR0=1;

for(;TF1==0;);TF1=0;

TR0=0;

TR1=0;

k=TL0|(TH0<<8);

if(k<=5)flag_ft=4;

else flag_ft=5;} //////////////////////////////////////////////////////////////////////////////// void test_af(void)//测量小于1KHZ的频率,用INT1和CT0。{

F=0;河池学院2004届本科生毕业论文(设计)简易数字频率计

test_at();P1=P1|0xff;

//清除上次单位指示

F=1000000/T_T;

if(F<10)

{

F*=1000;point=1;}

else if(F<100)

{

F*=100;point=2;

}

else if(F<1000)

{

F*=10;point=3;}

else

{

point=4;} P1_2=0;//HZ指示灯亮 } ///////////////////////////////////////////////////////////////////////////////////// void test_w()//测量脉冲宽度 {

W=0;

TMOD=0x90;//初始化

TH1=0x00;

TL1=0x00;ET1=1;//开中断

EA=1;bus1=0;

for(;P3_3==1;);//等待无效高电平过去

TR1=1;

for(;P3_3==0;);//等待高电平

for(;P3_3==1;);//等待低电平关闭计数器

TR1=0;W=bus1*65536;

W+=TL1|(TH1<<8);if(W<100){

W*=100;point=2;P1_1=0;//us指示灯亮

} else if(W<1000){ 河池学院2004届本科生毕业论文(设计)简易数字频率计

W*=10;point=3;P1_1=0;//us指示灯亮

} else if(W<10000){

point=4;P1_1=0;//us指示灯亮

}

else if(W<100000)

{

W/=10;point=2;P1_0=0;//ms指示灯亮

}

else if(W<1000000)

{

W/=100;point=3;P1_0=0;//ms指示灯亮

} else if(W<10000000){

W/=1000;point=4;P1_0=0;//ms指示灯亮

}

else

{

point=0;} } ////////////////////////////////////////////////////////////////// void test_bf(void)//测量1KHZ~16KHZ频率T1记数,T0定时 {

F=0;

TMOD=0x51;TL1=0x00;TH1=0x00;TL0=0xbc;TH0=0xbd;ET0=1;ET1=1;EA=1;

TR0=1;TR1=1;couter0=0;bus1=0;

for(;couter0<16;);

TR1=0;TR0=0;

F=bus1*65536;//取CT1记数值

F+=TL1|(TH1<<8);河池学院2004届本科生毕业论文(设计)简易数字频率计

F_F=F;if(F<10000){

point=1;}

else if(F<100000)

{

F/=10;point=2;}

else

{

point=0;} P1_3=0;//KHZ指示灯亮 } /////////////////////////////////////////// void test_z(){

Z=0;Ft();if(flag_ft==1)test_at();

else test_bt();

test_w();P1=P1|0xff;//清上次单位指示

Z=(unsigned int)((W/T)*100);

if(Z<10)

{

Z*=1000;point=1;}

else if(Z<=100)

{

Z*=100;point=2;}

/*else if(Z<1000)

{

Z*=10;point=3;}*/ else {

point=2;

} } /////////////////////////////////////////////////////////////////////////////////// void test_at(void)//测量小于1KHZ的周期 河池学院2004届本科生毕业论文(设计)简易数字频率计 {

T=0;

TMOD=0x01;

IT1=1;

EX1=1;ET0=1;EA=1;TL0=0x00;

TH0=0x00;

bus0=0;

TR0=0;

INT1_ready=0;

for(;INT1_ready<2;);EX1=0;//关INT1中断

T=bus0*65536;

T+=TL0|(TH0<<8);T_T=T;//传递给频率测量函数

if(T<1000){

T=T*10;point=3;P1_1=0;//us指示灯亮

} else if(T<10000){

point=4;P1_1=0;//us指示灯亮

}

else if(T<100000)

{

T/=10;point=2;P1_0=0;//ms指示灯亮

}

else if(T<1000000)

{

T/=100;point=3;P1_0=0;//ms指示灯亮

} else if(T<10000000){

T/=1000;point=4;P1_0=0;//ms指示灯亮

}

else

{

point=0;} } ////////////////////////////////////////////////////////////////////////////////// void test_bt(void)//测量测量1KHZ~16KHZ周期 河池学院2004届本科生毕业论文(设计)简易数字频率计 {

T=0;

test_bf();P1=P1|0xff;//清上次单位指示

T=1000000/F_F;

if(T<1000)

{

T=T*10;point=3;} else if(T<10000){

point=4;

} else {

point=0;} P1_1=0;//us指示灯亮 } ////////////////////////////////////////////////////////////////////////////////////// void test_cf(void)

/*大于16KHZ频率,分频,T0记数,T1定时*/ {

F=0;TMOD=0x15;TL0=0x00;TH0=0x00;TL1=0xbc;TH1=0xbd;ET0=1;ET1=1;EA=1;TR1=1;TR0=1;couter1=0;bus0=0;

for(;couter1<16;);TR0=0;TR1=0;F=bus0*65536;

F+=TL0|(TH0<<8);F=F*16;F_F=F;if(F<100000){ 河池学院2004届本科生毕业论文(设计)简易数字频率计

F/=10;point=2;}

else if(F<1000000)

{

F/=100;point=3;} else if(F<10000000){

F/=1000;point=4;}

else

{

point=0;} P1_3=0;

//KHZ指示灯亮 } void test_ct(void)

//大于16KHZ频率 {

T=0;

test_cf();P1=P1|0xff;

//清上次单位指示

T=1000000/F_F;

if(T<10)

{

T*=1000;point=1;

}

else if(T<100){

T*=100;point=2;

}

else if(T<1000){

T*=10;point=3;}

else

{

point=0;}

P1_1=0;//us指示灯亮 } ///////////////////////////////////////////////////////////////////////////////////////////// void Display()//显示驱动程序 {

buffer=BitTab[j];河池学院2004届本科生毕业论文(设计)简易数字频率计

P2=P2|0xf0;

P2=P2&buffer;

buffer=DispBuf[j];

buffer=DispTab[buffer];

P0=buffer;

switch(point)

{

case 1:if(j==0)P0_7=1;//第一位小数点亮

break;

case 2:if(j==1)P0_7=1;//第二位小数点亮

break;

case 3:if(j==2)P0_7=1;//第三位小数点亮

break;

default:break;

}

j++;

if(j==4)j=0;} //////////////////////////////////////////////////////////////// void Delay_5m(){

for(delay=0;delay<100;delay++);} ///////////////////////////////////////////////////////////////// void Measure(){

TH0=0;TL0=0;TH1=0;TL1=0;F=0;T=0;W=0;Z=0;

switch(key)

{

case 0xef:P2=P2|0x0f;

P2_1=0;//F指示灯亮

Ft();//flag_ft=Ft();///////////////////////////////////?

switch(flag_ft)

{

case 1:test_af();//测量小于1KHZ频率

break;

case 2:test_bf();//测量1KHZ~16KHZ频率 河池学院2004届本科生毕业论文(设计)简易数字频率计

break;

case 3:test_cf();//测量大于16KHZ频率

break;

default:break;

}

break;

case 0xdf:P2=P2|0x0f;

P2_2=0;//T指示灯亮

Ft();//flag_ft=Ft();

switch(flag_ft)

{

case 1:test_at();//测量小于1KHZ周期

break;

case 2:test_bt();//测量1KHZ~16KHZ周期

break;

case 3:test_ct();//测量大于16KHZ周期

break;

default:break;

}

break;

case 0xbf:P2=P2|0x0f;

P2_3=0;//W指示灯亮

Ft_10();

switch(flag_ft)

{

case 4:test_w();//测量脉冲宽度

break;

default:break;

}

break;

case 0x7f:P2=P2|0x0f;

P2_0=0;//Z指示灯亮

Ft_10();

switch(flag_ft)

{

case 5:test_z();//测量占空比

break;

default:break;

}

break;

default:break;

}

break;} 河池学院2004届本科生毕业论文(设计)简易数字频率计 //////////////////////////////////////////////////////////////////////////////// void INT_0(void)interrupt 0 {

P1=0xff;

key=P1;

Measure();} ///////////////////////////////////////////////////////////////////////////////// void CT1(void)interrupt 3 {

bus1+=1;couter1++;} ///////////////////////////////////////////////////////////////////////////////// void INT_1(void)interrupt 2 {

TR0=~TR0;

INT1_ready=INT1_ready+1;} ///////////////////////////////////////////////////////////////////////////////// void CT0(void)interrupt 1 {

bus0+=1;

//用于记数

couter0++;

//用于1S定时 } ///////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////// void main(void){

P1=0xff;

P2=0xff;//开关状态标志灯灭

IT0=0;

EX0=1;

EA=1;

IP=0x0e;

//设定中断优先级INT0最低,两层嵌套时允许打断按键中断

//显示主循环

for(;;)

{

P2=P2|0xf0;

TH0=0;

TL0=0;

TH1=0;

TL1=0;河池学院2004届本科生毕业论文(设计)简易数字频率计

switch(key)

{

case 0xef:{turn=(unsigned int)F;

DispBuf[3]=turn%10;

turn=turn/10;

DispBuf[2]=turn%10;

turn=turn/10;

DispBuf[1]=turn%10;

DispBuf[0]=turn/10;

Display();

Delay_5m();}

break;

case 0xdf:

{turn=(unsigned int)T;

DispBuf[3]=turn%10;

turn=turn/10;

DispBuf[2]=turn%10;

turn=turn/10;

DispBuf[1]=turn%10;

DispBuf[0]=turn/10;

Display();

Delay_5m();

};

break;

case 0xbf: {

turn=(unsigned int)W;

DispBuf[3]=turn%10;

turn=turn/10;

DispBuf[2]=turn%10;

turn=turn/10;

DispBuf[1]=turn%10;

DispBuf[0]=turn/10;

Display();

Delay_5m();

};

break;

case 0x7f:{

turn=Z;

DispBuf[3]=turn%10;

turn=turn/10;

DispBuf[2]=turn%10;

turn=turn/10;

DispBuf[1]=turn%10;

DispBuf[0]=turn/10;

Display();河池学院2004届本科生毕业论文(设计)简易数字频率计

Delay_5m();

};

break;

default: {

DispBuf[3]=10;

DispBuf[2]=10;

DispBuf[1]=10;

DispBuf[0]=10;

Display();

Delay_5m();

};

break;

}

cycle++;

if(cycle==500)

{

Measure();

cycle=0;} } }

第二篇:基于FPGA的简易数字频率计

EDA 简易数字频计 设计性实验 2008112020327 ** 电子信息科学与技术

物电

电工电子中心2009年5月绘制

2008.6.10 湖北师范学院电工电子实验教学省级示范中心电子版实验报告

简易数字频率计设计

一.任务解析

通过对选择题的分析,认为该简易数字频率计应该能达到以下要求: 1. 准确测出所给的方波信号的频率(1HZ以上的信号)。2. 在显示环节上,应能实现高位清零功能。3. 另外还有一个总的清零按键。

二.方案论证

本实验中所做的频率计的原理图如上图所示。即在一个1HZ时钟信号的控制下,在每个时钟的上升沿将计数器的数据送到缓冲器中保存起来,再送数码管中显示出来。

第2页,共11页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告

在本实验中,用到过几中不同的方案,主要是在1HZ时钟信号的选择和计数器清零环节上:

1. 在实验设计过程中,考滤到两种1HZ时钟信号其波形如下图所

对于上术的两种波形,可以调整各项参数来产生两种1HZ时钟信号。最后通过实验的验证发现第二种波形对于控制缓冲器获得数据和控制计数器清零更易实现。并且,用第二种波形做为时钟信号,可以在很短的高电平时间内对计数器清零,在低电平时间内让计数器计数,从面提高测量的精度。而用第一种波形则不易实现这个过程。

2.在计数器的清零过程中,也有两个方案,分别是能通过缓冲器反回一个清零信号,另一个是在时钟的控制下进行清零。最终通过实验发现,用时钟进行清零更易实现。因为如果用缓冲器反回一个清零信号,有一个清零信号归位问题,即当缓冲器反回一个低电平清零信号时,计数器实现清零,但不好控制让缓器冲的清零信号又回到高电平,否则计数器就一直处于清零状态面不能正常计数了。

三.实验步骤

通过上分析后,实验分为以下几步:

1.1HZ时钟信号的产生(产生该信号的模块如下):

module ones(clk,clkout);input clk;output clkout;parameter parameter N=24000000;n=24;

第3页,共11页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告

reg [n:0]cnt;reg clkout;

always @(posedge clk)begin if(cnt==N)else end endmodule begin cnt=0;

clkout=1;clkout=0;end

end begin cnt=cnt+1;最终产生的信号的波形:

2. 计数模块。其主要公能是在每个被测信号的上升沿自动加一,并且有一个清零信号的输入端,在1HZ时钟信号的高电平时间里进行清零。模块如下:

module count_99999999(sign,clr,b0,b1,b2,b3,b4,b5,b6,b7);input sign,clr;output [3:0]b0,b1,b2,b3,b4,b5,b6,b7;reg [3:0]b0,b1,b2,b3,b4,b5,b6,b7;always @(posedge sign or posedge clr)

if(clr)begin b0=0;b1=0;b2=0;b3=0;b4=0;b5=0;b6=0;b7=0;end else begin if(b0<9)b0=b0+1;else begin b0=0;if(b1<9)

第4页,共11页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告

b1=b1+1;else begin b1=0;if(b2<9)b2=b2+1;else begin

b2=0;

if(b3<9)

b3=b3+1;

else begin

b3=0;

if(b4<9)

b4=b4+1;

else begin

b4=0;

if(b5<9)

b5=b5+1;

else begin

b5=0;

if(b6<9)

b6=b6+1;

else begin

b6=0;

if(b7<9)

b7=b7+1;

else b7=0;

第5页,共11页

湖北师范学院电工电子实验教学省级示范中心电子版实验报告

end

end

end

end

end

end end

end endmodule 如果要访真该模块,要设定较长的访真时间,故在此不进行软件访真,只在实验箱上进行实验。

3. 数据缓冲模块。在每个秒级门控信号的上升沿接收计数器的数据,并送到驱动八个数码管的显示模块里。

module fre_count(clk,clr,b0,b1,b2,b3,b4,b5,b6,b7,a0,a1,a2,a3,a4,a5,a6,a7);input clk,clr;input [3:0]b0,b1,b2,b3,b4,b5,b6,b7;output [3:0]a0,a1,a2,a3,a4,a5,a6,a7;reg clro;reg [3:0]a0,a1,a2,a3,a4,a5,a6,a7;always @(posedge clk or negedge clr)//clk应该为1HZ的信号// begin if(!clr)

begin

a0<=0;a1<=0;a2<=0;a3<=0;a4<=0;a5<=0;a6<=0;a7<=0;end else

第6页,共11页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告

end begin a0<=b0;a1<=b1;a2<=b2;a3<=b3;a4<=b4;a5<=b5;a6<=b6;a7<=b7;end endmodule 在此模块中用了到了<=阻塞赋值的方式。

4.编写控制高位清零的模块,利用在扫描模块中控制SEL的值来实现高位清零。即先从高位开始判断,当只有个位有数据时,SEL只能等于0,当只有个位和十位有数据时,SEL要小于1,依此类推,实现高位清零功能。module scan(clk,a1,a2,a3,a4,a5,a6,a7,sel);input clk;input [3:0]a1,a2,a3,a4,a5,a6,a7;output [2:0]sel;reg [2:0]sel;always @(posedge clk)if({a1,a2,a3,a4,a5,a6,a7}==0000000)sel=0;else if({a2,a3,a4,a5,a6,a7}==000000)if(sel<1)sel=sel+1;else sel=0;else if({a3,a4,a5,a6,a7}==00000)if(sel<2)sel=sel+1;else sel=0;else if({a4,a5,a6,a7}==0000)if(sel<3)sel=sel+1;

第7页,共11页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告

else sel=0;else if({a5,a6,a7}==000)if(sel<4)sel=sel+1;else sel=0;else if({a6,a7}==00)if(sel<5)sel=sel+1;else sel=0;else if({a7}==0)if(sel<6)sel=sel+1;else sel=0;else sel=sel+1;endmodule 5.上述三个模块为本次实验的主要模块。除此,还用到了,译码,数据选择器模块。相应的模块代码省略。

6.所有模块都写完后,就是写顶层文件。

module top(clk,clr,sig_in,a,b,c,d,e,f,g,dp,sel);input clk,clr,sig_in;output [2:0]sel;output a,b,c,d,e,f,g,dp;

wire clk1,clk2,clk3;wire [2:0]sel_sign;wire [3:0] QA,QB,QC,QD,QE,QF,QG,QH;wire [3:0] b0_o,b1_o,b2_o,b3_o,b4_o,b5_o,b6_o,b7_o;wire [3:0] org_data;

第8页,共11页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告

assign sel=sel_sign;assign clk3=clk;

fre_count frequence(.clk(clk2),.clr(clr),.b0(b0_o),.b1(b1_o),.b2(b2_o),.b3(b3_o),.b4(b4_o),.b5(b5_o),.b6(b6_o),.b7(b7_o),.a0(QA),.a1(QB),count_99999999 mycounter(.sign(sig_in),.clr(clk2),.b0(b0_o),.b1(b1_o),.a2(QC),.a3(QD),.a4(QE),.a5(QF),.a6(QG),.a7(QH));.b2(b2_o),.b3(b3_o),.b4(b4_o),.b5(b5_o),.b6(b6_o),.b7(b7_o));

clk_div clksource(.clk(clk3),.clko1(clk1));

ones ones_con(.clk(clk3),.clkout(clk2));scan myscan(.clk(clk1),.a1(QB),.a2(QC),.a3(QD),.a4(QE),.a5(QF),.a6(QG),.a7(QF),.sel(sel_sign));mux81 mymux81(.sel(sel_sign),.a(QA),.b(QB),.c(QC),.d(QD),.e(QE),.f(QF),.g(QG),.h(QH),.out(org_data));

第9页,共11页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告

decode3_8 decode(.org(org_data),.a(a),.b(b),.c(c),.d(d),.e(e),.f(f),.g(g),.dp(dp));

endmodule

7. 写完了全部代码后,就是器件选择,分配引脚,下载程序,最后在实验箱上进行实验。

在实验的验证过程中,用到了DDS函数信号发生器,从其TTL输出端输出各种不同频率的方波信号,接入接简易频率计的被测信号输入端,在八个数码管上显示出相应的测量结果。

四.结果分析

在上述实验过程中,我们选取了若干组不同的TTL输出进行测量,发现当被测信号的频率不小于1HZ时,简易频率计可以精确的测出被测信号的频率。但是,当被测信号小于1HZ时,显示的测量结果在0和1之间跳动,不稳定。分析简易频率计的结构可知,在如下图所示波形关系中,当被测信号的频率小于1HZ时,在秒级门控信号的一个周期内,计数器要么能计数一次,要么计数零次,因而不能准确的测出被测信号的频率。

五.经验总结

1.本实验中的频率计由于其在结构上存在缺限,因而在测量小于1HZ的信号时,会有较大的误码差,在测量频率大于1HZ信号时,也可能存1HZ误差,其原因在于如果在一个秒级门控信号的周期内,被测信号的上升沿的个数正好

第10页,共11页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告

和其周数相同,则测量结果是准确的,如果上升沿的个数比周期数多一,则测量结果比实际值大一。

2.提高测量精度的另一个关键地方在所产生的秒级门控信号的精度。只有所产生的秒级门控信号的低电平时间长度为严格的一秒时,测量结果才会更精确。由于实验箱上所使用的晶振不是严格等于24MHZ,因而可用示波器测出晶振的准确频率后,再在parameter

N=24000000;语句中改变N的值。也可以在实验中逐渐调整N的值,直到测量结果最精确为止。最终我们的实验中,N的值取的是24000351。

3.对于高位清零功能的加入,正是仪器设计人性化的一个体现。如果没有这个功能,再未显示数据的数码管也一直处于工作状态,一则是对资源的乱费,二则是会减少器件的使用寿命。

第11页,共11页

第三篇:verilog简易数字频率计报告

一、实验原理

根据原理图,将计数器模块、显示模块、扫描模块、译码器模块等分别做出。其原理是在1S内用待测信号给计数器计数,并在一秒结束时给计数器清零,计出来用缓存器缓存,在数码管中显示出来。

二、方案论证

一、通过50M的时钟进行计数获得精密的1HZ——计数器用Verilog HDL语言实现在1HZ为底电平时计数——门控电路用或门开启——1HZ为高电平时进行数据锁存与显示——利用Verilog HDL语言使前面的0不显示。

计数器用Verilog HDL语言在写代码时可以用复制粘贴的方法可以简便的实现。通过50M的时钟进行计数获得精密的1HZ后只是经过很短的时间内进行计数器的清零及数据的琐存,并且得到的是1HZ的精密时钟。把锁存的数据进行清0的转换后利用分时扫描,后通过数码管译码显示。

说明:

Cnt9999:0000~9999计数器; Buffer:锁存器; Scan:扫描显示 共8个模块

三、实验步骤

一、计数器模块 计数器模块的仿真波形

二、锁存模块

利用32位的D触发器进行储存计数器送给它的数据。在时钟为上升沿的时候触发保存数据。锁存模块的源代码:

module buffer_32(clr,clear,in,out);input

clear,clr;input[31:0] in;output[31:0] out;reg[31:0]

out;always@(posedge clear or negedge clr)

if(!clr)out<=0;

//else if(clear)out=in;

else out<=in;

endmodule

三、转化清零模块 波形仿真波形

module cnt9999(clr,clk,q,c);

input clr,clk;output c;output [15:0]q;reg c;reg [15:0]q;

always @(posedge clk or negedge clr)begin

if(!clr)begin q[15:0]<=0;c<=1'b0;end

else if(q[15:0]==16'H9999)begin q[15:0]<=0;c<=1'b1;end

else if(q[11:0]==12'H999)begin q[15:0]<=q[15:0]+12'H667;c<=1'b0;end

else if(q[7:0]== 8'H99)begin q[15:0]<=q[15:0]+8'H67;c<=1'b0;end

else if(q[3:0]== 4'H9)begin q[15:0]<=q[15:0]+4'H7;c<=1'b0;end

else begin q[15:0]<=q[15:0]+1'b1;c<=1'b0;end end endmodule

四、扫描显示模块

把存储的数据分别分给8个数码管,利用循环扫描即可显示出所要显示的数据。

扫描显示模块的仿真波形

module scan(clk,q);input clk;output [2:0]q;reg

[2:0]q;

always @(posedge clk)

begin

q=q+1;

end

endmodule

四、引脚分配

五、实验总结

频率就是信号在1s内发生相同变化的次数,简易频率计就是基于这个原理设计的。我们先产生一个低电平为1s,高电平为1/50M秒的周期信号clk,用该信号与待测信号相与作为计数器的输入时钟,并把clk的上升沿作为缓存器的开关,把clk的高电平作为计数器的清零信号,这样就能保证缓冲器中存放的始终是待测信号在一秒内的跳变次数,也即待测信号的频率。

实验的原理尽管很清楚,但真正看到实验现象还是经历了一番波折,在写8选1数据选择器的时候,定义模块端口时,由于疏忽,把四位位宽漏写成了1位,结果在数码管上显示的始终只有0和1两种数字。为了改正这个错误,我把程序的主要模块都检查了一遍,结果不管怎么改实验现象都没有出来,这让我郁闷了很长一段时间,原理明明是对的,为什么就没有效果呢?最后我把整个程序都打印出来,一行一行地检查,最后终于找到了症结所在,就是8选1数据选择器的位宽弄错了!经历了这次错误,让我明白了写程序还是不能大意,8选1数据选择器虽然简单,却因为位宽这个小小的错误让我浪费了很长的时间,检查错误时也因为其简单而没有认真对待。

第四篇:简易数字频率计(数字电路课程设计)

数字电路课程设计报告

1)设计题目

简易数字频率计

2)设计任务和要求

要求设计一个简易的数字频率计,测量给定信号的频率,并用十进制数字显示,具体指标为:

1)测量范围:1HZ—9.999KHZ,闸门时间1s;

HZ—99.99KHZ,闸门时间0.1s;

HZ—999.9KHZ,闸门时间10ms;

KHZ—9999KHZ,闸门时间1ms;

2)显示方式:四位十进制数

3)当被测信号的频率超出测量范围时,报警.3)原理电路和程序设计:

(1)整体电路

数显式频率计电路

(2)单元电路设计;

(a)时基电路

(b)放大逻辑电路

(c)计数、译码、驱动电路

(3)说明电路工作原理;

四位数字式频率计是由一个CD4017(包含一个计数器和一个译码器)组成逻辑电路,一个555组成时基电路,一个9014形成放大电路,四个CD40110(在图中是由四个74LS48、四个74LS194、四个74LS90组成)及数码管组成。

两个CD40110串联成一个四位数的十进制计数器,与非门U1A、U1B构成计数脉冲输入电路。当被测信号从U1A输入,经过U1A、U1B两级反相和整形后加至计数器U13的CP+,通过计数器的运算转换,将输入脉冲数转换为相应的数码显示笔段,通过数码管显示出来,范围是1—9。当输入第十个脉冲,就通过CO输入下一个CD40110的CP+,所以此四位计数器范围为1—9999。

其中U1A与非门是一个能够控制信号是否输入的计数电路闸门,当一个输入端输入的时基信号为高电平的时候,闸门打开,信号能够通过;否则不能通过。

时基电路555与R2、R3,R4、C3组成低频多谐振荡器,产生1HZ的秒时基脉冲,作为闸门控制信号。计数公式:来确定。

与非门U2A与CD4017组成门控电路,在测量时,当时基电路输出第一个时基脉冲并通过U2A反相后加至CD4017的CP,CD4017的2脚输出高电平从而使得闸门打开。1s后,时基电路送来第二个脉冲信号,CD4017的2脚变为低电平,闸门关闭,测量结束。数码管显示即为所测频率。当555第三个脉冲送过来的时候,电路保持间歇1S,第四个脉冲后高电平加至R,使计数器复位。为下一次计算准备。

(4)元件选择。

标号

封装

数量

芯片

CD40110

GK7491AG

陶瓷熔扁平

CD4017

62F2X6KE4

陶瓷熔扁平

74LS00

陶瓷熔扁平

74LS10

陶瓷熔扁平

NE555

K104G4

双列直插型号

显示器

七段共阴数码管

电阻

300Ω

1KΩ

5.1KΩ

10KΩ

100KΩ

1MΩ

10KΩ(滑动)

电容

1000PF

0.1μF

100μF

二极管

1N4148

发光LED

开关

单刀双掷

导线

导线

若干

三极管

9014

电源

12V直流电源

4)电路和程序调试过程与结果:

a)、设计逻辑流程:

b)、理论波形图:

c)、仿真波形图:

1)、时基电路

2)、未、已经过施密特的波形:

d)、误差分析:

本实验的误差来自多方面的原因:一、时基电路NE555的滑动变阻器调节导致误差;二、闸门开放时间与信号输入时间的冲突导致测量不准确;三、整体电路的阻抗、容抗对电路信号的影响。

对于第一点,先计算相关的滑动变阻器的相应阻值大小,然后可以在关闭电源的情况下用万用表测量后才进行测量;第二点有点系统的偶然性;第三点可以尽量减少电路布局,从而减少相应的影响。

5)总结

这个电路多处使用了集成IC芯片,让电路更加简洁明了,并且提高了电路的安全性、可行性,减少了整个电路的功耗和整个电路的布线。但是此电路没有完全地符合实验要求:首先,整个电路没有施密特触发器,输入信号放大电路,数码管的小数点驱动,满位报警电路。因此我首先加入以三极管9014为核心的放大电路;然后用74LS00两个双输入与非门构成施密特触发器,对输入信号进行整形;对于报警电路,由于集成IC没有译码电路引脚,所以选择了一个8输入与非门和一个74LS00结成,这样可以充分考虑到唯一性;还有就是它的计数不是直接显示频率,而是显示一个数字,再与闸门的时候计算才可以得出真正的频率。

总体来说,电路还是存在一点小问题没有得到很好的解决,因为74LS00组成的施密特触发器没有很好地整形波,在示波器上出现脉冲波,还得于计算,可以改为以NE555组成的施密特电路。改用其他的数码管驱动,从而驱动小数点。

通过这次实验,让我认识到数字电路的万千变化,集成IC的推出,大大提高安全性和可行性。理解了科学就是力量。最主要是学习到设计电路的思想以为加强自己的焊接能力。让自己的电子技术更上一层楼。

附录:完整的电路PCB图,完整的源程序名列表(不需要把源程序打印出来,作为电子文档提交)。

附录一:

附录二:

第五篇:简易数字频率计设计报告

EDA技术基础 简易数字频率计 必做实验

电子信息科学与技术

物电学院

2011-06-24 湖北师范学院电工电子实验教学省级示范中心电子版实验报告

简易数字频率计

一.实验要求

用Verilog硬件描述语言设计一个时序逻辑电路,能够对输入的TTL信号进行1s时长计数,将计数结果在数码管上显示,让该电路循环运行,则数码管显示的就是输入信号的频率。

用标准DDS信号发生器输入TTL信号,测试信号的频率与DDS输出设定的频率比较,分析误差以及误差产生的原因。

显示效果好,无闪烁,高位零不显示。

二.方案原理图

总体框图:

三、主要部分原理说明及实验步骤

根据原理图,先把计数器模块、显示模块、扫描模块分别做出。对于计数器模块因为要实现00000000~99999999的计数器,所以要用32bit,即要用

32第2页,共8页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告

个D触发器。从而要用8个数码管进行循环扫描显示。对于1HZ的精密脉冲在低电平时,一方面和被测脉冲通过或门,当被测脉冲为高电平时门电路开启,另一方面通过一个非门把计数器的清零端置1,计数器正常工作开始计数。高电平时对计数器清零的同时,把测得的数据送入BUFFER中进行显示锁存。数码管的扫描时钟由外部提供。在此基础上把前面的0清除。

1、我在该设计中使用了一个或门作为门控电路,当输入时钟clka为低电平时,被测信号clk通过,当输入时钟clka为高电平时,被测信号被阻止。从clka端输入的是一个24M的脉冲,经过1HZ模块处理后生成一秒赫兹信号(如下图)

由这个信号来控制99999999计数器的清零和buffer中数据的更新以及被测信号的通过与阻止

其verilog语言代码如下 module clk_1hz(clk,clked);input clk;output clked;reg clked;reg[31:0]jishu;always @(posedge clk)begin if(jishu==24000000)begin jishu=0;clked=1;end else begin jishu=jishu+1;clked=0;end end endmodule

2、门控电路部分

其verilog语言代码如下

第3页,共8页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告

module mynot(clk_1hz,nclk_1hz);input clk_1hz;output nclk_1hz;assign nclk_1hz=!clk_1hz;endmodule

99999999计数器计数在到达1S的瞬间,1HZ时钟出现上升沿,控制缓存器将此时的计数值锁存起来,然后送出显示。很短一段时间后,1HZ时钟恢复低电平,在这很短的时间内1HZ时钟经非门也完成了计数器的清零,之后计数器又恢复计数状态,进入下一秒的计数。

其verilog语言代码如下 module mynot(clk_1hz,nclk_1hz);input clk_1hz;output nclk_1hz;assign nclk_1hz=!clk_1hz;endmodule

3、计数模块

第4页,共8页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告

99999999计数器是本次实验的关键所在,它的主要功能是:在1hz精密时钟和门控电路的控制下,在1s的时间内,对输入信号进行计数,1s后,由于门控电路的存在,计数器停止计数 其verilog语言代码如下 module cnt99999999(clr,clk,q);input clr,clk;output [31:0]q;reg [31:0]q;always @(posedge clk or negedge clr)begin if(!clr)q[31:0]=0;else if(q[31:0]==31'H99999999)q[31:0]=q[31:0]+32'H66666667;else if(q[27:0]==27'H9999999)q[31:0]=q[31:0]+28'H6666667;else if(q[23:0]==24'H999999)

q[31:0]=q[31:0]+24'H666667;else if(q[19:0]==20'H99999)

q[31:0]=q[31:0]+20'H66667;else if(q[15:0]==16'H9999)

q[31:0]=q[31:0]+16'H6667;else if(q[11:0]==12'H999)

q[31:0]=q[31:0]+12'H667;else if(q[ 7:0]== 8'H99)

q[31:0]=q[31:0]+8'H67;else if(q[ 3:0]== 4'H9)

q[31:0]=q[31:0]+4'H7;else q[31:0]=q[31:0]+1;end endmodule

4、显示数据缓冲buffer的设计

数据缓冲buffer的功能是当用计数器对输入信号计数,这些数据都暂时存在这个里面,每当时钟的上升沿到来的时候,它就向后面的模块输送数据,这样就可以得到相对稳定的显示。

第5页,共8页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告

其verilog语言代码如下

module buff(in,clk,n1,n2,n3,n4,n5,n6,n7,n8);input clk;input [31:0]in;output [3:0]n1,n2,n3,n4,n5,n6,n7,n8;reg [3:0]n1,n2,n3,n4,n5,n6,n7,n8;

always @(posedge clk)begin begin n1=in[3:0];n2=in[7:4];n3=in[11:8];n4=in[15:12];n5=in[19:16];n6=in[23:20];n7=in[27:24];n8=in[31:28];end end endmodule

5、显示部分

由于要用到8个数码管对实验结果进行显示,我们可以设计一个译码模块:

其verilog语言代码如下 module yima(in,a,b,c,d,e,f,g,dp);input

[3:0]in;output a,b,c,d,e,f,g,dp;reg

a,b,c,d,e,f,g,dp;always @(in)begin case(in)

第6页,共8页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告

4'b0000:{dp,g,f,e,d,c,b,a}=8'b00111111;4'b0001:{dp,g,f,e,d,c,b,a}=8'b00000110;4'b0010:{dp,g,f,e,d,c,b,a}=8'b01011011;4'b0011:{dp,g,f,e,d,c,b,a}=8'b01001111;4'b0100:{dp,g,f,e,d,c,b,a}=8'b01100110;4'b0101:{dp,g,f,e,d,c,b,a}=8'b01101101;4'b0110:{dp,g,f,e,d,c,b,a}=8'b01111101;4'b0111:{dp,g,f,e,d,c,b,a}=8'b00000111;4'b1000:{dp,g,f,e,d,c,b,a}=8'b01111111;4'b1001:{dp,g,f,e,d,c,b,a}=8'b01101111;default:{dp,g,f,e,d,c,b,a}=8'b01000000;endcase end endmodule 部分引脚功能的排列如下图所示

数码管的引脚排列 以上5部分就是顶层原理图的主要部分

四、实验总结

1、要用1HZ的精确时钟不能直接接一个外接的信号源,这样的误差太大,只能将一个标准的24M的时钟进行24分频,才能的到相对稳定的时钟信号。

2、数据缓冲部分不能少,如果没有这部分,将得不到想要的结果,数码管上会出现一排乱跳的数字。

3、在整个实验设计过程中,我发现只要弄清楚所需要的几个模块,然后将模块分开来进行生成,设计也并不是想象中的那么难。

第7页,共8页 湖北师范学院电工电子实验教学省级示范中心电子版实验报告

4、在此程序设计中,对各个模块的功能有针对性的设计思路有了一定的提高,对于一个程序的需要哪些功能模块,需要什么样的输入输出,都比以前有了一定的提高。

5、学EDA已经有一学期了,现在对那些原理框图并不陌生了,现在也可以写一些简单的代码。我发现只要我们认真的去学习,虚心的的去请教他人,我们谁都可以把这门课学好。虽然在学习这门课以及做实验的过程中,我们往往会遇到种种困难,但是当实验结果与现象出来的那一刹那,我们就会感受那成功的快乐。

第8页,共8页

下载简易数字频率计c程序清单word格式文档
下载简易数字频率计c程序清单.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    EDA简易数字频率计~课设报告

    EDA课程设计~简易数字频率计 《EDA技术》课程设计报告 题目:简易数字频率计专业:本组成员: 简述 EDA课程设计~简易数字频率计 随着数字电子技术的发展,频率测量成为一项越来越......

    简易疏散程序

    深圳市****公司 车间/部门/仓库简易应急疏散程序一、应急疏散小组 1.组长由本车间/部门/仓库主管****担任。 2.小组成员由本车间/部门/仓库组长****、****担任。 3.在事故发生......

    C语言简易教程

    C语言简易教程 变量(Variable) 现实生活中我们会找一个小箱子来存放物品,一来显得不那么凌乱,二来方便以后找到。计算机也是这个道理,我们需要先在内存中找一块区域,规定用它来存......

    c简易劳动合同范本

    Xxx公司劳动合同用人单位(甲方):职工(乙方): 地址:身份证号码: 法人代表或负责人:联系电话:甲方(单位)因生产(工作)需要,按照国家、省、市有关劳动法律、法规、规章规定,招用(以下称......

    招标分类及简易招标程序

    招标分类原则及简易招标程序 1.0 目的 对适用于房地产项目开发的招投标项目按标底额的大小进行分类,以便在招投标的过程中,根据不同项目采取不同招标形式,使招标工作更加科学......

    C程序实验报告

    工程学院 实 验 报 告课 程 名 称: c程序设计 课 程 代 码: 8234510 学院(直属系): 年级/专业/班: 2010级汽电1班 学 生 姓 名: 学 号: 31201008030 实验总成绩: 任 课 教......

    企业简易注销有哪些程序

    企业简易注销有哪些程序 学习啦【公司变更/注销】 编辑:晓敏 发布时间:2017-03-20 11:09:38 现在有没有关于企业简易的注销程序呢?不少公司都需要做注销了,但是这注销流程大家......

    几个简单的C程序1

    //#标志每个程序的开头,程序最后有功能概括 #include #include main { printf("hello,c");getchar; }//你好c程序 #include main { int a,b,sum;a=1;b=2; sum=a+b; p......