单片机课程设计指导书-课程设计指导手册2012

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机课程设计指导书
西安理工大学电气工程系
2012年7月
第1章单片机最小系统的设计
一、AT89S52 单片机简介
AT89S52是一种低功耗、高性能、基于CMOS技术的8位微控制器,它具有8K在系统可编程Flash存储器,使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品的指令和引脚完全兼容。

其片上Flash允许程序存储器在系统可编程,亦适于常规编程器。

在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高度灵活且有效的解决方案。

AT89S52具有以下标准功能:8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。

此外,AT89S52还可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。

空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。

掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。

1、AT89S系列单片机对一般用户来说,存在下列明显的优点:
(1)片内含Flash存储器
在系统开发过程中,可十分容易地进行程序的修改,大大缩短了系统的开发周期。

同时,在系统工作过程中,能有效地保存一些数据信息,即使外界电源损坏也不影响到信息的保存。

(2)和80C51兼容
89S系列单片机的引脚和80C51是全兼容的,所以当选用89S系列单片机取代80C51时,可以直接进行代换(二者封装一样是前提)。

(3)静态时钟方式
89S系列单片机采用静态时钟方式,故很节能,这对于降低便携式产品的功耗十分有用。

(4)错误编程亦无废品产生
一般的OTP产品,一旦错误编程就成了废品,而89S系列单片机内含Flash存储器,故在出现错误编程之后仍可以重新编程,直到正确为止,并不存在废品。

(5)可以进行反复系统试验
89S系列单片机系统,可反复进行系统试验,每次能编入不同的程序,以保证系统设计达到最优。

且能随用户的需要和发展,多次进行修改,以使系统能不断满足用户的最新要求。

2、AT89S系列单片机的内部结构
AT89S系列单片机的内部结构和80C51相近,是增强型,其主要含有如下一些部件:(1)8031CPU
(2)振荡电路
(3)片内Flash
(4)片内RAM
(5)总线控制部件
(6)中断控制部件
(7)并行I/O接口
(8)串行I/O接口
(9)定时器/计数器
3、AT89S系列与AT89C系列的区别
这两者内核相同,而且管脚也相互兼容,所以在通常情况下能相互代替,不过请注意:下载程序时稍有不同!
AT89C系列需要用并行编程器下载其程序,接线多且复杂;而AT89S系列却能支持ISP 下载,可以在AT89S52的系统板上预留出ISP下载接口,再用廉价且方便的下载线连接电脑USB口就可以利用软件将hex文件下载至AT89S52了。

二、应用单片机最小系统实现基本电子时钟
1、课设目的
(1)掌握51单片机的工作原理及使用方法,学会使用编译环境和下载器(含相关软件),会用其调试和下载程序;
(2)掌握一般硬件电路的设计方法和常用电子元器件的选用原则;
(3)熟悉印制电路板(PCB)的设计过程,掌握常用元件的焊接方法和技巧;
(4)掌握单片机系统的设计过程及其调试过程,增加对实际电路的感性认识;
(5)培养学生发现问题、独立思考并解决问题的能力,最终提高其实践能力。

2、课设内容
本课程设计的内容是利用51单片机最小系统设计一个电子时钟,时钟采用24小时制,设有按键,可设置时钟参数,并利用LCD进行显示。

其具体要求如下:
(A)熟悉硬件电路原理,掌握各部分电路功能,焊接好单片机最小系统;
(B)编写程序,调试LED,实现流水灯控制;
(C)编写程序,调试LCD(显示数字或英文字符),使其显示正常;
(D)编写程序,实现电子时钟显示,时钟采用24小时制。

3、课程设计计划
该次课程设计共一周时间,下面对每一天的安排作出详细规划如下表:
4、设计思路
(1)最小系统
本次课设选用STC89C52RC单片机作为系统核心,其封装是DIP-40。

要使单片机正常工作,就必须有相应的外围电路,能使单片机正常工作的最简化外围电路系统,就称之为:单片机的最小系统,通常包括:电源电路、复位电路、晶振电路等。

最小系统再扩展,可扩展以下一些功能模块:键盘(独立、矩阵)、显示(LED、LCD)、通信(RS232、UART等)、总线(SPI、I2C等)、通用IO(LED、蜂鸣器、继电器等)、前向通道、后向通道等。

(2)显示电路
鉴于液晶显示越来越普遍,故本次课设特选用驱动方便的COG型1602液晶显示模块。

常见的液晶显示模块可以分为:字符型、点阵型等,该1602模块属于字符型液晶。

该模块是一种用5×7点阵图形来显示字符的液晶显示器,其显示容量为2行16个字,故称之为1602。

其14针接口为通用接口:
1号管脚:GND。

模块的接地。

2号管脚:VCC。

模块的供电,+5V供电。

3号管脚:VO。

液晶模块对比度调整端,接正电源时对比度最低,接地时对比度最高,对比度过高或过低都不能使液晶达到最佳显示效果,因此在使用时可以通过一个10K的电位器来调整对比度。

4号管脚:RS。

为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。

5号管脚:RW。

为读写信号线,高电平时进行读操作,低电平时进行写操作。

当RS和RW都为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。

6号管脚:EN。

为使能端,当EN端由高电平跳变成低电平时,液晶模块执行命令。

7~14号管脚:D0~D7。

为8位双向数据线。

此外,该液晶模块还配有背光,所以还有单独的两根背光电源线:红线为正电源,黑线
接地。

注意!该1602模块背光供电电源为4.2V,若要在5V系统中用5V供电的话,需串入一个10欧姆的限流电阻,防止背光模块损坏。

1602液晶模块内的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如下表所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、日文的假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。

1602液晶模块内部的控制器共有11条控制指令,如下表所示:
1602的读写操作以及屏幕和光标的操作都是通过指令编程来实现的。

说明:1为高电平,0为低电平。

指令1:清显示,指令码01H,光标复位到地址00H位置。

指令2:光标复位,光标返回到地址00H。

指令3:光标和显示模式设置。

I/D:光标移动方向,高电平右移,低电平左移;S:屏幕上所有文字是否左移或者右移,高电平表示有效,低电平表示无效。

指令4:显示开关控制。

D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示;C:控制光标的开与关,高电平表示有光标,低电平表示无光标;B:控制光标是否要闪烁,高电平闪烁,低电平不闪烁。

指令5:光标或显示移位。

S/C:高电平时移动显示的文字,低电平时移动光标。

指令6:功能设置命令。

DL:高电平时为4位总线,低电平时为8位总线;N:低电平时单行显示,高电平时双行显示;F:低电平时显示5×7的点阵字符,高电平时显示5×10的点阵字符。

注意!有些1602模块DL定义为:高电平是8位总线,低电平是4位总线。

指令7:字符发生器RAM地址设置。

指令8:DDRAM地址设置。

指令9:读忙信号和光标地址。

BF:忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平则表示不忙,可以进行操作。

指令10:写数据。

指令11:读数据。

一个典型的1602液晶模块与单片机的接口电路如下:
液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要先确认模块的忙标志为低电平,表示不忙,否则此指令失效。

要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,下表是该1602液晶模块的内部显示地址:
注意!比如第二行第一个字符的地址是40H,那么是否直接写入40H就可以将光标定位在第二行第一个字符的位置呢?NO!因为写入显示地址时要求最高位D7恒定为高电平1,所以实际写入的数据应该是:01000000B(0H)+ 10000000B(80H)= 11000000B(C0H)。

(3)软件定时
时钟由定时器T0完成定时。

当时钟晶体振荡器为6MHz时,由于T0的最大定时达不到1s,故为方便计算及实现,取定时0.1s。

这样每0.1s中断1次,中断10次为1s。

0.1s的定时值为3CB0H。

5、参考流程图
第2章单片机系统软硬件调试
一、硬件焊接步骤
在焊接前请同学们认真对照原理图,了解开发板电路原理图(参见开发板说明书)和开发板各器件的对应关系,仔细查看印刷电路板,找到对应元件的功能区后,开始准备元件和工具。

此电路板焊接要求使用25W左右尖烙铁。

1.根据电路元件及电路原理图进行合理布局;
2.将集成电路插座按管脚方向布局;
3.注意电阻、电容、开关以及三极管等布局,电阻色环朝同一方向,电容有字面统一朝外方向,便于查看参数,开关个三级管按相同方向摆放;
4.焊接电阻、电容、开关以及三极管等;
5.每次焊接时,烙铁头与焊盘接触时间不应超过3秒,焊点应饱满。

二、硬件调试步骤
1.焊接完后,检查布局是否正确,特别是集成电路的管脚方向;
2.用万用表测试电源和地是否存在短路现象;
3.测试开发板电源部分器件是否正常;
4.用万用表检查是否存在焊接错误、虚焊等现象;
5.插上AT89S52、液晶和其他集成电路,注意芯片方向;
6.通电,利用硬件测试程序,对焊接电路进行测试;
7.若出现故障,则断电,根据故障现象,找出对应电路部分,进行排除。

三、软件调试
STC单片机ISP下载步骤:
1、安装下载线驱动程序。

见文件:支持STC下载的PL2303HX驱动
2、安装STC单片机ISP下载软件:
见文件:STC烧写软件(中文版).exe
3、编写程序,编译,生成.hex文件备用。

4、双击烧写软件图标,进入软件,如下图:
5、进行设置:
(1)选择STC89C52RC;
(2)点击“Open File”,选择相应路径,打开第三步生成的.hex文件。

如下图:
(3)首先打开电脑的设备管理器,查看USB转TTL设备(下载线)所在的串口号,再选择相应的COM和波特率。

如下图:
(4)用杜邦线连好下载线和实验板:
下载线的GND接实验板的GND;
下载线的TXD接实验板的RXD(P3.0);
下载线的RXD接实验板的TXD(P3.1);
(5)接好线后千万不能先上实验板的电!
应先:点击:Download/下载,
出现下图:
出现:请给MCU上电后,再给实验板上电!
(6)实验板上电后,窗口如下图:
当出现下图时,即代表下载完毕。

即可见调试效果。

附录1 液晶按键测试参考程序
#include<reg52.h>
#include<stdio.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar a;
static uchar address=0x01;
static uchar address_1=0x05;
static uchar address_2=0x41;
uchar XPOS,YPOS;
sbit RS = P2^5; //Pin4
sbit RW = P2^6; //Pin5
sbit E = P2^7; //Pin6
sbit CLK=P3^6; //txd
sbit DATA=P3^5; //RXD
sbit SH_LD=P3^7; //
uchar code table[]={'W','E','L','C','O','M'};
uchar code table_1[]={'W','W','W','.','X','A','-','P','C','B','.','C','N'}; uchar code table_2[]={""};
uchar code table_3[]= {"saosao"};
#define Data P0 //数据端口
/******************************************************************/
/* 函数声明 */
/******************************************************************//********** *****************************************************/
void DelayUs(unsigned char us)//delay us
{
unsigned char uscnt;
uscnt=us>>1;/* Crystal frequency in 12MHz*/
while(--uscnt);
}
/******************************************************************/
void DelayMs(unsigned char ms)//delay Ms
{
while(--ms)
{
DelayUs(250);
DelayUs(250);
DelayUs(250);
DelayUs(250);
}
}
void WriteCommand(unsigned char c)
{
DelayMs(5);//short delay before operation
E=0;
RS=0;
RW=0;
_nop_();
E=1;
Data=c;
E=0;
}
/****************************************************************/
void WriteData(unsigned char c)
{
DelayMs(5); //short delay before operation
E=0;
RS=1;
RW=0;
_nop_();
E=1;
Data=c;
E=0;
RS=0;
}
/*********************************************************************/ void ShowChar(unsigned char pos,unsigned char c)
{
unsigned char p;
p=pos+0x80; //是第二行则命令代码高4位为0x8
WriteCommand (p);//write command
WriteData (c); //write data
}
void InitLcd()
{
DelayMs(15);
WriteCommand(0x38); //display mode
WriteCommand(0x38); //display mode
WriteCommand(0x0f); //display mode
WriteCommand(0x06); //显示光标移动位置 WriteCommand(0x0c); //显示开及光标设置 WriteCommand(0x01); //显示清屏
}
uchar get_data()
{
uchar value=0x00;
uint cnt;
SH_LD=1;
_nop_();
SH_LD=0;
_nop_();
SH_LD=1;
_nop_();
_nop_();
_nop_();
_nop_();
for(cnt=0;cnt<8;cnt++)
{ value = value<<1;
DATA=1;
CLK=1;
_nop_();
_nop_();
CLK=0;
if(DATA)
{
value|=0x01;
}
_nop_();CLK=1;
}
CLK=1;SH_LD=1;
return value;
}
void welcom()
{
uint i,j;
for(i=0;i<6;i++)
{ShowChar(address_1++,table[i]);DelayMs(5);}
for(j=0;j<13;j++)
{ShowChar(address_2++,table_1[j]);DelayMs(5);} }
void welcom1()
{
uint i,j;
for(i=0;i<6;i++)
{ShowChar(address_1++,table_2[i]);DelayMs(5);} for(j=0;j<13;j++)
{ShowChar(address_2++,table_3[j]);DelayMs(5);} }
void charge(uchar date)
{ int i;
switch(date)
{
case 0x10:
for(i=0;i<100;i++);
ShowChar(address++,'1');
break;
case 0x20:
ShowChar(address++,'2');break;
break;
case 0x40:
ShowChar(address++,'3');break;
case 0x80:
ShowChar(address++,'4');break;
case 0x08:
ShowChar(address++,'5');break;
case 0x04:
ShowChar(address++,'6');break;
case 0x02:
ShowChar(address++,'7');break;
case 0x01:
ShowChar(address++,'8');break;
default:
ShowChar(0x00,'_');break;
}
if(address==0x10){address=0x40;}
DelayMs(60);
}
/////////////////////////////////////////////////////////////////
void main(void)
{ uint b=0;
InitLcd();
while(1)
{
DelayMs(15);
a=get_data();
P1 = 0x00;
if(b==0)
{
welcom();
while(a==0x00){a=get_data();} WriteCommand(0x01); //显示清屏
b=1;
}
charge(a);
}
}
附录2 单片机系统电路原理图。

相关文档
最新文档