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

📄 0809.c

📁 AD0809转换程序C代码并将转换的数据由LCD1602显示主芯片为AT89C52
💻 C
字号:
#include <REGX52.H>
#include <intrins.h>
#include <absacc.h>
#include <math.h>

void WriteCommandLCM(unsigned char WCLCM,unsigned char BusyC);
void DisplayListChar(unsigned char X,unsigned char Y,unsigned char code *DData);
void lcd_wait(void);   //LCD内部等待函数
void delay(int k);     //定义延时
void initLCM();        //定义显示器初始化
void display(void);    //显示函数
unsigned char ad_action(unsigned char chn);
void IntToStr1(unsigned int t);
void IntToStr2(unsigned int t);
void TimeInitial();
void alarm(void);

#define DATAPORT P2
unsigned char chnn;
#define IN0 XBYTE[0x7ff8+chnn]
unsigned char dispdata1[4]; 
unsigned char dispdata2[4]; 
unsigned int pre;
unsigned int tem;

sbit LCM_RS=P3^1;
sbit LCM_RW=P3^3;
sbit LCM_EN=P3^4;
sbit EOC=P3^2; 			//忙信号
sbit Clk=P3^5;  		//时钟信号
sbit BLUE=P1^0;
sbit RED=P1^3;
sbit warning=P1^7;

unsigned char code str1[]={"temperature:   C"};
unsigned char code str2[]={"pressure:    Kpa"};

void main()
{
  unsigned char q=0;
  unsigned char p;
  unsigned char xdata *ad_adr;
  TMOD=0x20;
  TL1=0xfd;
  TH1=0xfd;
  SCON=0x50;
  PCON&=0xef;
  TR1=1;
  ES=0;
  delay(500);                  //系统延时500ms启动
  initLCM();                   //进行LCD初始化子程序
  WriteCommandLCM(0x01,1);     //清显示屏
  DisplayListChar(0,0,str1);   //显示器第一行
  DisplayListChar(0,1,str2);   //显示器第二行
  TimeInitial();
  ad_adr=&IN0;
  while(1)
  {
    *ad_adr = 0; 
    p=p;   //延时
    p=p;
    p=p;
    while(EOC==0);
    while(1)
    {
    IntToStr1(ad_action(0)*1.0/255*600);
    display();
    IntToStr2(ad_action(1)*1.0/255*40);
    display();
    alarm();
    while(str1[q]!='\0')
    SBUF=str1[q];
    while(!TI);
    TI=0;
    q++;
    }
    delay(500);
  }
}

/*********延时K*1ms程序*********/
void delay(int k)
{
  int i,j;
  for(i=0;i<k;i++)
  {
    for(j=0;j<60;j++)
    {;}
  }
}

/**********LCM初始化子函数***********/
void initLCM()
{   
  DATAPORT=0;	
  delay(15);
  WriteCommandLCM(0x38,0);    //三次显示模式设置,不检测忙信号
  delay(5); 
  WriteCommandLCM(0x38,0);
  delay(5); 
  WriteCommandLCM(0x38,0);
  delay(5); 
  WriteCommandLCM(0x38,1);    //8bit数据传送,2行显示,5*7字型,检测忙信号
  WriteCommandLCM(0x08,1);    //关闭显示,检测忙信号
  WriteCommandLCM(0x01,1);    //清屏,检测忙信号
  WriteCommandLCM(0x06,1);    //显示光标右移设置,检测忙信号
  WriteCommandLCM(0x0c,1);    //显示屏打开,光标不显示,不闪烁,检测忙信号
}

/**********写指令到ICM子函数************/
void WriteCommandLCM(unsigned char WCLCM,unsigned char BusyC)
{
  if(BusyC)
  lcd_wait();
  DATAPORT=WCLCM;
  LCM_RS=0;                 // 选中指令寄存器
  LCM_RW=0;               	// 写模式	
  LCM_EN=1;    
  _nop_();   
  _nop_();
  _nop_(); 
  LCM_EN=0; 
}

/**********写数据到LCM子函数************/
void WriteDataLCM(unsigned char WDLCM)
{ 
  lcd_wait();            //检测忙信号    
  DATAPORT=WDLCM;
  LCM_RS=1;              // 选中数据寄存器
  LCM_RW=0;           	 // 写模式
  LCM_EN=1;
  _nop_();
  _nop_();
  _nop_();
  LCM_EN=0;
}

/***********LCD内部等待函数*************/
void lcd_wait(void)
{
  DATAPORT=0xff;	     //读LCD前若单片机输出低电平,而读出LCD为高电平,则冲突,Proteus仿真会有显示逻辑黄色
  LCM_EN=1;
  LCM_RS=0;   
  LCM_RW=1;   
  _nop_();
  _nop_();
  _nop_();
  while(P0&0x80)  
  {  
    LCM_EN=0;
	_nop_();
	_nop_();
	LCM_EN=1;
	_nop_();
	_nop_();
  }	 
  LCM_EN=0;	
}

/****显示指定坐标的一个字符子函数****/
void DisplayOneChar(unsigned char X,unsigned char Y,unsigned char DData)

{
  Y&=0x01;
  X&=0x0f;
  if(Y)X|=0x40;               //若y为1(显示第二行),地址码+0X40
  X|=0x80;                    //指令码为地址码+0X80
  WriteCommandLCM(X,1);
  WriteDataLCM(DData);
}

/*******显示指定坐标的一串字符子函数*****/ 
void DisplayListChar(unsigned char X,unsigned char Y,unsigned char code *DData)
{
  unsigned char ListLength=0;
  Y&=0x01;
  X&=0x0f;
  while(X<16)
  {
    DisplayOneChar(X,Y,DData[ListLength]);
    ListLength++;
    X++;
  }
}

/*************系统显示子函数*************/
void display(void)
{
  WriteCommandLCM(0x0c,1);    				//显示屏打开,光标不显示,不闪烁,检测忙信号	
  DisplayListChar(0,0,str1);	
  DisplayListChar(0,1,str2);	
  DisplayOneChar(12,0,dispdata1[1]+0x30);
  DisplayOneChar(13,0,dispdata1[2]+0x30);
  DisplayOneChar(14,0,dispdata1[3]+0x30);
  DisplayOneChar(10,1,dispdata2[2]+0x30);
  DisplayOneChar(11,1,dispdata2[3]+0x30);
  delay(500);                            //稳定显示
}


//AD0808CLOCK时钟信号
void Time(void) interrupt 3 using 0
{
  TH1=(65536-200)/256;
  TL1=(65536-200)%256;
  Clk=~Clk;
}

//AD0808初始化
void TimeInitial()
{ 
  TMOD=0x10;
  TH1=(65536-200)/256;
  TL1=(65536-200)%256;
  EA=1; 	
  ET1=1;	
  TR1=1;
}

//AD0808数据转换
unsigned char ad_action(unsigned char chn)
{
  unsigned char read_data;
  chnn=chn;
  IN0=chn;
  delay(15);
  read_data=IN0;
  return read_data;
}   

//读取AD0808数据
void IntToStr1(unsigned int t)
{	
  dispdata1[0]=(t/1000)%10;   //取得整数值到数组         	
  dispdata1[1]=(t/100)%10;
  dispdata1[2]=(t/10)%10;
  dispdata1[3]=(t/1)%10;
}
void IntToStr2(unsigned int t)
{	
  dispdata2[0]=(t/1000)%10;  //取得整数值到数组         	
  dispdata2[1]=(t/100)%10;
  dispdata2[2]=(t/10)%10;
  dispdata2[3]=(t/1)%10;
}

void alarm()
{
    pre=dispdata2[2]*10+dispdata2[3];
    tem=dispdata1[1]*100+dispdata1[1]*10+dispdata1[1];
    if(20<=pre&&pre<=30&&tem<400)
    {
    BLUE=0;
    RED=1;
    }
    else
    {
    BLUE=1;
    RED=0;
    }
}

⌨️ 快捷键说明

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