单片机电压采集装置课程设计AD转换及编程实现.docx
- 文档编号:8933334
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:22
- 大小:801.20KB
单片机电压采集装置课程设计AD转换及编程实现.docx
《单片机电压采集装置课程设计AD转换及编程实现.docx》由会员分享,可在线阅读,更多相关《单片机电压采集装置课程设计AD转换及编程实现.docx(22页珍藏版)》请在冰豆网上搜索。
单片机电压采集装置课程设计AD转换及编程实现
单片机课程设计
姓名:
学号:
专业:
电子科学与技术
题目:
单片机电压采集装置
专题:
AD转换及编程实现
指导教师:
设计地点:
实验楼时间:
20121220
2012年12月
单片机课程设计任务书
专业年级电科学号学生姓名
任务下达日期:
2012年12月20日
设计日期:
2012年12月1日至2012年12月20日
设计题目:
单片机电压采集装置
设计专题题目:
AD转换及编程实现
设计主要内容和要求:
制作单片机电压采集装置
基本要求
1、模拟通道0电压采集功能
在ADC0809的输入0~5V电压,数码管实时显示被测电压值(显示精度0.001V,即显示1位整数,3位小数)。
2、指定通道电压采集功能
通过模式选择按键切换到“指定通道电压采集功能”,利用+/-按键改变通道值,显示同上。
3、8通道自动循环电压采集功能制作单片机电压采集装置
通过模式选择按键切换到“8通道自动循环电压采集功能”,
默认通道切换时间为2秒。
扩展要求
1、超限报警功能
当Vi超出程序预设报警限值时,报警灯以1Hz速度闪烁显示,并显示提示符以区别上限或下限报警。
2、可修改上限和下限报警值的超限报警拨弄能
可随意设置上、下限报警值(步长0.1V,默认下限为0V,上限为5V)。
设置时,当下限≥上限(或上限≤下限)时予以提示,并拒绝接受数据。
指导教师签字:
摘要:
此单片机电压采集装置使用AT89S52芯片和ADC0809芯片进行电压采集,实现AD转换的基本功能。
,键盘电路和8个LED数码显示电路。
扩展电路中包含了A/D转换电路,AD转换五种工作模式下对应要实现的功能:
即模式0下完成通道0的模拟信号采集;模式1时完成指定模拟通道电压采集,按加、减(K2,K3)按键手动实现模拟通道的切换,此外,通过内部定时器T1实现报警功能,即超过上限电压4.999V时报警,同时点亮P1.1即L2发光LED小灯,低于下限电压0.000V时也实现报警功能,只是报警的频率改变,同时点亮P1.0即L1发光LED小灯;而模式2完成8通道模拟信号自动循环采集功能,通过加入内部定时器T0中断,从而实现每隔1秒通道值自动加1的功能;进入模式3的时候,需要人为设置报警上限,此程序设定报警上限为4V,而报警上限默认值为3.999V,通过按加、减(K2/K3)按键实现上限加减0.1V;模式4的时候设置报警下限电压,默认报警下限电压为1.999V,本程序中设置的报警下限电压为2V,通过加减(K2/K3)按键实现电压加减0.1V的功能,最终实现电压采集和扩展功能。
关键词:
AT89S52芯片、ADC0809芯片
1绪论
1.1系统设计方案
本次实验要求设计电压采集装置,课程设计分设计、制作和调试三个部分。
设计选题以单片机为核心,基本内容应包括单片机最小系统、键盘和LED显示电路,以及设计系统涉及的其他电路。
系统硬件电路由标准电路和自制电路两部分组成。
标准电路包括单片机最小系统、8个LED数码管电路和键盘电路,可根据设计需要进行配置选用。
自制电路需自行设计焊接,包含标准电路不具备的其他电路。
设计中采用了模数转换器,利用ADC0809型8位MOS型A/D转换器。
可实现8路模拟信号的分时采集,片内有8路模拟选通开关,以及相应的通道地址锁存用译码电路,实现模拟信号到数字信号的转换。
控制部分采用单片机89C52来完成。
显示部分利用LED数码管显示模块,来显示采集到的电压分量。
1.2.1系统设计原理框图
2硬件电路设计
系统硬件电路由标准电路和自制电路两部分组成。
标准电路包括单片机最小系统、6个LED数码管电路和键盘电路,可根据设计需要进行配置选用。
自制电路需自行设计焊接,包含标准电路不具备的其他电路。
2.1单片机电路
2.1.1单片机最小系统
CPU原理图
该原理图包含单片机以及外部连接译码,锁存电路端口,其中的ALE,REST为高电平时用来启动ADC0809.P0、P2口控制数码输出显示,P3口的P3.3、P3.4、P3.5控制按键,P1.1~P1.3控制通道选择。
晶振采用12MHZ,该频率有利于提高串口的通信可靠性,同时又保证单片机有较高的运行速度。
2.1.2显示译码电路
LED显示电路可提供8位LED显示;可显示P1(P3)口状态;也可显示输入按键状态
LED显示电路
显示电路采用6位共阳极LED动态扫描显示,CD4511输出所需字形,74LS138选择字位。
在动态方式中,逐个地循环地点亮各位显示器。
数码管显示电路
显示译码电路部分由P0口或P2口输出显示。
显示译码器采用CD4511芯片:
输入:
BCD输出:
七段码
74LS138芯片是用来控制显示时候的字位的,由于单片机的管脚是有限的通过使用138芯片可以避免少使用些单片机的管脚,当输入001时,译码可得10111111:
输入:
0~7输出:
低电平
2.2A/D转换
2.2.1ADC0809转换原理
当单片机端的P3.3接低电平时,可以使两个非门打开
(1)当模拟量送至某一输入通道后,CPU将标识该通道编码的三位地址信号经数据线或地址线输入到ADDC、ADDB、ADDA引脚上。
(2)地址锁存允许ALE锁存地址信号,启动命令START启动A/D转换。
(3)转换开始,EOC变低电平,转换结束,EOC变为高电平。
EOC可作为中断请求信号。
(4)转换结束后,可通过执行IN指令,设法在输出允许OE脚上形成一个正脉冲,打开三态缓冲器把转换的结果输入到DB,一次A/D转换便完成。
2.2.2AD转换电路
转换结束:
EOC=1
IN0,通道0
参考电压:
5V
转换时钟:
接单片机ALE输出经分频后得到
启动和地址锁存信号
输出使能信号
通道地址信号
输出数据
/WR
/RD
片选信号:
P3.3=0
/INT0
CC4060_7
AD_CS
2.2.3电路设计
硬件资源分配
数码管显示电路:
用P2口:
bcd码输出--P2.3~P2.0;字位选择--cba=P2.6~P2.4;小数点--P2.7
键盘电路:
P3口低四位
1号按键P3.0---模式切换
2号按键P3.1---通道、报警限加
3号按键P3.2--通道、报警限减
4号按键P3.3--查询法,接收ad转换状态
(不作为按键使用)中断法,收ad结束中断信号
ADC0809电压转换电路控制信号:
/wr==p3.6/rd==p3.7
eoc==p3.3Cs==p3.5
转换通道选择地址线:
CBA==P1(6-4)
3软件设计
3.1设计任务
3.1.1基本任务1、进行电压采集并显示
3.1.2扩展任务1、指定通道采集
2、循环采集显示,默认每通道显示1秒钟。
3、报警设置报警上限为4V
报警下限为2V
3.2程序设计
3.2.1主程序框图
主程序框图
3.3.2AD信号采集程序
#include
#defineucharunsignedchar
#defineuintunsignedint
#definezxmaP0//字型码地址,通过P0口送字型码
#definezwmaP2//字位码地址,通过P2口送字位码
sbitlowflag=P1^0;//下限报警LED
sbithighflag=P1^1;//上限报警LED
sbitad_adda=P1^4;//ad0809地址端A,低位
sbitad_addb=P1^5;//ad0809地址端B,中位
sbitad_addc=P1^6;//ad0809地址端C,高位
sbitkey1=P3^0;//按键1
sbitkey2=P3^1;//按键2
sbitkey3=P3^2;//按键3
sbitad_eos=P3^3;//ad0809转换结束标志,1转换完,0正在转换
sbitspeeker=P3^4;//蜂鸣器报警
sbitad_cs=P3^5;//ad0809片选,低电平有效
sbitad_wr=P3^6;//ad0809写入信号,锁存地址和启动ad
sbitad_rd=P3^7;//ad0809读出信号,通过P0口读回ad转换结果
ucharad_data;//ad采集数据
ucharpdataad_start,ad_over;//两个片外地址,用于产生读写信号
ucharad_td;//ad采集通道
ucharad_mode;//ad采集模式
ucharkey;
uintad_high=4000;//ad报警上限,设置为4V
uintad_low=2000;//ad报警下限,设置为2V
uchartt0=100;//定时1s(10ms,需要100次)
sbitad_clk=P1^7;//本程序利用P1.7产生方波来给ad0808提供脉冲,
/*共阴极数码管字形码,共阳极数码管取反即可*/
ucharcodezixing[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
/*共阳极数码管字位码,共阴极数码管取反即可*/
ucharcodeziwei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
voidtimer2int();
voiddelay(uinti);
voiddisp(void);
voidad_change(void);
voidkeyscan(void);
voidkeyanswer(void);
voidalarm();
voidtimer0int(void);
voidtimer0chengxu(void);
voidtimer1int(void);
voidtimer1chengxu(void);
voidmain(void)
{
timer0int();
timer1int();
while
(1)
{
keyscan();
keyanswer();
ad_change();
alarm();
disp();
}
}
voidkeyscan(void)
{
if(!
key1)
{
while(!
key1)disp();
key=1;F0=1;
}
if(!
key2)
{
while(!
key2)disp();
key=2;F0=1;
}
if(!
key3)
{
while(!
key3)disp();
key=3;F0=1;
}
}
voidkeyanswer(void)
{
if(key==1&F0==1)
{
ad_mode++;
if(ad_mode==5)ad_mode=0;
}
if(ad_mode==0)
{
ad_td=0;
}
if(ad_mode==1)
{
if(key==2&F0==1)
{
ad_td++;
if(ad_td==8)ad_td=0;
}
if(key==3&F0==1)
{
ad_td--;
if(ad_td==255)ad_td=7;
}
}
if(ad_mode==2)TR0=1;
elseTR0=0;
if(ad_mode==3)
{
if(key==2&F0==1)
{
ad_high=ad_high+100;
}
if(key==3&F0==1)
{
ad_high=ad_high-100;
}
}
if(ad_mode==4)
{
if(key==2&F0==1)
{
ad_low=ad_low+100;
}
if(key==3&F0==1)
{
ad_low=ad_low-100;
}
}
F0=0;
}
voidtimer0int(void)
{
TMOD=0x11;
TH0=(65536-10000/1)/256;
TL0=(65536-10000/1)%256;
ET0=1;
EA=1;
TR0=0;
}
voidtimer0chengxu(void)interrupt1
{
TH0=(65536-10000/1)/256;
TL0=(65536-10000/1)%256;
tt0--;
if(tt0==0)
{
tt0=100;
ad_td++;
if(ad_td==8)ad_td=0;
}
}
voidtimer1int()
{
TMOD=0x11;
TH1=(65536-500/1)/256;
TL1=(65536-500/1)%256;
ET1=1;
EA=1;
TR1=0;
}
voidtimer1chengxu()interrupt3
{
uintad_dianya;
if(ad_dianya { lowflag=0; TH1=(65536-100/1)/256; TL1=(65536-100/1)%256; speeker=~speeker; } else { lowflag=~lowflag; highflag=0; TH1=(65536-5000/1)/256; TL1=(65536-5000/1)%256; speeker=~speeker; } lowflag=1; highflag=1; } voidalarm() { uintad_dianya; //uintspeaker; if(ad_dianya>ad_high|ad_dianya { TR1=1;//开放T1中断 } elseTR1=0;//关闭T1中断 } voidad_change(void) { ad_adda=0; ad_addb=0; ad_addc=0; P1=P1|(ad_td<<4); ad_cs=0; ad_start=0x00; while(ad_eos==1)disp(); ad_data=ad_over; } voiddisp(void) {uintad_dianya; ucharj,k,l,m; if(ad_mode==0|ad_mode==1|ad_mode==2) { ad_dianya=ad_data*19.60784; } if(ad_mode==3) { ad_dianya=ad_high; } if(ad_mode==4) { ad_dianya=ad_low; } j=ad_dianya/1000; k=ad_dianya%1000/100; l=ad_dianya%100/10; m=ad_dianya%10; zwma=~ziwei[0];zxma=~zixing[ad_mode];delay (1);zxma=0xFF; zwma=~ziwei[2];zxma=~zixing[ad_td];delay (1);zxma=0xFF; zwma=~ziwei[4];zxma=~zixing[j]&0x7f;delay (1);zxma=0xFF; zwma=~ziwei[5];zxma=~zixing[k];delay (1);zxma=0xFF; zwma=~ziwei[6];zxma=~zixing[l];delay (1);zxma=0xFF; zwma=~ziwei[7];zxma=~zixing[m];delay (1);zxma=0xFF; } voiddelay(uinti) { unsignedintj,k; for(j=0;j for(k=0;k<121;k++); } voidtimer2int() { C_T2=0; RCAP2H=(65536-100)/256; RCAP2L=(65536-100)%256; EA=1; ET2=1; TR2=1; } voidtimer2pro(void)interrupt5using0{ TF2=0; ad_clk=~ad_clk; } 4系统调试 硬件焊接分为单片机板和扩展版两部分。 在焊接单片机板的时候出现过虚焊和漏焊的现象,再其次就是在焊接扩展板的时候,自己将排阵竟然全部焊接反了,由于自己的疏忽,导致杜邦线无法连接。 然后自己又逐一将排阵全部焊接了一遍,再者就是电路板的布局问题,由于自己是第一次走线,导致板子背面的走线很不光滑而且混乱,没有秩序,但最终在自己的努力下实现了功能。 由于自己曾经掌握一些简单的汇编语言,例如VB,C,C++等汇编语言,所以开始的时候总想将汇编语言写成C语言的格式,导致程序频频出现问题。 而且由于自己起初对KEILC软件不是非常了解,所以很多时候出现问题自己不会改写。 但最终在老师和同学的帮助之下,悉心学习,耐心请教,通过程序调试各个部分的功能,完成各功能模块,把程序下载到单片机中,最终实现电压采集功能和扩展功能。 参考文献: [1]胡汉才,《单片机原理及其接口技术》(2版),清华大学出版社 [2]张迎新,《单片机中级教程》,北京航空航天大学出版社 [3]丁元杰,《单片机原理与应用》,机械工业出版社 [4]孙育才,《MCS-51系列单片微型计算机及其应用》,东南大学出版社 附录一电源印刷电路板布线图 附录二单片机板电路原理图 附录三单片机印刷电路板布线图 附录四元件清单 电源板 符号 名称 型号参数 数量 备注 C1\5\6 电解电容 2200uF/25V 3 C3\9\10 100uF/25V 3 C2\4\7\8\11\12\13 独石电容 104 7 LED1\2\3 发光二极管 φ5 3 红 R1 电阻 470欧 1 R2/3 1K欧 2 D1_1/1/2/3/4/5 二极管 IN4007 6 散热片 3 变压器 220V~50V 1 MC1 芯片 7805 1 MC2 7812 1 MC3 7912 1 POWERIN/OUT5 电源接口 2 电路板 1 插头 1 扩展板 符号 名称 型号参数 数量 备注 滑动变阻器 1 芯片 ADC0809 1 74HC02 1 4046 1 74HC04 1 双排针 若干 短路帽 若干 单片机主板 符号 名称 型号参数 数量 备注 KP1/2/3/4/SWRST1 微动开关 6*6*6 5 SWPIP1 拨码开关 1 芯片座 14P 4 16P 4 28P 1 40P 11 U1 芯片 AT89S52 1 U2 4511 1 U3 74HC138 1 U5/6 74HC04 2 L1~8 发光二极管 8 红 SEG1~6 LED数码管 共阴极 6 SR1~8 电阻 200欧 8 R1 1K 1 R2 10K 1 CRY1 晶振 12M 1 C2/3 瓷片电容 20P 2 C5 独石电容 104 1 C1 电解电容 22uF/25V 1 RKP1 排阻 3.3K 1 RKP2 1K 1 RL1 10K 1 RLED 470 1 电路板 1 双排针 若干 短路帽 若干 POW1 电源接口 1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 电压 采集 装置 课程设计 AD 转换 编程 实现