数字电压表,文件里包含了C语言程序,proteus仿真。测量范围为 0~5V,测量精度达到0.01V
单片机源程序如下:
- //头文件区
- #include<AT89X51.h>
- #include<stdio.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define SEG P1//声明数码管接P1口
- //定义变量区
- uchar TAB[]={ 0x3f,0x06,0x5b,0x4f,0x66,//共阴字形码
- 0x6d,0x7d,0x07,0x7f,0x6f};
- uchar disp[4];//显示器数组
- uint temp,result;
- //函数声明区
- void display();//声明显示函数
- void delay1ms(uchar);//声明延时函数
- void init(void);//初始化函数
- sbit CLK=P3^4;//时钟接口
- sbit EOC=P3^2;//转换结束信号
- sbit ST=P3^6; //开始转换
- sbit OE=P3^7; //输出允许端
- //=====主函数=================
- main()
- { init();
- ST=0;
- while(1)
- { ST=1;//启动
- ST=0;
- while(EOC==0);//查询等待转换结果
- OE=1;//打开输出允许信号
- temp=P0;//读数据
- result=temp*1.0/255*500;//把0~255数字量量程改为0~500
- disp[0]=result/1000;//最高位永远为0,除法取商
- disp[1]=result/100%10;//;除以100取商,再除以10取余数
- disp[2]=result/10%10;//
- disp[3]=result%10;//
- display();
- }
- }
- //======显示函数=============
- void display()
- { uchar i,scan;
- scan=1;
- for(i=0;i<4;i++)
- { P2=~scan;
- SEG=TAB[disp[i]];
- if(i==1)
- SEG=SEG|0x80;
- delay1ms(4);
- scan<<=1;
- }
- }
- //=====延时1MS函数=========
- void delay1ms(uchar x)
- { uchar i,j;
- for(i=0;i<x;i++)
- for(j=0;j<120;j++);
- }
- //=====T0初始化函数============
- void init()
- { EA=1;
- ET0=1;
- TMOD=0x01;
- TH0=(65536-200)/256;
- TL0=(65536-200)%256;
- TR0=1;
- }
- //=======T0中断服务,提供时钟信号======
- void timer0() interrupt 1
- { TH0=(65536-200)/256;
- TL0=(65536-200)%256;
- CLK=~CLK;//取反,产生方波
- }
复制代码
所有资料51hei提供下载:
数字电压表.rar
(321.67 KB, 下载次数: 82)
|