利用单片机AT89C51与ADC0808设计一个数字电压表,能够测量0~5V的直流电压值,精度越高越好

我有过c的,你可以看一下嘛,希望能够帮上你。 6. C语言源程序#include AT89X52.Hunsigned char code dispbitcode[]={0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f};unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f,0x00};unsigned char dispbuf[8]={10,10,10,10,0,0,0,0};unsigned char dispcount;unsigned char getdata;unsigned int temp;unsigned char i;sbit ST=P3^0;sbit OE=P3^1;sbit EOC=P3^2;sbit CLK=P3^3;void main(void){ ST=0; OE=0; ET0=1; ET1=1; EA=1; TMOD=0x12; TH0=216; TL0=216; TH1=(65536-4000)/256; TL1=(65536-4000)%256; TR1=1; TR0=1; ST=1; ST=0; while(1) { if(EOC==1) { OE=1; getdata=P0; OE=0; temp=getdata*235; temp=temp/128; i=5; dispbuf[0]=10; dispbuf[1]=10; dispbuf[2]=10; dispbuf[3]=10; dispbuf[4]=10; dispbuf[5]=0; dispbuf[6]=0; dispbuf[7]=0; while(temp/10) { dispbuf[i]=temp%10; temp=temp/10; i++; } dispbuf[i]=temp; ST=1; ST=0; } }}void t0(void) interrupt 1 using 0{ CLK=~CLK;}void t1(void) interrupt 3 using 0{ TH1=(65536-4000)/256; TL1=(65536-4000)%256; P1=dispcode[dispbuf[dispcount]]; P2=dispbitcode[dispcount]; if(dispcount==7) { P1=P1 | 0x80; } dispcount++; if(dispcount==8) { dispcount=0; } } 0
我做过这个课程设计,有程序和仿真图
发个程序大家看看:#include reg52.h#include absacc.h#include intrins.h#include string.h#include math.hbit flag;unsigned int tt;unsigned int ftt; int bains;float temp;sbit pwm0 = P3^1;sbit rs = P2^0; sbit rw = P2^1;sbit ep = P2^2;sbit speak = P2^5;sbit kg = P2^7;sbit key1 = P1^3;sbit key2 = P1^4;sbit key3 = P3^2;sbit key4 = P3^3;delay(unsigned char ms){ // 延时子程序 unsigned char i; while(ms--) { for(i = 0; i 250; i++) { _nop_(); _nop_(); _nop_(); _nop_(); } }}bit lcd_bz(){ // 测试LCD忙碌状态 bit result; rs = 0; rw = 1; ep = 1; _nop_(); _nop_(); _nop_(); _nop_(); result = (bit)(P0 ep = 0; return result; }lcd_wcmd(unsigned char cmd){ // 写入指令数据到LCD while(lcd_bz()); rs = 0; rw = 0; ep = 0; _nop_(); _nop_(); P0 = cmd; _nop_(); _nop_(); _nop_(); _nop_(); ep = 1; _nop_(); _nop_(); _nop_(); _nop_(); ep = 0; }lcd_pos(unsigned char pos){ //设定显示位置 lcd_wcmd(pos | 0x80);}lcd_wdat(unsigned char dat) { //写入字符显示数据到LCD while(lcd_bz()); rs = 1; rw = 0; ep = 0; P0 = dat; _nop_(); _nop_(); _nop_(); _nop_(); ep = 1; _nop_(); _nop_(); _nop_(); _nop_(); ep = 0; }lcd_init(){ //LCD初始化设定 lcd_wcmd(0x38); // delay(1); lcd_wcmd(0x0c); // delay(1); lcd_wcmd(0x06); // delay(1); lcd_wcmd(0x01); //清除LCD的显示内容 delay(1);}void display_str(char *p){ int k; signed char i; k=strlen(p); for(i=0;ik;i++) lcd_wdat(*(p+i));}/******************************************************************** 函 数 名:maketime(float pwm_time)功 能: 将时间调制成脉宽说 明:入口参数:float pwm_time 每个周期内高电平时间返 回 值:无 设 计:陈磊 日 期:2009年9月26日修 改: 日 期: ***********************************************************************/void maketime(float pwm_time){ tt=pwm_time*922; ftt=18432-tt; tt=-tt; ftt=-ftt;}void display_temp(void){ unsigned char x[5]; maketime(temp); if(bains10) { x[0]= ; x[1]=0; x[2]=.; x[3]=0+bains; x[4]=0; } else if(bains100) { x[0]= ; x[1]=0+bains/10; x[2]=.; x[3]=0+bains%10; x[4]=0; } else { x[0]=0+bains/100; x[1]=0+bains/10%10; x[2]=.; x[3]=0+bains%10; x[4]=0; } lcd_pos(0x04); display_str(x); bains*=25; if(bains1000) { x[0]=0; x[1]=.; x[2]=bains/100+0; x[3]=bains/10%10+0; x[4]=0; } else { x[0]=bains/1000+0; x[1]=.; x[2]=bains/100%10+0; x[3]=bains/10%10+0; x[4]=0; } lcd_pos(0x44); display_str(x);}void main(void){ kg=0; lcd_init(); lcd_pos(0x00); display_str(PWM:); lcd_pos(0x08); display_str(ms); lcd_pos(0x40); display_str(VOL:); lcd_pos(0x48); display_str(V); EA=1; ET0=1; //开启定时器1中断,产生pwm波 ES=1; //开启串行中断 IT1=1; //外部中断1下降沿触发 EX1=1; //开启外部中断1 IT0=1; EX0=1; TMOD=0x21; // /* T0方式1计时0.01秒 */ TH0=0xB9; TL0=0xB0; TR0=1; pwm0=0; flag=0; temp=19; bains=(unsigned char)(temp*10); display_temp(); while(1) { if(key1==0) { key1=1; while(key1==0) { delay(30); } temp+=1; if(temp19) temp=19; bains=(unsigned char)(temp*10); display_temp(); } else if(key2==0) { key2=1; while(key2==0) { delay(30); } temp-=1; if(temp1) temp=1; bains=(unsigned char)(temp*10); display_temp(); } } /* 开中断,启动定时器 */}/* 定时计数器0的中断服务子程序 */void intserv1(void) interrupt 1 using 1{ if(flag==0) { TH0=tt/256; // 20ms TL0=tt%256; pwm0=1; flag=1; } else { TH0=ftt/256; // 20ms TL0=ftt%256; pwm0=0; flag=0; } } void init1() interrupt 2 using 1{ ET0=0; kg=1;}void init0() interrupt 0 using 1{ ET0=1; kg=0; }
我有用Proteus设计的数字电压表,完全满足你的要求,你给我发个邮箱我发给你……
求一个数字电压表的原理图

数字电压表是指表面从指针改为数字的电压表,即采用数码管显示或者液晶面板显示。
BHC-96V多功能数字电压表需要用线连接电脑和仪表?那数据是怎么上传到软件里的呢
