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

📄 7841.c

📁 该文件包含了AD7841的源程序
💻 C
字号:
#include  <REG52.H>
#include  <stdio.h>
#include  <string.h>
#include  <absacc.h>
#include  <intrins.h>
#define     TRUE       1
#define     FALSE      0
#define     uchar      unsigned   char
#define     uint       unsigned   int
#define     ulong      unsigned   long
#define     LCD_DATA P0 //数据口

sbit   RS = P2^0; //并行的指令/数据选择信号, H数据, L命令
sbit   RW = P2^1; //并行读写选择信号, H读, L写
sbit   E = P2^2;  //并行使能端, H有效, L无效
sbit   LED=P3^7; 
sbit   DCLK=P2^3;
sbit   DIN=P2^4;
//sbit   CS=P2^5;
sbit   DOUT=P2^6;

typedef struct __SYSTEMTIME__
{
	unsigned char gewei;
	unsigned char shiwei;
	unsigned char baiwei;
	unsigned char qianwei;
	unsigned char DateString[5];
}SYSTEMTIME;	//定义的时间类型

uint datax;

/*****************************************************************************
* 名称    :void Start_7841(void)
* 功能描述:启动7841进行转换,CS变低,开始转换过程
* 输入参量:无
* 输出参量:无
* 调用子程:无
* 使用方法:进行读数据之前要开始转换
-------------------*/
void Start_7841(void)
{
 //CS=0;
 DIN=0;
 DCLK=0;
}
 
/****************************************************************************
* 名称    :void Stop_7841(void)
* 功能描述:停止7841进行转换
* 输入参量:无
* 输出参量:无
* 调用子程:无
* 使用方法:当不用ad转换时停止转换器
------------------*/
void Stop_7841(void)
{
 //   CS=1;
 DIN=0;
 DCLK=0;
}
/****************************************************************
* 名称    :  void Write_Byte_3W(unsigned char cmd)
* 功能描述:  写命令字节
* 输入参量:  需要写的字节
* 输出参量:  无 
* 调用子程:  无
* 使用方法:  
-------------------------------------------------*/
void Write_Command(unsigned char cmd)   
{
 unsigned char i;
 for(i = 0; i < 8; i++) 
 { 
  if(cmd & 0x80) 
  { 
   DIN=1; 
  }  
  else  
  {  
   DIN=0;  
  }  
  DCLK=0;  
  DCLK=1;  
  cmd<<= 1;
 } 
 DIN=0; 
 DCLK=0;
}
/****************************************************************
* 名称    :  unsigned int Read_Data(void)
* 功能描述:  读AD转换后的数据
* 输入参量:  需要写的字节
* 输出参量:  读出的数据 
* 调用子程:  无
* 使用方法:  
----------------------------*/
unsigned int Read_Data(void)    
{
 unsigned char i;
 unsigned int AD_data;
 AD_data = 0;
 for(i=0;i<12;i++)
 { 
  DCLK=1;
  DCLK=0;     
  if(DOUT) //DOUT为高          
  { 
   AD_data<<=1; 
   AD_data+=0x01;
  } 
  else 
  { 
   AD_data <<= 1;
  }
 }
 for(i=0;i<4;i++)
 {
  DCLK=0;
  DCLK=1;
 }
 return AD_data;
}
/*****************************************************************************
* 名称    :void Read_7844_Data(unsigned char  chanel)
* 功能描述:从7844读数据,12bit  ,输入存储器的格式为下面
              D7 D6 D5 D4 D3 D2   D1   D0
              S  A2 A1 A0    SD  PD1   PD2
              1                            起始位为1
                 1   1  1                  通道选择
                             1             单端转换
                                  0    0  自动节电状态
* 输入参量:需要转换的通道号
* 输出参量:用unsigned char 形式表示的ad转换后的值
* 调用子程:
* 使用方法:
-----------------------------------------------*/
unsigned int ADC_Convert(unsigned char ch)
{
 unsigned char cmd,ADS_channel;
 unsigned int  ADData=0;
 switch(ch)
 {
  case 0:  ADS_channel=0x10;break;
  case 1:  ADS_channel=0x50;break;
  case 2:  ADS_channel=0x20;break;
  case 3:  ADS_channel=0x60;break;
  default: ADS_channel=0x10;break;
 }
 cmd=(ADS_channel)|(0x84);
 Start_7841();     //开始读取
 Write_Command(cmd);
 ADData=Read_Data();
 Stop_7841();
 return ADData;
}
/*************************************************************/
//延时约2us
void delayUs()
{
    _nop_();_nop_();
}
//延时 a * 1ms
void delayMs(uint a)
{
    uint i, j;
    for(i = a; i > 0; i--)
        for(j = 100; j > 0; j--);
}

//检测LCD是否处于忙状态, 若忙返回1, 空闲返回0
bit checkBusy()
{
    bit busy;
    RS = 0;
    RW = 1;
    E = 1;
    delayUs();
    busy = (bit)(LCD_DATA&0x80);
    E = 0;
    return busy;
}

//等待LCD到空闲
void wait()
{
    while(checkBusy());
}

//写命令
void writeCmd(uchar cmd)
{
    wait();
    RS = 0;
    RW = 0;
    E = 0;
    delayUs();
    LCD_DATA = cmd;
    delayUs();
    E = 1;
    delayUs();
    E = 0;
}

//写数据
void writeData(uchar dat)
{
    wait();
    RS = 1;
    RW = 0;
    E = 0;
    delayUs();
    LCD_DATA = dat;
    delayUs();
    E = 1;
    delayUs();
    E = 0;
}

//初始化LCD
void init()
{
    //PSB = 1; //并口方式
    writeCmd(0x30); //基本指令, 扩充指令为34H
    delayMs(10);
    writeCmd(0x0c); //显示开, 关光标
    delayMs(10);
    writeCmd(0x01); //清屏
    delayMs(10);
}

void setPosition(uchar x, uchar y)
{
    uchar p;
    switch(x%4)
    {
        case 0: p = 0x80; break; //第一行开始地址
        case 1: p = 0x90; break; //第二行
        case 2: p = 0x88; break; //第三行
        case 3: p = 0x98; break; //第四行
    }
    p += y;
    writeCmd(p);
}

void DateToStr(SYSTEMTIME *Time)
{
	Time->qianwei=datax/1000;
	Time->baiwei=(datax/100)%10;
	Time->shiwei=(datax/10)%10;
	Time->gewei=datax%10;
    Time->DateString[0] = Time->qianwei + '0';
	Time->DateString[1] = Time->baiwei + '0';	
	Time->DateString[2] = Time->shiwei + '0';
	Time->DateString[3] = Time->gewei  + '0';	 
	Time->DateString[4] = '\0';
}

void writeString(uchar * str)
{
    uchar i = 0;
    while(str[i] != '\0')
    {
        writeData(str[i++]);
    }
}
/******************************************************************/
void main(void)
{
 SYSTEMTIME S;
 while(1)
 {
  LED=0;
  init();
  setPosition(0,0);
  datax=ADC_Convert(0);
  DateToStr(&S);
  writeString(S.DateString);
 } 
}

⌨️ 快捷键说明

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