#include<AT89X52.H>
#define uchar unsigned char
#define uint unsigned int
uint a1,b1,ge,fen,fen1;
uchar code dispcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0Xff};//0-9 s、 d 共阳数码管段选数据
uchar t;uchar dispbuf[4]={0,0,0,0};// 0x76,0x3f,0x3f,0x4f
uchar dispcount;
sbit W0=P3^5; //
sbit W1=P3^4; //
sbit W2=P3^3; //
sbit W3=P3^2; //位选
sbit PIN=P1^7;
sbit st=P2^4;//A/D转换控制
sbit ale=P2^3;//通道控制
sbit oe=P2^5;//输出控制
sbit eoc=P3^7;//转换结束标志
sbit a=P2^0;
sbit b=P2^1;
sbit c=P2^2;
sbit k1=P3^0;//功能转换键
sbit k2=P3^1;//通道选择键
void delay(uchar x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}
void xz()//通道选择
{
if(t==1)
{
a=0;
b=0;
c=0;
ale=1;
delay(1);
ale=0;
}
if(t==2)
{
a=1;
b=0;
c=0;
ale=1;
delay(1);
ale=0;
}
if(t==3)
{
a=0;
b=1;
c=0;
ale=1;
delay(1);
ale=0;
}
if(t==4)
{
a=1;
b=1;
c=1;
ale=1;
delay(1);
ale=0;
}
if(t==5)
{
a=0;
b=1;
c=1;
ale=1;
delay(1);
ale=0;
}
if(t==6)
{
a=1;
b=0;
c=1;
ale=1;
delay(1);
ale=0;
}
if(t==7)
{
a=0;
b=0;
c=1;
ale=1;
delay(1);
ale=0;
}
if(t==8)
{
a=1;
b=1;
c=0;
ale=1;
delay(1);
ale=0;
}
}
void aj()//按键
{
if(k1==0)
{
delay(2);
if(k1==0)
TR1=!TR1;
while(!k1);
}
if(TR1==0)
{
if(k2==0)
{
delay(5);
if(k2==0)
{
t++;
if(t==9)
t=1;
}
while(!k2);
}
}
}
void du()//读数据
{
uchar tmp;
st=1;
st=0;
delay(1);//这里必须延时
if(eoc==1)//转换结束标志
{
oe=1;
delay(1);
tmp=P0;
oe=0;
delay(1);
}
ge=tmp/51;
a1=(tmp%51)*10;
fen=a1/51;
b1=(a1%51)*10;
fen1=b1/51;
dispbuf[0]=dispcode[t];
dispbuf[1]=dispcode[ge];
dispbuf[2]=dispcode[fen];
dispbuf[3]=dispcode[fen1];
}
void init()//初始化
{
EA=1;
ET1=1;
TMOD=0x10;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
T2MOD=0x00; /*定时器2为工作模式) */
T2CON=0x04; /*定时器2为自动重装定时工作模式) TR2=1 */
RCAP2L=(65536-4000)%256; //给定时器T2装初值
RCAP2H=(65536-4000)/256;
TR2=1; //打开定时器中断1,2
ET2=1;
W0=1;
W1=1;
W2=1;
W3=1;
ale=0;
oe=0;
st=0;
t=1;k1=1;k2=1;
}
void as() interrupt 3 using 0
{
uchar a;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
a++;
if(a==20)
{
a=0;
t++;
if(t==9)
t=1;
}
}
void main()
{
init();
while(1)
{
aj();
xz();
du();
}
}
void t1(void) interrupt 5 using 0
{
TF2=0; //T2定时器必须用软件清0
P1=dispbuf[dispcount]; //控制数码管 显示
if (dispcount==0)
{
W0=0;
W1=1;
W2=1;
W3=1;
}
if(dispcount==1)
{ PIN=0;
W0=1;
W1=0;
W2=1;
W3=1;
}
if(dispcount==2)
{
PIN=1;
W0=1;
W1=1;
W2=0;
W3=1;
}
if(dispcount==3)
{
W0=1;
W1=1;
W2=1;
W3=0;
}
dispcount++;
if(dispcount==4)
dispcount=0;
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
本资源内容概要: 这是基于51单片机的八路模拟电压采集设计,包含了电路图源文件(Altiumdesigner软件打开)、C语言程序源代码(keil软件打开) 。 本资源适合人群: 单片机爱好者、电子类专业学生、电子diy爱好者。 本资源能学到什么: 可以通过查看电路学习电路设计原理,查看代码学习代码编写原理。 本资源使用建议: 建议使用者需要具备一定电子技术基础,掌握一些常用元器件原理,例如三极管、二极管、数码管、电容、稳压器等。了解C语言基础设计原理,能看懂基础的电路图,具备一定的电路图软件使用能力。
资源推荐
资源详情
资源评论
收起资源包目录
75、基于51单片机八路模拟电压采集电路图及程序.rar (18个子文件)
75、基于51单片机八路模拟电压采集电路图及程序
电路图
8路电压表2.SCH 123KB
__Previews
8路电压表2.SCHPreview 66KB
模拟采集1000.PCBDOCPreview 77KB
模拟采集1000.PCBDOC 5.51MB
History
8路电压巡检.~(1).PrjPcb.Zip 5KB
8路电压巡检.PrjPcb 54KB
C语言程序
adc0809数字电压表.Opt 1000B
adc0809数字电压表.LST 9KB
adc0809数字电压表_Opt.Bak 1000B
adc0809数字电压表.hex 2KB
adc0809数字电压表.Uv2 2KB
adc0809数字电压表 11KB
adc0809数字电压表.lnp 66B
adc0809数字电压表.M51 15KB
adc0809数字电压表.c 3KB
adc0809数字电压表.OBJ 12KB
adc0809数字电压表_Uv2.Bak 0B
adc0809数字电压表.plg 216B
共 18 条
- 1
资源评论
>行者<
- 粉丝: 205
- 资源: 135
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功