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

📄 adc0809.c

📁 8路数据循环采集
💻 C
字号:
#include <reg52.h> 
#include <intrins.h>
#define  uchar  unsigned  char 
#define  uint   unsigned  int 


#define Digit0 0x01         		// 数码管1寄存器
#define Digit1 0x02         		// 数码管2寄存器
#define Digit2 0x03         		// 数码管3寄存器
#define Digit3 0x04         		// 数码管4寄存器
#define Digit4 0x05         		// 数码管5寄存器
#define Digit5 0x06         		// 数码管6寄存器
#define Digit6 0x07         		// 数码管7寄存器
#define Digit7 0x08         		// 数码管8寄存器


#define DecodeMode  0x09     		// 译码模式寄存器
#define Intensity   0x0a     		// 亮度寄存器
#define ScanLimit   0x0b      		// 扫描位数寄存器
#define ShutDown    0x0c       		// 低功耗模式寄存器
#define DisplayTest 0x0f    		// 显示测试寄存器


#define ShutdownMode    0x00      	// 低功耗方式
#define NormalOperation 0x01   		// 正常操作方式

#define ScanDigit       0x04        // 扫描位数设置,显示8位数码管
#define DecodeDigit     0xff       	// 译码设置,8位均为BCD码
#define IntensityGrade  0x0a    	// 亮度级别设置

#define TestMode        0x01        // 显示测试模式
#define TextEnd         0x00        // 显示测试结束,恢复正常工作模式



sbit DIN = P1^0;					// 串行数据输入
sbit CLK = P1^1;					// 串行时钟
sbit LOAD =P1^2;					// 显示数据锁存控制

sbit ST=P3^0; 
sbit OE=P3^1; 
sbit EOC=P3^2; 
sbit CLK1=P3^3; 

double  data  ad_data[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};  
uint    data  dis[5]={0x00,0x00,0x00,0x00,0x00};  


/* 延时t毫秒 */
void delay(uint t)
{
	uint i;
	while(t--)
	{
		/* 对于12M时钟,约延时1ms */
		for (i=0;i<125;i++)
		{}
	}
}

/* 向MAX7219写入字节(8位)*/
void SendChar (uchar ch)
{
	uchar i,temp;
    _nop_();
    for (i=0;i<8;i++)
    {
		temp=ch&0x80;
    	ch=ch<<1;
        if(temp)
        {
        	DIN=1;
           	CLK=0;
        	CLK=1;
        }
        else
        {
        	DIN=0;
        	CLK=0;
        	CLK=1;
        }
    }
}

/* 向MAX7219写入字(16位)*/
void WriteWord (uchar addr,uchar num)
{
    LOAD=0;
    _nop_();
    SendChar(addr);
    _nop_();
    SendChar(num);
    _nop_();
    LOAD=1;				// 锁存进相应寄存器
}

/* MAX7219初始化 */
void InitDisplay (void)
{
    WriteWord (ScanLimit,ScanDigit);         // 设置扫描界限
    WriteWord (DecodeMode,DecodeDigit);      // 设置译码模式
    WriteWord (Intensity,IntensityGrade);    // 设置亮度
    WriteWord (ShutDown,NormalOperation);    // 设置为正常工作模式
}






//*******ADC0809转换函数***********/

void  ADC0809_Convert()
{
uchar m;
uchar adr=0x00;
P2=adr;
for(m=0;m<8;m++)
 {
  
  
  ST=1;
  ST=0;
  _nop_();
  _nop_();
  _nop_();
  _nop_(); //延时4微秒
  while(EOC==0);//等待转换结束
  OE=1;
  ad_data[m]=P0;
  OE=0;
  adr++;
  P2=adr;//取AD值,地址加1
 }
P2=0x00; //地址复位 
}




//***********显示扫描函数**********/
Display_scan()
{

 char k,n;
  

dis[0]=0x00;                 //通道初值为0
for(n=0;n<8;n++)             //每次显示8个数据
 {
  ad_data[n]=(ad_data[n]/255*5);
  dis[1]=(uint)ad_data[n];     
  ad_data[n]=(ad_data[n]-dis[1])*10;    
  dis[2]=(uint)ad_data[n];
  ad_data[n]=(ad_data[n]-dis[2])*10;
  dis[3]=(uint)ad_data[n];
  for(k=0;k<4;k++)
  {
  WriteWord ( Digit0,  dis[0]);
  WriteWord ( Digit1,  0x0f );
  WriteWord ( Digit2,  dis[1]|0x80);
  WriteWord ( Digit3,  dis[2]);
  WriteWord ( Digit4,  dis[3]);
  }
  delay(1000);  
  dis[0]++;                 //通道值加1
 }
}

/* 主函数 */
void main(void)
{   
   

   	InitDisplay ();							// MAX7219初始化 
    WriteWord(DisplayTest,TestMode);		// 开始显示测试,点亮所有LED
  	delay(500);       						// 延时约3s
   	WriteWord (DisplayTest,TextEnd);		// 退出显示测试模式
	
	ST=0; 
    OE=0; 
    
	ET0=1; 
    EA=1; 
    TMOD=0x02; 
    TH0=216; 
    TL0=216; 
    TR0=1; 
while(1)
 {
 ADC0809_Convert();
 Display_scan();
 
} 
  
}


void timer0(void) interrupt 1 using 0 
{ 
    
  CLK1=~CLK1; 
} 
  


   		

⌨️ 快捷键说明

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