注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

龙的天空

在路上

 
 
 

日志

 
 

基于AT89S51的低频信号发生器(2)  

2010-01-04 20:37:46|  分类: 大学 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

 

7 组装调试

7.1使用的仪器、仪表设备及软件

PC机                      1台

数字万用表                 1台    

示波器                     1台

伟福单片机开发板仿         1台

电烙铁                     1个  

DXP—2004电路设计软件                         

Keil2编程软件

Progisp烧入软件

7.2调试电路的方法和技巧

    7.2.1硬件部分

电路板印制腐蚀完毕之后,首先应检查线路有无断线,确定无断线等印制错误,然后才能焊接元器件。焊接时要先焊跳线,以“从中间到外围,从复杂到简单”的原则焊接电路。焊接完毕后板用万用表检查有无焊接故障,测试每个器件的引脚都焊接无误,连接正常。

安装芯片时第一步安装单片机,然后上电测试ALE口的输出频率是否为1/6晶振频率,以检查晶振电路是否起振,再测试单片机的每个引脚的电位是否达到设计要求,确定单片机安装正确之后,烧入控制程序,用按键控制单片机,用示波器检查输单片机输出口是否有信号输出(也可以在没有使用的接口外接一个发光二极管,在控制程序中书写一个测试程序,以发光二极管的工作状态来查看单片机是否正常工作。;第二步,安装DAC0832芯片,使用万用表测试DAC0832与单片机连接是否正常,电源连接是否完好,然后上电,用万用表检测芯片输出引脚的电流是否有变化,如果DAC0832芯片输出电流正常,则继续安装运放,否则应检查电路。第三步,当DAC0832输出正常时,安装运放,测试其输出波形,如有问题,应检查运放电路。

7.3 测试数据及波形

   7.3.1仿真波形

通过前面的软、硬件设计,整个电路的设计已基本完成,下面将进行正弦波、方波、三角波的仿真与测试。本文中波形信号的仿真是以Proteus 6.5这一款软件为平台,装入波形发生程序,验证硬件电路和程序的正确性。

正弦波的仿真

如图7.1所示,此波形为幅度为5V,频率为500HZ的正弦波,是通过查表转换的方法来实现的。而要实现其他如10HZ、100HZ、1KHZ等频率的波形,则需要调用延时子程序,改变波形发生的时间常数。

 

 

 

 

 

 

 

 

图7.1  正弦波仿真图


7.3.2 三角波的仿真

如图7.2所示,此波形为幅度为5V,频率为500HZ的正弦波,是通过查表转换的方法来实现的。通过调用延时子程序,改变波形发生的时间常数,实现10HZ、100HZ、1KHZ等频率的波形。

 

 

 

 

 

 

 

 

图7.2  三角波仿真图

7.3.3 方波的仿真

如图5.6所示,此波形为幅度为5V,频率为500HZ的方波,通过程序,改变波形发生的时间常数,实现10HZ、100HZ、1KHZ等频率的波形以及占空比的转换。

 

 

 

 

 

 

 

图7.3 方波仿真图

7.4电路故障及排除

电路故障有

1存在断线和接触不良

故障原因:板材打磨过度,是覆铜太薄,焊接中存在问题,存在虚焊。

排除方法:使用万用表测试线路,对存在断线的线路用焊锡或跳线连接,使线路连接正常。

2无法烧入程序

故障原因:使用下载线向单片机内烧入程序时,存在接触不良,PC机有时不能识别单片机,无法烧入程序。

排除方法:

经询问科协同学,了解到实验室提供的下载线电路图有不合理设计,下载线的10号引脚应接地。重新设计下载接口电路后故障排除。

3 故障表现:烧入程序后单片机不能正常运行,ALE引脚测试不到2MHz的正弦信号。

故障原因:晶振电路使用的电容值过大,导致晶振无法起振

排除方法:换用22pF的无极电容,并将晶振电路安装紧凑,解决了无法起振的问题。

4运放故障

故障原因:无法查明

排除方法:经使用示波器检测DAC0832输出电流,确认故障出现在运放电路,但无法查出具体故障原因。导致系统调试失败。

8.总结

这个设计方案是经过多次整改之后才决定使用的,具有设计简单,易于制作,成本低且可以使用软件来代替大量的硬件开销。DAC0832单极性输出电路适用于一个模拟量输出的情况,双极性输出则适用于多模拟量输出。所以选择单极性输出是比较好的选择。最终的电路中没有加入用于检测单片机是否正常工作的LED指示灯,这不利于直观的观察单片机工作正常与否。

尽管制作成果不理想,但还是体会到了课设II核心价值:通过在制作中不断的解决故障,掌握分析问题和解决问题的方法,提高自己解决技术问题的能力。

意见:建议指导老师在给出课题的同时,也提供一些有关的资料或指出大概的研究方向。课设时间比较短暂,了解一个大概的研究方向更有利于学生解决问题。

虽然此次课设结果并不理想,但通过此次课设是我完整的了解和实践了如何设计和制作一个简单的基于单片机电子系统,也是自己再次回顾了C语言的编程知识,尽管自己对程序设计没有达到深入了解的程度,但是通过此次课设为即将开始的毕业设计打下了一定得基础,至少自己懂得了如何调试、如何分析和处理一个数字芯片电路系统的。使自己了解和掌握了很多测试单片机电路的方法,收获很多。

 

9 参考文献

1.王幸之,钟爱琴,王雷,王闪。AT89系列单片机原理与接口技术.北京航空航天大学出版社,2004

2.赵亮,侯国锐.单片机C语言编程与实例.人民邮电出版社

3.张洪润 刘秀英 张亚凡等。单片机应用设计200例。北京航空航天大学出版社,2006

4.求是科技. 单片机应用系统开发实例导航 。人民邮电出版社,2003

 

附程序:

 

#include "AT89X51.h"

typedef unsigned char uchar;

typedef unsigned int uint;

 

uchar code codeplay[256]={0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,0xb1,0xb4,0xb7,0xba,0xbc,0xbf,0xc2,0xc5

,0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd,0xdf,0xe1,0xe3,0xe5,0xe7,0xe9,0xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,0xf5

,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd

,0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf2,0xf1,0xef,0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda

,0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99

,0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51

,0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0x27,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16

,0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00

,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02 ,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15

,0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x38,0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e

,0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66 ,0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80 };

uchar F = 0,V = 0,D = 0;

 

char KEY = 0;

uchar value = 0;

 

void fdelay(uchar N)

{

   unsigned  i;

   for(i=0;i<N*100;i++);

}

/********************************************************************

       延时1毫秒生函数

参数:

       dat:延时时间

 

*********************************************************************/

void delay(uchar dat)

{

       char i;

       while(dat--)

  {

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

  }

}

/********************************************************************

       DAC0832函数

参数:

       datas:输出数据

      

      

*********************************************************************/

int DAC0832(uchar datas)

{

       P0=datas;

}

/********************************************************************

       三角波产生函数

参数:

       v:电压放大倍数

       f:频率改变大小

      

*********************************************************************/

 

void SanJAO(uchar v,uchar f)

{     char i;

    while(P1!=0XFE)

       {

              for(i =0;i<0xff-v;i++)

                     {

                            DAC0832(i);

                            fdelay(f);

                     }

              for(i = 0xff-v;i<0;i--)

                     {

                            DAC0832(i);

                            fdelay(f);

                     }

       }

      

}

/********************************************************************

       正弦波产生函数

参数:

       v:电压放大倍数

       f:频率改变大小

 

*********************************************************************/

void Sin(uchar v,uchar f)

{    char i;

       while(P1!=0XFE)

       {

              for(i =0;i<0xff-v;i++)

                     {

                            DAC0832(codeplay[i]);

                            fdelay(f);

                     }

       }

}

/********************************************************************

       方波产生函数

参数:

       v:电压放大倍数

       f:频率改变大小

       d:占空比改变大小

*********************************************************************/

void FangBo(uchar v,uchar f,uchar d)

       while(P1!=0XFE)

       {

              DAC0832(0xff-v);

              fdelay(f+d);

              DAC0832(0x00+v);

              fdelay(f-d);

       }

      

}

/********************************************************************

       波形切换函数

参数:

       temp:标志位

          0:三角波

          1:正弦波

          2:方波

 

*********************************************************************/

void Change_Form(char temp)

{

      

        if(temp==0) SanJAO(F,V);

       else 

              if(temp==1) Sin(F,V);

               else

                     FangBo(F,V,D);     

        

}

/********************************************************************

       初始化换函数:定时器初始化,0832初始化

   

*********************************************************************/

void Init()

{

        

      EA = 1;                        //允许CPU中断

      ET0 = 1;                      //定时器0中断打开

    TMOD = 0x1;               //设定时器0为模式1,16位模式

      TH0=0x3C;

      TL0=0x0B0;           //设定时值为(50ms)

      TR0 = 1;

}

/********************************************************************

       主函数

 

*********************************************************************/

void main()

{

       uchar flag1 = 0;

 

    Init();

       FangBo(0,0,0);

       while(1)

       {

      

         Change_Form(flag1);

         switch(KEY)

         {

           case 0xfe:

                      flag1 ++;                        //波形切换标志

                            if(flag1 == 3)

                                   flag1 = 0;

                            KEY = 0;

                            break;

              case 0xfd:

                            F++;                                          //频率改变

                            KEY = 0;

                            break;

              case 0xfb:

                            V++;                                          //幅度改变

                            KEY = 0;

                            break;

              case 0xf7:

                   D++;                                          //占空比改变

                            KEY = 0;

                            break;

               default:

                     KEY = 0;

                  break;

              }    

      

       }

}

/********************************************************************

定时器中断处理函数

 

*********************************************************************/

void SCANKEY() interrupt 1 using 1

{

      

    EA = 0;

    TH0=0x3C;

    TL0=0x0B0;                        //设定时值为(50ms)

 

   if((P1&0xff)!=0xff)

              {

             KEY=P1;

             }

 

  EA = 1;

 

}

  评论这张
 
阅读(148)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018