基于avr单片机的频率计的仿真原理图
俺毕业设计的小玩意.也许有人可以拿去玩.
当时刚出毕业选题就赶紧的选了这个简单的.免得以后为毕业设计费神.
这是最初的,后来给学校也是交的这个. 花了三天时间.
//*********************11月29日开始毕业选题
读了一点频率计原理,高频记数,低频测周期 规划了一下大体,坚决不用老师指定的51,
//*********************11月30日开始写代码
凑合着开始了,偏差很大,很无聊,晚上跟123JJ在51hei灌水,灌了阵找到思维了,继续写,基本完成
//*********************12月1日调试
写了个串口上位机对数据进行分析和记录,方便多了.仔细的调了下.不管他效率和规范了,出结果了就要得,马虎的收工了.
16MHz晶振,范围1Hz--5MHz,软件仿真测周期误差<1/8us.计数误差最大可能1hz. 当然液晶显示误差就大多了.显示位数有限.随便忽悠一下, 可以给老师交差了.前端信号处理和pcb以后再弄.
后来前端处理参照冬瓜哥的精华帖和建议,把CD4069作运放用.
感谢冬瓜哥给我打板,搭顺路车.
后来在寒假发神经又琢磨了一下,修改下代码,加上些别的东西,反正资源还足够,有些作了测试,有些只是空想,规划和写代码,没有测试.脉宽和占空比,电压表,示波器,欧姆表,信号发生器,温度计,电容表,电感表,逻辑仪,红外分析,弄了5,6天又停了,人太懒.再后来又忘干净了,只记得电容表是测充电时间.
再后来,写毕业论文,网上下了n多资料和论文用来copy,弄的电脑很乱,写到一半,实在太乱,文件整理中,大把的删文件夹,一不小心把软件都删了,还好在qq群共享里留下了这个最初版本.好险.差点作无用功.
下面是智能频率计的原理图是用ad画的.
下面是主程序的源程序:
#ifndef main_c //test ok
#define main_c
#endif
#include "main.h"
//************************全局变量
volatile uint t0_cont;
volatile uint t1_cont;
volatile uchar flg1; //
//-------------------------------------------------------------------------
// 测试函数 用来初始化
//-------------------------------------------------------------------------
void test()
{
send_str( "pinlvji" ); //完成后把所有串口去掉
showstr( "cymometer", 1, 1, 9 ); //液晶显示
// showstr( "1KHz", 12, 1, 4 );
showstr( "Hz", 14, 2, 2 );
}
//-------------------------------------------------------------------------
//mcu初始化 端口 定时器 中断 外中断 变量
//-------------------------------------------------------------------------
void mcu_init()
{
//******************端口
data_direc = out; //输出
DDRB = out; //输出
DDRC = out; //输出
PORTC = 0X00; //输出0
DDRB=0XE0; //输入口
PORTB=0XE9;
//********************定时器
TIMSK |= 0x12; //定时中断允许位 只允许两个匹配
}
//-------------------------------------------------------------------------
// 主函数
//-------------------------------------------------------------------------
int main()
{
uchar f_t; //用测频还是测周
//******************
mcu_init(); //初始化
usart_init( 57600 ); //初始化
send_str( "com ok" ); //完成后把所有串口去掉
yj_set( 0x38, 0x0f, 0x06 ); //初始化
clearall(); //初始化
mzd_on(); //开中断
#if debug
test();
#endif
while ( 1 )
{
if ( !( PINB& ( 1 << 3 )))
{
refish(); //刷新所有的东西
f_t = hz_try(); //估计范围 1k
if ( f_t )
{
cl_f(); //频率法
}
else
{
cl_t(); //周期法
}
}
}
return 1;
}
复制代码
cale.c
#ifndef cale_c
#define cale_c
#include "main.h"
//-------------------------------------------------------------------------
// //周期法 先笨方法
//-------------------------------------------------------------------------
void cale_t( uchar* back )
{
ulint count_all; //存放周期 max 16m min 16k
uint z_sh;
ulint y_sh;
uchar test;
//*******************整数小数分离
count_all = t1_cont * 50000+TCNT1;
if(count_all>max_t)
count_all=max_t;
z_sh = max_t / count_all;
#if pc
y_sh=max_t-count_all*z_sh;
y_sh*=10;
count_all/=100;
#else
y_sh = ( max_t % count_all )* 1000;
#endif
//*******************整数计算部分
*back++ = z_sh / 100;
z_sh = z_sh % 100;
*back++ = z_sh / 10;
*back++ = z_sh % 10;
//***************小数计算
z_sh = y_sh / count_all;
*back++ = z_sh / 100;
z_sh = z_sh % 100;
*back = z_sh / 10;
z_sh = z_sh % 10;
//************做四舍五入计算
test=0;
if ( z_sh >= 5 )
{
send_char(z_sh);
*back += 1; //
if ( *back == 10 )
{
test++;
*back-- = 0;
*back += 1;
if ( *back == 10 )
{
test++;
*back-- = 0;
*back += 1; //
if ( *back == 10 )
{
test++;
*back-- = 0;
*back += 1; //
if ( *back == 10 )
{
test++;
*back-- = 0;
*back += 1;
}
}
}
}
}
back-=(4-test);
//****************转到ascii码
for ( test = 5; test > 0; test-- )
{
*back++ = * back + 0x30;
}
back-=5;
//****************插进小数点
back[5] = back[4];
back[4] = back[3];
back[3] = '.';
//****************去掉不要的0
for ( test = 3; test > 0; test-- )
{
if ( *back == 0x30 )
{
*back++ = * back - 0x30;
}
else
{
break;
}
}
}
//-------------------------------------------------------------------------
// //记数法
//-------------------------------------------------------------------------
void cale_f( uchar* back )
{
ulint count_all;
uchar test;
count_all = t1_cont * 50000+TCNT1; //原始值
//*****************计算 笨方法计算
*back++ = count_all / 1000000; //最高位
count_all = count_all % 1000000; //去掉最高位
*back++ = count_all / 100000; //100k位
count_all = count_all % 100000; //去掉
*back++ = count_all / 10000;
count_all = count_all % 10000;
*back++ = count_all / 1000;
count_all = count_all % 1000;
*back++ = count_all / 100;
count_all = count_all % 100;
*back++ = count_all / 10; //十位
*back = count_all % 10; //个位
back = back - 6;
//转到ascii字符
for ( test = 7; test > 0; test-- )
{
*back++ = * back + 0x30;
}
back = back - 7; //指针退回
//处理前面的0
while ( *back == 0x30 )
{
*back++ = * back - 0x30;
}
}
#endif
上一篇:avr单片机流水灯和按键抗干扰
下一篇:avr单片机流水灯的程序
推荐阅读
史海拾趣
Bytes公司自成立以来,始终坚持以技术创新为核心竞争力。公司早期便投入大量研发资源,开发出一款具有划时代意义的电子产品,迅速在市场上占据一席之地。随着技术的不断进步,Bytes公司不断推出更新换代的产品,满足消费者日益增长的需求。同时,公司还积极与高校、科研机构合作,共同研发新技术,为公司的持续发展提供源源不断的动力。
在国内市场取得一定成绩后,Bel Power Solutions开始积极拓展国际市场。公司通过与全球知名企业的合作,成功将产品打入国际市场,并赢得了良好的声誉。同时,公司还积极寻求与系统集成商、分销商等建立长期稳定的合作关系,共同开拓市场。这些合作伙伴关系的建立,不仅为公司带来了更多的商业机会,还提升了公司的品牌影响力和市场份额。
2001年,Everett Charles Technologies (Shenzhen) Limited(ECT深圳)正式成立,成为Dover集团在中国的全资子公司。ECT深圳的成立,不仅为ECT在中国市场的业务拓展提供了有力支持,也为公司进一步拓展亚洲市场奠定了基础。多年来,ECT深圳凭借卓越的产品质量和服务水平,赢得了众多客户的信赖和支持,成为ECT在亚洲地区的重要生产基地。
在快速发展的同时,A-BRIGHT公司深知品质的重要性。公司加大了对品质管理的投入,引入了先进的生产线和检测设备,并建立了严格的质量管理体系。通过持续改进和优化生产流程,A-BRIGHT的产品质量得到了显著提升,赢得了客户的信任和好评。
在发展过程中,BELDEN公司积极实施国际化战略,不断拓展海外市场。公司在全球范围内设立了多个分支机构和销售网络,覆盖了北美、欧洲、亚洲等多个地区。通过与国际知名企业的合作与交流,BELDEN不断引进先进的技术和管理经验,提升了自身的研发能力和管理水平。同时,公司还针对不同地区的市场需求,推出了定制化的产品和服务,赢得了广大客户的信任和好评。
在20世纪初,BELDEN公司在技术创新方面取得了显著突破。公司不仅将塑料绝缘材料应用于电线和电缆制造,还着眼于精密和高质量产品的需求,致力于高附加值的绝缘材料、电缆、防护和护套材料的生产。这些技术创新使得BELDEN的产品在性能和质量上都有了显著提升,进一步巩固了公司在市场中的地位。同时,公司还不断扩大产品线,增加了橡胶绝缘材料等多种新产品,满足了不同客户的需求。
数字电视标准迟到3年终有定论 晨报讯(记者 刘映花)数字电视地面传输标准在难产了3年多之后,有消息说在本月底就能公布最终结果,清华大学标准已经胜出,随后将启动为期一年的大规模商业测试。与标准同时启动的,则是一个至少价值千亿元的庞 ...… 查看全部问答∨ |
|
试着layout一回,使用的软件是PADS layout 2005 sp1。据同事说这个软件不算稳定,用时心里也有点虚,不过上手的时候用的就是这个版本,就没管稳定不稳定了。 先是布局,板子不大,45mm*75mm的面积,因为背面是电池盒,所以元件基本在TOP层。最开始 ...… 查看全部问答∨ |
|
内容简介: 双面板布线技巧 模拟和数字布线的基本相似之处及差别 寄生元件危害最大的情况 AD 转换器的精度和分辨率增加时使用的布线技巧 如何使用工具确定与电路布线有关问题 传感系统的布线 对于电流回路,需要注意如下基本事项 1. 如果 ...… 查看全部问答∨ |
欢迎讨论 一个LED的N种玩法(一)——让LED闪起来https://bbs.eeworld.com.cn/viewthread.php?tid=103121 一个LED的N种玩法(二)——渐变https://bbs.eeworld.com.cn/viewthread.php?tid=103168 一个LED的 ...… 查看全部问答∨ |
2440里面基于ZC301的摄像头的QT4.5上显示视频的问题 要做个基于S3C2440的视频跟踪的东西,但目前遇到的问题太多了,现在是摄像头的视频提取与显示的方法未必对,下面是一部分主要的程序,肯定有许多地方是不合适地,希望大家能指教一下,目前下面的程序的问题是图片刷新很慢,并且只能刷新一段时间, ...… 查看全部问答∨ |
|
void UART3Init(void){ GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RC ...… 查看全部问答∨ |