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

📄 shu_ma.c

📁 这是基于蓝海微芯LJD-SY-XA+单片机开发系统的远程无线监控系统的DA及AD采集和数码显示的部分
💻 C
字号:
/*******************************************************************************************************
*  标题:  基于蓝海微芯LJD-SY-XA+单片机开发系统的远程无线监控系统的DA及AD采集和数码显示的部分           *
*  文件:  shu_ma.C                                                                                     *
*  日期:  2006-8-14(第五次修改)                                                                        *
*  版本:  5.0                                                                                          *
*  作者:  宇文工作室                                                                                   *
*  QQ:   412455719                                                                                    *
*  Emai:  zhuyu20-16@163.com                                                                           *
********************************************************************************************************/
#include <reg52.h>
#include <absacc.h>
#define CH451_DIG0      0x0800                  //数码管位0显示
#define CH451_DIG1      0x0900		            //数码管位1显示 
#define CH451_DIG2      0x0a00		            //数码管位2显示
#define CH451_DIG3      0x0b00		            //数码管位3显示
#define CH451_DIG4      0x0c00		            //数码管位4显示
#define CH451_DIG5      0x0d00	                //数码管位5显示	
#define CH451_DIG6      0x0e00	                //数码管位6显示	
#define CH451_DIG7      0x0f00		            //数码管位7显示
#define Vrefin          2.048                   //DA的参考电压
unsigned int a=1023;
void chang_data();
float CH[8]=0;        //存储12位的原始数据
   //存储12位的应显示的电流数据(4--20mA) 
//共阴的数码管用
unsigned char Data_shi_wei[8],Data_ge_wei[8],Data_shi_fen_wei[8],Data_bai_fen_wei[8];//分别存放十位,个位,十分位,百分位数码显示的数据


sbit ch451_dclk=P1^1;                           //串行数据时钟上升延激活
sbit ch451_din=P1^0;		                    // 串行数据输出,接CH451的数据输入
sbit ch451_load=P1^2;                           //串行命令加载,上升延激活

sbit tlc5615_sclk=P1^6 ;                         //时钟上升沿激活
sbit tlc5615_din=P1^5;                          //接tlc5615的数据输入
sbit tlc5615_cs=P1^7;                           //tlc5615的片选,兼有load功能
sbit xin_hao=P1^3;                              //一位高低电信号
  


 //------------------------------------------------------------------------------------------------------------
//用四片451串联的级联方式控制八片四位的数码管
 //输出命令子程序
 //定义一无符号整型变量存储12位的命令字。
 
void ch451_init()
{
  //P1=0x60;
  ch451_din=0;                                     //先低后高,选择4线输入
  ch451_din=1;
}
 void ch451_write(unsigned int command0,unsigned int command1,unsigned int command2,unsigned int command3)          
{                                              
                                                   //command0, command1, command2, command3
 												   //分别是451芯片1,2,3,4的控制命令    
 									   //分别是451芯片1,2,3,4的控制命令    
  unsigned char i;
    ch451_load=0;                                  //命令开始
    ch451_dclk=0;
      
  for(i=0;i<48;i++)
    {
	 
 	 switch(i/12)
	   {
	    case 0: ch451_din=command3&1;ch451_dclk=1;ch451_dclk=0;
		        command3>>=1;ch451_dclk=0; break;
	    case 1: ch451_din=command2&1;ch451_dclk=1;ch451_dclk=0;
		        command2>>=1;ch451_dclk=0; break;
		case 2: ch451_din=command1&1;ch451_dclk=1;ch451_dclk=0;
		        command1>>=1; ch451_dclk=0;break;
		case 3: ch451_din=command0&1;ch451_dclk=1;ch451_dclk=0;
		        command0>>=1;ch451_dclk=0; break;		
        default : break;
	   }
    }
	
  ch451_load=1;  
 }

//--------------------------------------------------------------------------------------------------------------


//*************************************************
 //延时程序
 void delay(unsigned char n){					//在12P下延时10毫秒
   unsigned char i,j,k;
   for(i=0;i<n;i++)
     for(j=0;j<40;j++)
       for(k=0;k<120;k++);
  }

//************************************************
//max197:
//maxD(0---7)--AD(0---7)--B(0---7)--A(0---7)--P0(0---7)
//direct:  dir=0 B-->A,dir=1 A-->B
/*D2 D1 D0
0  0   0 --ch0
0  0   1 --ch1
0  1   0 --ch2
0  1   1 --ch3
1  0   0 --ch4
1  0   1 --ch5
1  1   0 --ch6
1  1   1 --ch7
*/  
void max_set_data_get()
{
  unsigned char i;

  unsigned char  ad_command;
  unsigned char  p0_XL,p0_XH;

  //取第i路数据 
 for(i=0;i<6;i++)
 {
 
  ad_command=0x40+i;
  XBYTE[0x8600]=ad_command;


  delay(10);


  p0_XL=XBYTE[0x8600];
  p0_XH=XBYTE[0x8601];
  CH[i]= (p0_XH&0x0f)*256+ p0_XL;

 }
  
}
  
//---------------------------------------------------------------------------------------------------------------
//关于data转换的说明

//AD端  显示的 i=(5-v)/R0=v/0.25  (mA)  //v是A端的电压
//v=CH[i]
//DA端的工作原理:   A端电压 V0=2*Vrefin*(十位数字量)/1024             //Vrefin=2.048V  ,那个数字量<1023
////DA端  显示的 i=(2.88*V+3.6)/0.9
//DA端  显示的 i=switch():分段函数表示

void change_data()          
{		
      // int a=1023;    //任意给的值,测试DA用的
	  unsigned char i=0;
	  int x,y,z=0; char b;
	  
	  for(i=0;i<8;i++)
	  { if(i<=5)
		{
			CH[i]=CH[i]*4.096*1.2207/4096;
			
			CH[i]=CH[i]/0.25;    //显示电流数据(4--20mA)
		
        }
        else if(i==6)
        { 
			CH[i]=2*Vrefin*a/1024;      
            b=(char)(CH[i]*10);
			b%=100;	
               
            switch(b)
      		    { 
				     
				     case 0:  CH[i]=0;break;   //低于4毫安,显示零
				     case 1:  CH[i]=0 ;break;  //低于4毫安,显示零
				     case 2:  CH[i]=0 ;break;  //低于4毫安,显示零
				     case 3:  CH[i]=CH[i]*10+0.6 ;break;   //通过大量实验数据统计出的公式  V:(0.3---0.4)  mA:(3.9---4.5)  V*10+0.6     
					 case 4:  CH[i]=CH[i]*10+0.7 ;break;   //通过大量实验数据统计出的公式  V:(0.4---0.5)  mA:(4.6---5.7)  V*10+0.7 
					 case 5:  CH[i]=CH[i]*10+0.8 ;break;   //通过大量实验数据统计出的公式  V:(0.5---0.6)  mA:(5.8---6.9)  V*10+0.8 
					 case 6:  CH[i]=CH[i]*10+1.3 ;break;   //通过大量实验数据统计出的公式  V:(0.6---0.7)  mA:(7.0---8.5)  V*10+1.3 
					 case 7:  CH[i]=CH[i]*10+1.8 ;break;   //通过大量实验数据统计出的公式  V:(0.7---0.8)  mA:(8.6---10.3) V*10+1.8
					 case 8:  CH[i]=CH[i]*10+3.1 ;break;   //通过大量实验数据统计出的公式  V:(0.8---0.9)  mA:(10.4---12.5) V*10+3.1
					 case 9:  CH[i]=CH[i]*10+3.9 ;break;   //通过大量实验数据统计出的公式  V:(0.9---1.0)  mA:(12.6---14.2) V*10+3.9
					 case 10: CH[i]=CH[i]*10+4.5 ;break;   //通过大量实验数据统计出的公式  V:(1.0---1.1)  mA:(14.3---15.8) V*10+4.5
					 case 11: CH[i]=CH[i]*10+4.9 ;break;   //通过大量实验数据统计出的公式  V:(1.1---1.2)  mA:(15.9---16.9) V*10+4.9
					 case 12: CH[i]=CH[i]*10+5.1 ;break;   //通过大量实验数据统计出的公式  V:(1.2---1.3)  mA:(17.0---18.1) V*10+5.1
					 case 13: CH[i]=CH[i]*10+5.2 ;break;   //通过大量实验数据统计出的公式  V:(1.3---1.4)  mA:(18.2---19.1) V*10+5.2
					 case 14: CH[i]=CH[i]*10+5.3 ;break;   //通过大量实验数据统计出的公式  V:(1.4---1.5)  mA:(19.2---20.3) V*10+5.3
					 case 15: CH[i]=CH[i]*10+5.5 ;break;   //通过大量实验数据统计出的公式  V:(1.5---1.6)  mA:(20.4---21.5) V*10+5.5
					 case 16: CH[i]=CH[i]*10+5.6 ;break;   //通过大量实验数据统计出的公式  V:(1.6---1.7)  mA:(21.6---22.3) V*10+5.6
					 case 17: CH[i]=CH[i]*10+5.6 ;break;   //通过大量实验数据统计出的公式  V:(1.7---1.8)  mA:(22.6---23.5) V*10+5.6
					 case 18: CH[i]=23.5 ;break;   //通过大量实验数据的结论:此时已达到最大值  V:(1.8---....)  mA:23.5   
					 default :CH[i]=23.5 ;break;
				
				}//switch
        }//else if
        else
		{    xin_hao=1;//
			 if(xin_hao==1)
                CH[i]=1.0;
			 else
			    CH[i]=0.0;
        }


		Data_shi_wei[i]=CH[i]/10;
          
		     x=CH[i];
			 
		Data_ge_wei[i]=x%10+0x80;//各个位后带小数点
            
		     y=CH[i]*10;
			
		Data_shi_fen_wei[i]=y%10;
            
			 z=CH[i]*100;
			 
        Data_bai_fen_wei[i]=z%10;		  
		    
    }//for
}//change_data()


//----------------------------------------------------------------------------------------------------------------
//tlc5615
//p1.5----din,p1.6----sclk,p1.7---cs
void tlc5615_set_data_get(unsigned int command)
{  //定义一无符号整型变量存储10位的命令字。
  unsigned char i;
   tlc5615_cs=0;
   command<<=6;
  for(i=0;i<12;i++){                             //送入12位数据,高位在前,最低的两位是零
     tlc5615_sclk=0;
     tlc5615_din=command&0x8000;				
     tlc5615_sclk=1;
     command<<=1;
    }   
  tlc5615_cs=1;                 //load 12位数据                
}
  

void main(void)
{  
   ch451_init();
   ch451_write(0x401,0x401,0x401,0x401);  
   ch451_write(0x580,0x580,0x580,0x580);                           //测试送入命令
   //开始显示有效数据,数码管定义为:从右往左依次为百分位,十分位,各位(要显示小数点),十位
   //第一路,第二路数据显示用command0,第三路,第四路数据显示用command1     
   //第五路,第六路数据显示用command2,第七路,第八路数据显示用command3
   //P2=0x00;
   while(1)              
     {
	   
        max_set_data_get();//AD数据采集	

		// int a=1023;    //预定给的值,测试DA用的
        tlc5615_set_data_get(a); //DA数据采集
			    
		change_data();
  
     
	 ch451_write(CH451_DIG0|Data_shi_fen_wei[0],CH451_DIG0|Data_shi_fen_wei[2],
                 CH451_DIG0|Data_shi_fen_wei[4],CH451_DIG0|Data_shi_fen_wei[6]);
       //delay(1);
	 ch451_write(CH451_DIG1|Data_shi_fen_wei[0],CH451_DIG1|Data_shi_fen_wei[2],
                 CH451_DIG1|Data_shi_fen_wei[4],CH451_DIG1|Data_bai_fen_wei[6]);
       //delay(1);
	 ch451_write(CH451_DIG2|Data_ge_wei[0],CH451_DIG2|Data_ge_wei[2],
                 CH451_DIG2|Data_ge_wei[4],CH451_DIG2|Data_ge_wei[6]);
	   //delay(1);

	 ch451_write(CH451_DIG3|Data_shi_wei[0],CH451_DIG3|Data_shi_wei[2],
                 CH451_DIG3|Data_shi_wei[4],CH451_DIG3|Data_shi_wei[6]);
	   //delay(1);
    //下一列
	 ch451_write(CH451_DIG4|Data_bai_fen_wei[1],CH451_DIG4|Data_bai_fen_wei[3],
                 CH451_DIG4|Data_bai_fen_wei[5],CH451_DIG4|Data_bai_fen_wei[7]);
	   //delay(1);
	 ch451_write(CH451_DIG5|Data_shi_fen_wei[1],CH451_DIG5|Data_shi_fen_wei[3],
                 CH451_DIG5|Data_shi_fen_wei[5],CH451_DIG5|Data_shi_fen_wei[7]);
	   //delay(1);
	 ch451_write(CH451_DIG6|Data_ge_wei[1],CH451_DIG6|Data_ge_wei[3],
                 CH451_DIG6|Data_ge_wei[5],CH451_DIG6|Data_ge_wei[7]);
	   //delay(1);

	 ch451_write(CH451_DIG7|Data_shi_wei[1],CH451_DIG7|Data_shi_wei[3],
                 CH451_DIG7|Data_shi_wei[5],CH451_DIG7|Data_shi_wei[7]);
	   //delay(1);
      }
}


⌨️ 快捷键说明

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