51单片机和ADC0809循环采集电压,实时刷新,proteus仿真
单片机源程序如下:
- /********************
- * 程序说明:设计一个中断模式的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)
|