南京信息工程大学
单片机原理课程设计报告
设计题目: 直流数字电压表设计 专业班级: 测控技术与仪器 学生姓名:
学生学号:
指导老师:
成 绩:
二○一三年 六 月 二十 日
一、设计任务、目的与要求
1
1.1 设计任务
通过STC89S52单片机与ADC0809、1602液晶等原件设计一个一般精度的三位半数字电压表。
1.2 设计目的
1、通过动手实践在理论学习的基础上更加理解51单片机的应用
2、提高动手能力,为将来就业奠定基础
3、了解掌握相关软硬件应用软件,如KEIL、ALTIUM DESIGNER等
4、熟悉应用开发基本流程,学会查询相关芯片资料并自主学习应用
1.3 设计要求
在已有相关元器件基础上,通过查询相关资料并在理解单片机相关知识基础上,能自主设计相关硬件电路,在万能板上布局相关器件并动手焊接,并通过KEIL软件编程,烧录到51单片机芯片中,使系统能成为独立工作的三位半数字电压表。
二、系统总体方案设计
2.1 系统组成
系统包括电源电路模块、单片机最小系统模块、ADC0809与单片机接口电路模块、液晶显示模块。
2.2 系统工作原理
系统核心部分是ADC0809模数转换模块。只要通过AD转换,将数据送给单片机,单片机通过数据处理再送到1602液晶显示。
ADC0809是带有8位A/D转换器、8路多路开关以及微处理机兼容的控制逻辑的CMOS组件。它是逐次逼近式A/D转换器,可以和单片机直接接口。
1)ADC0809的内部逻辑结构
由下图可知,ADC0809由一个8路模拟开关、一个地址锁存与译码器、一个A/D转换器和一个三态输出锁存器组成。多路开关可选通8个模拟通道,允许8路模拟 2
量分时输入,共用A/D转换器进行转换。三态输出锁器用于锁存A/D转换完的数字量,当OE端为高电平时,才可以从三态输出锁存器取走转换完的数据。
(2).ADC0809引脚结构
ADC0809各脚功能如下:
D7-D0:8位数字量输出引脚。
IN0-IN7:8位模拟量输入引脚。
VCC:+5V工作电压。
GND:地。
REF(+):参考电压正端。
REF(-):参考电压负端。
START:A/D转换启动信号输入端。
ALE:地址锁存允许信号输入端。
(以上两种信号用于启动A/D转换)
EOC:转换结束信号输出引脚,开始转换时为低电平,当转换结束时为高电平。 OE:输出允许控制端,用以打开三态数据输出锁存器。
CLK:时钟信号输入端(一般为500KHz)。
A、B、C:地址输入线。
3
ADC0809对输入模拟量要求:信号单极性,电压范围是0-5V,若信号太小,必须进行放大;输入的模拟量在转换过程中应该保持不变,如若模拟量变化太快,则需在输入前增加采样保持电路。
地址输入和控制线:4条
ALE为地址锁存允许输入线,高电平有效。当ALE线为高电平时,地址锁存与译码器将A,B,C三条地址线的地址信号进行锁存,经译码后被选中的通道的模拟量进入转换器进行转换。A,B和C为地址输入线,用于选通IN0-IN7上的一路模拟量输入。通道选择表如下表所示。
4
数字量输出及控制线:11条
ST为转换启动信号。当ST上跳沿时,所有内部寄存器清零;下跳沿时,开始进行A/D转换;在转换期间,ST应保持低电平。EOC为转换结束信号。当EOC为高电平时,表明转换结束;否则,表明正在进行A/D转换。OE为输出允许信号,用于控制三条输出锁存器向单片机输出转换得到的数据。OE=1,输出转换得到的数据;OE=0,输出数据线呈高阻状态。D7-D0为数字量输出线。
CLK为时钟输入信号线。因ADC0809的内部没有时钟电路,所需时钟信号必须由外界提供,通常使用频率为500KHZ,
VREF(+),VREF(-)为参考电压输入。
2. ADC0809应用说明
(1). ADC0809内部带有输出锁存器,可以与AT89S51单片机直接相连。
(2). 初始化时,使ST和OE信号全为低电平。
(3). 送要转换的哪一通道的地址到A,B,C端口上。
(4). 在ST端给出一个至少有100ns宽的正脉冲信号。
(5). 是否转换完毕,我们根据EOC信号来判断。
(6). 当EOC变为高电平时,这时给OE为高电平,转换的数据就输出给单片机了。
三、系统硬件设计
3.1电源电路设计
BT1+6vGND(C?)
5
3.2单片机最小系统
(U?)
C1(C?)22uf
VCC
+1
3.3 液晶显示电路
3.4单片机与ADC0809接口电路
6
3.5系统整体硬件原理图
四、系统软件设计
4.1 系统程序设计
系统软件设计包括ADC0809数据采集程序设计、1602液晶显示程序设计、延迟子程序
7
设计,其中ADC0809数据采集程序是整个系统程序核心,也是最难的,采用中断判断采集结束信号再由单片机进行处理。
4.2 系统源程序
4.2.1系统主函数
#include<reg52.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
#define _NOP_ _nop_()
#include"1602.h"
#include"delay.h"
#include"intrins.h"
sbit ST=P2^5;
sbit OE=P2^3;
sbit EOC=P3^2;
sbit ALE=P2^7;
uchar value=0;
float voltage2=0;
uchar si=0;
uint sun2=0;
char v2[5];
uchar flag;
void Start_ADC0809();
uchar str1[11]="dianyazhi";
void adc0809_init()
{
8
EA=1;//开总中断 TCON=0x01;
EX0=1;//开外部中断0
ST=0;
}
void main()
{ //uint i;
adc0809_init();
Start_ADC0809(); DelayUs2x(2); lcd_init(); delay(1); lcd_zifu(str1,0x01); while(1) OE=0; ALE=0; { _NOP_;_NOP_; OE=1; value=P0; OE=0; _NOP_;_NOP_; if(flag==1) { flag=0; voltage2=(float)value*5/256; 9
sprintf(v2,"%5.2f",voltage2); lcd_zifu(v2,0x46); }
}
}
/*----------------------------------
启动ADC0809
-----------------------------------*/
void Start_ADC0809()
{
_NOP_;
ST=0;
ALE=0;
_NOP_;
ST=1;
ALE=1;
_NOP_;
_NOP_;
ST=0;
ALE=0;
_NOP_;
}
/*----------------------------------
读ADC0809结果
-----------------------------------*/
10
void In0() interrupt 0 using 0 {
flag=1;
}
4.2.2
#include<reg52.h>
#include<intrins.h>
#include"1602.h"
#include"delay.h"
#define uchar unsigned char #define uint unsigned int sbit rs=P3^0;
sbit rw=P3^1;
sbit en=P3^3;
void lcd_1602(uchar comm); void lcd_write(uchar dat); bit lcd_busy();
void delay(uchar); void lcd_1602(uchar comm);
void lcd_data(uchar *p,uchar wei);
bit lcd_busy();
sbit busy=P1^7;
/***************************** 1602液晶写命令函数
参数:
返回值:无
11
******************************/ void lcd_1602(uchar comm) {
while(lcd_busy());//查忙 rs = 0;
rw = 0;
en = 0;
_nop_();
P1 = comm;
_nop_();
en = 1;
_nop_();
_nop_();
en = 0;
}
/***************************** 1602液晶写数据函数
参数:
返回值:无
******************************/ void lcd_write(uchar dat)
{
while(lcd_busy());//查忙 rs = 1;
rw = 0;
en = 0;
_nop_();
12
}
P1= dat; _nop_(); _nop_(); en = 1; _nop_(); _nop_(); en = 0;
/***************************** 1602液晶初始化函数
参数:无
返回值:无
******************************/ void lcd_init()
{
lcd_1602(0x38); delay(3); lcd_1602(0x38); delay(3); lcd_1602(0x38); delay(3); lcd_1602(0x38);
lcd_1602(0x08); /*显示关闭*/ lcd_1602(0x01); /*显示清屏*/
lcd_1602(0x06); /*显示光标移动设置*/ delay(3);
13
lcd_1602(0x06);
delay(5);
lcd_1602(0x0c);
}
/***************************** 1602液晶读忙标志
参数:无
返回值:无
******************************/ bit lcd_busy()
{
bit result;
rs = 0;
rw = 1;
en = 1;
delay(2);
result = busy;
en = 0;
return result;
}
/***************************** 1602液晶写字符
参数:
返回值:无
******************************/ void lcd_zifu(uchar *p,uchar wei) {
14
} uchar temp; lcd_1602(0x80+wei); for(temp=*p;temp!='\0';p++,temp=*p) lcd_write(temp); delay(10);
void lcd_data(uchar *p,uchar wei)
{
}
#include "delay.h"
/*------------------------------------------------
uS延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编,大致延时 长度如下 T=tx2+5 uS
------------------------------------------------*/
void DelayUs2x(unsigned char t)
{
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值 uchar temp; lcd_1602(0x80+wei); for(temp=*p;temp!='\0';p++,temp=*p) lcd_write(temp); delay(10); 15
unsigned char 是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M,精确延时请使用汇编 ------------------------------------------------*/
extern void delay(unsigned char t)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
五、设计实物图片展示
16
六、课程设计总结(心得体会)
5.1 本课程设计应该是大部分同学的第一次真正动手实践。本小组成员通过优势互补,互相协作,最终完成设计任务。在设计过程中由于开始觉得比较简单,比较大意,硬件电路设计较为迅速,焊接过程也比较快,焊接完成后,发现了许多错误。虽然焊接时错误也是难免的,但如果更加小心可能会更好。 由于小组成员在软件编程方面比较薄弱,花了较长时间才完成了相关软件设计。虽然不容易,但我们也从中学会了很多。以前在软件设计方面总是一大块,现在我们学会了使用模块化设计方法,使程序的可移植性、清晰性更加明显。
5.2老师的指导是我们首先要感谢的,老师将设计相关内容原理给我们讲的比较透彻,在设计过程中耐心指导,使我们少走很多弯路。团队合作也比较关键,小组成员知识掌握程度不一,组长在理论和实践方面比较熟悉,带领组员一起动手,分工明确,使工作效率大大提高。大家也都从中学到了很多。
17
PIC单片机技术 上机实验报告
实验项目: 定时/计数 姓 名: 专 业: 班 级: 学 号: 学 期: 1314 学年2 学期
20xx
一、实验名称
×××
二、实验设备
×××× (实验所需的设备或者软件)
三、实验目的
1.××××
2.××××
3.
4.
四、实验要求
××××××××
五、理论原理
×××××(本次实验所用到的书上的理论知识点的概要说明。)
六、实验内容步骤
1.×××××××××××××××××××××××××××××××××××××××××
2.×××××××××××
3.×××××
七、实验程序
附软件流程、程序源代码。(程序要注释)
八、实验结果
附:电路原理图、Proteus仿真的结果图片等。并做文字说明。
九、分析总结
××××××××(实验过程遇到的问题、思考及解决方法;此次实验的功能模块在实际应用的思考、本次实验的心得体会等)
1
单片机课程设计示例交通灯控制系统设计一总体设计1设计要求交通灯的任务要求为模拟十字路口的交通灯的亮灭及闪烁基本工作原理根据交通灯的…
西南科技大学20xx级微机原理与接口技术课题名称姓名学号系部专业指导教师课程设计报告微机原理与接口技术制造科学与工程学院20xx年…
河南理工大学《单片机应用与仿真训练》设计报告题目四路定时控制器姓名:学号:专业班级:电子信息工程指导老师:所在学院:电气工程与自动…
单片机课程设计报告格式要求统一的A4纸打印。每页约44行,每行约34字;打印正文用宋体小四号字;版面页边距上空2.5cm,下空2c…
单片机微机系统与接口课程设计报告论文题目3号宋体加粗居中专业班级姓名时间指导教师年月日课程设计任务书小三宋体1设计目的与要求5号黑…
单片机课程设计报告格式要求统一的A4纸打印。每页约44行,每行约34字;打印正文用宋体小四号字;版面页边距上空2.5cm,下空2c…
湖州师范学院求真学院课程设计总结报告课程名称单片机应用系统设计设计题目基于STC89C51的数字电子钟设计专业电子科学与技术班级0…
单片机接口技术与实验课程总结现代数字系统设计课程总结姓名学号年级专业20xx年秋季学期每个实验都应该包含以下内容实验一三号字宋体居…
西南科技大学20xx级微机原理与接口技术课题名称姓名学号系部专业指导教师课程设计报告微机原理与接口技术制造科学与工程学院20xx年…
韶关学院课程设计说明书论文设计题目基于单片机控制的智能交通灯设计课程名称微机原理与应用实训学生姓名学号院系物理与机电工程学院汽车系…