📄 7.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 + -