小量程电子秤

baidu123   2010-6-30 13:41 楼主
小量程电子秤(有更详细的资料我已经传到下载频道了 请自己搜索关键字 单片机课程设计小量程电子秤)
正文
一 设计题目:
         小量程电子秤
目的:学习对可编程集成电路(主要指STC51单片机)的编程方法;熟悉74HC573锁存器的使用方法;熟悉ADC0804模数转换器的使用方法;熟悉INA118和OP07运放的使用方法;熟悉悬臂式压力传感器的使用方法;学会构造单片机的最小系统;掌握什么是时钟电路;掌握什么是复位电路;了解电源的设计方法;学会一位数码管的接线方法;练习在万用板上布线;练习电路的手工焊接技术。
二 设计要求:
         设计一个量程为1000g左右的小量程电子秤,要有一定的精度和稳定性,要有显示系统。我要完成定题目,选器件,设计电路,程序编写,焊接电路,完成成品,产品测试,完成报告等一系列工作。要求是可以实现便携式应用,就是说要使设备拿出来就可以用,环境里没有电源也可以用,所以我们要给设备加上供电系统。
三 题目分析:
         我的题目是《小量程电子秤》。我们知道知道电子产品设计的核心方向有两大类一是使用通用性的产品,如:单片机。二是使用专用性的产品,如:专用集成电路。后者工作效率较高,但是价格往往较高,前者虽然专一性较低,但是价格对于我是很有诱惑力的,我不可能为了为了做个电子秤花很多的钱,这不实际,所以我选择了使用STC的51单片机。在传感器方面我挑了一个价格比较合理的量程为1000g的悬臂式压力传感器。对于精度问题的解决,其实只要使用位数高的AD精度就会高,我用的是8位的,精度能达到+4g,其实这个精度并不算高,但是对于学习来说还是够用的的,要做成品的话就不行了。
四 整体构思:
         要做电子秤,首先要有一个数据的采集系统把重量转换成电信号并最终变成数字信号,提供给运算系统,这个过程可以叫做数据的输入。输入的问题解决了,接下来就要有数据的运算处理系统,我用的是一个STC80C51单片机的最小系统,它负责接收输入信号,实现功能转换,还有信号输出,这个构成可以叫做数据的处理。还有就是要有一个输出系统,我们用了一个四位数码管作为输出设备,开始的时候我们为了省钱打算不用给数码管加驱动电路的,但是效果不好,直接把单片机和数码管连在一起后因为51单片机的电流驱动能力不够使得数码管的亮度太低,阳光强一点的话根本看不见数码管显示的是什么,最后我英明果断的决定提高数码管的待遇,忍痛给它配个驱动电路(又加大了预选,好心疼,可是为了性能的优越性该花的还要花),我给他配的是两个74HC573锁存器,这东西又便宜,又简单,这个过程可以叫做数据的输出。所有问题都解决了。什么都全了,可是系统没有能量的话还是不会工作的,所以还要有一个电源系统,单片机的标准电源是5V,可以有0.5V较大电压波动,传感器我用的是5V左右的电源,要求工作时电源要很稳定,所以我加了一个0805稳压芯片,它可以输出一个稳定的5V左右的电压。INA118和OP07这连个运放都要求有+5V和-5V的双电源,所以我用了一个迪龙的DLM05-12D05,它可以实现输入12V电压输出+5V和-5V的两路电压。
五 具体实现:
         1先去查资料,了解我想要做什么东西,别人是怎么做的。
         2 查完资料后,研究我要怎么做这个东西,把方案定下来。
         3 去哈工程那的船舶电子大世界三楼,把要用到的器件全买回来。
         4 把电路焊接好(最简单的描述,最累人的工作)。
         5开始软件编写,并且实现单独的功能在硬件上可以成功实现。
         6 把各个功能模块儿合成到一起,实现一套设备可以有机工作。
         7 对系统开始测试,硬件焊接有问题就重新焊接,软件运行有问题就改写软件。
         8 完成报告。
六 各部分定性说明及定量计算:
本课程设计的总体框架图:
本课程设计的电路图原理图如下页所示:
方块电路图如下:
电源模块原理图如下:
数据采集模块原理图如下:
数据处理模块原理图如下:
数据输出模块原理图如下:
本课程设计的程序框架图:
本课程设计的软件程序源代码如下:
#include "reg52.h"                //包含头文件
#include "math.h"
sbit wei0=P0^0;                //位定义
sbit wei1=P0^1;
sbit wei2=P0^2;
sbit wei3=P0^3;
sbit cs_AD=P3^7;
sbit rd_AD=P3^6;
sbit wr_AD=P3^5;
sbit le_573=P3^4;

#define uint unsigned int                //宏定义
#define ulong unsigned long
#define uchar unsigned char

uchar code shuma[]={                //码表
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e,
0x8e,0xc1,0xc7,0xc7};

ulong xielv=4975;                //定义全局变量
ulong zhong=0;

void init()                //初始化函数
{
        le_573=0;
        wei0=0;
        wei1=0;
        wei2=0;
        wei3=0;
}
void delay_ms(unsigned int a)                //延时函数
{
        unsigned int b;
        unsigned int c;
        for(b=0;b         for(c=0;c<112;c++);
}
void display(ulong shuad)                //显示函数
{
        uchar qian,bai,shi,ge,i;
        qian = (shuad/1000000)%10;
        bai  = (shuad/100000)%10;
        shi  = (shuad/10000)%10;
        ge   = (shuad/1000)%10;
        if(shuad>1010000)
        {
                for(i=0;i<80;i++)
                {
                        P2=shuma[16];                //显示千位
                        wei3=1;
                        delay_ms(3);
                        P2=0xff;
                        wei3=0;
                        wei2=1;                //显示百位
                        P2=shuma[17];
                        delay_ms(3);
                        P2=0xff;
                        wei2=0;
                        wei1=1;                //显示十位
                        P2=shuma[18];
                        delay_ms(3);
                        P2=0xff;
                        wei1=0;
                        wei0=1;                //显示个位
                        P2=shuma[19];
                        delay_ms(3);
                        P2=0xff;
                        wei0=0;                       
                }               
        }
        else
        {
                for(i=0;i<80;i++)
                {
                        P2=shuma[qian];                //显示千位
                        wei3=1;
                        delay_ms(3);
                        P2=0xff;
                        wei3=0;
                        wei2=1;                //显示百位
                        P2=shuma[bai];
                        delay_ms(3);
                        P2=0xff;
                        wei2=0;
                        wei1=1;                //显示十位
                        P2=shuma[shi];
                        delay_ms(3);
                        P2=0xff;
                        wei1=0;
                        wei0=1;                //显示个位
                        P2=shuma[ge];
                        delay_ms(3);
                        P2=0xff;
                        wei0=0;                       
                }
        }
}
uchar readad()                //读AD函数
{
        uchar ADshu;
        cs_AD=1;
        wr_AD=1;
        rd_AD=1;
        cs_AD=0;
        delay_ms(1);
        wr_AD=0;
        delay_ms(1);
        wr_AD=1;
        delay_ms(5);
        rd_AD=0;
        delay_ms(1);
        P1=0xff;
        ADshu=P1;
        rd_AD=1;
        cs_AD=1;
        return ADshu;
}
int main()                //主函数
{
        init();
        while(1)
        {
                zhong=(readad()-17)*xielv;
                display(zhong);
        }
}
七 设计心得体会:

       通过完成这次课程设计,我有了很大的收获。这些天的时间,我过得即忙碌又充实,为了完成一个目标而努力,分析问题,研究问题,解决问题。要靠自己的力量完成这个东西,定题目,选器件,设计电路,程序编写,焊接电路,完成成品,产品测试。通过完成本课程设计,我还很好的复习了过去的一些课程,比如《数字电子技术》,《模拟电子技术》,《微机接口技术》,《单片机技术》,《C语言》等。过去有时觉得学这些东西好像用不着,现在发现学校,老师教我们的每一门课程都是有用的,只有先慢慢积少才能渐渐成多。知识这个东西只要学了,早晚是会用到的。我们现在要做的就是好好学就OK了。
成品照片:
八 参考文献:
1 《数字电子技术基础》主编:阎石 高等教育出版社
      2 《模拟电子技术基础简明教程》主编:杨素行 高等教育出版社
      3  STC89C51 datasheet
4 《单片机原理及应用》 李全利 清华大学出版社
      5  74HC573 datasheet
     6 《单片机的C语言应用程序设计》  马忠梅 北京航空航天大学出版社
      7  ADC0804 datasheet
     8  INA118 datasheet
     9  OP07 datasheet

回复评论 (4)

支持原创!谢谢楼主分享实际成果。
点赞  2010-6-30 14:33
楼主牛。。。。。
点赞  2010-6-30 21:45
围观dddd
点赞  2010-6-30 21:54
(对于精度问题的解决,其实只要使用位数高的AD精度就会高)
精度和分辨率不是一回事。
点赞  2010-7-1 09:26
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复