📄 send.c
字号:
#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar xstemp;
uchar tll=0;
uchar thh=50;
uchar inte,dec;
sbit DQ =P2^0; //定义通信端口
sbit rt=P1^0; //收发选择端口
sbit busy=P1^1; //收发忙标志
sbit enable=P1^7; //定义模块使能端
sbit beep=P1^3;
bit send_flag;
void delay1(unsigned int i)
{
while(i--);
}
reset(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
delay1(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay1(80); //精确延时 大于 480us
DQ = 1; //拉高总线
delay1(14);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay1(20);
}
//读一个字节
unsigned char read_byte(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80; /*LSB to MSB*/
delay1(4);
}
return(dat);
}
//写一个字节
write_byte(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
delay1(5);
DQ = 1;
dat>>=1;
}
}
//读取温度
unsigned char read_temperature(void)
{
unsigned char a=0;
unsigned char b=0;
reset();
write_byte(0xCC); // 跳过读序号列号的操作
write_byte(0x44); // 启动温度转换
reset();
write_byte(0xCC); //跳过读序号列号的操作
write_byte(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=read_byte();
b=read_byte();
xstemp=a&0x0f;
b=b<<4;
a=a>>4;
return(a|b);
}
unsigned char read_temperature_dec(void) //读入小数
{
return(xstemp);
}
senddata(unsigned char dat) //串口发送数据
{SBUF=dat;
while(TI==0);
TI=0;
}
send_temperature() //发送温度
{
inte = read_temperature(); //整数部分温度
dec = read_temperature_dec(); //小数部分温度
senddata(0xfe);
senddata(dec);
senddata(0xff); //发送标志,0xff表示后面是整数,0xfe表示后面是小数
senddata(inte);
send_flag=0;
delay1(100);
}
serial_init() //串口初始化
{
SCON=0X50; /* SCON: 串口方式1, 8位异步通信,接收使能*/
TMOD=0x20; /*波特率发生需用定时器1:TMOD: 定时器1, 8位自动重装 */
PCON=0x80; //双倍时钟
TH1=0xfd; /* TH1:自动重装值,19200baud ,晶振11.0592MHz */
TL1=0xfd;
TR1=1; /* TR1:启动定时器1 */
EA=1;
ES=1;
}
void receivedata() interrupt 4 using 1//接收中断
{ uchar temp;
static bit flag_thh=0,flag_tll=0; //整数部分和小数部分的标志
temp=SBUF;
if(flag_thh==1)
{
thh=temp; //接收温度上限部分
flag_thh=0; // 清除温度上限标志
}
if(flag_tll==1)
{
tll=temp; //接收温度下限部分
flag_tll=0; // 清除温度下限标志
}
if(temp==0xfd) flag_thh=1; //表示下面发送的是温度上限部分
if(temp==0xfc) flag_tll=1; //表示下面发送的是温度下限部分
RI=0; //清除中断标志
}
main()
{
serial_init(); //串口初始化
enable=0; //使模块工作
//rt=0;
//发送使能 0发送,1接收
while(1)
{
if(inte<tll||inte>=thh)
beep=0;
else if(inte>=tll&&inte<thh)
beep=1;
if(send_flag==1)
send_temperature(); //发送温度
delay1(20000); //适当延时,使其进入串口中断
send_flag=1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -