51单片机简易电阻测量仪仿真设计

这篇具有很好参考价值的文章主要介绍了51单片机简易电阻测量仪仿真设计。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

51单片机简易电阻测量仪仿真设计( proteus仿真+程序+报告+讲解视频)

仿真图proteus7.8及以上

程序编译器:keil 4/keil 5

编程语言:C语言

设计编号:S0037

演示视频

基于51单片机的简易电阻测量仪仿真设计( proteus仿真+程序+报告+讲解视频)

单片机最小系统

单片机最小系统,或者称为 最小应用系统,是指用最少的元件组成的单片机可以工作的系统。对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接电源:
STC89C51/52或其他51系列兼容单片机特别注意:对于31脚(EA/Vpp),当接高电平时,单片机在复位后从内部ROM的0000H开始执行,当接低电平时,复位后直接从外部ROM的0000H开始执行,这一点是初学者容易忽略的。

1.主要功能:

电路元件参数RC测量电路的设计

要求:

测量仪的工作原理为:利用振荡电路,将电阻测量转变为与之成一定函数关系频率的测量,再利用单片机对不同频率进行测量和处理,用LCD显示被测量的大小。

测量电阻范围为:≤30KΩ。

测量精度〈±5%。

以下为本设计资料展示图:

2.仿真

开始仿真

开始仿真后可以通过滑动变阻器改变测了电阻值,改动后长按测量按键显示。

测量6000R 实测数值6081R

测量15000R 实测数值15186R

51单片机简易电阻测量仪仿真设计

51单片机简易电阻测量仪仿真设计

3. 程序

51单片机简易电阻测量仪仿真设计

    #include<reg52.h>
    #include<intrins.h>
    #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,含各种框图。

51单片机简易电阻测量仪仿真设计

报告部分内容

1 电阻测试仪的发展历史及研究现状

当今电子测试领域,电阻,电容和电感的测量已经在测量技术和产品研发中应用的十分广泛。 电阻测试发展已经很久,方法众多,常用测量方法如下。电阻测量依据产生恒流源的方法分为电位降法、比例运算器法和积分运算器法。比例运算器法测量误差稍大,积分运算器法适用于高电阻的测量。传统的测量电容方法有谐振法和电桥法两种。前者电路简单,速度快,但精度低;后者测量精度高,但速度慢。随着数字化测量技术的发展,在测量速度和精度上有很大的改善,电容的数字化测量常采用恒流法和比较法。电感测量可依据交流电桥法,这种测量方法虽然能较准确的测量电感但交流电桥的平衡过程复杂,且通过测量Q值确定电感的方法误差较大,所以电感的数字化测量常采用时间常数发和同步分离法。

将一个运算放大器的输出端与其反相输入端直接连接,形成一个电压跟随器; 将基准精密电阻®的一端与被隔离的在线元件(Z↓[x])的一端通过导线连接,基准精密电阻®的另一端与信号源(V↓[i])或者地连接,被隔离的在线元件(Z↓[x])的另一端通过导线与地或者信号源(V↓[i])连接,基准精密电阻®与被隔离的在线元件(Z↓[x])连接的一端同时与运算放大器的同相输入端连接;中国本土测量仪器设备发展的主要瓶颈。尽管本土测试测量产业得到了快速发展,但客观地说中国开发测试测量仪器还普遍比较落后。每当提起中国测试仪器落后的原因,就会有许多不同的说法,诸如精度不高,外观不好,可靠性差等。实际上,这些都还是表面现象,

真正影响中国测量仪器发展的瓶颈为:

测试在整个产品流程中的地位偏低。由于人们的传统观念的影响,在产品的制造流程中,研发始终处于核心位置,而测试则处于从属和辅助位置。关于这一点,在几乎所有的研究机构部门配置上即可窥其一斑。这种错误观念上的原因,造成整个社会对测试的重视度不够,从而造成测试仪器方面人才的严重匮乏,造成相关的基础科学研究比较薄弱,这是中国测量仪器发展的一个主要瓶颈。实际上,即便是研发队伍本身,对测试的重视度以及对仪器本身的研究也明显不够。

面向应用和现代市场营销模式还没有真正建立起来。本土仪器设备厂商只是重研发,重视生产,重视狭义的市场,还没有建立起一套完整的现代营销体系和面向应用的研发模式。传统的营销模式在计划经济年代里发挥过很大作用,但无法满足目前整体解方案流行年代的需求。所以,为了快速缩小与国外先进公司之间的差距,国内仪器研发企业应加速实现从面向仿制的研发向面向应用的研发的过渡。特别是随着国内应用需求的快速增长,为这一过渡提供了根本动力,应该利用这些动力,跟踪应用技术的快速发展。

5. 设计资料内容清单

下载方式见文章开头视频或下方链接

51单片机简易电阻测量仪仿真设计

百度云网盘资料下载链接:

https://docs.qq.com/doc/DS3VsUGdlQnBheExM文章来源地址https://www.toymoban.com/news/detail-425305.html

到了这里,关于51单片机简易电阻测量仪仿真设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 51单片机汽车胎压大气气压测量仪仿真设计_数码管显示(代码+仿真+设计报告+讲解)

    (代码+仿真+设计报告+讲解) 仿真原版本:proteus 7.8 程序编译器:keil 4/keil 5 编程语言:C语言 设计编号:S0018 本课程设计用MPX4115传感器来检测压力参数,ADC0832进行模数转换后,利用单片机AT89C52进行数据处理后,用四个八段数码管显示压力值。压力测量的量程在15.3KPA~114.9KPA,

    2024年02月08日
    浏览(41)
  • 基于单片机的一种风速测量仪的设计与制作

    收藏和点赞,您的关注是我创作的动力     风速、风向的测量在气象预报、环境监测、风力发电、航空航天等领域中有着重要意义。随着传感器技术、微处理器技术和网络通信技术的发展,相比传统的人工观测,数字化、智能化的气象仪器在观测精度、速度和稳定性等方

    2024年01月17日
    浏览(45)
  • 单片机测量NTC热敏电阻温度的方法(含程序代码)

    NTC是负温度系数热敏电阻,随着温度的升高,NTC的阻值会呈非线性的下降。 这里采用100k 3950的热敏电阻,100k代表的是在25℃下的标准阻值,3950是热敏电阻的B值,B值与电阻温度系数正相关,也就是说B值越大,其电阻温度系数也就越大。 网上查找我们所选用NTC对应的R-T对照表

    2024年02月11日
    浏览(37)
  • 51单片机项目(7)——基于51单片机的温湿度测量仿真

    本次做的设计,是利用DHT11传感器,测量环境的温度以及湿度,同时具备温度报警的功能:利用两个按键,设置温度阈值的加和减,当所测温度大于温度阈值的时候,蜂鸣器就会响起,进行报警提示。 同时系统还有一个LCD1602屏幕,用于显示实时的温度湿度,还可以显示温度阈

    2024年02月10日
    浏览(47)
  • 定量分析计算51单片机复位电路工作原理 怎么计算单片机复位电容和电阻大小

    下面画出等效电路图  可以知道单片机内必然有一个电阻RX,为了简化分析,我们假设他是线性电阻(不带电容,电感的支路) 还有一个基础知识: 电容器的充电放电曲线: 还需要知道电容电压的变化是连续的,(高数知识)无法跳变。 一个很大的误区就是认为电容一上电

    2024年02月12日
    浏览(50)
  • 【Proteus仿真】【51单片机】基于电阻应变片电子秤设计

    本项目使用Proteus8仿真51单片机控制器,使用LCD1602、压电传感器、信号放大电路、ADC模块等。 系统运行后,LCD1602显示采集压力值。 B站演示视频:https://space.bilibili.com/444388619 B站演示视频:https://space.bilibili.com/444388619 专注于51单片机、STM32、国产32、DSP、Proteus、ardunio、ESP32、物

    2024年01月19日
    浏览(49)
  • LCR 测量仪使用方法

    LCR 数字电桥又称 LCR 测量仪、LCR 电桥、数字电桥等等。 以HIOKI为例说明(参考说明书): 显示参数选择: 需要根据被测元件选择。 手册上的说明如下: (1)以两个不同的测试频率下损耗因子的变化性来决定。若频率升高而损耗增加,则应选用串联等效电路。若频率升高而

    2024年02月14日
    浏览(61)
  • 圆管在线直线度测量仪的特点

    保定市蓝鹏测控科技有限公司的在线直线度测量仪主要用于圆形产品如无缝钢管、焊管、不锈钢管、圆钢、钢管、线材、陶瓷管等管材、线材、棒材等的直线度、外径及椭圆度检测。圆管在线直线度测量仪是在基于光电检测及直线法原理研发的,它能实现每米直线度尺寸的检

    2024年02月08日
    浏览(38)
  • 基于超声技术的气体流量测量仪设计

    摘要 科学地解决能源三气的计量问题,一直是业界困扰的问题。进入二十一世纪以来,用于测量气体流量的超声波流量计以其无压损、无阻力、量程比宽、受流体限制少等优点受到业界的广泛关注。随着国内人民生活水平的提高,科技不断地进步,控制不断地完善,从而促使

    2024年02月09日
    浏览(31)
  • 51单片机简易电子密码锁

    由于作业需求,在昨天天晚上写了一个通过lcd1602,i2c,eeprom,按键,实现的可以设置密码的简易电子锁,    首先点击k15(回车键)进入  进入后可以点击0-9按键输入6位密码,错误则显示error,5s后重新显示密码输入页面,密码正确则进入。    进入后可以点击Esc键设置密码,进入设

    2024年02月02日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包