单片机课程设计.docx
《单片机课程设计.docx》由会员分享,可在线阅读,更多相关《单片机课程设计.docx(26页珍藏版)》请在冰豆网上搜索。
单片机课程设计
中国矿业大学徐海学院
单片机课程设计
姓名:
学号:
专业:
电子科学与技术
题目:
单片机电压采集装置
专题:
单片机系统设计
指导教师:
设计地点:
时间:
2013.12—2014.1
2014年1月
单片机课程设计任务书
专业年级电科11级学号学生姓名
任务下达日期:
2013年12月23日
设计日期:
2013年12月24日至2014年1月3日
设计题目:
单片机电压采集装置
设计专题题目:
单片机系统设计
设计主要内容:
利用单片机学习板扩展出能够采样的电压装置。
设计要求:
1、基本要求
制作单片机电压采集装置
①电压采集功能在ADC0809的0通道输入0~5V电压,实时显示被测电压值(显示精度0.001V,即显示1位整数,3位小数)。
2、扩展要求
1、指定通道采集默认采集通道为0,按2:
通道+1,按3:
通道-1。
2、8通道自动循环电压采集功能:
默认通道切换时间为2秒。
3、报警设置设置报警上限、下限。
超过上线或者低于下线时LED会亮。
4、可随意设置上、下限报警值(步长0.1V,默认下限为0V,上限为5V)。
设置时,当下限≥上限(或上限≤下限)时予以提示,并拒绝接受数据。
5、超限报警后,蜂鸣器鸣叫。
指导教师签字:
摘要:
本次课程设计通过自己的单片机学习板完成,在其扩展部分采用扩展芯片的办法完成电压数据的采集。
电压采集系统包括了学习板的主板部分和A/D扩展部分。
其中主板电路包括单片机的最小系统,键盘电路和8个LED数码显示电路,这部分电路已制成电路板。
扩展部分包含了A/D转换电路,单片机电压采集电路,通过调节电位器来改变输入的电压值,在主板电路的数码管中显示出所采集的电压值,该部分电路的布线部分是由工作自己手工完成的。
在扩展部分有热敏电阻单元和光敏电阻单元作为整个系统的实际功能的体现。
本次课程设计运用C语言进行了编程,相对汇编语言来说C语言具有很强的灵活性。
关键词:
单片机学习板A/D转换ADC0809芯片电路图
目录
1绪论1
1.1系统总览1
1.1.1课程的性质、目的和任务1
1.1.2硬件部分1
1.1.3软件部分2
1.2系统设计方案2
2硬件电路设计3
2.1直流稳压电源3
2.2单片机电路3
2.2.1单片机电路板3
2.2.2单片机最小系统4
2.3A/D转换4
2.3.1ADC0809内部结构4
2.3.2ADC0809转换原理5
2.3.3ADC0809转换原理表格5
2.3.4AD转换电路6
2.3.5电路设计7
2.3.6采集数据和对应电压的转换7
2.3.7检测AD转换是否结束7
3软件设计8
3.1系统框图8
3.2正常采集8
3.3循环采集11
4系统调试12
4.1硬件部分12
4.2软件部分12
5总结13
参考文献:
13
附录:
14
附录一电源印刷电路板布线图14
附录二单片机板电路原理图15
附录三ADC0809与单片机连接图16
附录四单片机实物展示17
附录五数码管显示电路18
附录六程序总览19
1绪论
1.1系统总览
1.1.1课程的性质、目的和任务
《单片机系统设计》是在学习《模拟电子技术》、《数字电子技术》、《单片机原理及应用》等相关理论课程之后,所设置的重要的综合性实践教学环节,课程的任务是通过选题的设计、安装和调试,巩固已学的理论知识,综合应用所学知识,进行电子系统的设计,从而培养工程实践能力、创新能力,培养严肃认真的工作作风和科学态度。
通过查阅资料、选定方案、设计电路、安装调试、写报告等过程,得到一次科学研究工作的启蒙训练,也为以后利用单片机开发电子产品奠定坚实的基础。
课程的任务是通过学生独立进行选题的设计、安装和调试,巩固已学的理论知识,综合应用所学知识,进行电子系统的设计,从而培养学生工程实践能力、创新能力,培养学生严肃认真的工作作风和科学态度。
通过查阅资料、选定方案、设计电路、安装调试、写报告等过程,使学生得到一次科学研究工作的启蒙训练,也为以后利用单片机开发电子产品奠定坚实的基础。
1.1.2硬件部分
硬件部分整体框图如图1—1所示,其中单片机最小系统用的便是51学习板上的最小单片机系统。
图1-1硬件框图
1.1.3软件部分
C语言是一种编译型程序设计语言,它兼顾了多种高级语言的特点,并具备汇编语言的功能。
目前,使用C语言进行程序设计已经成为软件开发的一个主流。
用C语言开发系统可以大大缩短开发周期,明显增强程序的可读性,便于改进和扩充。
而针对8051的C语言日趋成熟,成为了专业化的实用高级语言。
C语言有以下的几个特点:
1.语言简洁、紧凑,使用方便、灵活。
2.运算符丰富。
3.数据结构丰富。
具有现代化语言的各种数据结构。
4.可进行结构化程序设计。
5.可以直接对计算机硬件进行操作。
6.生成的目标代码质量高,程序执行效率高。
7.可移植性好。
1.2系统设计方案
本次实验要求设计电压采集装置,课程设计分设计、制作和调试三个部分。
设计选题以单片机为核心,基本内容应包括单片机最小系统、键盘和LED显示电路,以及设计系统涉及的其他电路。
系统硬件电路由标准电路和自制电路两部分组成。
标准电路包括单片机最小系统、6个LED数码管电路和键盘电路,这部分电路已制成电路板,可根据设计需要进行配置选用。
自制电路需自行设计焊接,包含标准电路不具备的其他电路。
设计中采用了模数转换器,利用AD0809型8位MOS型A/D转换器。
可实现8路模拟信号的分时采集,片内有8路模拟选通开关,以及相应的通道地址锁存用译码电路,实现模拟信号到数字信号的转换。
控制部分采用单片机89C52来完成。
显示部分利用LED数码管显示模块,来显示采集到的电压分量。
2硬件电路设计
2.1直流稳压电源
为使单片机工作需要提供+5V和±12V的直流稳压电源,电源电路图如(图1):
电源印刷电路板图鉴附录1
工作原理:
利用二极管对交流电进行整流,然后再经过稳压滤波,将直流电压稳定在相应的幅值上,经过半波整流得到5V的电压,经过全波整流得到+12V.-12V的电压。
2.2单片机电路
2.2.1单片机电路板
单片机电路板电路框图如图2;PROTEL绘制的原理图见附录2;PROTEL绘制的电路排版图见附录3。
2.2.2单片机最小系统
CPU原理图
该原理图包含单片机以及外部连接译码,锁存电路端口,其中的ALE,REST为高电平时用来启动ADC0809.P0、P2口控制数码输出显示,P3口的P3.3、P3.4、P3.5控制按键,P1.1~P1.3控制通道选择。
晶振采用12MHZ,该频率有利于提高串口的通信可靠性,同时又保证单片机有较高的运行速度。
2.3A/D转换
2.3.1ADC0809内部结构
ADC0809由8路模拟开关、地址锁存与译码器、比较器、256电阻阶梯、树状开关、逐次逼近式寄存器SAR、控制电路和三态输出锁存器等组成。
AD采样通道的模拟框图如下图所示。
2.3.2ADC0809转换原理
工作原理:
当单片机端的P3.3接低电平时,可以使两个非门打开
(1)当模拟量送至某一输入通道后,CPU将标识该通道编码的三位地址信号经数据线或地址线输入到ADDC、ADDB、ADDA引脚上。
(2)地址锁存允许ALE锁存地址信号,启动命令START启动A/D转换。
(3)转换开始,EOC变低电平,转换结束,EOC变为高电平。
EOC可作为中断请求信号。
(4)转换结束后,可通过执行IN指令,设法在输出允许OE脚上形成一个正脉冲,打开三态缓冲器把转换的结果输入到DB,一次A/D转换便完成。
2.3.3ADC0809转换原理表格
AD转化共有八种状态与之对应有八种输出。
输出表格如下图所示。
所以对应通道数也是八个。
2.3.4AD转换电路
转换结束:
EOC=1
2.3.5电路设计
硬件资源分配
1号按键P3.0---模式切换
2号按键P3.1---通道、报警限加
3号按键P3.2--通道、报警限减
4号按键P3.3--查询法,接收ad转换状态
(不作为按键使用)中断法,收ad结束中断信号
数码管显示电路:
用P2口:
bcd码输出--P2.3~P2.0;字位选择--cba=P2.6~P2.4;小数点--P2.7
键盘电路:
3个键--P3(3-5)
ADC0809电压转换电路控制信号:
/wr==p3.6/rd==p3.7
eoc==p3.2Cs==p3.3(可以不要,使0809常选通)
数据输出:
==P0转换通道选择地址线:
CBA==P1(3-1)
2.3.6采集数据和对应电压的转换
一个8位二进制的AD采集数据转换为5位10进制显示数据。
对应关系:
00H~FFH---0.000V~5.000V;AD分辨率为:
5/255=19.6mV;算法:
Y=X×19.6=X×196/10
具体步骤:
1、求Y=X×196,结果为双字节二进制数
2、将Y转换为十进制数,最大是一个5位的十进制数
3、去掉十进制数的最低位,相当于除10
2.3.7检测AD转换是否结束
1.查询方式:
A/D转换芯片设有表示转换完成的状态信号端,例如:
ADC0809的EOC端。
通过软件测试EOC端的状态,就可确知转换是否完成,一旦确定转换完成,就可以读取数据。
2.定时方式:
对于某种A/D转换器来说,作为其性能指标之一的转换时间是已知和固定的。
例如ADC0809的转换时间是128us。
可据此设计一个延时子程序,A/D转换器启动后即调用这个延时子程序,延时时间一到,转换肯定已经完成了,接着就可进行数据传送了。
3.中断方式:
把表明转换完成的状态信号 EOC作为中断请求信号,以中断的方式进行数据传送。
3软件设计
3.1系统框图
系统整体框图如图1—2所示。
3.2正常采集
把采集的电压值转化为十进制,显示在数码管的后四位。
显示三位小数。
程序框图如上图所示。
#include
Unsignedcharcodedispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsignedcharxdatazixin_at_0xefff;
unsignedcharxdataziwei_at_0xdfff;
unsignedcharxdataad_at_0x7fff;
unsignedcharchannel1=0x0f1;
unsignedchargetdata;
unsignedchardw;
unsignedchargw,a,b,c,d,e,f,g,gt;
unsignedintget;
voiddelay(unsignedintcnt)
{
cnt--;
}
voidint0(void)interrupt0
{
getdata=ad;
get=getdata*196;
a=get/10000;
b=get%10000/1000;
c=get%10000%1000/100;
d=get%10000%1000%100/10;
zixin=dispcode[a];
ziwei=16;
delay(100);
ziwei=0;
zixin=dispcode[b];
ziwei=32;
delay(100);
ziwei=0;
zixin=dispcode[c];
ziwei=64;
delay(100);
ziwei=0;
zixin=dispcode[d];
ziwei=128;
delay(100);
ziwei=0;
ad=0;
}
voidmain(void)
{
IT0=0;
EX0=1;
EA=1;
//打开总中断
P1=channel1;
ad=0;
while
(1)
{
}
}
3.3循环采集
循环采集
按2--数码管最右端显示2,此时为循环采集
--单片机自动在0-7八个通道循环采集,通道号显示在左边第三位。
4系统调试
系统调试包括硬件调试和软件调试两部分,介绍一下我在这两方面遇到一些问题,以及如何解决的。
4.1硬件部分
硬件焊接分为单片机板和扩展版两部分。
单片机版已经焊接好,只需焊接扩展版。
在焊接扩展版时,我事先没有布局,任意焊接芯片,导致需要很长的导线,布线不规整。
我把芯片拆下,通过看其他同学的焊接,查看元件管脚图,自己在草稿纸上画出各个芯片的位置。
然后焊接。
结果布线比较整齐。
4.2软件部分
开始对单片机C语言很陌生,看程序很困难,自己编写不出程序。
通过老师的讲解,和以前学过的C语言的知识,与单片机C语言基本相同,有些区别,把其中的区别搞懂了,能够编写简单的程序了。
前几个程序通过问同学,反复调试编写了出来,设定电压上下线的程序没有编写出来,通过看同学编写的程序,明白了如何编写。
通过程序调试各个部分的功能,完成各功能模块,把程序下载到单片机中,最终实现电压采集功能和扩展功能。
5总结
由于本次单片机综合设计涉及很多内容,锻炼了我对所学电子知识综合应用的能力以及编程能力。
更重要的是要学会查询资料、利用资料。
在设计过程中有很多思路和方法并非直接来源于教材,这时就需要我们学会充分利用身边一切可以利用的有效资源去查阅了解,并在翻阅资料的过程中,努力掌握一些常用元件的特性、优缺点、工作原理以及适用条件,方便我们以后在遇到同类产品时能够了解其属性,从而更加轻松自如的设计更多电子产品。
这次实验课过后,我自己做了详细的自我检查。
我认为,现在我们要做的不仅仅是掌握更多的专业知识,更重要的是要打好坚实的基础。
例如,我们经常在焊接过程中出现焊盘脱落或者焊点不够饱满圆润,大小不均匀等等情况。
对此,我们要做的就是多加练习,并且时刻保持饱满的热情和良好的心态,努力说服自己每一次都会有所进步,有所收获。
另外,在课程学习中练习了很多程序,以前都是只看看,现在自己写,感觉学到更多。
这次的单片机综合设计课程让我收获知识的同时收获一份喜悦与满足!
最后,我在这里要感谢所有实验室老师对我们的谆谆教诲,不辞辛苦的为我们劳作,解决我们遇到的困难和问题!
相信在我们师生的共同努力下,我们一定会有更加充实的大学生活,得到更多的收获!
参考文献:
1、胡汉才,《单片机原理及其接口技术》(2版),清华大学出版社
2、张迎新,《单片机中级教程》,北京航空航天大学出版社
3、丁元杰,《单片机原理与应用》,机械工业出版社
4、孙育才,《MCS-51系列单片微型计算机及其应用》,东南大学出版社
5、曹巧媛,《单片机原理及应用——教学、实践、设计指导》,电子工业出版社
6、谢自美,《电子线路设计·实验·测试》(2版),华中科技大学出版社
7、单片机实验指导书
附录:
附录一电源印刷电路板布线图
附录二单片机板电路原理图
附录三ADC0809与单片机连接图
附录四单片机实物展示
附录五数码管显示电路
附录六程序总览
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitad_eos=P3^3;
sbitad_cs=P3^5;
sbitad_adda=P1^4;
sbitad_addb=P1^5;
sbitad_addc=P1^6;
sbitkey1=P3^0;
sbitkey2=P3^1;
sbitkey3=P3^2;
sbitspeeker=P3^4;
sbitlowflag=P1^0;
sbithighflag=P1^1;
ucharkey=0;
ucharad_data;
ucharpdataad_start,ad_over;
ucharad_td=0x8f;
uintad_dianya;
ucharad_mode=0x00;
uchardisbuf[9];
uchart=40;
uintad_high=4000;
uintad_low=2000;
voiddelay(uinti);
voiddisp(void);
voidadchange(void);
voidkeyscan(void);
voidkeyanswer(void);
voidad_dealdata(void);
voidtimer0out(void);
voidtimer1out(void);
voidmoshi0(void);
voidmoshi1(void);
voidmoshi2(void);
voidmoshi3(void);
voidmoshi4(void);
voidalarm(void);
ucharcodeziweima[]=
0x01,0x02,0x04,0x08,//选中左1-4
0x10,0x20,0x40,0x80,//选中左5-8
0x10};//选中左5
ucharcodezixingma[]=
{0x3F,0x06,0x5B,0x4F,//0-3
0x66,0x6D,0x7D,0x07,//4-7
0x7F,0x6F,0x77,0x7C,//8-B
0x39,0x5E,0x79,0x71,//C-F
0x80,0x00};//小数点,灭
voidadchange(void)
{
ad_adda=(ad_td>>4)&0x01;//逐位送地址信号&&ad_mode==2
ad_addb=(ad_td>>5)&0x01;
ad_addc=(ad_td>>6)&0x01;
ad_cs=0;
ad_start=0x00;
while(ad_eos==1)disp();
ad_data=ad_over;
}
voidad_dealdata(void)
{
uintad_dianya1;
ad_dianya=ad_data*19.60784;
if(ad_mode==0|ad_mode==1|ad_mode==2)
{ad_dianya1=ad_dianya;}
if(ad_mode==3)
{ad_dianya1=ad_high;}
if(ad_mode==4)
{ad_dianya1=ad_low;}
disbuf[0]=ad_mode;//模式
disbuf[1]=0x11;//灭
disbuf[2]=(ad_td>>4)&0x07;//通道
disbuf[3]=0x11;//灭
disbuf[4]=ad_dianya1/1000;//千位
disbuf[5]=ad_dianya1%1000/100;//百位
disbuf[6]=ad_dianya1%100/10;//十位
disbuf[7]=ad_dianya1%10;//个位
disbuf[8]=0x10;//小数点
}
voidalarm(void)
{
//uintad_dianya;
if(ad_dianyaad_high)TR1=1;//
//if((ad_data>0xa0)|(ad_data<0x30))TR1=1;
elseTR1=0;
//if(ad_dianya>ad_low|ad_dianya//else
//{
//
//lowflag=1;
//highflag=1;
//TR1=0;
//}
voidkeyscan(void)
{
if(key1==0)
{
while(key1==0)disp();
key=1;
F0=1;
}
if(key2==0)
{
while(key2==0)disp();
key=2;
F0=1;
}
if(key3==0)
{
while(key3==0)disp();
key=3;
F0=1;
}
}
voidkeyanswer(void)
{
if(key==1&F0==1)//1号按键按下,则模式加1
{
ad_mode++;
if(ad_mode==5)ad_mode=0;
}
switch(ad_mode)
{
case0:
moshi0();break;
case1:
moshi1();break;
case2:
moshi2();break;
case3:
moshi3();break;
case4:
moshi4();break;
default:
moshi0();
}
F0=0;
}
voidmoshi0(void)
{
ad_td=0x8f;
ad_mode=0x00;
}
voidmoshi1(void)
{
if(key==2&F0==1)//2号按键按下,则通道加1
{
ad_td=ad_td+0x10;
if(ad_td==0x00)ad_td=0x8f;
}
if(key==3&F0==1)
{
ad_td=ad_td-0x10;
if(ad_td==0x7f)ad_td=0xff;
}
}
voidmoshi2(void)
{
//if(ad_mode==2)
TR0=1;
//elseTR0=1;
}
voidmoshi3(void)
{
if(key==2&F0==1)
{
ad_high=ad_high+100;
//