51单片机数字电压表及显示学号后四位Word文档格式.docx
《51单片机数字电压表及显示学号后四位Word文档格式.docx》由会员分享,可在线阅读,更多相关《51单片机数字电压表及显示学号后四位Word文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
A/D转换原理
在A/D转换器中,因为输入的模拟信号在时间上是连续的,而输出的数字信号代码是离散的,所以A/D转换器在进行转换时,必须在一系列选定的瞬间(时间坐标轴上的一些规定点上)对输入的模拟信号采样,然后再把这些采样值转换为数字量。
因此,一般的A/D转换过程是通过采样保持、量化和编码这三个步骤完成的,即首先对输入的模拟电压信号采样,采样结束后进入保持时间,在这段时间内将采样的电压量转化为数字量,并按一定的编码形式给出转换结果,然后开始下一次采样。
图1-1为模拟量到数字量转换过程的框图。
图1-1A/D转换过程
动态显示接口电路分析
动态显示主要就是利用人眼的视觉感来设计的,一般来说如果显示的频率过慢,则会有断断续续的显示;
如果显示的频率加快,则人眼就分辨不出这种视觉残余!
动态显示过程采用循环导通或循环截止各位显示器的做法。
当循环显示时间间隔较小(如10ms)时,由于人眼的暂留特性,就将看不出数码管的闪烁现象。
动态显示接口的突出特点是占用资源少,但由于显示值需要CPU随时刷新,故其占用时机较多。
编程思路阐述
本电压表输出设计是基于8051单片机控制系统,采用ADC0808数模转换芯片ADC0808是采样分辨率为8位的、以逐次逼近原理进行模/数转换的器件。
其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。
ADC0808是ADC0809的简化版本,功能基本相同。
本设计采用P0口控制数码管的显示,数码管显示采用动态显示。
P1口接收AD转换的数据。
ADC0808的IN0作为电压表的输入接口,它的时钟信号为5KHz。
P3.2外接一个开关按钮,此为外部中断信号,功能为按下按钮时,显示自己学号后四位数。
当按钮按下时,由于外部中断优先级最高,单片机立即执行外部中断信号,则此时数码管显示学号后四位数。
仿真运行效果图
显示实时电位器的输出电压
显示学号后四位数(2673)
课程学习内容总结及教学建议
课程内容总结
本课程从单片机最基本的知识讲起,首先从8051单片机的发展概况特点和应用以及未来发展趋势说起,说明了学习单片机的用处。
然后讲解了学习单片机的预备知识。
第二章从单片机的结构及原理讲起。
介绍了单片机的内部结构及工作原理,并说明了单片机的外部引脚的分布情况及功能,这样能够让学生对单片机有了基本了解。
第三章讲解汇编语言,介绍了单片机用汇编语言编程的基本方法。
第四章开始讲解单片机的C语言的编程方法以及Keil及Protuus软件的使用方法,并配有相关的程序实例。
中断是单片机非常重要的内容,51单片机有5个中断源,分为外部中断和内部中断。
中断源出现某种特定信号时,相应的中断请求标志位将自动置1.外部中断是通过P3.2和P3.3引脚输入,输入信号可有电平和脉冲两种形式,而内部中断时通过单片机内部的定时/计数器实现的。
用户对单片机中断系统的操作时通过控制寄存器实现的。
8051设置了4个控制寄存器,即定时控制寄存器TCON、串口控制寄存器SCON、中断优先级控制寄存器IP及中断允许控制寄存器IE。
8051单片机中的定时/计数器的工作原理是利用加1计数器对时钟脉冲货外来脉冲进行自动计数。
当计数满溢出时,可引起中断标志(TFx)硬件置位,据此表示时间到或计数次数到。
定时器本质上是计数器,前者是对时钟脉冲进行计数,后者是对外来脉冲进行计数。
51单片机包括两个16位定时器T0(TH0、TL0)和T1(TH1、TL1),还包括两个控制寄存器TCON和TMOD。
通过TMOD控制字可以设置定时与计数两种模式,设置方式0~方式3,四种工作方式,通过TCON控制字可以管理计数器的启动停止。
MCS-51内置有可编程的全双工异步串行通信接口,包括两个物理上是相互独立的数据缓冲器SBUF,两个串口控制寄存器SCON和PCON。
定时器T1作为波特率信号发生器。
总线是一组传送信息的公共通道,包括地址总线、数据总线和控制总线,其特点是结构简单、形式规范、易于扩展。
P0口具有方式输出地址和数据的功能,需要在P0口外加一个地址锁存器,将地址信息的低8位锁存输出。
D/A转换的工作原理是利用电子开关使T形电阻网络产生与输入数字量成正比的电流,在利用外接反向运算放大器转换成电压V。
DAC0832是具有直通、单缓冲和双缓冲3种工作方式的8位电流型D/A转换器。
ADC0809是采用逐次逼近式原理8位A/D转换器,其内置有8路模拟量切换开关,输出具有三态锁存功能。
开关量功率输出接口的主要驱动方式为:
三态门或OC门驱动电路、小功率管驱动电路、达林顿驱动电路、光电隔离驱动器件、电磁继电器驱动电路、晶闸管驱动器件等。
课程学习教学建议
单片机这门课程对很多同学来说是比较抽象的,希望以后老师上课是能够拿一个基于单片机的电子产品在课堂上讲解或者可以拿一个51开发板在课堂上演示,这样不至于课程抽象和枯燥无味,极大提高了学生学习的兴趣。
学习心得体会
我是专升本上来的同学,在以前学校学习过51单片机,所以现在学起来就比较轻松易懂。
在以前学校也做了很多与单片机相关的实验,动手能力得到了极大的提高,现在再次学习对我来说是一个温故而知新的过程。
在上课时我认真听老师讲课认真做笔记,将自己不懂的地方都弥补起来了,一学期下来感觉自己对单片机的认识又有了新的提高。
比如单片机的内部结构及工作原理,单片机内部的寄存器的工作原理以及他们之间的关系,都有了比较清楚的认识。
随着大规模集成电路的出现及其发展,将计算机的CPU、RAM、ROM、定时/数器和多种I/O接口集成在一片芯片上,形成芯片级的计算机,因此单片机早期的含义称为单片微型计算机,直译为单片机。
单片机是微型计算机应用技术的一个重要分支,近年来在工业智能仪器仪表、光机电设备、自动检测、信息处理、家电等的得到广泛应用和迅速发展。
单片机这门课是一科非常重视动手实践的科目,不能总是看书,但是也不能完全不看书。
单片机并不象传统的数字电路或模拟电路那样比较直观,原因是除了“硬件”之外还存在一个“软件”的因素。
正是这个“软件”的原因使得许多初学者怎么也弄不懂单片机的工作过程,怎么也不明白为什么将几个数送来送去就能让数码管显示一串字符或控制一个电机的变速。
对初学单片机的人来说,需要从书中大概了解一下单片机的各个功能寄存器,如果看的多了反而容易搞乱,现在市场上大多数讲单片机的书一开始就讲解较复杂的内存、地址、存储器什么的,更让初学者感到不知所云、难以入门。
如果按教科书式的学法,上来就是一大堆指令、名词,学了半天还搞不清这些指令起什么作用,能够产生什么实际效果,那么也许用不了几天就会觉得枯燥乏味而半途而废。
简单的说,使用单片机实际上就是用我们自己编写的软件去控制单片机的各个功能寄存器。
再简单些,就是控制单片机哪些引脚的电平什么时候输出高电平,什么时候输出低电平。
由这些高低变化的电平来控制外围电路,实现我们需要的各个功能。
自我评价(优秀)
自我感觉对这门课程学习还不错,并对这门课程很感兴趣。
上课从无旷课迟到早退,每次作业认真完成。
自己也买了一个51开发板,经常在课余时间练习写程序,复习当天老师讲过的内容,能够做到举一反三。
自我评价优秀。
实验源程序
#include<
reg51.h>
sbit_st=P2^5;
//定义AD启动位,_st
sbit_eoc=P2^6;
//定义AD结束位,_eoc
sbit_oe=P2^7;
//定义AD使能位,_oe
sbitled0=P2^3;
//定义数码管最低位,led0
sbitled1=P2^2;
//定义数码管第二位,led1
sbitled2=P2^1;
//定义数码管第三位,led2
sbitled3=P2^0;
//定义数码管第三位,led3
sbitKey=P3^2;
unsignedcharad_result=0;
//定义AD转换结果变量,ad_result
unsignedchartable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//定义十进制显示字模数组,table[]
unsignedlonginti=0;
voiddelay(unsignedinttime){//延时函数
unsignedintj=0;
for(;
time>
0;
time--)
for(j=0;
j<
125;
j++);
}
voiddisp(void){//动态显示函数
led3=0;
P0=table[i/10000];
//输出第三位的字模
delay(10);
i=i%10000;
led3=1;
led2=0;
//第三位位码清0
P0=table[i/1000];
//延时10ms
i=i%1000;
led2=1;
//第三位位码置1
led1=0;
//第二位位码清0
P0=table[i/100];
//输出第二位的字模
i=i%100;
led1=1;
//第二位位码置1
led0=0;
//最低位位码清0
P0=table[i/10];
//输出最低位的字模
led0=1;
//最低位位码置1
voiddisp1(void){//动态显示函数
P0=table[2];
;
P0=table[6];
P0=table[7];
P0=table[3];
voidmain(void){
while
(1){
if(Key==0)
{disp1();
}
else
{
_st=0;
_st=1;
_st=0;
//模拟启动时序,发出启动AD转换脉冲
while(!
_eoc);
//查询EOC标志,若EOC=0,原地等待
_oe=1;
//若EOC=1,使能OE置1
ad_result=P1;
//读取AD转换结果
_oe=0;
//使能OE置0
i=ad_result*196;
disp();
///动态显示函数调用