1、2008080303137 陈柏宇 学 号:2008080303113 李冉 学 号:2008080303119 张茜 学 号:2008080303104一、实验任务: 利用单片机AT89C51与A/D转换器件ADC0808设计一个数字电压表,能够测量05V之间的直流电压值,并用4位数码管显示该电压值。设计任务要求:硬件设计:利用Proteus软件绘制原理图;软件设计:利用Keil软件进行程序设计;完成软硬件调试:Proteus和Keil联调,实现选题要求的功能;二、实验设计:1、 硬件设计:单片机1.1设计框图:电压输入显示模数转 换1.2 proteus原理电路2、 软件设计: 2.1 程
2、序源代码:#include#define uchar unsigned char /宏定义#define uint unsigned int/定义管脚 sbit START=P32; sbit OE=P30;sbit EOC=P31;sbit P07=P07;sbit CLK=P34;uchar data led4;uint data tvdata; /定义输出电压值变量 uchar code tv=0xf7,0xfb,0xfd,0xfe; /led动态显示控制位选数组 uchar code a=0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07,0x7f,0x6
3、f; /led上显示段选数组 ,09,阴极管 void delay(void) /延时程序 uint i; for(i=0;i100;i+) for(i=0;i+); /对于12mhz单片机,10ms延时 void led_display(void) /数码管显示模块 uchar k,temp; led0=tvdata%10; /个位 led1=tvdata/10%10; /十位 led2=tvdata/100%10;/百位 led3=tvdata/1000;/千位 for(k=0;k4;k+)/利用for循环进行动态显示 P2=tvk; /位选信号赋值给P2口 temp=ledk; / 段选
4、信号赋值给临时变量temp P0=atemp;/ 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;/因为输出值在0255之间,所以应该放大到05000 OE=0; /关闭三态门,禁止输出 led_display(); /LED上显示测得电压值 void t0(void) interrupt 1 using 0 /定时中断函数 ,使用寄存器组0,产生 adc0808的驱动时钟脉冲 CLK=CLK; /clk电平取反 三、联调结果 5