proteus和keil的仿真实验报告
- 格式:doc
- 大小:196.00 KB
- 文档页数:5
北京联合大学
《基于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电平取反
}
三、联调结果