⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adc.c

📁 AT89C51电压测量及显示 AT89C51电压测量及显示
💻 C
字号:
#include <AT89X51.H>                  //51系列单片机定义文件
#include <intrins.h>                //调_nop_(),延时函数用
#define ad_con P0                  //A/D控制口
#define addata P0                  //A/D数据计入读入口
#define Disdata P1                //显示数据段码输出口
#define uchar unsigned char        //无符号字符(8位)
#define uint unsigned int         //无符号整数(16位)
uint s=0x00; 	                 //通道号初值
uint m=0;						 //内存单元计数
uint n=0;						 //显示通道号初值
sbit ALE=P2^4;               	  //地址锁存位
sbit START=P2^5;                  //启动一次转换位
sbit OE=P2^6;                   //0890输出数据控制位
sbit DISX=Disdata^7;               //LED 小数点位
//
//
unsigned char code dis_7[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
/*共阳7段LED段码表"0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮"*/
unsigned char code scan_con[4]={0x0e,0x0d,0x0b,0x07};//4位列扫控制字
unsigned char data ad_data[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//定义8个数据内存单元 
unsigned int data dis[5]={0x00,0x00,0x00,0x00,0x00};//定义4个显示数据单元和一个数据存储单元
//
//
delay1ms(unsigned int t)
{ 
 uint i,j;
 for(i=0;i<t;i++)
   for(j=0;j<120;j++);
    }

//
/**********显示单通道扫描子函数**********/
scan(n)
{
uint k,h;
dis[3]=n; //通道号显示 
dis[2]=ad_data[n]/51; //测得值转换为3个BCD码,最大值为5.00V
dis[4]=ad_data[n]%51; //余数暂存
dis[4]=dis[4]*10;  //计算小数第一位
dis[1]=dis[4]/51;
dis[4]=dis[4]%51;
dis[4]=dis[4]*10;  //计算小数第二位
dis[0]=dis[4]/51;  
for(h=0;h<250;h++)  //每个通道值显示控制时间(约0.5S)
   {
    for(k=0;k<4;k++)  //4位LED扫描控制
     {
       Disdata=dis_7[dis[k]];
       if(k==2){DISX=0;}
       P2=scan_con[k];delay1ms(1);
     }
   }
}


/**********0809AD转换子函数**********/
test()
{
  ad_con=s;
  ALE=1;_nop_();_nop_();ALE=0;     //转换通道地址锁存
  START=1;_nop_();_nop_();START=0; //开始转换命令

  ad_con=0x00;  //控制复位
}
/**********ADC中断函数**********/
void int1()interrupt 2
{
   OE=1;ad_data[m]=addata;OE=0;//取A/D值
   m++;if(m>=8) m=0;
   s++;ad_con=s;
   if(s>=8) s=0;//通道地址加1
   ALE=1;_nop_();_nop_();ALE=0;     //转换通道地址锁存
  START=1;_nop_();_nop_();START=0; //开始下次转换命令
}
/**********显示通道中断函数**********/
void int0()interrupt 0
{
n++;
}

/**********主函数**********/
main()
{
P0=0xff;  //初始端口
P3=0xff;
IT0=1;
IT1=1;
EX0=1;
EX1=1;
EA=1;
test();
while(1)
{
 scan(n);
}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -