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

📄 temp.c

📁 单片机数据通讯典型应用(光盘内容)
💻 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 + -