proteus和keil的仿真实验报告.doc
《proteus和keil的仿真实验报告.doc》由会员分享,可在线阅读,更多相关《proteus和keil的仿真实验报告.doc(5页珍藏版)》请在冰点文库上搜索。
北京联合大学
《基于proteus和keil仿真》实验报告
实验题目:
基于ADC0808模数转换器的数字电压表
学院:
信息学院专业:
电子信息工程
班级:
0808030301
组员:
华永奇学号:
2008080303107
组员:
朱圣峰学号:
2008080303137
组员:
陈柏宇学号:
2008080303113
组员:
李冉学号:
2008080303119
组员:
张茜学号:
2008080303104
一、实验任务:
利用单片机AT89C51与A/D转换器件ADC0808设计一个数字电压表,能够测量0~5V之间的直流电压值,并用4位数码管显示该电压值。
设计任务要求:
硬件设计:
利用Proteus软件绘制原理图;
软件设计:
利用Keil软件进行程序设计;
完成软硬件调试:
Proteus和Keil联调,实现选题要求的功能;
二、实验设计:
1、硬件设计:
单
片
机
1.1设计框图:
电压输入
显示
模数转换
1.2proteus原理电路
2、软件设计:
2.1程序源代码:
#include
#defineucharunsignedchar //宏定义
#defineuintunsignedint
//定义管脚
sbitSTART=P3^2;
sbitOE=P3^0;
sbitEOC=P3^1;
sbitP07=P0^7;
sbitCLK=P3^4;
uchardataled[4];
uintdatatvdata; //定义输出电压值变量
ucharcodetv[]={0xf7,0xfb,0xfd,0xfe};//led动态显示控制位选数组
ucharcodea[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,0x7f,0x6f};//led上显示段选数组,0~9,阴极管
voiddelay(void)//延时程序
{
uinti;
for(i=0;i<100;i++)
for(i=0;i<100;i++); //对于12mhz单片机,10ms延时
}
voidled_display(void)//数码管显示模块
{
uchark,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(); //延时
}
}
voidmain(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(); //延时
}
}
voidt0(void)interrupt1using0//定时中断函数,使用寄存器组0,产生adc0808的驱动时钟脉冲
{
CLK=~CLK; //clk电平取反
}
三、联调结果
5