标题:
单片机ADC0809中断模式循环采集电压源程序+Proteus仿真
[打印本页]
作者:
上官海涵
时间:
2020-3-3 21:18
标题:
单片机ADC0809中断模式循环采集电压源程序+Proteus仿真
51单片机和ADC0809循环采集电压,实时刷新,proteus仿真
X(J{)3K{6B{I2IQO]FF%%BY.png
(100.48 KB, 下载次数: 35)
下载附件
2020-3-3 21:18 上传
单片机源程序如下:
/********************
* 程序说明:设计一个中断模式的ADC0809 通道循环采样
* 摘要: ADC0809数据手册
**********************************/
#include <reg51.h> //头文件
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code Tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar code Tab1[]={0xbf,0x086,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
uchar code Seg_WEI[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
uchar dat[]={0,0,0,0};
uchar adc;
uint V=0;
char IN=0;
uchar num;
long int time;
/*****************P2特殊寄存器*******************/
sbit ADDA=P2^1;
sbit ADDB=P2^2;
sbit ADDC=P2^3;
sbit ST=P2^4; //定义ADC0809位
sbit EOC=P2^5;
sbit OE=P2^6;
sbit CLK =P2^7;
/************ 数码管位码****************/
/***********P3特殊寄存器*****************/
sbit WEI=P3^6;
sbit DUAN=P3^7;
void nop(uchar xus);
void display();
void add(uchar c,uchar b,uchar a);
void init();
void gather();
/******************************
* 函数名称: 主函数
* 函数功能: 程序主体
***************************************/
void main()
{
init();
gather();
}
/******************************
* 函数名称: 数码管显示电压
* 函数功能: 显示电压
***************************************/
void display()
{
dat[0]=V/1000;
dat[1]=V%1000/100;
dat[2]=V%1000%100/10;
dat[3]=V%10;
P0=Seg_WEI[0]; //P0特殊寄存器
WEI=1;
WEI=0;
P0=0Xff;
P0=Tab[IN];
DUAN=1;
DUAN=0;
nop(30);
P0=Seg_WEI[1];
WEI=1;
WEI=0;
P0=0XFF;
P0=0x40;
DUAN=1;
DUAN=0;
nop(30);
P0=Seg_WEI[2];
WEI=1;
WEI=0;
P0=0XFF;
P0=Tab1[dat[0]];
DUAN=1;
DUAN=0;
nop(30);
P0=Seg_WEI[3];
WEI=1;
WEI=0;
P0=0XFF;
P0=Tab[dat[1]];
DUAN=1;
DUAN=0;
nop(30);
P0=Seg_WEI[4];
WEI=1;
WEI=0;
P0=0XFF;
P0=Tab[dat[2]];
DUAN=1;
DUAN=0;
nop(30);
P0=Seg_WEI[5];
WEI=1;
WEI=0;
P0=0XFF;
P0=Tab[dat[3]];
DUAN=1;
DUAN=0;
nop(30);
}
/******************************
* 函数名称: 延时函数
* 函数功能: 延时
***************************************/
void nop(uchar xus)
{
uint i;
for(i=0;i<xus;i++)
{
_nop_();
}
}
/******************************
* 函数名称: 通道选择函数
* 函数功能: 确定ADC的通道
***************************************/
void add(uchar c,uchar b,uchar a)
{
ADDA=a;
ADDB=b;
ADDC=c;
}
/******************************
* 函数名称: 初始化
* 函数功能: 中断初始化
***************************************/
void init()
{
TMOD=0x01; //设置定时器0为工作方式1
TH0=(65536-2)/256; //200us定时,装入初值
TL0=(65536-2)%256;
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
}
/******************************
* 函数名称: 定时器
* 函数功能: 定时器0工作
***************************************/
void T0_time() interrupt 1
{
TH0=(65536-2)/256; //重装初值
TL0=(65536-2)%256;
CLK=~CLK;
}
/******************************
* 函数名称: 采集电压
* 函数功能: 采集电压
***************************************/
void gather()
{
uchar i;
while(1)
{
for(i=0;i<8;i++)
{
if(i==0)
{
IN=0;
add(0,0,0);
ST=0;
OE=0;
ST=1;
ST=0;
while(EOC==0);
OE=1;
adc=P1;
V=adc*20;
for(time=20;time>0;time--)
{
display();
}
}
else if(i==1)
{
IN=1;
add(0,0,1);
ST=0;
OE=0;
ST=1;
ST=0;
while(EOC==0);
OE=1;
adc=P1;
V=adc*20;
for(time=20;time>0;time--)
{
display();
}
}
else if(i==2)
{
IN=2;
add(0,1,0);
ST=0;
OE=0;
ST=1;
ST=0;
while(EOC==0);
OE=1;
adc=P1;
V=adc*20;
for(time=20;time>0;time--)
{
display();
}
}
else if(i==3)
{
IN=3;
add(0,1,1);
ST=0;
OE=0;
ST=1;
ST=0;
while(EOC==0);
OE=1;
adc=P1;
V=adc*20;
for(time=20;time>0;time--)
{
display();
}
}
else if(i==4)
{
IN=4;
add(1,0,0);
ST=0;
OE=0;
ST=1;
ST=0;
while(EOC==0);
OE=1;
adc=P1;
V=adc*20;
for(time=20;time>0;time--)
{
display();
}
}
else if(i==5)
{
IN=5;
add(1,0,1);
ST=0;
OE=0;
ST=1;
ST=0;
while(EOC==0);
OE=1;
adc=P1;
V=adc*20;
for(time=20;time>0;time--)
{
display();
}
}
else if(i==6)
{
IN=6;
add(1,1,0);
ST=0;
OE=0;
ST=1;
ST=0;
while(EOC==0);
OE=1;
adc=P1;
V=adc*20;
for(time=20;time>0;time--)
{
display();
}
}
else if(i==7)
{
IN=7;
add(1,1,1);
ST=0;
OE=0;
ST=1;
ST=0;
while(EOC==0);
OE=1;
adc=P1;
V=adc*20;
for(time=20;time>0;time--)
{
display();
}
}
}
}
}
复制代码
所有资料51hei提供下载:
ADC0809.zip
(111.51 KB, 下载次数: 77)
2020-3-3 21:18 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1