• 大小: 13.34MB
    文件类型: .7z
    金币: 1
    下载: 0 次
    发布日期: 2023-06-29
  • 语言: 其他
  • 标签: 单片机  

资源简介

通过STM89C51单片机控制烟雾传感器,通过AD0832数模转换和LCD1602来显示烟雾的浓度。

资源截图

代码片段和文件信息

#include 
#include 
//变量定义:
unsigned char ly_dis[4];   //定义显示缓冲区
code unsigned char table[]={0x3f0x060x5b0x4f0x660x6d0x7d0x07
0x7f0x6f0x770x7c0x390x5e0x790x71};//表:共阳数码管 0-9
unsigned char l_posit=0; //显示位置
//引脚定义:  
sbit SMG_q = P0^0; //定义数码管阳级控制脚(千位)
sbit SMG_b = P0^1; //定义数码管阳级控制脚(百位)
sbit SMG_s = P0^2; //定义数码管阳级控制脚(十位)
sbit SMG_g = P0^3; //定义数码管阳级控制脚(个位)
sbit CS   = P2^3;
sbit Clk = P2^2;
sbit DATI = P2^0;
sbit DATO = P2^1;
unsigned char dat = 0x00;      //AD值
unsigned char count = 0x00;      //定时器计数
unsigned char CH;       //通道变量
//函数声明:
void display(void);//显示函数,显示缓冲区内容
void delay(void);
//unsigned char GetValue0832(bit Channel);
unsigned char adc0832(unsigned char CH);
//主函数,C语言的入口函数: 
void main()

 unsigned int i=0;
 int ltemp;
 while(1)
 {
  if(i==100)
  {
   ltemp=2*adc0832(1);       //隔时取模数转换(0~255对应0.00-5.00的电压)
   ly_dis[0]=ltemp/100;    //显示百位值
   ltemp=ltemp%100;
   ly_dis[1]=ltemp/10; //显示 十位值
   ltemp=ltemp%10;
   ly_dis[2]=ltemp/1; //显示 个位值
   ly_dis[3]=0;  //显示小数点后一位0
  }
  i++;
  if(i==500)
   i=0;
  display(); //调用显示调一次只显示一位轮流显示四位
  delay();     
 }
}
//显示函数,参数为显示内容
void display()
{
 P0=0x00; 
 
for(l_posit=0;l_posit<=3;l_posit++)
{  // 
 P0=0xfe;
P1=table[ly_dis[0]];
delay();
 P0=0xfd;
P1=table[ly_dis[1]];
delay();
 P0=0xfb;
P1=table[ly_dis[2]];
delay();
P0=0xf7;
P1=table[ly_dis[3]];
delay();
  //每调用一次将轮流显示一位

};
}
//延时子函数短暂延时
void delay(void){  
 unsigned char i;
i=10;
 while(i--);
}
/****************************************************************************
函数功能:AD转换子程序
入口参数:CH
出口参数:dat
****************************************************************************/
unsigned char adc0832(unsigned char CH)
{
      unsigned char itestadval;
     adval = 0x00;
     test = 0x00;
     Clk = 0;       //初始化
     DATI = 1;
     _nop_();
     CS = 0;
     _nop_();
     Clk = 1;
     _nop_();
   if ( CH == 0x00 )      //通道选择
   {
       Clk = 0;
       DATI = 1;      //通道0的第一位
       _nop_();
       Clk = 1;
       _nop_();
       Clk = 0;
       DATI = 0;      //通道0的第二位
       _nop_();
       Clk = 1;
       _nop_();
    }
    else
    {
       Clk = 0;
       DATI = 1;      //通道1的第一位
       _nop_();
       Clk = 1;
       _nop_();
       Clk = 0;
       DATI = 1;      //通道1的第二位
       _nop_();
       Clk = 1;
       _nop_();
    }
      Clk = 0;
      DATI = 1;
    for( i = 0;i < 8;i++ )      //读取前8位的值
    {
       _nop_();
       adval <<= 1;
       Clk = 1;
       _nop_();
       Clk = 0;
       if (DATO)
          adval |= 0x01;
      else
          adval |= 0x00;
    }
      for (i = 0; i < 8; i++)      //读取后8位的值
      {
           test >>= 1;
           if (DATO)
              test |= 0x80;
           else
              test |= 0x00;
          _nop_();
          Clk = 1;
          _nop_();
          Clk = 0;
      }
      if (adva

评论

共有 条评论