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

📄 7.c

📁 AD0809很翔实的资料。包括电路设计
💻 C
字号:
/*********************************************************************
实验:温度和压力的测量实验
接线方法:
YS0----CS40
YS2----CS13
YS0----CS40
CLOCK--0.5M
IN0----AN0   (压力)
IN1----AN1   (温度)
**********************************************************************/
#include<reg52.h>
#include<stdio.h>
#include  <absacc.h>
#include  <intrins.h>
#include  <ctype.h>


xdata unsigned char OUTBIT _at_ 0x8002;           // 位控制口
xdata unsigned char OUTSEG _at_ 0x8004;           // 段控制口
xdata unsigned char IN     _at_ 0x8001;           // 键盘读入口

xdata unsigned char CS0809 _at_ 0xa000;     //定义第一通道

xdata unsigned char CSIN   _at_ 0xa001;//定义第二通道

sbit DQ =P3^3;   //定义p3.3口

#define  uchar  unsigned  char
#define  uint   unsigned  int
#define Debugging 50
#define Debug     100

unsigned int MAP[Debugging+1];

void   delay(uint useconds);
uchar  ow_reset(void);
uchar  read_byte(void);
void   write_byte(uchar val);
uint   Read_Temperature(void);
void Dis_LED(unsigned char n);



void Array (void)
{
	int i,j=0;//j=Debugging;
    for(i=0;i<=Debugging+1;i++)
	{

	  MAP[i]=j;
	  //j--;
	  j++;
	}
}





code unsigned char LEDMAP[] = {                   // 八段管显示码
  0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
  0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71
};

void Delay(unsigned char CNT)      //压力与变阻式温度的延时
{
  unsigned char i;

  while (CNT-- !=0)
    for (i=100; i !=0; i--);
}

///=====================
void delay1(uint useconds)                    //数字温度的 延时
{
  for(;useconds>0;useconds--);
}

 //=========================

unsigned char Read0809()                 //变阻式温度的转换 
{
  unsigned char i;

  CS0809 = 0;                                     // 起动 A/D ,并选中通道
  for (i=0; i<0x00; i++) ;                        // 延时 > 100us 延时等待
  return(CS0809);                                 // 读入结果
}


unsigned char Pressure()                   //压力的转换
{
  unsigned char i;

  CSIN = 0;                               //选中通道
  for (i=0; i<0x00; i++) ;        //延时等待
  return(CSIN);                     //读入结果
}


void Dis_LED(unsigned char n)          //显示变阻式温度
{
  unsigned char temp;

  temp = n;

  temp = n / 16;
  OUTSEG = LEDMAP[temp];                        // 显示AD采样值的十位
  OUTBIT = 0x08;                                        //十位显示在第三个数码管
  Delay(5);

  temp = n % 16;
  OUTSEG = LEDMAP[temp];                        // 显示AD采样值的个位
  OUTBIT = 0x04;                                      //个位显示在第四个数码管
  Delay(5);

}

void Dis_LED1(unsigned char n)       //显示压力
{
  unsigned char temp;

  temp = n;
//  temp = n / 10;

//  n = n % 100;
  temp = n / 16;
  OUTSEG = LEDMAP[temp];                        // 显示AD采样值的十位
  OUTBIT = 0x02;                                       //十位显示在第五个数码管
  Delay(5);

  temp = n % 16;
  OUTSEG = LEDMAP[temp];                        // 显示AD采样值的个位
  OUTBIT = 0x01;                                         //个位显示在第六个数码管
  Delay(5);

}
////////////=====================================
void Dis_LED2(unsigned char n)
{
  unsigned char temp;


  temp = n / 10;                  // 显示十进制温度值
  OUTSEG = LEDMAP[temp];
  OUTBIT = 0x20;                //十位显示在第一个数码管
  delay1(150);

  temp = n % 10;
  OUTSEG = LEDMAP[temp];
  OUTBIT = 0x10;            //个位显示在第二个数码管
  delay1(1);

}
uchar  ow_reset(void) //  信号复位进行初始化
{
  uchar  presence;
  DQ = 0;                       // DQ置低电平 
  delay1(29);                    // 等待 480us
  DQ = 1;                       // 
  delay1(3);                     // 延时等待
  presence = DQ;                // DS18b20等待过后发送存在的脉冲持续
  delay1(25);                    // wait for end of timeslot
  return(presence);             // 返回值
                                // 0=presence, 1 = no part
}
uchar  read_byte(void)
{
  uchar  i;
  uchar  value = 0;
  for (i=8;i>0;i--)
  {
    value>>=1;
    DQ = 0;                                  // pull DQ low to start timeslot
    DQ = 1;                                  // then return high
    delay1(1);
    if(DQ)value|=0x80;
    delay1(6);                                // wait for rest of timeslot
  }
  return(value);
}
void write_byte(uchar val)
{
  uchar i;
  for (i=8; i>0; i--)                      // writes byte, one bit at a time
  {
    DQ = 0;                                // pull DQ low to start timeslot
    DQ = val&0x01;
    delay1(5);                              // hold value for remainder of timeslot
    DQ = 1;
    val=val/2;
  }
    delay1(5);
}
  uint Read_Temperature(void)  // 获取当前的温度值
{
  uchar a,b,y1,y2,y3;
  ow_reset();        //初始化,检测是否存在DS18B20

  write_byte(0xcc);                      //跳过 ROM
  write_byte(0x44);                     //启动温度变换

  ow_reset();                           //复位

  write_byte(0xcc);                      //跳过 ROM
  write_byte(0xbe);                      //准备读暂存器

  a=read_byte();
  b=read_byte();
  y1=a>>4;                       //将温度转换结果的低8位的高4位移入低4位
  y2=b<<4;                   //将温度转换结果的高8位的低4位移入高4位
  y3=y1|y2;                  // 保留高4位并存入Y3
  return y3;                 // 返回Y3值
}



void main()
{
   long float b,d;
   int c,j,k,w;

    uchar   wd;
   Array ();
   while(1)
   {                                            // 读取AD的采样值

    	b = Read0809();                             // 显示AD的采样值
    	c = (b*255)/255;
	 	j=MAP[c];
    	Dis_LED(j);
		CS0809 = 1;
		Delay(5);
//--------------------------------

		d=Pressure();
        	k=(d*255)/255;
	 	w=MAP[k];
	 	Dis_LED1(w);
	 	CSIN = 1;
	 	Delay(5);
//======== =====

        wd=Read_Temperature();              // 温度采集
        Dis_LED2(wd);                       //将温度值送入LED显示
        delay1(20);
   }


}

⌨️ 快捷键说明

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