×
单片机 > 单片机程序设计 > 详情

0832ADC的51测试程序

发布时间:2020-06-15 发布时间:
|
#include"reg52.h"

#include
#include"intrins.h"

//==========================================================
sbit CS=P3^0;    //使能片选
sbit CLK=P3^1;   //时钟
sbit Do=P3^2;    //数据输出
sbit Di=P3^2;    //数据输入
sbit Do2=P3^3;    //数据输出
sbit Di2=P3^3;    //数据输入
sbit Do3=P3^4;    //数据输出
sbit Di3=P3^4;    //数据输入
sbit Do4=P3^5;    //数据输出
sbit Di4=P3^5;    //数据输入
sbit Do5=P3^6;    //数据输出
sbit Di5=P3^6;    //数据输入

unsigned char data_f=0,data_c=0,data_f2=0,data_c2=0,data_f3=0,data_c3=0,data_f4=0,data_c4=0,data_f5=0,data_c5=0;  //data_f正确顺序  data_c逆序

unsigned char last[5];    //记录上一时刻各AD转换得到的值
unsigned char current[5];  //记录此次AD转换得到的值

int left = 0;   //记录0.1秒内电机向左转动的步数
int right = 0; //记录0.1秒内电机向右转动的步数

sbit RS = P2^4;//Pin4
sbit RW = P2^5; //Pin5
sbit E  = P2^6;//Pin6

#define Data  P0    //数据端口

char data TimeNum[]="                ";
char data Test1[]="                  ";


/******************************************************************/
/*                    函数声明                                    */
/******************************************************************//***************************************************************/
void DelayUs(unsigned char us)//delay us
{
 unsigned char uscnt;
 uscnt=us>>1;/* Crystal frequency in 12MHz*/
 while(--uscnt);
}
/******************************************************************/
void DelayMs(unsigned int ms)//delay Ms
{
 while(--ms)
   {
     DelayUs(250);
     DelayUs(250);
  DelayUs(250);
  DelayUs(250);
   }
}
void WriteCommand(unsigned char c)
{
 DelayMs(5);//short delay before operation
 E=0;
 RS=0;
 RW=0;
 _nop_();
 E=1;
 Data=c;
 E=0;
}
/****************************************************************/
void WriteData(unsigned char c)
{
 DelayMs(5);   //short delay before operation
 E=0;
 RS=1;
 RW=0;
 _nop_();
 E=1;
 Data=c;
 E=0;
 RS=0;
}
/*********************************************************************/
void ShowChar(unsigned char pos,unsigned char c)
{
 unsigned char p;
 if (pos>=0x10)
    p=pos+0xb0; //是第二行则命令代码高4位为0xc
 else 
    p=pos+0x80; //是第二行则命令代码高4位为0x8
 WriteCommand (p);//write command
 WriteData (c);   //write data
}
/*************************************************************************/
void ShowString (unsigned char line,char *ptr)
{
 unsigned char l,i;
 l=line<<4;
 for (i=0;i<16;i++)
  ShowChar (l++,*(ptr+i));//循环显示16个字符
}
/*********************************************************************/
void InitLcd()
{
 DelayMs(15);
 WriteCommand(0x38); //display mode
 WriteCommand(0x38); //display mode
 WriteCommand(0x38); //display mode
 WriteCommand(0x06); //显示光标移动位置
 WriteCommand(0x0c); //显示开及光标设置
 WriteCommand(0x01); //显示清屏

}


//////////////////////////////////////////////////////////////////////
//ADC转换函数========================================================
void ADconv()
{
  unsigned char i;


  //时能前初始化====================================================
  Di=1;
  Di2=1;
  Di3=1;
  Di4=1;
  Di5=1;


  CS=1;
  _nop_();
  CS=0;
  Di=1;
  Di2=1;
  Di3=1;
  Di4=1;
  Di5=1;
  //=================================================================

  //第一个下降沿===================================================
  CLK=1;
  _nop_();
  _nop_();
  CLK=0;
  //=================================================================
  
  //确定通道方式,第二个下降沿===================================
  _nop_();
  _nop_();
  CLK=1;
  Di=1;
  Di2=1;
  Di3=1;
  Di4=1;
  Di5=1;
  _nop_();
  _nop_();
  CLK=0;
  //=================================================================
  
  //第三个下降沿===================================================
  _nop_();
  _nop_();
  CLK=1;
  Di=0;
  Di2=1;
  Di3=1;
  Di4=1;
  Di5=1;
  _nop_();
  _nop_();
  CLK=0;      //AD初始化完成     
  //=================================================================  
  
  //读取数据========================================================
  Di=1;       //IO变为输入
  Di2=1;
  Di3=1;
  Di4=1;
  Di5=1;
  CLK=1;
  _nop_();
  _nop_();
  CLK=0;

  CLK=1;
   CLK=1;
  _nop_();
  _nop_();
  CLK=0;

  CLK=1;
  //得到一个正常排序的8位数据
  for(i=8;i>0;i--)
  {
 data_f<<=1;
 data_f2<<=1;
 data_f3<<=1;
 data_f4<<=1;
 data_f5<<=1;

    data_f|=Do;
    data_f2|=Do2; 
    data_f3|=Do3;
    data_f4|=Do4; 
    data_f5|=Do5;

 

 CLK=1;
    _nop_();
    _nop_();
    CLK=0;
    _nop_();  
  }
  //==============================
  //得到一个反序排列的8位数据  
  for(i=8;i>0;i--)
  {
 data_c<<=1;
 data_c2<<=1;
 data_c3<<=1;
 data_c4<<=1;
 data_c5<<=1;

    data_c|=Do;
    data_c2|=Do2;
    data_c3|=Do3;
    data_c4|=Do4;
    data_c5|=Do5;

    _nop_();
 CLK=1;
    _nop_();
    _nop_();
    CLK=0;
    _nop_();  
  }
  //==============================
  CLK=0;
  _nop_();
  _nop_();
  CLK=1;
  _nop_();
  _nop_();
  CLK=0; 
  _nop_();
  _nop_();
  CLK=1;
  _nop_();
  CS=1;
  _nop_();
  _nop_();


}
//===================================================================

//显示转换===========================================================
char huanhuan(unsigned char benben)
{
  switch(benben)
  {
    case 0:
 return '0';
 break;

 case 1:
 return '1';
 break;

 case 2:
 return '2';
 break;  
  
 case 3:
 return '3';
 break;

 case 4:
 return '4';
 break;

 case 5:
 return '5';
 break;

 case 6:
 return '6';
 break;

 case 7:
 return '7';
 break;

 case 8:
 return '8';
 break;

 case 9:
 return '9';
 break;

 default:
 break;
  }
}
//===================================================================

void main()
{
  unsigned xianshi=0;
  InitLcd();
  DelayMs(15);
  sprintf(Test1," wo shi tiancai ");//the first line
  ShowString(0,Test1);
  sprintf(TimeNum,"AD value is     ");//the first line
  ShowString(1,TimeNum);
  while(1)
  {  
    DelayMs(800);
    xianshi=data_f;     
    ADconv();
 TimeNum[12]=huanhuan(xianshi/100);
 TimeNum[13]=huanhuan(xianshi/10%10);
 TimeNum[14]=huanhuan(xianshi%10);
    ShowString(1,TimeNum);
  }
}

关键字:0832ADC  51测试程序 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
STM32单片机的复用端口初始化的步骤及方法