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

📄 analog.c

📁 最实用的模拟量控制程序!但在实际应用中注意地址定义。
💻 C
字号:
#include "stdio.h"
#include "reg52.h"
#include <intrins.h>
#include "absacc.h"      
//-----------------------------------------------------------------------------
//全局常量
//-----------------------------------------------------------------------------
int flag;
#define SYSCLK 11059200 //系统时钟频率12MHz   
#define BAUDRATE 9600 // UART 波特率9600bps
//X25045
#define WREN   0x06                     
#define WRDI   0x04
#define RDSR   0x05
#define WRSR   0x01
#define READ0  0x03
#define READ1  0x0b
#define WRITE0 0x02           
#define WRITE1 0x0a
//DS12887
#define uchar unsigned char
#define uint unsigned int
#define P128870 XBYTE[0xfe00]
#define P128871 XBYTE[0xfe01]
#define P128872 XBYTE[0xfe02]
#define P128873 XBYTE[0xfe03]
#define P128874 XBYTE[0xfe04]
#define P128875 XBYTE[0xfe05]
#define P128876 XBYTE[0xfe06]
#define P128877 XBYTE[0xfe07]
#define P128878 XBYTE[0xfe08]
#define P128879 XBYTE[0xfe09]
#define P12887a XBYTE[0xfe0a]          
#define P12887b XBYTE[0xfe0b]
#define P12887c XBYTE[0xfe0c]
#define P12887d XBYTE[0xfe0d]
#define P12887e XBYTE[0xfe0e]
#define P12887f XBYTE[0xfe0f]

//X25045
#define X25045  XBYTE[0XFdFF]   
//ds8255        
#define P8255A XBYTE[0x1fff]     
#define P8255B XBYTE[0x5fff]                
#define P8255C XBYTE[0x9fff]
#define P8255chol XBYTE[0xdfff]


//---------------------------------------------------------------------------
//全局变量
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
// 函数原型
//-----------------------------------------------------------------------------
void UART0_INIT();  //串中初始化
void LED_Flash();
void cl_dog();
void setup12887(uchar *p);
void read12887(uchar *p);
void start12887();
unsigned char Read1B(unsigned char cAddress,bit bRegion);           //读出上次关机的时间
void Write1B(unsigned char cData,unsigned char cAddress,bit bRegion);
int  read2543(uchar cData,int n);//2543
void dac_5604(unsigned char ch, float out);
void msdelay(int i);

//-----------------------------------------------------------------------------
//端口定义x25045
//-----------------------------------------------------------------------------
sbit CS=P2^1; //单片机p2.7为片选  
sbit SO=P1^2; //数据输出 
sbit SI=P1^1; // 数据输入
sbit SK=P1^0; //时钟

//2543
sbit CS2543=P2^3;

//5604
sbit CS5604=P2^4;
sbit FS=P1^3;

//指示灯
sbit xianshiC=P2^2;                    
#define xianshi XBYTE[0Xfbff]   
         
/*主函数*/
void main()
{ unsigned int i;
  unsigned char ch1;
  uchar  *p;
  uchar  time[8]={'0','0','0','0','0','0','0','0'};
  p=&time;//
  UART0_INIT();
  CS5604=1;
  CS2543=1;
  SBUF=0X34;  //缓冲寄存器
 // cl_dog();
  for(i=0;i<8;i++)
     {
      *p++=Read1B(i,0);//读出上次关机的时间
     }
  p=&time;
  if(time[0]==0)
     {  
        setup12887(p);for(i=0;i<10;i++){;}
     }
  start12887();
 // read12887(5);
 while(1)
     {  int Dataoutput;
        //ch1=0x80;
	  printf("start test\n  ");
        Dataoutput=read2543(0x09,100);
      printf("channel=:0x09,A/D=%u\n",Dataoutput);   
        //dac_5604(ch1,2.8);
      //  printf("the test is over\n  ");//  
   //
    // xianshi=0x00;
    // for(i=0;i<0xffff;i++){;}
     //xianshi=0xff;
   //  for(i=0;i<0xffff;i++){;}
   // printf("input digital\n ");
	 //data_output=ad2543(channel,500); 
   // 
//	 printf("input digital\n");
   //printf("channel=:%u,Analog=: %u\n",channel,data_output);  
      }
 }

//void LED_Flash()
 // { short int i;
  //  xianshi=0x00;
  //  for(i=0;i<0xffff;i++){;}
 //   xianshi=0xff;
 //   for(i=0;i<0xffff;i++){;}
//  }




           //   void Loop_Test()   ////指示灯亮息
                //    {
                  //    uchar B_out=1,i;
                    //   for(i=0;i<8;i++)
                   //    {
                     //   write8255(B_out);
                      //  LED_Flash();

                      //  B_out=B_out<<1;
                     //   }
                   //  }


 



void UART0_INIT(void)          //串行口初始化
{
  SCON=0X50;//串口工作方工1,读允许
  TMOD=0X22;//定时器1工作在方式2;定时器0工作在方式2
  PCON=0X00;
  TCON=0X21;//
  IP=0X01;
  TI=1;
  IT0=0;
  TR1=1;
  TR0=0;
  TL0=0X00;
  TH0=0X00;
  TL1 = 0xfa; // 按波特率设置定时器1 初值fa为4800 fd为9600
  TH1 = 0xfa; // 按波特率设置定时器1 重装值fa为4800 fd为9600
 }

//-------------------------------------
//x25045
//-------------------------------------
unsigned char Read8()//读8位数据     
{
bit bData;
unsigned char cLoop;
unsigned char cData;
for(cLoop=0;cLoop<8;cLoop++)
{
msdelay(40);
SK=1;
msdelay(40);
SK=0;
msdelay(40);
bData=SO;
cData<<=1;    //没有值怎么移位???
if(bData)
{
cData|=0x01;
}
}
return cData;
}

void Write8(unsigned char cData)//写8位数据     
{
unsigned char cLoop;
for(cLoop=0;cLoop<8;cLoop++)
{
if((cData&0x80)==0)
{
SI=0;
}
else
{
SI=1;
}
msdelay(10);
SK=0;
msdelay(10);
SK=1;
msdelay(10);
cData<<=1;
}
}

unsigned char ReadSR()//读状态寄存器          ?
{
unsigned char cData;
CS=0;
Write8(RDSR);
_nop_();_nop_();_nop_();
cData=Read8();
CS=1;
return cData;
}

unsigned char WriteSR(unsigned char cData)//写状态寄存器      
{
unsigned char cTemp;
cTemp=ReadSR();
//if((cTemp&0x01)==1)
//{
//   printf("write SR  wrong:  \n"); 
//   return 0;////////////////////////以上两句在实际使用时,要加上;
//}
CS=0;
Write8(WREN);
CS=1;
CS=0;
Write8(WRSR);
Write8(cData);
CS=1;
 //printf("write SR  right:  \n");
return 1;   //怎么始终返回是1
}

void Write1B(unsigned char cData,unsigned char cAddress,bit bRegion)
/* 写入一个字节,cData为写入的数,cAddress为写入地址,bRegion为页 */
{
//while((ReadSR()&0x01)==1)
//{
//}
CS=0;
Write8(WREN);
CS=1;
CS=0;
if(bRegion==0)
{
Write8(WRITE0);
}
else
{
Write8(WRITE1);
}
Write8(cAddress);
Write8(cData);
SK=0;
CS=1;
}

unsigned char Read1B(unsigned char cAddress,bit bRegion)
/* 读入一个字节,cAddress为读入地址,bRegion为页 */
{
unsigned char cData;
//while((ReadSR()&0x01)==1)
//{
//}
CS=0;
if(bRegion==0)
{
Write8(READ0);
}
else
{
Write8(READ1);
}
Write8(cAddress);
cData=Read8();
CS=1;
return cData;
}

void cl_dog(void)//禁止看门狗
{
   unsigned char cdata;
   unsigned char tdata;
   tdata=0;
   cdata=ReadSR();//读当前状态寄存器
   cdata=cdata|0x30;
   do
   {
     tdata=WriteSR(cdata);//写状态寄存器,禁止看门狗 

	 }while(tdata==0);
}

//--------------------------
//ds12887
//---------------------------         

void setup12887(uchar *p) //设置系统时间
{
uchar i;
i=P12887d;
P12887a=0x70;
P12887b=0xa2; 
P128870=*p++; 
P128871=0xff; 
P128872=*p++;
P128873=0xff; 
P128874=*p++; 
P128875=0xff; 
P128876=*p++; 
P128877=*p++;
P128878=*p++;
P128879=*p++; 
P12887b=0x22;
P12887a=0x20;
i=P12887c;
}
void read12887(uchar *p) //读取系统时间
{
uchar a;
do{ a=P12887a; } 
while((a&0x80)==0x80);
*p++=P128870; 
*p++=P128872; 
*p++=P128874; 
*p++=P128876;
*p++=P128877; 
*p++=P128878;
*p++=P128879;
}
void start12887(void) //启动时钟
{
uchar i;
i=P12887d;
P12887a=0x70; P12887b=0xa2; P128871=0xff; P128873=0xff; P128875=0xff;
P12887b=0x22; P12887a=0x20;
i=P12887c;
}
//2543  read function
 int read2543(int channel,int n)//write cData to the chip,example,00000011 is select the AN3,and MSB is before
{ unsigned char i;
  int cData;
  int value=0;
  cData=channel;
  CS2543=0;
  
  for(i=0;i<12;i++)
   {  
     SK=1;
     SI=(bit)(cData&0x0008);
     msdelay(n);
     SK=0;  
     cData=cData<<1;
     msdelay(n);
    }

  IE=0x81; //open interrupt
  SK=1; 
  CS2543=1;
  
  
 for(i=0;i<2; )
{ 
    if (flag)
  {
    
    cData=channel;
    CS2543=0;   
    for(i=0;i<12;i++)
      {  
       SK=1;
       value=value<<1;
       SI=(bit)(cData&0x0008);
       msdelay(n);   
       if(SO)
         {    
          SK=0; 
          value |=0x0001;
          msdelay(n);
         }
       else
         { 
          SK=0;
          value &=0xfffe;
          msdelay(n);
         }
        cData=cData<<1;   
        } 
       
        IE=0x00; //close interrupt 
        SK=1;   
        CS2543=1;
        flag=0;
      }
    
     }
 return value; 
}
  
//中断函数
void EOCinterrupt() interrupt 0 
{  
   flag=1;
}



//TLC5604
void dac_5604(unsigned char ch,float out)
{ 
  unsigned int i,n,cod;
  cod=(out*1024)/5;//2*Vref  参考电压
//  printf(" 输出 1 input digtial %d\n",cod);
  cod<<=6;
  FS=1;
  for(i=0;i<5;i++){;}
  CS5604=0;
  FS=0;
 // cod=0xffff;
 
  for(n=0;n<4;n++)  /*确定输出在(A,B,C,D)通道*/
   { if((ch&0X80)==0x80)
	    SI=1; 
	  else
	    SI=0;
	  ch<<=1;
     SK=0;
     for(i=0;i<10;i++){;}
     SK=1; 
     for(i=0;i<10;i++){;}
  	}
  
  for(n=0;n<10;n++)   /*输出模拟信号*/
   { 
      if((cod&0X8000)==0x8000)
	     SI=1;
      else
	     SI=0; 
      cod<<=1;
      SK=0;
      for(i=0;i<10;i++){;}
      SK=1; 
      for(i=0;i<10;i++){;}
   } 
 // printf(" 输出 input digtial :%d\n",cod);
  for(i=0;i<10;i++){;}
  SI=0;
  SK=0;
  for(i=0;i<10;i++){;}
  SK=1;
  for(i=0;i<10;i++){;}
  SI=0;
  SK=0;
  for(i=0;i<10;i++){;}
  SK=1;
 // msdelay(200);
  FS=1;
  CS5604=1;
 // msdelay(50);
 // for(i=0;i<200;i++){;}
}


//-----------------------------------------------------
//延时函数
//-----------------------------------------------------
void msdelay(int i)
{
  int m;
  for(m=0;m<i;m++){;}
}

⌨️ 快捷键说明

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