《单片机课程设计》报告

机械与车辆学院

《单片机课程设计》报告

(20##-20##学年第一学期)

课程设计题目:  水塔水位控制系统

姓名:   

学号:  

班级:  

指导老师:          职称:

时间:

成绩:


目录

一、课程设计性质和目的... 3

二、课程设计的内容及要求... 4

1、硬件设计... 4

2、软件设计... 4

3、功能要求:... 4

三、课程设计的进度及安排... 5

四、设计所需设备及材料... 5

五、设计思路及原理分析... 6

六、流程图及程序编写... 7

(1)根据功能要求画出控制程序流程图。... 8

(2)根据控制程序流程图编写C51程序... 8

七、调试运行... 10

1、软件测试:... 10

2、硬件测试:... 11

八、结果及分析... 12

九、心得体会... 13

十、参考文献... 14

十一、致谢... 14

十二、附录... 15

【1】整流器protel防真原理图:... 15

【2】数字时钟... 16

一、课程设计性质和目的

单片机课程设计是《单片机原理与接口技术》课程与实验结束后的一门综合性实践课。设计一种基于单片机水塔水位检测控制系统。该系统能实现水位检测、电机故障检测、处理和报警等功能,实现超高、低警戒水位报警,超高警戒水位处理。介绍电路接口原理图,给出相应的软件设计流程图和汇编程序,并用Proteus软件仿真。所选题目《水塔水位控制》紧密结合所学的主要内容,加深巩固所学知识,同时对所学内容进行扩展,有一定的深度和广度,能充分发挥学生的能动性和想象力。通过电路设计、安装、调试等一系列环节的实施,提高学生的单片机应用系统的设计能力。

相信本次的设计一定能够给老百姓的生活带来方便,也一定会具有广阔的市场前景,一定能够使我们电子设计能力得到很好的锻炼,使我们的理论和现实生活联系起来!

二、课程设计的内容及要求

1、硬件设计

(1)用80C51设计一个单片机最小控制系统。其中P1.0接水位下限传感器,P1.1接水位上限传感器,P1.2输出经三极管和电阻后接光电耦合器,通过继电器控制水泵,P1.3输出接LED,当出现故障时LED闪烁;当出现故障时报警。

(2)用塑料尺、导线等设计一个水塔水位传感器。其中A电级置于水位10CM处,接5V电源的正极,B级置于水位15CM处,经4.7K下拉电阻接单片机的P1.0口,C电级置于水位的20CM处,经4.7K下拉电阻接单片机的P1.2口。

(3)设计一个单片机至水泵的控制电路。要求单片机与水泵之间用反相器、光电耦合器和继电器控制,计算出LED限流电阻,接好继电器的续流二极管。

2、软件设计

(1)根据功能要求画出控制程序流程图。

(2)根据控制程序流程图编写C51程序

3、功能要求:

(1)水塔水位下降至下限水位时,启动水泵,水塔水位上升至上限水位则关闭水泵。 

(2)水塔水位在上、下限水位之间时,水泵保持原状态。

(3)供水系统出现故障时,自动报警。

表1 水塔水位信号状态

三、课程设计的进度及安排

四、设计所需设备及材料

五、设计思路及原理分析

水塔水位控制原理图见图1,图中两条虚线表示正常工作情况下水位升降的上下限,在正常供水时,水位应控制在两条虚线代表的水位之间。B测量水位下限,C测量水位上限,A接+5V,B、C接地。

图1 水塔水位检测原理图

 水塔无水或水位低于下限水位时,B、C为断开,B、C两点电位为零(低电平“0” ),需要水泵供水,单片机输出低电平,控制电机工作供水。水位上升到B点,B接通,B点电位变为高电平“1”,C开关仍断开,C点仍为低电平,维持现状水泵继续供水。当水位上升到C点时,C接通。这时B、C均接通,B、C两点都为高电平,表示水塔水位已满,需水泵停止供水,单片机输出高电平,电机断电停止供水。水塔水位开始下降,水位在降到B点之前,B点电位为高、C点电位为低,单片机输出控制电平维持不变,仍为高。当水位降到B点以下,B、C两点电平都为低时,单片机输出控制电平又变低,水泵供水。

六、流程图及程序编写

(1)根据功能要求画出控制程序流程图。

(2)根据控制程序流程图编写C51程序

#include<reg51.h>

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;

void delay0_2s(){

  unsigned char i;

  TMOD=0x01;

  for(i=0;i<4;i++){

         TH1=0x3C;

         TL1=0xB0;

         TR1=1;

         while(!TF1);

         TF1=0;

  }

}

void delay_1s(){

  unsigned char i;

  for(i=0;i<5;i++){

         delay0_2s();

  }

}

void main(){

  P1=0xf0;

  while(1){

         P1_3=0;

         if(P1_0==0)//B

         {

                if(P1_1==0)//C

                {

                       P1_2=0;

                       delay_1s();

                }

                else

                {     P1_2=1;//电机

                       P1_3=1;

                       delay0_2s();

                       P1_4=1;

                       delay_1s();

                }

         }

         else

         {

                if(P1_1==1){//C

                       P1_2=1;

                       delay_1s();

                }

                else

                delay_1s();

         }

         }}

七、调试运行

1、软件测试:

运用Protul软件进行仿真检验。在元件库中找到所需要的元器件,把它们按照原理图的构想依次连接起来,反复检查线路会不会出错。待画完图,就可以开始仿真电路图了。给单片机导入预先编程好的程序“.hex”文件,点击仿真。仿真图可以运行,但是电机在B,C都为低电平的情况下没有运转。说明电路有部分地方短路或者断路了,观察仿真图中的电位情况也许可以找到问题的所在。经过多次的检查发现,各点的电位并没有像想象中的那样有什么不妥。现在就要搞清楚仿真中的元器件的所有主要参数是否和实际的参数相符合。查看资料,对于继电器,它本身的线圈电阻是在400欧左右,在查看仿真中的元器件的参数,不难发现原始数据和实际相差很大,它给的是理想线圈,也就是没有内阻。这样就如预期的那样找到电机不转的原因了。原始数据没有进行改变;查找资料,得知光电耦合器的发光二极管的压降为1.15~1.5v,最大电流为60mA,电流传输比CTR为20~70%。通过已知的条件求出每条线路上所需要的电阻大小。对各各元器件的初参数设置完毕,启动仿真,整体像想象中的那样正常工作!软件仿真结束,仿真图里的数值引用到实际电路的焊接中。

2、硬件测试:

焊接完整体的板件,开始测试板子电路是否能够完成所需要的功能。应为电路的原版是根据仿真电路出来的,所以不一定能够一次性就完成设计。 对于板子上的器件来说,有两个是特别容易烧掉的,PNP三极管和4N25光电耦合器。因为它们的工作电压较低和工作电流很小,所以要特别的注意。虽然已经给了足够的保护还是不能太掉以轻心要是烧了就没有其他器件可以换了。

首先,测试光电耦左边能否正常工作。把三极管的B极接于低电平,给予E极高电平,测试两管脚之间的电压降是多少。经测试三极管正常工作,可是光电耦合器的1,2管脚的电压异常偏高。断去电源,用万用表的测试端测试1,2管脚是否击穿,发现并没有完全短路,有可能是封装的时候没有装好。

其次,测试光电耦合器右端是否能正常工作。给继电器加上12v的电压, 用导线短接光电耦合器的4,5号管脚,继电器能发出啪啪声,也就是说明光电耦合器右端能够正常工作。

再次,对整块板进行调试。给光电耦合器两边电路都通上电,给三极管的B端输入一个低电平,继电器不工作。说明光电耦合器无法工作。应当更换光电耦合器;换完光电耦合器后的检测。换完光电耦合器后进行整块板子的调试,给三极管B极一个低电平继电器能够工作。插到单片机上给一个周期性的低电平,继电器能够周期性的发出啪啪声,整体调试通过

八、结果及分析

调试:

将光耦的第二引脚和第四引脚接地,PNP三极管的发射极接+5V电源。然后分别用光耦的第五引脚和+12V电源线接继电器的线圈两端,稍停片刻后,若能听到吧嗒一声,则证明光耦、继电器能够正常工作,然后进行接铜片,用开发板防真,进行水泵实验,电路能够实现表一的真值表功能。

硬件电路如下:

九、心得体会

结束为期两周的单片机课程设计,让我加深了对单片机的理解,由单片机控制系统可以应用到生活中的很多地方,解决生活中的一些简单的用电子控制的问题,使我意识到了单片机的重要性,两周以来,我们分别进行了课程设计的硬件部分的电路焊接和软件部分的电路图的设计和原理图的设计和制作,无论是硬件电路的焊接和软件的设计和仿真都需要我们认真的把每一部分的原理弄懂,并且要把他们连接起来,这个过程,要求我们要很有耐心和认真的心态。由于以前对单片机的理解不够深刻,使我在单片机课程设计的过程中遇到了很多困难,比如说protues的仿真过程中,在调试出问题后,我虚心地请教同学,也得到了同学的热心帮忙,真正让我体会到了虚心使人进步这句话的深刻含义。

十、参考文献

[1] 王静霞 主编,单片机应用技术,电子工业出版社,2009.

[2] 徐玮 主编,C51单片机高效入门,机械工业出版社,2006.

[3] 张永枫 主编,单片机应用实训教程,清华大学出版社,2008

[4] 李常庆 主编,数字电子技术第三版,机械工业出版社,2008

[5]杨素行 主编.模拟电子技术简明教程,高等教育出版社,20##年

十一、致谢

感谢我们的吴明友老师,组员在这两个星期以来对我的辅导和帮助,在我工作过程中对我的支持和配合。

十二、附录

【1】整流器protel防真原理图:

【2】整流器protel防真波形图:

【2】数字时钟

#include<reg52.h>

#define uchar unsigned char //定义无字符变量

#define uint unsigned int//

uchar SMG_duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //是数码管的段选位

uchar SMG_wei[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};  // 是数码管的位选位

sbit k1=P3^0;               //位定义P3.0为启动按钮

sbit k2=P3^1;               //位定义P3.1复位按钮

sbit k3=P3^2;               //位定义P3.2停止按钮

sbit d1=P0^0;               //位定义P0.0为LED灯控制端

uint i,second,minute,n,x,b,c,a,flag1,flag2;

void delay(uchar i);        //延时函数

void XSSHIZHONG();          //显示数字时钟

void DingShi();             //用于定时分钟函数

void delay5ms();            //按键的消抖5ms

void ShiZhong();          //时钟控制函数控制时钟的启动,复位,停止,设定设定的操作

void main()

{

   TMOD=0x12;             // 定时器1工作方式1和定时器0工作方式2

   TH1=(65536-50000)/256;   // 定时时间为50MS  设初值

   TL1=(65536-50000)%256;  

   TR1=0;                   //  开定时器1

   EA=1;                    //  开总中断

   ET1=1;                // 开定时器T1允许位

   EX1=1;                   //   开放外部中断0允许位

   IT1=1;                   //   置外部中断为边沿(下降沿4)触发方式

   P2=0x00;                 //  P2口为段选

   P1=0xff;                   //   P1口为位选

   while(1)

    {

       XSSHIZHONG();

       ShiZhong();

    }

}

void DingShiqing1() interrupt 3 //用定时器1 中断号为3

{

    TH1=(65536-50000)/256;       //定时时间为50MS

    TL1=(65536-50000)%256;       //

     i++;                       //

    if(i==2)                    //  100ms到,即0.1秒,即0.1秒加1

    {

        i=0;

        n++;  

      if(n==10)       //1000ms时n清零

       {

        n=0;

        second++;

       if(second==60)    //   60秒到时,分钟加1,秒钟清零

         {

            second=0;

            minute++;

           if(minute==60) //  60分钟到时,分钟清零

             minute=0;

         }

        }

    }

}

void  weidu1() interrupt 2     //外部中断1

{

     unsigned int z;

      flag1=1;       

      b=second;

      c=n;

      a++;

      if(a==60)

      a=0;

      for(z=0;z<40;z++)

     DingShi();

}

void delay(uchar i)

{

   unsigned char j,k;

   for(k=0;k<i;k++)

   for(j=0;j<255;j++);

}

void XSSHIZHONG()

{

      P1=SMG_wei[6];

       P2=SMG_duan[n];             //显示时钟的0.1秒位

       delay(2);

       P1=SMG_wei[5];

       P2=0x40;                    //  "-"

       delay(2);

       P1=SMG_wei[3];

       P2=SMG_duan[second/10];   //显示时钟的秒的十位

       delay(2);

       P1=SMG_wei[4];

       P2=SMG_duan[second%10];   // 显示时钟的秒的个位

       delay(2);

       P1=SMG_wei[2];

       P2=0x40;                   //       "-"

       delay(2);

       P1=SMG_wei[0];

       P2=SMG_duan[minute/10];   // 显示时钟的分钟的十位

       delay(2);        

       P1=SMG_wei[1];

       P2=SMG_duan[minute%10];   //  显示时钟的分钟的个位

       delay(2);

}

void DingShi()

{

      P1=SMG_wei[6];

       P2=0x00;          

       delay(2);

       P1=SMG_wei[5];

       P2=0x00;         

       delay(2);

       P1=SMG_wei[3];

       P2=0x00;          

       delay(2);

       P1=SMG_wei[4];

       P2=0x00;            

       delay(2);

       P1=SMG_wei[2];

       P2=0x00;              

       delay(2);

       P1=SMG_wei[0];

       P2=SMG_duan[a/10];   // 显示时钟的分钟的十位

       delay(2);        

       P1=SMG_wei[1];

       P2=SMG_duan[a%10];   //  显示时钟的分钟的个位

       delay(2);

}

void ShiZhong()

{

     

         if((a==minute)&&(b==second)&&(c==n)) // 判断是否到了定时的时间

           {

                 if(flag2==1)       //flag2为标志位,在K1启动的时候启动定时

                   {

                      flag2=0;            

                      d1=0;         //定时时间到,LED灯亮

                      minute=0;     //时钟复位,即分钟,秒,0.1秒都清零

                      second=0;    

                      n=0;             

                    }

           }            

        if(k1==0)             //判断是否需要启动时钟

        {

           delay5ms();          //延时消抖5ms

           if(k1==0)

            {

             TR1=1;          //打开定时器1

              if(flag1==1)     //设标志位,只有在按下定时按键才进入这个函数

              {

                  flag1=0;

                 flag2=1;

              }    

            }

        }

        if(k2==0)        // 判断时钟是不是要进行复位

        {

           delay5ms();

           if(k2==0)

            {

               n=0;

              second=0;

              minute=0;

            }

        }

       if(k3==0)         // 判断时钟是不是应该停止

        {                    

           delay5ms();

           if(k3==0)

            {

              TR1=0;     //关闭定时器1

            }

            while(!k3);     

         }

    }

void delay5ms()

{

      uint y;

      TH0=6;

       TL0=6;

     for(y=0;y<20;y++)

       {

          TR0=1;

         while(!TF0);      

}

}

【4】数字时钟仿真电路图

相关推荐