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
|