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

📄 ad-dis.c

📁 这是一个利用单片机来控制AD转换芯片工作的C语言程序
💻 C
字号:
#include "reg51.h"                        //寄存器定义头文件
#include "intrins.h"

//****** HD7279A指令系统 ****** 
#define CMD_RESET 0xa4 
#define CMD_TEST 0xbf 
#define DECODE0 0x80  //显示在第一个数码管
#define DECODE1 0xc8 
#define CMD_READ 0x15 
#define UNDECODE 0x90 
#define RTL_CYCLE 0xa3 
#define RTR_CYCLE 0xa2 
#define RTL_UNCYL 0xa1  //左移
#define RTR_UNCYL 0xa0 
#define ACTCTL 0x98 
#define SEGON 0xe0 
#define SEGOFF 0xc0 
#define BLINKCTL 0x88 

//****** TLC549时序延时定义 ****** 
#define    Wait1us        _nop_();
#define    Wait2us        {_nop_();_nop_();}
#define    Wait4us        {Wait2us;Wait2us;}
#define    Wait8us        {Wait4us;Wait4us;}
#define    Wait10us      {Wait8us;Wait2us;}
#define    Wait30us      {Wait10us;Wait8us;Wait4us;Wait2us;}
//////////////////////////////////////////////////////////////////////////////////////////////
//函数申明
//////////////////////////////////////////////////////////////////////////////////////////////
void send_byte(unsigned char out_byte);
unsigned char receive_byte();
void long_delay(void);
void short_delay(void);
unsigned char ADCSelChannel(void);
void TODISP(unsigned char AD_result);

//////////////////////////////////////////////////////////////////////////////////////////////
//全局变量
//////////////////////////////////////////////////////////////////////////////////////////////   
unsigned int tmr;
unsigned int H;	//存放显示的最高位
unsigned int M;	//存放显示的中间位
unsigned int L;	//存放显示的最低位

//sbit	key= P1^3;		//7279接口定义
sbit	clk= P1^6;		
sbit 	dat = P1^7;		
sbit 	cs = P2^7;
	
//AD接口定义
sbit DAT0 = P1^0;	 //数据输出口线
sbit CLK0 = P1^1; 	//时钟口线
sbit CS0 = P1^2; 	//片选口线	
	
///////////////////////////////////////////////////////////////////////////////////////////////
//主函数
///////////////////////////////////////////////////////////////////////////////////////////////
main()
{
 unsigned char AD_result;
 
 while(1)
 	{
 	AD_result=ADCSelChannel();
 	TODISP(AD_result);
 
 	clk=1;
	dat=1;	
    for (tmr=0;tmr<0x2000;tmr++);              //      
    send_byte(CMD_RESET);                     //    HD7279A 
    cs = 1;
	send_byte(0x80);				//显示在第一个数码管
	send_byte(L);

	send_byte(0x81);				//显示在第二个数码管
	send_byte(M);

	send_byte(0x82);			//显示在第三个数码管
	send_byte(H);
 	}
}

//////////////////////////////////////////////////////////////////////////////////////////////
//命令发送子函数
//功能:发送命令(8位)
////////////////////////////////////////////////////////////////////////////////////////////// 
void send_byte(unsigned char out_byte) 
{ 
 unsigned char i; 
 cs=0;  			//cs下降沿开始发送数据
 long_delay(); 
 for (i=0;i<8;i++) 
     { 
     if (out_byte&0x80) 
         { 
          dat=1; 
          } 
     else 
         { 
          dat=0; 
          } 
     clk=1; 
     short_delay(); 
     clk=0; 
     short_delay(); 
     out_byte=out_byte*2; 
     } 
 dat=0; 
} 
//////////////////////////////////////////////////////////////////////////////////////////////
//命令接收子函数
//功能:接收命令(8位)
////////////////////////////////////////////////////////////////////////////////////////////// 
unsigned char receive_byte() 
{ 
 unsigned char i, in_byte; 
 dat=1;
 long_delay(); 
 for (i=0;i<8;i++) 
     { 
      clk=1; 
      short_delay(); 
      in_byte=in_byte*2; 		//相当与左移一位
      if (dat) 
          { 
           in_byte=in_byte|0x01; //dat输出1,让in_byte末位为1
           } 
      clk=0; 
      short_delay(); 
      } 
 dat=0; 
 return (in_byte); 
} 

//////////////////////////////////////////////////////////////////////////////////////////////
//延时函数
//功能:长延时和端延时
//////////////////////////////////////////////////////////////////////////////////////////////  
void long_delay(void) 
{ 
 unsigned char i; 
 for (i=0;i<0x30;i++); 
} 

void short_delay(void) 
{ 
 unsigned char i; 
 for (i=0;i<8;i++); 
} 

//////////////////////////////////////////////////////////////////////////////////////////////
//ADCSelChannel
//功能:转换指定通道的模拟量为数字量
////////////////////////////////////////////////////////////////////////////////////////////// 
unsigned char ADCSelChannel(void)
{
      unsigned char ConvertValue = 0;
      unsigned char i;
      CS0 = 1; //芯片复位
      CS0 = 0;
      CS0 = 1;
      CLK0 = 0;
      Wait4us;
      CS0 = 0; //芯片起始
      Wait4us; //等待延时
      for (i = 0; i < 8; i ++) //输入采样转换时钟
      	{
         CLK0 = 1;
         CLK0 = 0;
      	 }
      CS0 = 1; //开始转换
      Wait10us; //等待转换结束
      CS0 = 0; //读取转换结果
      Wait4us;
      for (i = 0; i < 8; i ++) //
      	{
         CLK0 = 1;
         ConvertValue <<= 1;
         if (DAT0)
            {
             ConvertValue |= 0x01;
             }
            CLK0 = 0;
      }
      CS0 = 1;
      return (ConvertValue); //返回转换结果
}

//////////////////////////////////////////////////////////////////////////////////////////////
//TODISP
//功能:将转换结果拆成三位分别在数码管上显示
////////////////////////////////////////////////////////////////////////////////////////////// 
void TODISP(unsigned char AD_result)
{
 float cell,temp;
 unsigned int number;
 H=0;
 M=0;
 L=0;
 cell=5.0/256.0;
 temp=(float)AD_result*cell;	//将数字的结果换算成模拟结果(0-5V)
 number=(unsigned int)(temp*100);	//保留前三位有效数字
 H = number/100;
 H |=0x80;
 number=(number%100);				//显示小数点
 M = number/10;	  
 L = number%10;
}





/*

#include  <reg51.h>
#include  <intrins.h>

sbit      P1_0 =    P1^0;
sbit      DOUT  =     P1^5 ;
sbit      IOCLK      =  P1^4;
sbit       CS       = P2^7;
typedef   unsigned char  uchar  ;
typedef   unsigned  int   uint;

void  delay(uint n)
{ 
    while(n--);
        
} 
void  main()
{ 
      
      uchar     j ;
      uchar isFirst=0;
      uchar  b ;
     
     uchar figure[16]={0x3f,0x06,0x5B, 0x4F,0x66,0x6D,0x7D,0x07,  //0-7                            
    0x7f,        0x6f,        0x77,    0x7c,    0x39,
    0x5e,    0x79,    0x71};
    while(1)
    {  
                  
                 j=0;  b=0;
                
                            
    
                CS=0;   
                 //delay(10);
                b=(b<<1)|DOUT;     //获取最高位
                j++;
             while(j<8)
            { 
                    IOCLK      =1;
                   //    delay(2);
                    IOCLK      =0;
                   // delay(2);
                b=(b<<1)|DOUT;
                    j++;    
            }         //while(j)
                CS=1;            
            isFirst++;  
            //b=0x46;
         if(isFirst!=1)               //第一个周期不显示,因为不准确
         {    
            //b=0x35;
            P1=0x01;
            P2=figure[b/16];    
            delay(60000);                    
                            
            P1<<=1;                //把结果用数码管显示出来
            P2=figure[b%16];
            delay(60000);
          }
    } 
} 


*/

⌨️ 快捷键说明

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