程序流程图
最下面四个是采样电阻,调节电阻值改变采样电压大小,然后8个通道依次采四个电阻值输出的电压的大小,在数码管上动态显示通道号和所对应采回的电压值大小。ADC0808转换完成是使用外部中断下降沿的方式通知单片机进行数据读取,最大程度上保证了电压数据的精确,程序中可以更改ADC循环 采样的时间。示波器是为了观察转换是否完成的波形来确保ADC0808能否正常工作。
Proteus仿真图
单片机源程序如下:
代码:
- /* Main.c file generated by New Project wizard
- *
- * Created: 周四 2月 27 2020
- * Processor: AT89C51
- * Compiler: Keil for 8051
- */
- #include <reg51.h>
- #include <stdio.h>
- #define u8 unsigned char
- sfr AUXR =0x8E;
- u8 code t_display[]={ //标准字库
- // 0 1 2 3 4 5 6 7 8 9 A B C D E F
- 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
- // black - H J K L N o P U t G Q r M y
- 0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
- 0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};
- // 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1
- unsigned xianshi[6];
- u8 code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //位码
- /*******************************************************/
- sbit start=P3^1;
- sbit CLK=P3^0;
- sbit addA=P3^4;
- sbit addB=P3^5;
- sbit addC=P3^3;
- sbit OE=P3^7;
- bit disflag;
- bit adcflag;
- bit okflag;
- u8 adcnum,adc_value;
- unsigned int a;
- void Timer0Init(void) //定时器初始化0.1毫秒@11.0592MHz
- {
- TMOD &=0xf0;
- TMOD |=0X01;
- //TH0=(65536-92)/256;
- //TL0=(65536-92)%256;
-
- TL0 = 0xA4; //设置定时初值
- TH0 = 0xFF;
-
- ET0=1; //开启定时器0中断
- TR0=1; //定时器T0启动
- }
- void timer0() interrupt 1 using 1 //定时器中断函数配置
- {
- static int dis_count=0,adc_count=0;
- TL0 = 0xA4; //设置定时初值
- TH0 = 0xFF;
- //CLK=~CLK;
- dis_count++;
- adc_count++;
- if(dis_count==10)
- {
- dis_count=0;
- disflag=1;
- };
- if(adc_count==10000)
- {
- adc_count=0;
- adcflag=1;
- };
-
- }
- void Exit0Init(void) //外部中断初始化
- {
- IE=0; //开启外部中断请求
- IT0=1; //外部中断设置为下降沿触发
- EX0=1; //外部中断请求开启
- }
- void exit0() interrupt 0 //外部中断0中断函数配置
- {
- okflag=1; //转换完成
- }
- void display() //数码管扫描显示函数
- {
- static int i=0;
- disflag=0;
- P2=0XFF; //消影
- P1=xianshi[i]; //送位选
- P2=~T_COM[i]; //送段选
- i++;
- if(i==6) i=0;
- }
- void start_adc() //adc启动函数
- {
- start=0;
- adcflag=0;
-
- addC=adcnum/4;
- addB=adcnum%4/2;
- addA=adcnum%2;
-
-
- start=1;
-
- if(adcnum==8) adcnum=0;
- adcnum++;
- start=0;
- }
- void read_adc() //adc读取函数
- {
- okflag=0;
-
- OE=1;
- adc_value=P0;
-
-
- a=adc_value*20;//255表示5000mv ,1表示20mv,共5100mv
- OE=0;
- xianshi[0]=t_display[a%10];
- xianshi[1]=t_display[a%100/10];
- xianshi[2]=t_display[a%1000/100];
- xianshi[3]=t_display[a/1000+32];
- xianshi[4]=0x40;
- xianshi[5]=t_display[adcnum-1];
-
- }
- void main(void)
- {
-
- // Write your code here
- Exit0Init();
- Timer0Init();
- EA=1; //开启全局中断
- while (1)
- {
-
- if(disflag==1) display();
- if(adcflag==1) start_adc();
- if(okflag==1) read_adc();
- }
- ;
- }
全部资料51hei下载地址: