proteus和keil的仿真实验报告

  • 格式:doc
  • 大小:196.00 KB
  • 文档页数:5

下载文档原格式

  / 5
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

北京联合大学

《基于proteus和keil仿真》实验报

实验题目:基于ADC0808模数转换器的数字电压表

学院:信息学院专业:电子信息工程

班级:0808030301

组员:华永奇学号:2008080303107

组员:朱圣峰学号:2008080303137

组员:陈柏宇学号:2008080303113

组员:李冉学号:2008080303119

组员:张茜学号:2008080303104

一、实验任务:

利用单片机AT89C51与A/D 转换器件ADC0808设计一个数字电压表,能够

测量0~5V 之间的直流电压值,并用4位数码管显示该电压值。 设计任务要求:

硬件设计:利用Proteus 软件绘制原理图; 软件设计:利用Keil 软件进行程序设计;

完成软硬件调试:Proteus 和Keil 联调,实现选题要求的功能;

二、实验设计:

1、 硬件设计:

1.11.2 proteus

2、软件设计:

2.1 程序源代码:

#include

#define uchar unsigned char //宏定义

#define uint unsigned int

//定义管脚

sbit START=P3^2;

sbit OE=P3^0;

sbit EOC=P3^1;

sbit P07=P0^7;

sbit CLK=P3^4;

uchar data led[4];

uint data tvdata; //定义输出电压值变量

uchar code tv[]={0xf7,0xfb,0xfd,0xfe}; //led动态显示控制位选数组

uchar code a[]={0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //led上显示段选数组,0~9,阴极管void delay(void) //延时程序

{

uint i;

for(i=0;i<100;i++)

for(i=0;i<100;i++); //对于12mhz单片机,10ms延时

}

void led_display(void) //数码管显示模块

{

uchar k,temp;

led[0]=tvdata%10; //个位

led[1]=tvdata/10%10; //十位

led[2]=tvdata/100%10; //百位

led[3]=tvdata/1000; //千位

for(k=0;k<4;k++) //利用for循环进行动态显示

{

P2=tv[k]; //位选信号赋值给P2口

temp=led[k]; // 段选信号赋值给临时变量temp

P0=a[temp]; // temp赋值给P0口

if(k==3) //点亮第四个数码管的小数点

{

P07 =1; //高位点亮

}

delay(); //延时

}

}

void main(void) //主控制模块

{

ET0=1; // 允许定时器中断

EA=1; //开启中断总开关

TMOD=0x02; //设置定时工作状态,定时器0工作在方式2

TH0=216; //在寄存器中装入初始值,

TL0=216;

TR0=1; //启动定时器0

while(1)

{

START=1; //启动转换

START=0;

while(EOC==0) ;//等待模数转换结束

OE=1; //输入高电平,打开输出三态门,输出数字量

tvdata=P1; //读取P1口的值给输出电压值变量

tvdata*=5000/255.000;//因为输出值在0~255之间,所以应该放大到0~5000

OE=0; //关闭三态门,禁止输出

led_display(); //LED上显示测得电压值

delay(); //延时

}

}

void t0(void) interrupt 1 using 0 //定时中断函数,使用寄存器组0,产生adc0808的驱动时钟脉冲

{

CLK=~CLK; //clk电平取反

}

三、联调结果