📄 iread.c
字号:
/*------------------------------------------------------------------------------
; Copyright (C) 2006 WangChanghong INTEGRATED PRODUCTS, INC.
; All rights reserved.
; MCU:AT89s52 ,晶体频率:12MHz
: 作者:汪长洪
: 时间:2006年07月31日
: 地点:威海
;-----------------------------ZyTemp红外测温仪程序-----------------------------*/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
/*----------------------------------工程说明--------------------------------------
; 工程名称: ZyTemp.Uv2
; 功能描述: 测量环境温度和目标温度,并用键盘控制显示温度值,
; 按K1,显示目标温度
; 按K2,显示环境温度
; IDE环境: Keil uVision3 V3.31
; 硬件连接: VCC-------VCC
; P1.0------Data
; P1.2------Clk
; P1.4------ACK
; GND-------GND
;------------------------------------定义接口------------------------------------*/
sbit TN_Data = P1^0;
sbit TN_Clk = P1^2;
sbit TN_ACK = P1^4;
sbit key_1 = P2^2;
sbit key_2 = P2^3;
/*-----------------------------------变量列表------------------------------------*/
unsigned char code keytab_1[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89};//H: 0x89;//L: 0x87;//P: 0x8a;//Q: 0X98;
unsigned char code keytab_2[]={0xef,0xdf,0xbf,0x7f};
uchar ReadData[5],iShow[5];
/*-----------------------------------函数列表------------------------------------*/
void display_1(uchar i,uchar num); //定位显示单个字符
void display_2(void); //定位显示四个字符
void TN_ReadData(uchar Flag); //读数据
void TN_GetData(void); //计算数据
/*----------------------------------主程序入口-----------------------------------*/
void main()
{
TN_ACK=1;
while(1)
{
if(!key_1)
{
TN_ACK=0;
TN_ReadData(0x4c); //目标温度的第一个字节为0x4c
}
else if(!key_2)
{
TN_ACK=0;
TN_ReadData(0x66); //环境温度的第一个字节为0x66
}
if((ReadData[0]==0x4c)&&(ReadData[4]==0x0d)) //每帧的最后一个字节为0x0d
{
TN_GetData();
display_2();
}
else if((ReadData[0]==0x66)&&(ReadData[4]==0x0d)) //每帧的最后一个字节为0x0d
{
TN_GetData();
display_2();
}
}
}
/*------------------------------定位显示单个字符-------------------------------*/
void display_1(uchar i,uchar num)
{
P0=keytab_1[i];
P2=keytab_2[num];
}
/*------------------------------定位显示四个字符-------------------------------*/
void display_2(void)
{
uchar kk;
display_1(iShow[3]&0x0f,3); //显示十位
for(kk=200;kk>0;kk--); //延时
display_1(iShow[2]&0x0f,2); //显示个位
for(kk=200;kk>0;kk--); //延时
display_1(iShow[1]&0x0f,1); //显示小数第一位
for(kk=200;kk>0;kk--); //延时
display_1(iShow[0]&0x0f,0); //显示小数第二位
for(kk=200;kk>0;kk--); //延时
}
/*------------------------------------读数据-------------------------------------*/
void TN_ReadData(uchar Flag)
{
uchar i,j,k;
bit BitState=0;
for(k=0;k<7;k++) //每次发七帧
{
for(j=0;j<5;j++) //每帧五个字节
{
for(i=0;i<8;i++)
{
while(TN_Clk);
BitState= TN_Data;
ReadData[j]=ReadData[j]<<1;
ReadData[j]=ReadData[j]|BitState;
while(!TN_Clk);
}
}
if(ReadData[0]==Flag) k=8;
}
TN_ACK=1;
}
/*-----------------------------------计算数据------------------------------------*/
void TN_GetData(void)
{
int Temp;
Temp=(ReadData[1]<<8)|ReadData[2];
Temp = Temp/16 - 273.15;
Temp=Temp*100; //温度值乘100,以方便计算小数点后两位
iShow[4]=Temp/10000; //计算温度值的百位数
iShow[3]=(Temp/1000); //计算温度值的十位数
iShow[3]=iShow[3]%10;
iShow[2]=(Temp/100); //计算温度值的个位数
iShow[2]=iShow[2]%10;
iShow[1]=(Temp/10); //计算温度值的小数点后第一位数
iShow[1]=iShow[1]%10;
iShow[0]=(Temp); //计算温度值的小数点后第二位数
iShow[0]=iShow[0]%10;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -