源码加电路图
单片机源程序如下:
- #include<reg51.h>
- #define uint unsigned int
- #define uchar unsigned char
- uchar code led[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管显示0-9的电平码
- uint volt,vtime; //电压值测定值
- uchar addr;//测量地址位
- sbit LW1=P2^3; //对应第4个数码管
- sbit LW2=P2^2; //对应第3个数码管
- sbit LW3=P2^1; //对应第2个数码管
- sbit LW4=P2^0; //对应第1个数码管
- sbit LW5=P1^4;//指示当前显示的是第几个转换值
- sbit CLK=P2^4; //时钟信号
- sbit START=P2^5; //转换启动开关
- sbit EOC=P2^6; //转换结束标志
- sbit OE=P2^7;//定义ADC0809各脚
- /**********************************************************/
- //函数名:delay(uint x)
- //功能:延时程序 改变测量地址
- //调用函数:
- //输入参数:x
- //输出参数:
- //说明:程序的延时时间为x乘以0.5ms 每5s改变测量地址位
- /**********************************************************/
- void delay(uint x)
- {
- uchar y,z;
- for(y=x;y>0;y--)
- for(z=250;z>0;z--);//该步运行时间约为0.5ms
- vtime++;
- if(vtime==1000)
- {
- vtime=0;
- addr++;
- if(addr==3) //本例子一共有3个测量输入值,轮流读取这3个值并转换显示
- addr=0;//以上语句实现测量地址位的改变
- }
- }
- /**********************************************************/
- //函数名:ADC()
- //功能:数模转换程序
- //调用函数:
- //输入参数:
- //输出参数:
- //说明:将转换好的测定值保存在变量volt中
- /**********************************************************/
- void ADC()
- {
- EA=1;//开中断
- //确保进入正常AD转换状态?
- START=0;
- START=1;
- START=0;//ad开始转换
- while(EOC==0); //等待转换结束
- OE=1; //输出数据标志为真
-
- EA=0;//关中断
- volt=P3;//获取转换值保存到volt中,(P3为转换后数据)
- volt=volt*196;//转换值处理 (例子的满量程为5V,转换分辩率为8位即最大值是255,5/255=196mV,即1代表196mV)
-
- OE=0;//输出转换结束 (要在获取转换值之后)
- }
- /**********************************************************/
- //函数名:display()
- //功能:4位数码管显示
- //调用函数:delay(uint x)
- //输入参数:
- //输出参数:
- //说明:将处理后的电压值显示在4位数码管上
- /**********************************************************/
- void display()
- {
- P0=0xff;//消隐 (相当于全部灭灯,清除上次显示效果)
- LW1=0;
- P0=~led[volt/10000]&0x7f;//带小数点1伏显示位
- delay(2);
- P0=0xff;
- LW1=1;
- LW2=0;
- P0=~led[(volt/1000)%10];//100毫伏显示位
- delay(2);
- P0=0xff;
- LW2=1;
- LW3=0;
- P0=~led[(volt/100)%10];//10毫伏显示位
- delay(2);
- P0=0xff;
- LW3=1;
- LW4=0;
- P0=~led[(volt/10)%10];//1毫伏显示位
- delay(2);
- P0=0xff;
- LW4=1;
- LW5=0;
- P0=~led[addr+1];//显示电压测量位
- delay(2);
- LW5=1;//指示当前显示的是第几个转换值
- }
- /**********************************************************/
- //主程序
- /**********************************************************/
- void main()
- {
- EA=1;//开总中断
- TMOD=0x01;//设定定时计数工作方式
- //为定时器初赋值
- TH0=0XFF;
- TL0=0XB4;
- ET0=1;//开定时器0中断
- TR0=1;//开启定时器0
- while(1)
- {
- P1=addr;//装入测量地址
- LW5=1;
- ADC();//调用模数转换程序
- display();//调用显示程序
- }
- }
- /**********************************************************/
- //函数名:timer() interrupt 1
- //功能:定时中断0响应程序
- //调用函数:
- //输入参数:
- //输出参数:
- //说明:为ADC提供时钟信号
- /**********************************************************/
- void timer() interrupt 1
- {
- //初值重置
- TH0=0XFF;
- TL0=0XF0;
- CLK=~CLK;//取反 产生时钟信号
- }
复制代码
仿真代码51hei提供下载:
数字电压表(ADC0809)-2.rar
(47.83 KB, 下载次数: 70)
|