📄 com.c
字号:
#include<reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
/*端口定义*/
#define LED P0 /*实际温度值输出端口定义*/
#define NOP _nop_()
uint temp=40;
uint t1=41;
sbit CLK=P0^7;
sbit DAT=P0^4;
sbit DCLK=P0^6;
sbit key=P1^0;
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};//0-9,-,全灭
sbit tem_in=P2^6; /*温度读取端口*/
sbit heat1=P2^0; //加热控制端口1
uchar temp_h,temp_l; /*温度值变量*/
uchar flag1; /*正负标志位*/
uchar temper,temper_set;
void initcom(void);
void send_char(unsigned char txd);
void tmpchange(void);
void sendbyte(uchar byte);
void delay2(uint j);//延时
void display(uchar number);
void delays(uint n);
//串口初始化
void initcom(void)
{
TMOD = 0x20; // 定时器1工作于8位自动重载模式, 用于产生波特率
TH1 = 0x0F3; // 波特率2400
TL1 = 0x0F3;
SCON = 0x50; // 设定串行口工作方式
PCON=0; //波特率不翻倍
//PCON &= 0xef; // 波特率不倍增
ES=1; //允许串行口中断
TR1 = 1; // 启动定时器1
IE|= 0x90; // enable serial interrupt,禁止other中断
// IE= 0x9F; // enable serial interrupt,禁止other中断
// IE = 0x00; // 禁止任何中断
EA=1; //开总中断
// IT0=1;
// EX0=1;
}
void send_char(unsigned char txd)
// 传送一个字符
{
SBUF = txd;
while(!TI); // 等特数据传送
TI = 0; // 清除数据传送标志
}
//======595显示程序===============================================
void sendbyte(uchar byte)
{
uchar num,i;
num=tab[byte];
for(i=0;i<8;i++)
{
CLK=0;
DAT=num&0x80;
num=num<<1;
CLK=1;
}
}
void delay2(uint j)//延时
{ uchar m;
for(;j>0;j--)
{
for(m=0;m<=250;m++)
{;}
}
}
void display(uchar number)
{
uchar sw,gw;
DCLK=0;
sw=number/10;
gw=number-10*sw;
sendbyte(sw);
sendbyte(gw);
DCLK=0;
delay2(150);
//out595();
DCLK=1;
}
//=====================================================================
/**********************************延时1S整*******************************/
void delays(uint n)
{
unsigned char i,j,k,l;
for(l=n;l>0;l--)
for(k=100;k>0;k--)
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}
//************************************
/*====================================
函数功能:延时
入口参数:
说 明 :送1迟202us
=====================================*/
void delay(unsigned int count)
{
unsigned int i;
while(count)
{
i=200;
while(i>0)i--;
count--;
}
}
/*====================================
函数功能:延时 us
入口参数:
说 明 :
=====================================*/
void Delay_us(uchar n)
{
uchar i;
i=0;
while(i<n)
{i++;}
return;
}
/*====================================
函数功能:DS18B20重设
入口参数:无
说 明 :
=====================================*/
void dsreset(void)
{
unsigned int i;
tem_in=0;
i=103;
while(i>0)i--;
tem_in=1;
i=4;
while(i>0)i--;
}
/*====================================
函数功能:直接读一字节程序
入口参数:无
说 明 :返回结果
=====================================*/
uchar ReadByte(void){
uchar i,k;
i=8;
k=0;
while(i--)
{
tem_in=1;
Delay_us(1);
tem_in=0;
k=k>>1;
tem_in=1;
NOP;
if(tem_in)k |= 0x80;
Delay_us(4);
}
return(k);
}
/*====================================
函数功能:向B20写一字节
入口参数:待写数据
说 明 :
=====================================*/
void tmpwrite(unsigned char dat)
{ unsigned int i;
unsigned char j;
bit testb;
for(j=1;j<=8;j++)
{ testb=dat&0x01;
dat=dat>>1;
if(testb)
{ tem_in=0;i++;i++;
tem_in=1;
i=8;while(i>0)i--;
}
else
{
tem_in=0;
i=8;while(i>0)i--;
tem_in=1;i++;i++;
}
}
}
//////////////////////////////////////////////////////////////
void tmpchange(void)
{
dsreset(); /*复位*/
delay(1);
tmpwrite(0xcc); //跳过序列号命令
// delay(200);
tmpwrite(0x44); //转换命令
}
/*====================================
函数功能:将温度值读出来并转化为显示数组
入口参数:
说 明 :调用 ReadByte();
=====================================*/
void tmp(void)
{
float dis;
// uchar tempbuf;
dsreset();
delay(1);
tmpwrite(0xcc);
tmpwrite(0xbe);
temp_l=ReadByte(); //低位在前
temp_h=ReadByte(); //高位在后
flag1=temp_h&0xf8;
if(flag1)
{
temp_h=~temp_h;
if(temp_l==0)temp_h++; //若低8位全为0且温度为负,取补时就要向高位进1
temp_l=~temp_l+1;
}
dis=(temp_h*256+temp_l)/16;
//dis=25.34; //调试用
// dis=2;
temper=(uchar)dis;
}
//================================================
//================温度控制开始========
void system_heat(uint temperature)
{
if(temper<=temperature)
{
heat1=0;
tmpchange(); //启动温度转换/
delays(1); // 发出转换温度的指令后要等至少750mS(12位精度),才能发读温度指令,如果发早了,就读到了芯片上电后预设的85度这个数。
tmp(); //温度显示和报警/
display(temper);
}
else if(temper>temperature)
{
heat1=1;
tmpchange(); //启动温度转换/
delays(1); // 发出转换温度的指令后要等至少750mS(12位精度),才能发读温度指令,如果发早了,就读到了芯片上电后预设的85度这个数。
tmp(); //温度显示和报警/
display(temper);
}
}
//--------------串口接收从电脑发来的数据------------------//
void chuankou() interrupt 4 using 1//串口接收数据,中断方式
{
if(RI!=0)
{
RI=0;
// receive=SBUF;
ES=0;
temp=SBUF;
if(temp==0x0e)
{
// tmpchange(); //启动温度转换/
// delays(1); // 发出转换温度的指令后要等至少750mS(12位精度),才能发读温度指令,如果发早了,就读到了芯片上电后预设的85度这个数。
// tmp(); //读取温度转换结果/
// display(temper);
// send_char(temper);
// system_heat(t1);
t1=30;send_char(temp);
}
else{ t1=temp;send_char(temp);}
ES=1;
}
}
/*void key_scan() interrupt 0 using 2
{
if(!key)
{
delay2(2);
if(!key)
{ tmpchange(); //启动温度转换/
delays(1); // 发出转换温度的指令后要等至少750mS(12位精度),才能发读温度指令,如果发早了,就读到了芯片上电后预设的85度这个数。
tmp(); //读取温度转换结果/
display(temper);
send_char(temper);
// delays(1);
}
}
}
*/
///===========================================
main()
{
initcom();
LED=0xff;
P2=0x00;
P1=P1&0x01;
heat1=1;
while(RI!=1)
{
system_heat(t1);
if(!key)
{
delay2(2);
if(!key)
{ tmpchange(); //启动温度转换/
delays(1); // 发出转换温度的指令后要等至少750mS(12位精度),才能发读温度指令,如果发早了,就读到了芯片上电后预设的85度这个数。
tmp(); //读取温度转换结果/
display(temper);
send_char(temper);
// system_heat(t1);
// delays(1);
}
}
/* if(RI)
{
RI=0;
t1=SBUF;
if(t1==0x02)
{
system_heat(40);}
if(temp==0x0e)
{
tmpchange(); //启动温度转换
delays(1); // 发出转换温度的指令后要等至少750mS(12位精度),才能发读温度指令,如果发早了,就读到了芯片上电后预设的85度这个数。
tmp(); //读取温度转换结果
display(temper);
send_char(temper);
}
else system_heat(t1);
}*/
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -