#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit DQ=P2^7;
sbit beep=P2^1;
sbit DP=P0^7;
uint temp;
uint numb;
//**************温度小数部分用查表法***********//
uchar code table[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
uchar code dis_7[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
0x82,0xf8,0x80,0x90,0xff,0xbf};
uchar code wei[4]={0x7f,0xbf,0xdf,0xfe};
uchar data temp_data[2]={0x00,0x00}; //读出温度暂放
uchar data display[5]={0x00,0x00,0x00,0x00,0x00};
uchar code ruq[18]={' ',' ','"','y','i',' ','w','u',' ',
'r','u',' ','q','i','n','"',' ',0x00};
void delayms(uint z);
void send_char(unsigned char txd);
void delay(uint t);
void init();
void write_byte(uchar shu);
uchar read_byte();
uint read_temp();
void work_temp(uint tem);
void scan();
int neg,h;
main()
{
TMOD=0x21;//设置定时器0,1的工作方式 1为八位自动重装 0为十六位定时器
TH1=0xfd;
TL1=0xfd;
TH0=(65536-50000)/265;
TL0=(65536-50000)%256;
SCON=0x40;
EA=1;//开总中断
EX0=1;//外部中断允许
ET0=1;//开定时器允许
ET1=1;
TR1=1;//打开定时器
TR0=1;
REN=1;
P3=0xff;
delay(100);
for(h=0;h<4;h++)
display[h]=0;
init();
write_byte(0xcc);
write_byte(0x44);
for(h=0;h<100;h++)
scan(); //上电显示0000
while(1)
{
read_temp();
work_temp(temp);
scan();
}
}
void dshi() interrupt 1
{
TH0=(65536-50000)/265;
TL0=(65536-50000)%256;
numb++;
if(numb==100)
{
numb=0;
if(neg==1)
{
SBUF='-';
while(!TI);
TI = 0;
}
else
{
SBUF='+';
while(!TI);
TI = 0;
}
send_char(display[2]+0x30);
send_char(display[1]+0x30);
SBUF='.';
while(!TI);
TI = 0;
send_char(display[0]+0x30);
SBUF=' ';
while(!TI);
TI = 0;
SBUF=' ';
while(!TI);
TI = 0;
SBUF=' ';
while(!TI);
TI = 0;
}
}
void hwaijsh() interrupt 0 //监测异物入侵报警并向GPRS发送数据
{
int i=60,j=0;
while(i)
{
beep=0;delayms(50);
beep=1;delayms(50);
i--;
}
while(ruq[j]!=0x00)
{
SBUF=ruq[j];
while(TI==0);
TI=0;
j++;
}
delayms(500);
}
void delayms(uint z)
{
int i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void send_char(unsigned char txd)
{
SBUF = txd;
while(!TI); // 等特数据传送
TI = 0; // 清除数据传送标志
}
void delay(uint t)
{
for (;t>0;t--);
}
void init()
{
int num=1;
while(num)
{
while(num)
{
DQ=1;_nop_();_nop_();
DQ=0;
delay(50);
DQ=1;
delay(6);//等待复位
num=DQ;//完成复位
}
delay(50);
num=~DQ;
}
DQ=1;
}
//写命令给DQ
void write_byte(uchar shu)
{
int i;
for(i=0;i<8;i++)
{
DQ=1;_nop_();_nop_();
DQ=0;_nop_();_nop_();_nop_();_nop_();
DQ=shu&0x01;
delay(6);
shu=shu/2;
}
DQ=1;
delay(1);
}
uchar read_byte()
{
uchar i,value=0;
for(i=0;i<8;i++)
{
DQ=1;_nop_();_nop_();
value>>=1;
DQ=0;
_nop_();_nop_();_nop_();_nop_();
DQ=1;
_nop_();_nop_();_nop_();_nop_();
if(DQ)
value|=0x80;
delay(6);
}
DQ=1;
return value;
}
//读温度
uint read_temp()
{
init();
delay(100);
write_byte(0xcc);//跳过检测
write_byte(0x44);//转换温度
init();
delay(1);
write_byte(0xcc);
write_byte(0xbe); //读暂存器
temp_data[0]=read_byte();
temp_data[1]=read_byte();
temp=temp_data[1];
temp<<=8;
temp=temp|temp_data[0];
return temp;
}
void work_temp(uint tem)
{
uchar neg=0;
if(tem>0x8000)
{temp=65536-tem;neg=1;}
display[4]=tem&0x0f;
display[0]=table[display[4]];
tem>>=4;
display[3]=tem/100;
display[2]=tem%100;
display[2]=display[2]/10;
display[1]=tem%10;
if(!display[3]) display[3]=0x0a;
if(!display[2]) display[2]=0x0a;//消隐(当数据为零时不显示)
if(neg) display[3]=0x0b;
}
void scan()
{
char k;
for(k=0;k<4;k++)
{
P0=dis_7[display[k]];
if (k==1)
DP=0;
P3=wei[k];
delay(300);
}
}
MCU.rar_红外传感器_红外采集器_红外采集温度
版权申诉
125 浏览量
2022-09-24
03:12:40
上传
评论
收藏 2KB RAR 举报
四散
- 粉丝: 53
- 资源: 1万+
最新资源
- Unity Easy Color Picker 2.2.1
- 基于Django和Hadoop集群进行的大数据分析平台
- openEuler-22.03-LTS-SP3-netinst-x86-64-dvd.iso
- AL-2023-4卷习题-文本文件
- openEuler-22.03-LTS-SP3-netinst-aarch64-dvd.iso
- openEuler-20.03-LTS-SP4-netinst-aarch64-dvd.iso
- 基于vue3.0的大数据分析系统,包含各种echarts和vue3.0新API
- 基于Java 实现WIFI探针的商业大数据分析技术(获得附近的人流量、入店量、驻留时长等信息 )
- Data$distriLecturer.class
- SECS移动解决方案 SECS如何实现扫码功能 SECS安卓APP SECS PDA应用 安卓版本SECS协议应用
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈