×
嵌入式开发 > 详情

用51Hei单片机开发板制作基于AD的数字电压表

发布时间:2020-07-01 发布时间:
|


/***************************************************************************
晶振:11.0592M
跳线设置:跳线设置:J2的34端插上跳线帽
这个程序的上位机就用附带串口调试程序,在51hei单片机开发板上实验成功,发送01后
旋动电压调整电位器RP2,当前电压即可显示在串口调试程序的接受区如上图

单片机上电后等待从上位机发送来的命令,同时在数码管的前三位以十进制方式显
示A/D采集的数值,在未收到上位机发送来的启动A/D转换命令之前数码管始终显示000。

当收到上位机以十六进制发送来的01后,向上位机发送字符串“Turn on ad!”,同时
间隔一秒读取一次A/D的值,然后把A/D采集回来的8位二进制数转换为十进制数表示的

实际电压浮点数。并且从串口发送给上位机,形如“The voltage is 3.398438V”,发送周
期也是一秒一次,同时在数码管上也要每秒刷新现在的数值。

当收到上位机以十六进制发送来的02后,向上位机发送字符串“Turn off ad!”,然后
停止发送电压值,数码管上显示上次结束时保持的值。

当收到上位机发来的其他任何数时,向上位机发送字符串“Error!”。

*****************************************************************************/

由于代码太长篇幅有限本文只列出了部分代码,完整版本下载请到:

#includereg52.h>
#include intrins.h>
#includestdio.h>
#define uint unsigned int
#define uchar unsigned charunsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};sbit diola=P2^5;
sbit dula=P2^6;
sbit wela=P2^7;
sbit adwr=P3^6;
sbit adrd=P3^7;
sbit adcs=P2^0;
uchar flag,a,flag_uart,flag_time,flag_on,num0,ad_val;
float ad_vo;
void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=111;y>0;y--);P0=0xfF;wela=1;wela=0;}
void display(uchar value)
{uchar shu1,shu2,shu3;shu1=value/100;shu2=value%100/10;shu3=value%10;P0=table[shu1];dula=1;dula=0;P0=0xff;P0=0xfe;wela=1;wela=0;delay(1);P0=table[shu2];dula=1;dula=0;P0=0xff;P0=0xfd;wela=1;wela=0;delay(1);P0=table[shu3];dula=1;dula=0;P0=0xff;P0=0xfb;wela=1;wela=0;delay(1);}void init(){   adcs=0;diola=1;P1=0xff;diola=0;wela=1;P0=0x7f;wela=0;TMOD=0x21;//       SCON=0x50;TH0=(65536-46080)/256;TL0=(65536-46080)%256;TH1=0xfd;TL1=0xfd;TR1=1;ET0=1;SM0=0;SM1=1;REN=1;EA=1;ES=1;}uchar get_ad(){uchar adval;adwr=1;_nop_();adwr=0;_nop_();adwr=1;P1=0xff;adrd=1;_nop_();adrd=0;_nop_();adval=P1;adrd=1;return adval;}void main(){init();while(1){if(flag_uart==1){flag_uart=0;ES=0;TI=1;switch(flag_on){case 0:puts("Turn on ad!\n");TR0=1;break;case 1:puts("Turn off ad!\n");TR0=0;break;case 2:puts("Error!\n");break;}while(!TI);TI=0;ES=1;        }if(flag_time==1){flag_time=0;ad_val=get_ad();ad_vo=(float)ad_val*5.0/256.0;ES=0;TI=1;printf("The voltage is %fV\n",ad_vo);while(!TI);TI=0;ES=1;        }display(ad_val);        }        }void T0_time() interrupt 1{TH0=(65536-46080)/256;TL0=(65536-46080)%256;num0++;if(num0==20){num0=0;flag_time=1;}                 }void ser() interrupt 4{RI=0;a=SBUF;flag_uart=1;if(a==1)flag_on=0;else if(a==2)flag_on=1;elseflag_on=2;}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
发明专利在疫情影响下的逆势增长