单片机原理及应用
课程设计报告书
题 目:时钟计时器的设计 姓 名: 学 号:
专 业:电子信息科学与技术 指导老师:
设计时间:2010年 12 月
目 录
1. 引 言 ................................. 错误!未定义书签。 1.1. 设计意义 ........................ 错误!未定义书签。 1.2. 系统功能要求 .................... 错误!未定义书签。 1.3. 本组成员所做的工作 .............. 错误!未定义书签。 2. 方案设计 .............................. 错误!未定义书签。 3. 硬件设计 .............................. 错误!未定义书签。 4. 软件设计 .............................. 错误!未定义书签。 5. 系统调试 .............................. 错误!未定义书签。 6. 设计总结 .............................. 错误!未定义书签。 7. 附 录A;源程序 ....................... 错误!未定义书签。 8. 附 录B;作品实物图片 .................. 错误!未定义书签。 9. 参考文献 .............................. 错误!未定义书签。
- 2 -
简易数字电压表的设计
1. 引言
随着学习的深入,我们们对各种电子器件的了解日渐深入,对各种电子仪器的原理日渐熟知,所以想通课本次课题设计来检验一
下自己对课本的掌握程度,也检验一下我们们的动手能力。
1.1设计意义 电压表是我们们学习电子的学生最常见的仪器,通过对电压表的设计来检验我们们的学习。同时也通过完成对电压表的课程设计,综合应用和巩固单片机课程设计及相关课程的基础理论和专业知识,系统地掌握电子产品元件的使用方法,及单片机结构设计的基本方法和步骤,电子电路的设计等电子技术设计基本方法,同时我们们学会了正确运用技术标准和资料,培养了我们们认真负责、踏实细致的工作作风和严谨的科学态度,强化了我们们的质量意识和时间观念。
1.2系统功能要求 简易数字电压表可以测量0~5V范围内的8路输入电压值,并在4位LED数码管上轮流显示或单路选择显示。其测量最小分辨率为0.02V。
1.3本组成员所做的工作
** 负责在电路板上布线,识别电路元件级各种元器件的用法,焊接方案。 ** 主要负责焊接元器件,同时辅助布线设计。
** 查找电子元器件的使用方法,性能,写设计报告。
2 .方案设计
通过对元器件的对比,在电路板上选择了较优的布线方案,力争达到用最少的漆包线。按照系统的功能实现要求,决定控制系统采用STCC52单片机,A/D转换采用ADC0809.系统除了能确保实现要求的功能之外,还可以方便的进行8路其他A/D转换亮的测量和远程测量结果传送等扩展功能。数字电压表系统设计方案框图如下图2.1所示。
3
ATC52P0ADC0809上电复位P2串口通信P14位LED显示器电源电路P3 图2.1
数字点压表系统设计方案框图
3.硬件设计
简易电压表设计中所用到的各种元器件电路图及原理介绍如下:
ADC0809电路原理图如下所示:
1. 主要特性
1)8路输入通道,8位A/D转换器,即分辨率为8位。 2)具有转换起停控制端。
3)转换时间为100μs(时钟为0kHz时),130μs(时钟为500kHz时) 4)单个+5V电源供电
5)模拟输入电压范围0~+5V,不需零点和满刻度校准。
4
6)工作温度范围为-40~+85摄氏度 7)低功耗,约15mW。 2.内部结构
ADC0809是CMOS单片型逐次逼近式A/D转换器,内部结构如图13.22所示,它由8路模拟开关、地址锁存与译码器、比较器、8位开关树型A/D转换器、逐次逼近
3.外部特性(引脚功能)
ADC0809芯片有2引脚,采用双列直插式封装,如图13.23所示。下面说明各引脚功能。
IN0~IN7:8路模拟量输入端。 2-1~2-8:8位数字量输出端。
ADDA、ADDB、ADDC:3位地址输入线,用于选通8路模拟输入中的一路 ALE:地址锁存允许信号,输入,高电平有效。
START: A/D转换启动脉冲输入端,输入一个正脉冲(至少100ns宽)使其启动(脉冲上升沿使0809复位,下降沿启动A/D转换)。
EOC: A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。
OE:数据输出允许信号,输入,高电平有效。当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。
CLK:时钟脉冲输入端。要求时钟频率不高于0KHZ。 REF(+)、REF(-):基准电压。 Vcc:电源,单一+5V。
GND:地。 ADC0809的工作过程
首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。此地址经译码选通8路模拟输入之一到比较器。START上升沿将逐次逼近寄存器复位。下降沿启动 A/D转换,之后EOC输出信号变低,指示转换正在进行。直到A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用作中断申请。当OE输入高电平 时,输出三态门打开,转换结果的数字量输出到数据总线上。
转换数据的传送 A/D转换后得到的数据应及时传送给单片机进行处理。数据传送的关键问题是如何确认A/D转换的完成,因为只有确认完成后,才能进行传送。为此可采用下述三种方式。 (1)定时传送方式
对于一种A/D转换其来说,转换时间作为一项技术指标是已知的和固定的。例如ADC0809转换时间为128μs,相当于6MHz的MCS-51单片机共个机器周期。可据此设计一个延时子程序,A/D转换启动后即调用此子程序,延迟时间一到,转换肯定已经完成了,接着就可进行数据传送。 (2)查询方式
A/D转换芯片由表明转换完成的状态信号,例如ADC0809的EOC端。因此可以用查询方式,测试EOC的状态,即可确认转换是否完成,并接着进行数据传送。 (3)中断方式
把表明转换完成的状态信号(EOC)作为中断请求信号,以中断方式进行数据传送。
5
ATC52电路原理图如下:
主要功能特性:
兼容MCS51指令系统
8k可反复擦写(>1000次)Flash ROM 32个双向I/O口 256x8bit内部RAM
3个16位可编程定时/计数器中断 时钟频率0-24MHz 2个串行中断 可编程UART串行通道 2个外部中断源 共8个中断源 2个读写中断口线 3级加密位
低功耗空闲和掉电模式 软件设置睡眠和唤醒功能
简易电压表工作原理简介:A/D转换由集成电路ADC0809完成。ADC0809具有模拟输入端口,地址线可决定对那一路模拟输入作A/D转换。
A/D转换由集成电路ADC0809完成。ADC0809具有8路模拟输入端口,地址线可决定对哪一路模拟输入作A/D转换。第22脚为地址锁存控制,当输入为高电平时,对地址信号进行锁存。第6脚为测试控制,当输入一个2us宽高电平脉冲时,就开始A/D转换。第7脚为A/D转换结束标志,当A/D转换结束时,第7脚输出高电平。第9脚为A/D转换数据输出允许控制,当OE脚为高电平时,A/D转换数据从端口输出。第10脚为ADC0809的时钟输入端,利用单片机第30脚的6分频晶振频率,再通过14024二分频得到1MHz时钟。
单片机的P1、P3.0~P3.3端口作为4位LED数码管显示控制。P3.5端口用作单路显示/循环显示转换按钮,P3.6端口用作单路显示时选择显示的通道。P0端口用作A/D转换数据读入,P2端口用作ADC0809的A/D转换控制。
简易数字电压表电路原理图如下所示:
6
4.软件设计
4.1 初始化程序
系统上电时,初始化程序主要用来执行70H~77H内存单元清0和P2口置0等准备工作。
4.2 主程序 在刚上电时,系统默认为循环显示8个通道的电压值状态。当进行一次测量后,将显示每一通道的A/D转换值,每个通道的数据显示时间在1s左右。主程序在调用显示子程序与测量子程序之间循环。
主程序流程图如下所示
开始初始化调用A/D转换测量子程序调用显示子程序 4.3 显示子程序
显示子程序采用动态扫描法实现4位数码管的数值显示。测量所得的A/D转换数据放在70H~77H内存单元中,测量数据在显示时须经过转换成为十进制BCD码放在78H~7BH单元中,其中7BH存放通道标志数。寄存器R3用作8路循环控制,R0用作显示数据地址指针。
4.4 A/D转换测量子程序
A/D转换测量子程序用来控制对ADC0809的8路模拟输入电压的A/D转换,并将
7
对应的数值移入70H~77H内存单元。 A/D转换测量子程序流程图如下所示:
开始启动测试(TESTART)A/D转换结束?(P3.7=1?)NY取数据(P2.5=1)ADC0809地址加1Y地址数小于8?N结束 5.系统调试
采用Wave或Keil C51编译器进行源程序编译及仿真调试,同时进行硬件电路板的设计制作,烧录好程序后进行软硬件联调,最后进行端口电压的对比测试。 简易数字电压表与“标准”数字电压表对比测试表 标准电压值/V 0 0.15 0.85 1 1.25 1.75 简易电表测得值/V 0 0.17 0.86 1.02 1.26 1.76 绝对误差/V 0 0.02 0.01 0.02 0.01 0.01 标准电压值/V 1.98 2.23 2.65 3 3.45 3.55 简易电表测得值/V 2 2.33 2.66 3.01 3.47 3.56 绝对误差/V 0.02 0.01 0.01 0.01 0.02 0.01 标准电压值/V 4 4.5 4.6 4.7 4.81 4.9 简易电表测得值/V 4.01 4.52 4.62 4.72 4.82 4.92 绝对误差/V 0.01 0.02 0.02 0.02 0.01 0.02
从表中可以看出,简易数字电压表与“标准”数字电压表测得的绝对误差均在0.02v以内,这与采用8位A/D转换器所能达到的理论误差精度相一致,在一般的应用场合可完全满足要求。
6.设计总结
8
通过这次课程设计使我们懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。
生活就是这样,汗水预示着结果也见证着收获。劳动是人类生存生活永恒不变的话题。通过实习,我们才真正领略到“艰苦奋斗”这一词的真正含义,我们才意识到老一辈电子设计者为我们的社会付出。我们想说,设计确实有些辛苦,但苦中也有乐,在如今单一的理论学习中,很少有机会能有实践的机会,但我们可以,而且设计也是一个团队的任务,一起的工作可以让我们有说有笑,相互帮助,配合默契,多少人间欢乐在这里洒下,大学里一年的相处还赶不上这十来天的合作,我们感觉我们和同学们之间的距离更加近了;我们想说,确实很累,但当我们看到自己所做的成果时,心中也不免产生兴奋; 正所谓“三百六十行,行行出状元”。我们们样可以为社会作出我们应该做的一切,这有什么不好?我们们断的反问自己。也许有人不喜欢这类的工作,也许有人认为设计的工作有些枯燥,但我们认为无论干什么,只要人生活的有意义就可。社会需要我们,我们也可以为社会而工作。既然如此,那还有什么必要失落呢?于是我们决定沿着自己的路,执着的走下去。
同时我们认为我们的工作是一个团队的工作,团队需要个人,个人也离不开团队,必须发扬团结协作的精神。某个人的离群都可能导致导致整项工作的失败。实习中只有一个人知道原理是远远不够的,必须让每个人都知道,否则一个人的错误,就有可能导致整个工作失败。团结协作是我们实习成功的一项非常重要的保证。而这次实践也正好锻炼我们这一点,这也是非常宝贵的。
7.附录A 源程序
/*****************************************************/
// 八路电压表C程序
/***************************************************/
/*使用ATC52单片机,12MHZ晶振,P0口读入AD值,P2口作AD控制,用共阳LED
数码管
P1口输出段码,P3口扫描,最高位指示通道(0-7)。*/ #include \"reg52.h\" //52系列单片机定义文件 #include \"intrins.h\" //调用_nop_();延时函数用
#define ad_con P2 //AD控制口
9
#define addata P0 //AD数据计入读入口 #define Disdata P1 //显示数据段码输出口 #define uchar unsigned char//无符号字符(8位) #define uint unsigned int //无符号整数(16位) sbit ALE=P2^3; //锁存地址控制位 sbit START=P2^4; //启动一次转换位 sbit OE=P2^5; //0809输出数据控制位 sbit EOC=P3^7; //转换结束标志位 sbit DISX=Disdata^7; //LED小数点
//
uchar code
dis_7[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff}; /* 共阳七段LED段码表 \"0\" \"1\" \"2\" \"3\" \"4\" \"5\" \"6\" \"7\" \"8\" \"9\" \"不
亮\" */ uchar code scan_con[4]={0xfe,0xfd,0xfb,0xf7}; //四位
列扫描控制字 uchar data ad_data[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//定义8个
数据内存单元 uint data dis[5]={0x00,0x00,0x00,0x00,0x00}; //定义4个显示数据单元、1个
数据暂存单元
//
/********1毫秒延时子函数**********/
delay1ms(uint t) {
uint i,j; for(i=0;i///***********显示扫描子函数**********/
scan(){uchar k,n; int h;
10
dis[3]=0x00; //通道初值为0 for(n=0;n<8;n++) //每次显示8个数据
{
dis[2]=ad_data[n]/51; //测得值转换为三位BCD码,最大为5.00V
dis[4]=ad_data[n]%51; // 余数暂存 dis[4]=dis[4]*10; //计算小数第一位
dis[1]=dis[4]/51; // dis[4]=dis[4]%51; //
dis[4]=dis[4]*10; //计算小数第二位
dis[0]=dis[4]/51; //
for(h=0;h<500;h++) //每个通道值显示时间控制(约1秒) {
for(k=0;k<4;k++) //四位LED扫描控制 { Disdata=dis_7[dis[k]]; if(k==2){DISX=0;}
P3=scan_con[k];delay1ms(1);P3=0xff; } } dis[3]++; //通道值加1 }} /*******0809AD转换子函数***********/
test(){uchar m; uchar s=0x00; ad_con=s; for(m=0;m<8;m++) {
ALE=1;_nop_();_nop_();ALE=0; //转换通道地址锁存 START=1;_nop_();_nop_();START=0; //开始转换命令 _nop_();_nop_();_nop_();_nop_(); //延时4微秒 while(EOC==0); //等待转换结束
OE=1;ad_data[m]=addata;OE=0;s++;ad_con=s;//取AD值,地址加1 }
ad_con=0x00; //控制复位
}
11
/**************主函数****************/
main(){
P0=0xff; //初始化端口 P2=0x00;P1=0xff; P3=0xff; while(1) { scan(); //依次显示8个通道值一次
test(); //测量转换一次
}}
//*********************结束**************************//
8.附录B 作品实物图
12
9.参考文献
[1] 阳进.基于单片机的LED显示屏的汉字显示[J].中国科技信息,2005,(12):112. [2] Mark Nelson著.潇湘工作室译.串行通信开发指南[M].中国水利水电出版社,2002. [3] 王宜怀.单片机原理及其嵌入式应用教程[M].北京希望电子出版社,2002.
[4] 韩润萍,陈小萍.点阵LED显示屏控制系统[J].微计算机信息,2003,19(10):50-51. [5] http://www.ourdev.cn
13