📄 temp.c
字号:
#include<reg51.h>
#include<stdio.h>
#include <intrins.h>
#define uchar unsigned char
sbit MAXDIN=P2^0; //定义MAX7219数据输入引脚
sbit MAXLOAD=P2^1; //定义MAX7219片选引脚
sbit MAXCLK=P2^2; //定义MAX7219时钟引脚
#define BUFFERLEGTH 10
#define uchar unsigned char
#define uint unsigned int
bit false=0;
bit true=1;
sbit DQ=P0^3; //温度输入口
unsigned char ROMID[4][8]; //用于存放4个DS18B20的ROM ID序列号
unsigned char tempH; //温度高位
unsigned char tempL; //温度低位
unsigned char TH; //温度上限
unsigned char TL; //温度下限
unsigned char cfg; // 温度配置寄存器数据值
unsigned char reserved[3]; //用于写高速暂存器存储单元
unsigned char crc;
//********延时15μs********
void delay(int n)
{
do{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}while(--n);
}
//**********18b20复位********
unsigned char ds18b20_reset(void)
{
uchar tdq;
DQ=1; //保证DQ信号线为高
_nop_();_nop_(); //保证高电平1μs以上
DQ=0; //主机拉低总线
delay(32); //使DQ信号线的低电平状态持续480μs
DQ=1; //主机释放总线
delay (4); //高电平保持60μs,等待从设备将总线拉低
tdq=DQ; //主机对总线采样
delay (32); //等待初始化结束
return tdq; //返回采样值
}
//***********18b20_read_bit()读一个数据位
unsigned char ds18b20_read_bit(void)
{
uchar tdq;
_nop_(); //保证两次连续写操作间隔1μs以上
DQ=0; //将DQ信号线拉低,启动读时隙
_nop_(); //保证拉低总线的时间不少于1μs
DQ=1; //释放DQ信号线,等待从机返回数据位
_nop_();
tdq=DQ; //主机对总线采样
delay (4); //延时60μs等待读操作结束准备采样总线上的信号
return tdq; //返回读取到的数据
}
//********18b20_write_bit()写一个数据位***********
void ds18b20_write_bit(unsigned char wbit)
{
_nop_(); //保证两次写操作间隔1μs以上
DQ=0; //将DQ信号线拉低,启动写时隙
_nop_(); //保证主机拉低总线1μs以上
if(wbit)
{ //向总线写1
DQ=1; //写的数据位是1,使DQ返回到高电平
delay (4); //延时60μs 等待写时隙结束
}
else
{ //向总线写0
delay (4); //延时60μs
DQ=1; //释放DQ信号线
}
}
//*******18b20_read_byte()读一个字节数据******
unsigned char ds18b20_read_byte(void)
{
unsigned char i,tmp,value=0;
for(i=0;i<8;i++) //依次读取字节的每个位,低位在前
{
tmp=ds18b20_read_bit();
value|=tmp<<i;
}
delay(8); //等待读时隙结束
return value;
}
//********** 18b20_write_byte()写一个字节数据***
void ds18b20_write_byte(unsigned char wby)
{
unsigned char i,tmp;
for(i=0;i<8;i++) //依次发送字节的每个位,低位在前
{
tmp=wby>>i; //将要写的数据字节右移i位
tmp=tmp&0x01; //取出数据字节的第i位
ds18b20_write_bit(tmp); //向总线写一个数据位
}
delay(5); //等待时隙结束
}
//*********ds18b20_rom_match() ROM匹配子程序**********
unsigned char ds18b20_rom_match(unsigned char ds18b20number)
{
unsigned char i;
if(ds18b20_reset()) return false; //如果总线上没有器件,返回false
ds18b20_write_byte(0x55); //向总线上写匹配ROM命令0x55
for(i=0;i<8;i++)
{
ds18b20_write_byte(ROMID[ds18b20number][i]);//向总行写ROM ID 的第i个字节
}
return true;
}
//*********ds18b20_read_scratchpad()读高速暂存器数据********
void ds18b20_read_scratchpad(unsigned char DTNO)
{
struct stu{char tempH;
char tempL;
char TH;
char TL;
char cfg;
char reserved[3];
char crc;
}pad;
ds18b20_rom_match(DTNO); //向总线发送匹配ROM指令,使编号为DTNO的器件处于选中状态
ds18b20_write_byte(0xBE); //发送指令开始读取温度
pad.tempL=ds18b20_read_byte(); //读温度低位
pad.tempH= ds18b20_read_byte(); //读温度高位
pad.TH=ds18b20_read_byte(); //读温度报警上限
pad.TL= ds18b20_read_byte(); //读温度报警下限
pad.cfg=ds18b20_read_byte(); //读配置寄存器
pad.reserved[0]= ds18b20_read_byte(); //读保留位
pad.reserved[1]= ds18b20_read_byte();
pad.reserved[2]= ds18b20_read_byte();
pad.crc= ds18b20_read_byte(); //读CRC
}
//********只读温度值*******
void ds18b20_read_scratchpad_t(unsigned char DTNO)
{
struct stu{char tempH;
char tempL;
char TH;
char TL;
char cfg;
char reserved[3];
char crc;
}pad;
ds18b20_rom_match(DTNO); //向总线发送匹配ROM指令,使编号为DTNO的器件处于选中状态
ds18b20_write_byte(0xBE); //发送指令开始读取温度
pad.tempL=ds18b20_read_byte(); //读温度低位
pad.tempH= ds18b20_read_byte(); //读温度高位
ds18b20_reset(); //发送一次复位脉冲,终止温度的读取
}
//********ds18b20_write_scratchpad()写高速暂存器******
void ds18b20_write_scratchpad(unsigned char DTNO)
{
ds18b20_rom_match(DTNO); //向总线发送匹配ROM指令,使编号为DTNO的器件处于选中状态
ds18b20_write_byte(0x4E); //向总线发送写暂存器命令
ds18b20_write_byte(TH); //写温度报警上限
ds18b20_write_byte(TL); //写温度报警下限
ds18b20_write_byte(cfg); //写配置寄存器
}
//******************串口发送**********
void UART_init(); //串口初始化函数
void COM_send(void); //串口发送函数
char str[20];
void UART_init() //初始化串行口和波特率发生器
{
SCON =0x50; //选择串口工作方式1,打开接收允许
TMOD =0x20; //定时器1工作在方式2,定时器0工作在方式1
TH1 =0xfA; //实现波特率9600
PCON = 0x80;
TR1 =1; //启动定时器T1
ET1 =0;
ES=1; //允许串行口中断
PS=1; //设计串行口中断优先级
EA =1; //单片机中断允许
}
void COM_send(void) //串口发送程序
{
unsigned char point = 0;
for(point=0;str[point]!='\0';point++) //连续发送二十位数据把缓存区的数据都发送到串口
{
SBUF=str[point];
while(!TI);
TI=0; //str[point]='\0';
}
}
//**********数码管显示*********
void maxsend(uchar maxadd,uchar maxdat)
// MAXADD为MAX7219的寄存器写入地址;MAXDAT为寄存器写入数据
{
uchar i;
MAXLOAD=0; //片选清零
for(i=0;i<8;i++) //循环写入8为地址信息
{ MAXCLK=0; //时钟线拉低
maxadd=maxadd<<1; //地址信息左移
MAXDIN=CY; //写入地址信息
MAXCLK=1; //时钟线拉高
}
for(i=0;i<8;i++) //循环写入8为数据信息
{ MAXCLK=0; //时钟线拉低
maxdat=maxdat<<1; //数据信息左移
MAXDIN=CY; //写入数据信息
MAXCLK=1; //时钟线拉高
}
MAXLOAD=1; //片选拉高
}
void max7219_init(void) //MAX7219初始化
{
maxsend(0x0c,0x01); //设置正常显示状态
maxsend(0x0b,0x06); //设置扫描6位
maxsend(0x09,0xff); //设置译码方式为不译码
maxsend(0x0a,0x05); //设置亮度为11/32
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -