单片机最小系统设计报告

单 片 机 最 小 系 统

             

计报告

          

学校:湖南科技大学      

学院:信息与电气工程学院

班级:09级电子一班      

姓名:田  坎             

目     录

1、设计 ……………………………………………………………………   

1.1 主要芯片简介 ……………………………………………………

      1.1.1  HD7279芯片 …………………………………………  5  

      1.1.2  MAX232芯片 …………………………………………  5      

      1.1.3  DS1302芯片 …………………………………………  6  

1.1.4  24C02芯片 …………………………………………   6    

1.2  目的要求 ………………………………………………………         

      1.2.1  目的 …………………………………………………  6     

      1.2.2  任务 …………………………………………………  7     

2.  系统原理 ………………………………………………………………      

          2.1    电源 …………………………………………………  7     

          2.2    复位及时钟电路 ……………………………………  8     

          2.3    八段数码显示管 ……………………………………  9    

          2.4    液晶显示电路 ………………………………………  9     

          2.5    按键电路 ……………………………………………  10     

          2.6    温度测量电路………………………………………   10

2.7    实时时钟电路………………………………………   10

2.8    储存电路……………………………………………   11

2.9    串口…………………………………………………   11

3.   具体步骤 …………………………………………………………    12

4.  设计总结 …………………………………………………………    13

5.   软件设计 …………………………………………………………    13

附录1   材料清单

     

一、摘要:

单片机最小系统设计主要在STC89C52单片机上, 用MAX232芯片实现串口程序下载,用HD7279A片驱动4*4键盘和8位数码管显示,用DS1302实现实时钟电路,用18b20数字温度传感器实现温度的测量,用24C02芯片实现储存电路,液晶以并行通信的方式连接单片机I/O口。软件编程控制数码管显示、液晶显示、实时时钟以及储存电路。

二、关键字:

STC89C52、MAX232、HD279A、24C20、DS1302、18B20、按键、LCD、8段数码管

三、整体结构框图如图所示。

     

    

1.设计

1.1主要芯片简介

       1.1.1  HD7279A

HD7279A是一片具有串行接口的,可驱动8位共阴式数码管(或64只独立LED)的智能显示驱动芯片,该芯片同时还可连接多达64键的键盘矩阵,单片即可完成LED显示、键盘接口的全部功能。

特点:

  1、串行接口,无需外围元件可直接驱动LED

  2、各位独立控制译码/不译码及消隐和闪烁属性

  3、(循环)左移/(循环)右移指令

  4、具有段寻址指令,方便控制独立LED

  5、64键键盘控制器,内含去抖动电路

1.1.2      MAX232

  MAX232芯片是美信公司专门为电脑的RS-232标准串口设计的单电源电平转换芯片,使用+5v单电源供电。

其主要特点如下:

1、符合所有的RS-232C技术标准

2、只需要单一 +5V电源供电

3、片载电荷泵具有升压、电压极性反转能力,能够产生+10V和-10V电压V+、V-

4、功耗低,典型供电电流5mA

     5、内部集成2个RS-232C驱动器

    6、内部集成两个RS-232C接收器

7、高集成度,片外最低只需4个电容即可工作。

1.1.3  DS1302

DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力。电源电压范围:-0.5V…6V

1.1.3   24C02

串行E2PROM是基于I2C-BUS 的存储器件,遵循二线制协议,由于其具有接口方便,体积小,数据掉电不丢失等特点,在仪器仪表及工业自动化控制中得到大量的应用。随着世界上各公司对该器件的开发,市场上推出了许多牌号的24C02器件,甚至还有一些冒牌的24C02器件,这样就使批量生产的单片机控制系统的质量出现时好时坏的问题。笔者经过大量的设计实践和试验摸索找出了24C02在应用中之所以出现数据被冲掉的原因,并总结了一套保护24C02数据安全的软硬件设计方法。

1.1.3    

1.2  目的要求

1.2.1 目的:

   通过对单片机最小系统的研究, 掌握单片机各引脚功能,理解单片机工作过程及原理,以及与各种外部扩展器件的连接,能够自己运用单片机来解决实际问题。

1.2.2 任务:

   根据单片机最小系统的原理图,完成单片机最小系统的焊接以及调试。掌握keil 等单片机相关软件的使用。理解小系统的工作原理,掌握实际运用单片机小系统。

2.   系统原理

电路是由电源、复位电路、串口、八段数码管显示电路、按键及储存电路、时钟电路、温度测量电路、LCD电路等部分组成。

2.1 电源:

                

5V电源电路图

2.2 复位及时钟电路:

         

复位及时钟电路图

    复位电路由按键复位和上电复位两部分组成。STC89系列单片机为高电平复位,通常在复位引脚RST上连接一个电容到VCC,再连接一个电阻到GND,由此形成一个RC充放电回路保证单片机在上电时RST脚上有足够时间的高电平进行复位,随后回归到低电平进入正常工作状态,这个电阻和电容的典型值为10K和10uF。

STC89C52RC使用11.0592MHz的晶体振荡器作为振荡源,由于单片机内部带有振荡电路,所以外部只要连接一个晶振和两个电容即可,电容容量一般在15pF至50pF之间。

2.3  HD72729驱动数码管和按键:

                     数码管及按键电路图

电路包含两个共阴四位8段数码管显示器,使用HD7279驱动。HD7279是一片具有串行接口的,可以同时驱动8位共阴式数码管的智能显示驱动芯片,该芯片还可以连接多达64键的键盘矩阵,单片即可完成全部功能。

2.4 液晶显示电路:

                        液晶电路

电路采用12864液晶显示器,液晶的D(0…7)数据线连接在单片机的P0口上。RS、WR、LCDEN连接在P2.2、P2.3、P2.4上。

2.6 温度测量电路:

       温度测量电路图

2.7实时时钟电路:

实时时钟电路图

2.8 储存电路:、

24c02 储存电路图

2.9 串口:

串口下载电路图

3.   具体步骤

3.1 先按照器件规格要求,找到对应的具体器件,特别是电阻和电容的大小,单片机等各个芯片的缺口要与底座对应。

3.2 按照对应的器件把器件牢固的焊接到板子对应的焊盘上,要注意不要让针脚脱落。

3.3 使用单片机编程软件keil 编写调试所用的程序,比如数码管、时钟程序、液晶显示等。

3.4 检测完所有模块没有问题就说明单片机最小系统制作完成,然后撰写课程设计报告。

六、 设计总结

   单片机最小系统经过我们一段时间的焊接、调试,终于能够达到预定的功能,虽然只是简单的焊接和调试,但从中我们也接触了不少的关于单片机的知识。此次设计让我对单片机有了初步的认识,能够了解单片机工作的模式和具体过程,明白了怎样利用单片机来设计满足自己设定功能的作品,怎样利用单片机来控制系统。同时,这也让我了解到怎样进行单片机编程。还有就是通过具体焊接过程掌握了焊接的技巧,锻炼了自己的焊接能力。掌握了这些就可以在大学期间利用单片机最小系统来拓展功能,制作自己想做的东西,对科研立项等活动有很大的帮助作用。

七、 软件设计

  #include<lcd12864.h>

#include<hd7279.h>

#include<ds1302.h>

#include<at24c02.h>

#include<ds18b20.h>

#include<stdio.h>

#include<top.h>

void display_lcd2()

{

   unsigned char date[]={'2','0',0,0,'.',0,0,'.',0,0,0};

   unsigned char time[9]={0,0,':',0,0,':',0,0,0};

   unsigned char number[4]={' ',' ','0',0},i=2,temp;

   unsigned char tem[7];

   sprintf(tem,"%6.2f",read_ds18b20());

   time[0]=read_time_buf[2]/16+'0';

   time[1]=read_time_buf[2]%16+'0'; 

   time[3]=read_time_buf[1]/16+'0';

   time[4]=read_time_buf[1]%16+'0';

   time[6]=read_time_buf[0]/16+'0';

   time[7]=read_time_buf[0]%16+'0';

   date[2]=read_time_buf[5]/16+'0';

   date[3]=read_time_buf[5]%16+'0';

   date[5]=read_time_buf[4]/16+'0';

   date[6]=read_time_buf[4]%16+'0';

   date[8]=read_time_buf[3]/16+'0';

   date[9]=read_time_buf[3]%16+'0';

   temp=count;

   while(temp)

   {

      number[i]=temp%10+'0'  ;

      temp/=10;

      i--;

   }

   write_12864_cmd(1);

   display_12864(0,0,"日期: ");

   display_12864(1,0,"时间: ");

   display_12864(2,0,"温度:       °C");

   display_12864(3,0,"开机:  ");

   display_12864(0,3,date);

   display_12864(1,3,time);

   display_12864(2,3,tem);

   display_12864(3,5,number);

}

void main()

{

// unsigned char i;

   EA=0;

   delay(200);

   count=read_add(0);

   count++;

   write_add(0,count);

   init_12864();

   init2402();

   lcd_display1();

   hd7279_test();

   write_12864_cmd(0x01);

   EA=1;

   EX0=1;

   while(1)

   {

      Clock_Get_Time(read_time_buf);

      delay(100);

      display_time();

      display_lcd2(); 

   }

}

void int0() interrupt 0

{

   EX0=0;

   switch(read7279(0x15))

   {

      case 58:set_time_date();break;

      case 55:flag=!flag;break;

   }

   EX0=1;

}

附录1  材料清单

      

 

第二篇:基于单片机与PLC智能家居系统设计报告

              PLC课程设计

基于单片机与PLC智能家居系统设计与实现

一、课题设计目的:

  1、家居控制的自动化,智能化;

     2、此设计对于家居生活能达到省事又省心的目的;

     3、进一步加深对PLC的熟练应用,并有效地与单片机结合运用。

 二、课题所用主要元件及作用:

     1、光敏电阻:感测光照;

     2、湿敏电阻:感测湿度;

     3、温度传感器18B20:测量温度;

     4、遥控器:遥控窗帘、收衣杆等;

     5、单片机:采集并处理传感器数据,予PLC输入信号;

     6、PLC:控制家里的一些设备,这里主要用于控制窗户与收衣杆;  

三、课题设计功能:

     1、晚上自动把衣服收存起来,将窗户及窗帘关上<Y9>;

     2、要是天气下雨,自动把衣服收存起来<Y9>;

     3、白天自动把衣服晾出去<Y10>;

     4、本系统可以遥控调式和自动调式;

     5、温度的测试并由数码管显示,当温度高于上限或低于下限时,自动开启空调使室内温度达到一个合适的值。

四、课题设计的主要内容:

1、梯形图:

2、系统示意图:

3、原理图:

4、单片机程序:  

单片机C主要程序程序:

#include <AT89X52.h>

#include <intrins.h > 

#define  uchar unsigned char

#define  uint  unsigned int

#define delayNOP() ; {_nop_() ;_nop_() ;_nop_() ;_nop_() ;} ;

uchar code word[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x20};

uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};

uchar code light[2]={"G:"},shui[3]={"S:%"},tem[4]={"T:.C"};

uchar code  mytab[8] = {0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00} ;

uchar data display[5]={0x00,0x00,0x00,0x00,0x00};

uchar data temp_data[2]={0x00,0x00};

uint  temp;

bit presence;

uchar a1,a2,a3;

sbit ARDA=P1^0;

sbit ARDB=P1^1;

sbit ARDC=P1^2;

sbit EOC=P1^3;

sbit ST=P1^4;

sbit OE=P1^5;

sbit CLK=P1^6 ;

sbit LCD_RS = P2^0 ;             

sbit LCD_RW = P2^1;

sbit LCD_EN = P2^2 ;

sbit DQ=P2^3;

sbit jdq0=P2^4;

sbit jdq1=P2^5;

sbit jdq2=P2^6;

sbit beep=P2^7;

void delayms(int ms)

{

 unsigned char y ;

  while(ms--)

 {

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

  {

   _nop_() ;

   _nop_() ;

   _nop_() ;

   _nop_() ;

  }

 }

}

/*************************1602*****************************************/

bit lcd_busy()

 {                         

    bit result ;

    LCD_RS = 0 ;

    LCD_RW = 1 ;

    LCD_EN = 1 ;

    delayNOP() ;

    result = (bit)(P0&0x80) ;

    LCD_EN = 0 ;

    return(result) ;

 }

void lcd_wcmd(uchar cmd)

{                         

   while(lcd_busy()) ;

    LCD_RS = 0 ;

    LCD_RW = 0 ;

    LCD_EN = 0 ;

    _nop_() ;

    _nop_() ;

    P0 = cmd ;

    delayNOP() ;

    LCD_EN = 1 ;

    delayNOP() ;

    LCD_EN = 0 ; 

}

void lcd_wdat(uchar dat)

{                         

   while(lcd_busy()) ;

    LCD_RS = 1 ;

    LCD_RW = 0 ;

    LCD_EN = 0 ;

    P0 = dat ;

    delayNOP() ;

    LCD_EN = 1 ;

    delayNOP() ;

    LCD_EN = 0 ;

}

void lcd_init()

{

    delayms(15) ;  

    lcd_wcmd(0x01) ;                

    lcd_wcmd(0x38) ;     

    delayms(5) ;

    lcd_wcmd(0x38) ;        

    delayms(5) ;

    lcd_wcmd(0x38) ;        

    delayms(5) ;

    lcd_wcmd(0x0c) ;     

    delayms(5) ;

    lcd_wcmd(0x06) ;     

    delayms(5) ;

    lcd_wcmd(0x01) ;     

    delayms(5) ;

}

void lcd_pos(uchar pos)

{                         

  lcd_wcmd(pos | 0x80) ; 

}

/*************************1602******************************************/

void Delay(unsigned int num)

{

  while( --num ) ;

}

/**********************ds18b20*********************************************/

Init_DS18B20(void)

     DQ = 1 ;    

     Delay(8) ;  

     DQ = 0 ;     

     Delay(90) ;  

     DQ = 1 ;      

     Delay(8) ;

     presence = DQ ;   

     Delay(100) ;

     DQ = 1 ;     

     return(presence) ;

}

 ReadOneChar(void)

{

unsigned char i = 0 ;

unsigned char dat = 0 ;

for (i = 8 ; i > 0 ; i--)

  {

    DQ = 0 ;

    dat >>= 1 ;

    DQ = 1 ;

    if(DQ)

     dat |= 0x80 ;

    Delay(4) ;

  }

    return (dat) ;

}

 WriteOneChar(unsigned char dat)

{

  unsigned char i = 0 ;

  for (i = 8 ; i > 0 ; i--)

  {

    DQ = 0 ;

    DQ = dat&0x01 ;

    Delay(5) ;

    DQ = 1 ;

    dat>>=1 ;

  }

}

 Read_Temperature(void)

{

     Init_DS18B20() ; 

     WriteOneChar(0xCC) ;

     WriteOneChar(0x44) ; 

     Init_DS18B20() ;

     WriteOneChar(0xCC) ; 

     WriteOneChar(0xBE) ; 

     temp_data[0] = ReadOneChar() ;  

     temp_data[1] = ReadOneChar() ;  

}

/*自定义字符写入CGRAM                                   */

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

void  writetab() 

    unsigned char i ;

    lcd_wcmd(0x40) ;            //写CGRAM

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

    lcd_wdat(mytab[ i ]) ;       

}

 Disp_Temperature()

{ uchar i,j;

  display[4]=temp_data[0]&0x0f ;

  display[0]=ditab[display[4]]+0x30 ;    

 

  display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4) ;

  display[3]=display[4]/100+0x30 ;

  display[1]=display[4]%100 ;

  i=display[1]/10;

  j=display[1]%10;

  display[2]=display[1]/10+0x30 ;

  display[1]=display[1]%10+0x30 ;

    if(display[3]==0x30)       

   {

     display[3]=0x20 ;             

     if(display[2]==0x30)     

     display[2]=0x20 ;

   }

     lcd_pos(0x43) ;

     lcd_wdat(tem[0]);

     lcd_wdat(tem[1]);            

     lcd_wdat(display[3]) ;                    

     lcd_wdat(display[2]) ;                    

     lcd_wdat(display[1]) ;       

     lcd_wdat(tem[2]);            

     lcd_wdat(display[0]) ;

     writetab() ;            

     delayms(5) ;

     lcd_pos(0x4b) ;

     lcd_wdat(0x00) ;         

     lcd_wdat(tem[3]);

     if(i>=2&&j>5)

     a1=1;

     else

     a1=0;

}

wendu()

{

  Read_Temperature() ;

  Disp_Temperature() ;

 if(a1==1)

 { jdq1=0;

  beep=0;}

else

   { jdq1=1;

      beep=1;}   

}

/****************************ds18b20***************************************/

/*****************************光照**************************************/

 guangzhao()   

{

    uchar i,shuzi[4];

    uint j;

    TR0=1;

    ARDA=0;

    ARDB=0;

    ARDC=0;

    ST=0;

    ST=1;

    ST=0;

    while(EOC==0);

    OE=1;

    i=P3;

    OE=0;

    j=(255-i)*(3000/255);

    shuzi[0]=j/1000;

    shuzi[1]=j%1000/100;

    shuzi[2]=j%100/10;

    shuzi[3]=j%10;

    if(shuzi[0]==0)

    {shuzi[0]=10;

     if(shuzi[1]==0)

      {shuzi[1]=10;

        if(shuzi[2]==0)

        shuzi[2]=10;}

    }

    lcd_pos(0x00);

    lcd_wdat(light[0]);

    lcd_wdat(light[1]);

    lcd_wdat(word[shuzi[0]]);

    lcd_wdat(word[shuzi[1]]);

    lcd_wdat(word[shuzi[2]]);

    lcd_wdat(word[shuzi[3]]);

    delayms(10);

    if(j<=500)

    a2=1;

    else

    a2=0;

}

/*************************光照******************************************/

/**************************湿度*****************************************/

shidu()

{

    uchar i,shuzi[3],m;

    float j;

    ARDA=1;

    ARDB=0;

    ARDC=0;

    ST=0;

    ST=1;

    ST=0;

    while(EOC==0);

    OE=1;

    i=P3;

    OE=0;

    j=(255-i)/255.0*100;

    m=(int)j;

    shuzi[0]=m/100;

    shuzi[1]=m%100/10;

    shuzi[2]=m%10;

    if(shuzi[0]==0)

    {shuzi[0]=10;

     if(shuzi[1]==0)

      shuzi[1]=10;

    }

    lcd_pos(0x0a);

    lcd_wdat(shui[0]);

    lcd_wdat(shui[1]);

    lcd_wdat(word[shuzi[0]]);

    lcd_wdat(word[shuzi[1]]);

    lcd_wdat(word[shuzi[2]]);

    lcd_wdat(shui[2]);

    delayms(10);

    if(m>=50)

    a3=1;

    else

    a3=0;

}

/**************************湿度*****************************************/

/***************主函数 *********************/

void main()

 {

   TMOD=0x02;

   TH0=0xfe;

   TL0=0xfe;

   ET0=1;

   EA=1;

   lcd_init();

   while(1)

    {

      guangzhao();

      shidu();

      TR0=0;

      wendu();

      if(a2||a3)

      jdq0=0;

      else

      jdq0=1;

   

     }

}

void timer0() interrupt 1

{

   TF0=0;

   CLK=!CLK;

}

5、实物图:

相关推荐