单片机课程设计报告——数字电压表 下载本文

通过P0口控制四位共阴极数码管段选,通过P2口的低四位控制位选。值得注意的是P0需要接上拉电阻,否则P0会处于高阻态。

总电路如下:

设计原理:将模拟量通过IN0输入,经过ADC0808芯片转换,得到数字量输出到单片机P0口,经过单片机处理后,送到四位共阴极数码管上显示。

仿真结果如下:

五、程序设计

为了在C语言源程序中直接编写中断服务函数的需要,KeilCx51编译器对函数的定义进行了扩展,增加了一个扩展关键字interrupt,它是函数定义是的一个选项,加上这个选项即可以将一个函数定义成中断服务函数。定义中断服务函数的一般形式为:

函数类型 函数名(形式参数表) [interrupt n] [using n] 由于ADC0808的CLOCK的时钟频率不高于640KHZ,在这利用定时器T0的中断产生时钟频率,则可设置为:

void t0(void) interrupt 1 using 0

ADC0808的时序图如下:

由时序图可知,只有在转换期间,EOC处于低电平,因此在AD转换开始前EOC置为低电平,START在上升沿期间将芯片内的所有寄存器清零,在下降沿来临时开始转换,由于所用的时钟为100KHz,比较的缓慢不需要再延时,在此等待转换结束,结束后将其数字量输出。

根据上述分析及原理,可设计程序流程图如下:

设计程序如下:

#include #include

#define uchar unsigned char #define uchar unsigned char #define uint unsigned int sbit START=P3^0; sbit OE=P3^1; sbit EOC=P3^2; sbit P07=P0^7; sbit CLK=P3^4; uchar data led[4]; uint data tvdata;

uchar code tv[]={0xfe,0xfd,0xfb,0xf7}; uchar code a[]={0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,0x7f,0x6f};

void delay(void) //延时程序 {

uint i;

for(i=0;i<10;i++); }

void ledxianshi(void) //显示模块 {

uchar k,i;

if(tvdata>5000) tvdata=5000;

led[0]=tvdata; led[1]=tvdata/10; led[2]=tvdata/100; led[3]=tvdata/1000;

for(k=0;k<4;k++) {

P2=tv[k];