51单片机简易内阻检测仪仿真设计(仿真+程序+报告+讲解视频)
仿真图.8及以上
程序编译器:keil4/keil5
编程语言:C语言
设计编号:S0037
51单片机简易内阻检测仪仿真设计
演示视频
基于51单片机的简易内阻检测仪仿真设计(仿真+程序+报告+讲解视频)
单片机最小系统
单片机最小系统,或则称为最小应用系统电阻的测量仪器是什么,是指用最少的器件组成的单片机可以工作的系统。对51系列单片机来说,最小系统通常应当包括:单片机、晶振电路、复位电路。下边给出一个51单片机的最小系统电路图。
复位电路:
一、复位电路的用途:单片机复位电路就好比笔记本的重启部份,当笔记本在使用中出现蓝屏,按下重启按键笔记本内部的程序从头开始执行。单片机也一样,当单片机系统在运行中,深受环境干扰出现程序跑飞的时侯,按下复位按键内部的程序手动从头开始执行。单片机复位电路如右图:
二、复位电路的工作原理在书本上有介绍,51单片机要复位只须要在第9引脚接个高电平持续2US就可以实现,那这个过程是怎样实现的呢?在单片机系统中,系统上电启动的时侯复位一次,当按钮按下的时侯系统再度复位,假如释放后再按下,系统就会复位。所以可以通过键盘的断掉和闭合在运行的系统中控制其复位。
开机的时侯为何会复位:在电路图中,电容的的大小是10uF,内阻的大小是10k。所以依照公式,可以算出电容充电到电源电流的0.7倍(单片机的电源是5V,所以充电到0.7倍即为3.5V),须要的时间是10K*10UF=0.1S。也就是说在单片机启动的0.1S内,电容两端的电流时在03.5V降低。这个时侯10K内阻两端的电流为从51.5V降低(串联电路各处电流之和为总电流)。所以在0.1S内,RST引脚所接收到的电流是5V~1.5V。在5V正常工作的51单片机中大于1.5V的电流讯号为低电平讯号,而小于1.5V的电流讯号为高电平讯号。所以在开机0.1S内,单片机系统手动复位(RST引脚接收到的高电平讯号时间为0.1S左右)。
键盘按下的时侯为何会复位:在单片机启动0.1S后,电容C两端的电流持续充电为5V,这是时侯10K内阻两端的电流接近于0V,RST处于低电平所以系统正常工作。当按钮按下的时侯,开关导通,这个时侯电容两端产生了一个回路,电容被漏电,所以在按钮按下的这个过程中,电容开始释放之前充的电量。随着时间的推移,电容的电流在0.1S内,从5V释放到变为了1.5V,甚至更小。按照串联电路电流为各处之和,这个时侯10K内阻两端的电流为3.5V,甚至更大,所以RST引脚又接收到高电平。单片机系统手动复位。
晶振电路:
晶振电路:晶振是晶体振荡器的简称在电气上它可以等效成一个电容和一个内阻并联再串联一个电容的二端网路钳工学上这个网路有两个谐振点以频度的高低分其中较低的频度是串联谐振较高的频度是并联谐振因为晶体自身的特点使得这两个频度的距离相当的接近在这个极窄的频度范围内晶振等效为一个电感所以只要晶振的两端并联上合适的电容它还会组成并联谐振电路这个并联谐振电路加到一个负反馈电路中就可以构成正弦波振荡电路因为晶振等效为电感的频度范围很窄所以虽然其他器件的参数变化很大这个振荡器的频度也不会有很大的变化
晶振有一个重要的参数那就是负载电容值选择与负载电容值相等的并联电容就可以得到晶振标称的谐振频度
通常的晶振振荡电路都是在一个反相放大器(注意是放大器不是反相器)的两端接入晶振再有两个电容分别接到晶振的两端每位电容的另一端再接到地这两个电容串联的容量值就应当等于负载电容请注意通常IC的引脚都有等效输入电容这个不能忽视
通常的晶振的负载电容为15pF或12.5pF假如再考虑器件引脚的等效输入电容则两个22pF的电容构成晶振的振荡电路就是比较好的选择
如上图:晶振是给单片机提供工作讯号脉冲的这个脉冲就是单片机的工作速率例如12M晶振单片机工作速率就是每秒12M其实单片机的工作频度是有范围的不能太大通常24M就不起来了不然不稳定
晶振与单片机的脚XTAL0和脚XTAL1构成的振荡电路中会形成偕波(也就是不希望存在的其他频度的波)这个波对电路的影响不大但会增加电路的时钟振荡器的稳定性为了电路的稳定性起见ATMEL公司只是建议在晶振的两引脚处接入两个10pf-50pf的墙砖电容接地来缩减偕波对电路的稳定性的影响所以晶振所配的电容在10pf-50pf之间都可以的没有哪些估算公式
P0口的上拉内阻:
P0口作为I/O口输出的时侯时输出低电平为0输出高电平为高组态(并非5V,相当于
悬空状态)。也就是说P0口不能真正的输出高电平,给所接的负载提供电压,因而必须接上拉内阻(一阻值联接到VCC),由电源通过这个上拉内阻给负载提供电压。因为P0口内部没有上拉内阻,是开漏的,不管它的驱动能力多大,相当于它是没有电源的,须要外部的电路提供,绝大多数情况下P0口是必需加上拉内阻的。
1.通常51单片机的P0口在作为地址/数据复用时不接上拉内阻。
2.作为通常的I/O口时用时,因为内部没有上拉内阻,故要接上上拉内阻!!
3.当p0口拿来驱动PNP管子的时侯,就不须要上拉内阻,由于此时的低电平有效;4.当P0口拿来驱动NPN管子的时侯,就须要上拉内阻的,由于此时只有当P0为1时侯,才才能使后级端导通。
31脚EA/Vpp接电源:
/52或其他51系列兼容单片机非常注意:对于31脚(EA/Vpp),当接高电平时,单片机在复位后从内部ROM的0000H开始执行,当接低电平时,复位后直接从外部ROM的0000H开始执行,这一点是初学者容易忽视的。
1.主要功能:
电路器件参数RC检测电路的设计
要求:
检测仪的工作原理为:借助振荡电路,将内阻检测转变为与之成一定函数关系频度的检测,再借助单片机对不同频度进行检测和处理,用LCD显示被检测的大小。
检测内阻范围为:≤30KΩ。
检测精度〈±5%。
以下为本设计资料展示图:
2.仿真
开始仿真
开始仿真后可以通过滑动变阻器改变测了内阻值,改动后长按检测键盘显示。
检测6000R实测数值6081R
检测实测数值
3.程序
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^6;
sbit RW=P2^5;
sbit E=P2^7;
sbit R=P1^0;
sbit C=P1^1;
sbit L=P1^2;
sbit A1=P1^3;
sbit A0=P1^4;
#define LCD_data P0
uchar code table1[10]={"R= R"};
uchar code table2[10]={"C= pF"};
uchar code table3[10]={"L= mH"};
uchar code f_table[88]={13,14,15,16,17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100};
uchar code f_correct[88]={9,10, 11, 12, 12, 12, 13, 14, 15, 16, 17, 18, 18, 18, 19, 20, 21, 21, 22, 23, 24, 25, 25, 26, 26, 27, 28, 29, 29, 30, 30, 31, 32, 33, 33, 34, 35, 35, 36, 37, 38, 38, 39, 40, 41, 41, 42, 42, 43, 44, 45, 45, 46, 47, 48, 49, 49, 50, 51, 51, 52, 53, 54, 54, 55, 55, 56, 57, 57, 58, 59, 60, 60, 62, 62, 63, 64, 64, 65, 66, 66, 67, 67, 68, 69, 70, 71, 71,};
uchar a6,a5,a4,a3,a2,a1;
uchar flag;
unsigned long cnt,cnt1;
uchar f_cnt;
/********************************/
void delay_us(); //18us
void delay_ms(uint);
void lcd_init();
void lcd_write_com(uchar com);
void lcd_write_dat(uchar dat);
void lcd_init();
void lcd_display(uchar add,uchar dat);
/***********************************/
void delay_us()
{
uchar x;
for(x=0;x<5;x++);
}
void delay_ms(uint z)
{
uint x,y;
for(x=0;x<z;x++)
for(y=0;y<123;y++);
}
void lcd_write_com(uchar com)
{
E=0;
RS=0;
RW=0;
delay_us();
LCD_data=com;
E=1; //高脉冲写入数据
delay_us();
E=0;
}
void lcd_write_dat(uchar dat)
{
E=0;
RS=1;
RW=0;
delay_us();
LCD_data=dat;
E=1; //高脉冲写入数据
delay_us();
E=0;
}
void lcd_init() //lcd初始化
{
delay_ms(15);
lcd_write_com(0x38);
delay_ms(10);
lcd_write_com(0x0c);
lcd_write_com(0x06);
lcd_write_com(0x01);
delay_ms(2);
}
void timer_init(void) //定时器初始化
{
TMOD=0X51;
PT0=1; /*中断优先*/
TH0=0x3c;
TL0=0xb0;
TH1=0;
TL1=0;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
EA=1;
}
void lcd_display(uchar add,uchar dat) //lcd显示(地址,数据)
{
lcd_write_com(add);
lcd_write_dat(dat);
delay_us();
}
void real_display(void)
{
if(!R)
{
// while(!R);
A1=A0=0;
lcd_display(0x80,table1[0]);
lcd_display(0x80+1,table1[1]);
lcd_display(0x80+8,table1[8]);
lcd_display(0x80+9,table1[9]);
}
else if(!C)
{
A0=0;A1=1;
lcd_display(0x80,table2[0]);
lcd_display(0x80+1,table2[1]);
lcd_display(0x80+8,table2[8]);
lcd_display(0x80+9,table2[9]);
}
else if(!L)
{
A0=1;A1=0;
lcd_display(0x80,table3[0]);
lcd_display(0x80+1,table3[1]);
lcd_display(0x80+8,table3[8]);
lcd_display(0x80+9,table3[9]);
}
if(a6)
lcd_display(0x80+2,0x30+a6);
else
lcd_display(0x80+2,' ');
if(a6||a5)
lcd_display(0x80+3,0x30+a5);
else
lcd_display(0x80+3,' ');
if(a6||a5||a4)
lcd_display(0x80+4,0x30+a4);
else
lcd_display(0x80+4,' ');
if(a6||a5||a4||a3)
lcd_display(0x80+5,0x30+a3);
else
lcd_display(0x80+5,' ');
if(a6||a5||a4||a3||a2)
lcd_display(0x80+6,0x30+a2);
else
lcd_display(0x80+6,' ');
lcd_display(0x80+7,0x30+a1);
}
void correct(void) //误差修正函数
{
uchar i,k;
unsigned long wucha;
if(cnt<100000) //100KHz以内的修正
{
if(cnt>980&&cnt<2100) cnt-=1;
if(cnt>=2100&&cnt<3900) cnt-=2;
if(cnt>=3900&&cnt<4800) cnt-=3;
if(cnt>=4800&&cnt<5700) cnt-=4;
if(cnt>=5700&&cnt<8000) cnt-=5;
if(cnt>=8000&&cnt<9100) cnt-=6;
if(cnt>=9100&&cnt<10900) cnt-=7;
if(cnt>=10900&&cnt<11900) cnt-=8;
if(cnt>=11900&&cnt<13000) cnt-=9;
if(cnt>=13000&&cnt<=100000)
{
k=cnt/1000;
for(i=0;i<88;i++)
{
if(k==f_table[i])
{
cnt-=f_correct[i];
}
}
}
}
if(cnt>100000)
{
wucha=(cnt/1000)*73065/100000;
cnt-=wucha;
}
}
void main()
{
timer_init();
lcd_init();
while(1)
{
if(flag==1)
{
real_display();
flag=0;
}
}
}
void timer0() interrupt 1
{
uchar timer0;
TH0=0x3c; //50ms
TL0=0xb0;
timer0++;
if(timer0==20)
{
TR1=0; //关闭的计数器
EA=0;
cnt=TL1+TH1*256+f_cnt*65536;
correct();
//cnt1=(1e+9)/(2*0.693 *cnt)-20000/2;
if(!R)
{
// while(!R);
cnt1=1000000/(0.2*0.693*cnt)-165;
}
else if(!C)
{
cnt1=1000000000/(0.693*3*510*cnt);
}
else if(!L)
{
cnt1=(1e+9)/(4*3.14*3.14*cnt*cnt*0.05);
}
timer0=0;
a6=cnt1%10000000/100000;
a5=cnt1%100000/10000;
a4=cnt1%10000/1000;
a3=cnt1%1000/100;
a2=cnt1%100/10;
a1=cnt1%10;
flag=1;
TH1=0;
TL1=0;
TH0=0x3c;
TL0=0xb0;
cnt=0;
f_cnt=0;
EA=1;
TR1=1; //打开计数器
}
}
void int1() interrupt 3
{
f_cnt++;
}
4.设计报告
报告格式规范,字数6952,含各类框图。
报告部份内容
1内阻测试仪的发展历史及研究现况
现今电子测试领域,内阻,电容和电感的检测早已在检测技术和产品研制中应用的非常广泛。内阻测试发展早已许久,技巧诸多,常用检测方式如下。内阻检测根据形成恒流源的方式分为电位降法、比例运算器法和积分运算器法。比列运算器法检测偏差稍大,积分运算器法适用于高内阻的检测。传统的检测电容方式有谐振法和电桥法两种。后者电路简单电阻的测量仪器是什么,速率快,但精度低;前者检测精度高,但速率慢。随着数字化检测技术的发展,在检测速率和精度上有很大的改善,电容的数字化检测常采用恒流法和比较法。电感检测可根据交流电桥法,这些检测方式其实能较确切的检测电感但交流电桥的平衡过程复杂,且通过检测Q值确定电感的方式偏差较大,所以电感的数字化检测常采用时间常数发和同步分离法。
将一个运算放大器的输出端与其反相输入端直接联接,产生一个电流追随器;将基准精密内阻®的一端与被隔离的在线器件(Z↓[x])的一端通过导线联接,基准精密内阻®的另一端与讯号源(V↓[i])或则地联接,被隔离的在线器件(Z↓[x])的另一端通过导线与地或则讯号源(V↓[i])联接,基准精密内阻®与被隔离的在线器件(Z↓[x])联接的一端同时与运算放大器的同相输入端联接;中国本土检测仪器设备发展的主要困局。虽然本土测试检测产业得到了快速发展,但客观地说中国开发测试检测仪器还普遍比较落后。每每提起中国测试仪器落后的缘由,还会有许多不同的说法,例如精度不高,外形不好,可靠性差等。实际上,那些都还是表面现象,
真正影响中国检测仪器发展的困局为:
测试在整个产品流程中的地位偏高。因为人们的传统观念的影响,在产品的制造流程中,研制一直处于核心位置,而测试则处于从属和辅助位置。关于这一点,在几乎所有的研究机构部门配置上即可窥其二斑。这些错误观念上的缘由,导致整个社会对测试的注重度不够,进而导致测试仪器方面人才的严重短缺,导致相关的基础科学研究比较薄弱,这是中国检测仪器发展的一个主要困局。实际上,就算是研制队伍本身,对测试的注重度以及对仪器本身的研究也显著不够。
面向应用和现代市场营销模式还没有真正完善上去。本土仪器设备厂商只是重研制,注重生产,注重狭义的市场,还没有构建起一套完整的现代营销体系和面向应用的研制模式。传统的营销模式在计划经济年代里发挥过很大作用,但未能满足目前整体解方案流行年代的需求。所以,为了快速缩小与美国先进公司之间的差别,国外仪器研制企业应加速实现从面向仿造的研制向面向应用的研制的过渡。非常是随着国外应用需求的快速下降,为这一过渡提供了根本动力,应当借助这种动力,跟踪应用技术的快速发展。
5.设计资料内容清单
下载形式见文章开头视频或下方链接
百度云云盘资料下载链接: