当前位置:首页 » 编程语言 » 红外测温传感器模块c语言运行代码
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

红外测温传感器模块c语言运行代码

发布时间: 2022-10-06 07:11:45

⑴ 单片机c语言编写自动门控制系统程序,p1.0红外传感器,p1.1位置检测开关1,p1.2位置检测开关2。

以下汇编程序,delay的时间你需要自己调整一下,再加个2重循环吧,现在的时间是很短的。
P1.3为开门信号,P1.4为关门信号,输入输出低电平有效。
org 00h
ljmp main
org 30h
main:
jb p1.0,next1
setb 00h
clr 01h
next1:
jb p1.1,next2
clr 00h
next2:
jb p1.2,next3
clr 01h
next3:
mov c,00h
cpl c
mov p1.3,c
mov c,01h
cpl c
mov p1.4,c
jnb 02h,next4
jb 00h,next4
lcall delay
setb 01h
clr 00h
next4:
mov c,00h
mov 02h,c
ljmp main

delay:
mov r7,#00h
lp:
mov r6,#00h
djnz r6,$
djnz r7,lp
ret

⑵ C8051F530A单片机,温度传感器DS18B20,C51编程,c语言程序。

考试还是开发产品?
开发的话可以帮你搞定。。。

⑶ 基于51单片机红外遥控代码(C语言)

以下文件是51单片机实现遥控解码,通过数码管显示键码的程序,P0口驱动数码管段选,p2.6和p2.7为数码管位选,接收头连到P3.2口。此程序以通过验证,可以直接编译使用,另外还有一个继电器和蜂鸣器的控制,不用可以屏蔽掉。

;********************************************************************************
;* 描述: *
;* 遥控键值读取器 *
;* 数码管显示, P0口为数码管的数据口 *
;* *
;********************************************************************************
;遥控键值解码-数码管显示 *
;********************************************************************************/

#include <reg51.h>
#include <intrins.h>

void IR_SHOW();
void delay(unsigned char x);//x*0.14MS
void delay1(unsigned char ms);
void beep();

sbit IRIN = P3^2;
sbit BEEP = P3^7;
sbit RELAY= P1^3;
sbit GEWEI= P2^7;
sbit SHIWEI= P2^6;

unsigned char IRCOM[8];
unsigned char code table[16] =
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
main()
{
IE = 0x81; //允许总中断中断,使能 INT0 外部中断
TCON = 0x1; //触发方式为脉冲负边沿触发
delay(1);

IRIN=1;
BEEP=1;
RELAY=1;
for(;;)
{
IR_SHOW();
}

} //end main

void IR_IN() interrupt 0 using 0
{
unsigned char i,j,k,N=0;
EA = 0;
I1:
for (i=0;i<4;i++)
{
if (IRIN==0) break;
if (i==3) {EA =1;return;}
}
delay(20);
if (IRIN==1) goto I1; //确认IR信号出现
while (!IRIN) //等 IR 变为高电平
{delay(1);}

for (j=0;j<4;j++)
{
for (k=0;k<8;k++)
{
while (IRIN) //等 IR 变为低电平
{delay(1);}
while (!IRIN) //等 IR 变为高电平
{delay(1);}
while (IRIN) //计算IR高电平时长
{
delay(1);
N++;
if (N>=30) {EA=1;return;}
}
IRCOM[j]=IRCOM[j] >> 1;
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}
N=0;
}//end for k
}//end for j

if (IRCOM[2]!=~IRCOM[3]) {EA=1;return;}
IRCOM[5]=IRCOM[2] & 0x0F;
IRCOM[6]=IRCOM[2] & 0xF0;
IRCOM[6]=IRCOM[6] >> 4;
beep();
EA = 1;

}

void IR_SHOW()
{
P0 = table[IRCOM[5]];
GEWEI = 0;
SHIWEI = 1;
delay1(4);
P0 = table[IRCOM[6]];
SHIWEI = 0;
GEWEI = 1;
delay1(4);
}

void beep()
{
unsigned char i;
for (i=0;i<100;i++)
{
delay(5);
BEEP=!BEEP;
}
BEEP=1;
}

void delay(unsigned char x)//x*0.14MS
{
unsigned char i;
while(x--)
{
for (i = 0; i<13; i++) {}
}
}

void delay1(unsigned char ms)
{
unsigned char i;
while(ms--)
{
for(i = 0; i<120; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}

⑷ 嵌入式温湿度传感器C语言代码求帮忙注释

#include "ioCC2430.h" //包含头文件,相应的板子以及传感器一些信息

#include "hal.h"

#include <math.h>

//#include <intrins.h>

#include <stdio.h>


typedef union //定义联合体,

{

unsigned int i;

float f;

} value; //定义联合体类型名称为value


#define noACK 0

#define ACK 1

#define STATUS_REG_W 0x06 //0x06 = 0000 0110

#define STATUS_REG_R 0x07 //0x07 = 0000 0111

#define MEASURE_TEMP 0x03 //0x03 = 0000 0011

#define MEASURE_HUMI 0x05 //0x05 = 0000 0101

#define RESET 0x1e //0x1e = 0001 1110

#define SDA P1_6 //定义SDA代表的是P1_6脚

#define SCL P1_7

#define begin P2_0

unsigned char d1,d2,d3,d4,d5,d6,d7; //定义无符号字符型变量


void Wait(unsigned int ms) //定义wait函数,主要用于软件循环,延时作用

{

unsigned char g,k;

while(ms)

{

for(g = 0;g <= 167; g++)

{

for(k = 0;k <= 48; k++);

}

ms--;

}

}


void QWait() //1us的延时

{

asm("NOP"); //加入汇编操作语句,空操作,主要用于机器周期执行

asm("NOP");

asm("NOP");

asm("NOP");

asm("NOP");

asm("NOP");

asm("NOP");

asm("NOP");

asm("NOP");

asm("NOP");

asm("NOP");

}


void initUART(void) //初始化单片机的串口

{

IO_PER_LOC_USART0_AT_PORT0_PIN2345(); //具体函数的定义与用法,你得参考头文件中的程序代码了

IO_DIR_PORT_PIN(1, 6, IO_OUT);

IO_DIR_PORT_PIN(1, 7, IO_OUT);

//IO_IMODE_PORT_PIN(1, 6, IO_IMODE_TRI);

//IO_IMODE_PORT_PIN(1, 7, IO_IMODE_TRI);

IO_DIR_PORT_PIN(2, 0, IO_OUT);

IO_FUNC_PORT_PIN(2, 0, IO_FUNC_GIO);

//SET_MAIN_CLOCK_SOURCE(RC);

SET_MAIN_CLOCK_SOURCE(CRYSTAL);

UART_SETUP(0, 115200, HIGH_STOP); //设置传输数据的波特率115200

UTX0IF = 1;

U0CSR |= 0XC7; //U0CSR = U0CSR | 0x1010 0111 (进行位或操作)

IEN0 |= 0x84;

SDA = 1;

SCL = 0;

}


int putchar (int c) //定义输入字符函数,给的参数是一个整型的数

{

if (c == ' ') //判断参数c的值是否和' '的值相等

{

while (!UTX0IF); //执行的时候UTX0IF的值是0,此处不是很理解?

UTX0IF = 0; //给UTX0IF赋0

U0DBUF = 0x0d; //U0DBUF赋值0x0d = 0000 1011

}

while (!UTX0IF);

UTX0IF = 0;

return (U0DBUF = c); //如果c的值不是' '也就是换行符的时候,将c的值传递到U0DBUF寄存器中

}


char s_write_byte(unsigned char value) //定义写字节函数(8位)

{

unsigned char i,error = 0;

for (i = 0x80;i > 0;i /= 2) //i 赋初始值0x80 = 128, 执行判断是i > 0,执行语句是i = i / 2; 即i = 128,64,32,16,8,4,2,1,0.5(0),8位

{

if (i & value)

SDA = 1;

else

SDA = 0;

SCL = 1; //此时SCL端口处,也就是p1_7引脚处是高电平

QWait(); //因为写入需要时间,所以程序之中加入下面几条语句

QWait();

QWait();

QWait();

QWait();

SCL = 0; //使能p1_7眼角处低电平,使的数据写入(具体需要看单片机控制芯片的手册

asm("NOP");

asm("NOP");

}

SDA = 1;

SCL = 1;

asm("NOP");

error = SDA;

QWait();

QWait();

QWait();

SDA = 1;

SCL = 0;

return error;

}


char s_read_byte(unsigned char ack) //读取数据,按照字节位的顺序读取(8位)128 = 1000 0000 ,64 = 0100 0000, 32 = 0010 0000 ,16 = 0001 0000, 8 = 0000 1000, 4 = 0000 0100 , 2 = 0000 0010, 1 = 0000 0001

{

unsigned char i,val = 0;

SDA= 1;

for(i = 0x80;i > 0;i /= 2) //同上

{

SCL = 1;

if (SDA) //判断SDA处是否有高电平

val = (val | i); //进行或操作

else

val = (val | 0x00);

SCL = 0;

QWait();

QWait();

QWait();

QWait();

QWait();

}

SDA = !ack;

SCL = 1;

QWait();

QWait();

QWait();

QWait();

QWait();

SCL = 0;

SDA = 1;


return val; //返回读取到的数据,一个字节,八位

}


void s_transstart(void) //传输使能函数,就是给控制器引脚处相应电平,使对应模块工作

{

SDA = 1;

SCL = 0;

QWait();

QWait();

SCL = 1;

QWait();

QWait();

SDA = 0;

QWait();

QWait();

SCL = 0;

QWait();

QWait();

QWait();

QWait();

QWait();

SCL = 1;

QWait();

QWait();

SDA = 1;

QWait();

QWait();

SCL = 0;

QWait();

QWait();

}


void s_connectionreset(void) //复位操作函数

{

unsigned char i;

SDA = 1;

SCL = 0;

for(i = 0;i < 9; i++)

{

SCL = 1;

QWait();

QWait();

SCL = 0;

QWait();

QWait();

}

s_transstart(); //调用开始函数

}


char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode) //函数,主要统计传输的数据个数

{

unsigned er = 0;

unsigned int i,j;

s_transstart();

switch(mode)

{

case 3 :er += s_write_byte(3);

break;

case 5 :er += s_write_byte(5);

break;

default :break;

}

for(i = 0;i < 65535;i++)

{

for(j = 0;j < 65535;j++)

{if(SDA == 0)

{

break;

}

}

if(SDA == 0)

{

break;

}


}

if(SDA)

{

er += 1;

}

*(p_value) = s_read_byte(ACK);

*(p_value + 1) = s_read_byte(ACK);

*p_checksum = s_read_byte(noACK);

d6 = *(p_value);

d7=*(p_value + 1);

return er;

}


void calc_sth11(float *p_humidity ,float *p_temperature)//计算温度值

{

const float C1 =- 4.0;

const float C2 =+ 0.0405;

const float C3 =- 0.0000028;

const float T1 =+ 0.01;

const float T2 =+ 0.00008;

float rh =* p_humidity;

float t =* p_temperature;

float rh_lin;

float rh_true;

float t_C;

t_C = t * 0.01 - 44.0 ;

rh_lin = C3 * rh * rh + C2 * rh + C1;

rh_true = (t * 0.01 - 40.0 - 25) * (T1 + T2 * rh) + rh_lin;

if(rh_true > 100)

{

rh_true = 100;

}

if(rh_true < 0.1)

{

rh_true = 0.1;

}

*p_temperature = t_C;

*p_humidity = rh_true;

}


void main() //主函数

{

value humi_val,temp_val; //声明两个联合体变量

unsigned char error,checksum; //声明两个无符号的字符型变量

initUART(); //初始化串口

P1INP |= 0xC0; //初始化P1引脚 , 0xC0 = 1010 0000 ,使P1_7和P1_5引脚为1

begin = 0;

s_connectionreset();

while(1) //无限循环操作

{

error = 0;

error += s_measure((unsigned char*) &humi_val.i,&checksum,5); //读入串口的数据进行温度的计算

d1 = d6;

d2 = d7;

error += s_measure((unsigned char*) &temp_val.i,&checksum,3);

d3 = d6;

d4 = d7;

if(error != 0)

s_connectionreset();

else

{

humi_val.f = (float)humi_val.i;

temp_val.f = (float)temp_val.i;

humi_val.f = d1 * 256 + d2;

temp_val.f = d3 * 256 + d4;

calc_sth11(&humi_val.f,&temp_val.f);

printf("temp:%5.1fC humi:%5.1f%% ",temp_val.f,humi_val.f);

// printf("t1:%x h1:%x ",d1,d2);

//printf("t2:%x h2:%x ",d3,d4);

}

Wait(150);

}

}


⑸ 用单片机C语言设计数字温度计!求代码!急急急

//------------------------------------------------------------------
//DS18B20温度传感器输出显示,运行本例时,外界温度将显示在1602LCD上
//------------------------------------------------------------------
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define delayNOP() {_nop_();_nop_();_nop_();_nop_();}
sbit DQ=P2^2;
sbit la=P2^6; //定义锁存器锁存端
sbit wela=P2^7;
sbit rs=P3^5; //定义1602液晶RS端
sbit lcden=P3^4;//定义1602液晶LCDEN端
sbit s1=P3^0; //定义按键--功能键
sbit s2=P3^1;//定义按键--增加键
sbit s3=P3^2;//定义按键--减小键
sbit s4=P3^6;//闹钟查看键
sbit rd=P3^7;
sbit beep=P2^3; //定义蜂鸣器端
uchar code Temp_Disp_Title[]={" Current Temp : "};
uchar Current_Temp_Display_Buffer[]={" TEMP: "};

uchar code Alarm_Temp[]={"ALARM TEMP Hi Lo"};
uchar Alarm_HI_LO_STR[]={"Hi: Lo: "};
uchar temp_data[2]={0x00,0x00};
uchar temp_alarm[2]={0x00,0x00};
uchar display[5]={0x00,0x00,0x00,0x00,0x00};
uchar display1[3]={0x00,0x00,0x00};
uchar code df_Table[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};
uchar CurrentT=0;//当前读取的温度整数部分
uchar Temp_Value[]={0x00,0x00};//从DS18B20读取的温度值
uchar Display_Digit[]={0,0,0,0}; //待显示的各温度数位
bit DS18B20_IS_OK=1;//传感器正常标志

//-------------------------------------
//延时1
//-------------------------------------
void delay1(uint x)
{
uchar i;
while(x--) for(i=0;i<200;i++);
}
//-------------------------------------
//延时2
//-------------------------------------
void Delay(uint x)
{
while(x--);
}
//------------------------------------
//忙检查
//------------------------------------
void write_com(uchar com)//液晶写命令函数
{
rs=0;
lcden=0;
P0=com;
delay1(5);
lcden=1;
delay1(5);
lcden=0;
}
void Write_LCD_Data(uchar date)//液晶写数据函数
{
rs=1;
lcden=0;
P0=date;
delay1(5);
lcden=1;
delay1(5);
lcden=0;
}
//-----------------------------
//设置LCD显示位置
//---------------------------------
void Set_Disp_Pos(uchar Pos)
{
write_com(Pos|0x80);
}

//-----------------------------
//LCD初始化
//---------------------------------
void Initialize_LCD()
{
uchar num;
rd=0; //软件将矩阵按键第4列一端置低用以分解出独立按键
la=0;//关闭两锁存器锁存端,防止操作液晶时数码管会出乱码
wela=0;
lcden=0;

write_com(0x38);//初始化1602液晶
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);//设置显示初始坐标

for(num=0;num<14;num++)//显示年月日星期
{
Write_LCD_Data(Temp_Disp_Title[num]);
delay1(5);
}
}

//-------------------------------------
//函数功能:初始化DS18B20
//出口参数:status---DS18B20是否复位成功的标志
//-------------------------------------
uchar Init_DS18B20()
{
uchar status; //储存DS18B20是否存在的标志,status=0,表示存在;status=1,表示不存在
DQ=1;Delay(8); //先将数据线拉高 //略微延时约6微秒
DQ=0;Delay(90); //再将数据线从高拉低,要求保持480~960us
//略微延时约600微秒 以向DS18B20发出一持续480~960us的低电平复位脉冲
DQ=1;Delay(8); //释放数据线(将数据线拉高) //延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲)
status=DQ;Delay(100); //让单片机检测是否输出了存在脉冲(DQ=0表示存在) //延时足够长时间,等待存在脉冲输出完毕
DQ=1; // 将数据线拉高
return status; //返回检测成功标志
}
//-------------------------------------
//函数功能:读一字节
//出口参数:dat---读出的数据
//-------------------------------------
uchar ReadOneByte()
{
uchar i,dat=0;
DQ=1;_nop_(); // 先将数据线拉高 //等待一个机器周期
for (i=0;i<8;i++)
{
DQ=0; //单片机从DS18B20读书据时,将数据线从高拉低即启动读时序
dat>>=1;
_nop_();//等待一个机器周期
DQ=1; //将数据线"人为"拉高,为单片机检测DS18B20的输出电平作准备
_nop_();_nop_(); //延时约6us,使主机在15us内采样
if (DQ) dat|=0x80; //如果读到的数据是1,则将1存入dat,如果是0则保持原值不变
Delay(30); //延时3us,两个读时序之间必须有大于1us的恢复期
DQ=1; // 将数据线拉高,为读下一位数据做准备
}
return dat;
}
//-------------------------------------
//函数功能:写一字节
//入口参数:dat---待写入的数据
//-------------------------------------
void WriteOneByte(uchar dat)
{
uchar i;
for (i=0;i<8;i++)
{
DQ=0; //将数据线从高拉低时即启动写时序
DQ=dat & 0x01; //利用与运算取出要写的某位二进制数据,
//并将其送到数据线上等待DS18B20采样
Delay(5); //延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样
DQ=1; //释放数据线
dat>>=1; //将dat中的各二进制位数据右移1位
}
}
//-------------------------------------
//函数功能:读取温度值
//出入口参数:无
//-------------------------------------
void Read_Temperature()
{
if(Init_DS18B20() == 1) //DS18B20故障
DS18B20_IS_OK=0;
else
{
WriteOneByte(0xCC); // 跳过读序号列号的操作
WriteOneByte(0x44); // 启动温度转换
Init_DS18B20(); //将DS18B20初始化
WriteOneByte(0xCC); //跳过读序号列号的操作
WriteOneByte(0xBE); //读取温度寄存器,前两个分别是温度的低位和高位
Temp_Value[0]=ReadOneByte(); //温度低8位
Temp_Value[1]=ReadOneByte(); //温度高8位
DS18B20_IS_OK=1;
}
}
//-------------------------------------
//函数功能:在LCD上显示当前温度
//入口参数:
//-------------------------------------
void Display_Temperature()
{
uchar i;
//延时值与负数标识
uchar t=150,ng=0;
//高5位全为1(0xF8)则为负数,为负数时取反加1,并设置负数标示
if ((Temp_Value[1] & 0xF8)==0xF8)
{
Temp_Value[1]=~Temp_Value[1];
Temp_Value[0]=~Temp_Value[0]+1;
if(Temp_Value[0]==0x00) Temp_Value[1]++; //加1后如果低字节为00表示有进位,进位位再加到高字节上
ng=1; //负数标示置1
}
Display_Digit[0]=df_Table[Temp_Value[0] & 0x0F]; //查表得到温度小数部分
//获取温度整数部分(高字节的低3位与低字节中的高4位,无符号)
CurrentT=((Temp_Value[0] & 0xF0)>>4)|((Temp_Value[1] & 0x07)<<4);
//将整数部分分解为3位待显示数字
Display_Digit[3]=CurrentT/100;//百位 digit[CurrentT/100];
Display_Digit[2]=CurrentT%100/10;//十位
Display_Digit[1]=CurrentT%10;//个位
//刷新LCD显示缓冲
Current_Temp_Display_Buffer[11]=Display_Digit[0]+'0';//先将'0'转换成整数48,然后与前面数字相加,得到相应数字的ASCII字符
Current_Temp_Display_Buffer[10]='.';
Current_Temp_Display_Buffer[9]=Display_Digit[1]+'0'; //个位
Current_Temp_Display_Buffer[8]=Display_Digit[2]+'0'; //十位
Current_Temp_Display_Buffer[7]=Display_Digit[3]+'0'; //百位
//高位为0时不显示
if(Display_Digit[3]==0) Current_Temp_Display_Buffer[7]=' ';
//高位为0且次高位为0时,次高位不显示
if(Display_Digit[2]==0 && Display_Digit[3]==0)
Current_Temp_Display_Buffer[8]=' ';
//负数符号显示在恰当位置
if(ng)
{
if (Current_Temp_Display_Buffer[8]==' ')
Current_Temp_Display_Buffer[8]='-';
else if(Current_Temp_Display_Buffer[7]==' ')
Current_Temp_Display_Buffer[7]='-';
else
Current_Temp_Display_Buffer[6]='-';
}
//在第一行显示标题
Set_Disp_Pos(0x00);
for(i=0;i<16;i++)
{
Write_LCD_Data(Temp_Disp_Title[i]);
}
Set_Disp_Pos(0x40); //在第二行显示当前温度
for(i=0;i<16;i++)
{
Write_LCD_Data(Current_Temp_Display_Buffer[i]);
}
//显示温度符号
//Set_Disp_Pos(0x4D);Write_LCD_Data(0x00);
Set_Disp_Pos(0x4D);Write_LCD_Data(0xdf);
Set_Disp_Pos(0x4E);Write_LCD_Data('C');
}
//-------------------------------------
//函数功能:主函数
//入口参数:
//-------------------------------------
void main()
{
Initialize_LCD();
Read_Temperature();
Delay(50000);
Delay(50000);
while (1)
{
Read_Temperature();
if (DS18B20_IS_OK) Display_Temperature();
delay1(100);
}
}

⑹ msp430温度传感器,c语言程序,我想在电脑上看到它返回的温度数值,可是总看不到返回值。

1、说几点我没去看F2XX的手册,这个是F5X的串口中断,不知道你的中断#pragma vector=USCIAB0RX_VECTOR对不对,建议在官方下载例程看一下。

2、主程序里面只有接收中断哪里可以呢,你这个属于发送中断了,应为你没有直接在主函数里面发出去,估计是你修改的官方的例子,是串口发送一个数据返回一个数据的例子吧
IE2 |= UCA0RXIE; // Enable USCI_A0 RX interrupt

3、UCA0RXBUF = get_temperature();这一句建议使用定义的变量,不要使用UCA0RXBUF这个寄存器,因为你的USCIAB0RX_VECTOR中断是包含发送和接收中断的,你这玩意不就是直接发出去嘛,可以不需要中断直接在主函数里面发送出去。

4、一楼完全是扯淡的,低功耗当然是进入了,在AD中不是有 __bis_SR_register(CPUOFF + GIE); // LPM0 with interrupts enabled这一句么,没问题的,中断中是会对SR操作的,这个自然就自己处理了。只需要再次配置就OK。

4、建议你屏蔽主函数里面的UCA0RXBUF = get_temperature();这一句,在PC端发送数据给单片机看看串口是否通了。

5、配置串口发送中断,应该可以解决问题。

6、F5438的串口中断程序如下:
#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
{
switch(__even_in_range(UCA0IV,4))
{
case 0:break; // Vector 0 - no interrupt
case 2: // Vector 2 - RXIFG
while (!(UCA0IFG&UCTXIFG)); // USCI_A0 TX buffer ready?
UCA0TXBUF = UCA0RXBUF; // TX -> RXed character
break;
case 4:break; // Vector 4 - TXIFG
default: break;
}
}

7、如果觉得回答的可以,建议追加分数。

⑺ 大虾们~小弟急需mlx90615红外传感器在单片机中的c语言编程~跪求~大谢!

红外测温模块?
不是很难吧。

⑻ 红外线遥控器解码C语言程序代码 SM0038接受头

//////////////////////////////////////
//晶振频率为6MHz 一个机器周期2us //
//实现按键地址码、指令码的数码管显示//
//2010-06-01 //
//////////////////////////////////////
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit la=P2^6;
sbit wela=P2^7;
bit overflag,dataover;//开始接收数据,数据处理完毕

uchar timedata;//定时器0溢出次数
uchar chubus[33];//33Byte数据 timedata组成的数组
uchar jieguos[4];//地址码,地址反码,数据码,数据反码;

void initial()//初始化
{
IT0=1;EX0=1;//负边沿触发

TMOD=0x01;ET0=1;TR0=1;//模式1,十六位定时器
TH0=0xff;TL0=0x06;//0.5ms溢出

EA=1; //开总中断
}

void time0() interrupt 1//定时器0中断
{TH0=0xff;TL0=0x06;
timedata++;
}

void ex0() interrupt 0//外部中断0,接收数据
{
static bit startflag;//开始接收
static uchar i;

if(startflag)
{
if(timedata<32&&timedata>=16) i=0;
chubus[i]=timedata;
timedata=0;
i++;
if(i==33){overflag=1;i=0;}

}
else
{
startflag=1;
timedata=0;
}
}

void chulidata()
{
uchar chubu;//初步数据
uchar jieguo;//结果数据
uchar x,y,z=1;
for(x=0;x<4;x++)//处理四组数据
{
for(y=1;y<=8;y++)//处理一组数据8Byte
{
chubu=chubus[z];
jieguo=jieguo>>1;
if(chubu>3) jieguo=jieguo|0x80;//大于1.5mS为1
z++;
}
jieguos[x]=jieguo;
jieguo=0;
}
dataover=1;

}

void delay(uint z)
{
uint x ,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}

void display()
{
uchar gao,gao1;
uchar di,di1;

uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
gao1=table[jieguos[0]/16];
di1=table[jieguos[0]%16];
gao=table[jieguos[2]/16];
di=table[jieguos[2]%16];

la=1;
P0=gao1;
la=0;
P0=0xff;
wela=1;
P0=0x7e;
wela=0;
delay(2);

la=1;
P0=di1;
la=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(2);//地址码

la=1;
P0=gao;
la=0;
P0=0xff;
wela=1;
P0=0x77;
wela=0;
delay(2);

la=1;
P0=di;
la=0;
P0=0xff;
wela=1;
P0=0x6f;
wela=0;
delay(2);//指令码

}

void main()
{
initial();//初始化
while(1)
{

if(overflag)//数据接收完毕
{
chulidata();//处理数据,完成标志dataover
overflag=0;
}
if(dataover)
{
display();//数码管显示
}
}
}

⑼ DS18B20温度传感器,89S52单片机,通过无线模块(NRF24L01)发射、接收,用LCD1602显示温度,求完整c语言

我没能帮你。但C语言是可以移植的,我给你一个DS18B20的程序,你再找关于无线模块的资料,然后将它们整合到一起
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DS=P2^2; //define interface
uint temp; // variable of temperature
uchar flag1; // sign of the result positive or negative
sbit la=P2^6;
sbit wela=P2^7;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
0x87,0xff,0xef};

void delay(uint count) //delay
{
uint i;
while(count)
{
i=200;
while(i>0)
i--;
count--;
}
}
///////功能:串口初始化,波特率9600,方式1///////
void Init_Com(void)
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFd;
TL1 = 0xFd;
TR1 = 1;
}

void dsreset(void) //send reset and initialization command 18B20复位,初始化函数
{
uint i;
DS=0;
i=103;
while(i>0)i--;
DS=1;
i=4;
while(i>0)i--;
}

bit tmpreadbit(void) //read a bit 读1位数据函数
{
uint i;
bit dat;
DS=0;i++; //i++ for delay
DS=1;i++;i++;
dat=DS;
i=8;while(i>0)i--;
return (dat);
}

uchar tmpread(void) //read a byte date 读1字节函数
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在DAT里
}
return(dat);
}

void tmpwritebyte(uchar dat) //write a byte to ds18b20 向1820写一个字节数据函数
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //write 1
{
DS=0;
i++;i++;
DS=1;
i=8;while(i>0)i--;
}
else
{
DS=0; //write 0
i=8;while(i>0)i--;
DS=1;
i++;i++;
}

}
}

void tmpchange(void) //DS18B20 begin change 开始获取数据并转换
{
dsreset();
delay(1);
tmpwritebyte(0xcc); // address all drivers on bus 写跳过读ROM指令
tmpwritebyte(0x44); // initiates a single temperature conversion 写温度转换指令
}

uint tmp() //get the temperature 读取寄存器中存储的温度数据
{
float tt;
uchar a,b;
dsreset();
delay(1);
tmpwritebyte(0xcc);
tmpwritebyte(0xbe);
a=tmpread(); //读低8位
b=tmpread(); //读高8位
temp=b;
temp<<=8; //two byte compose a int variable 两个字节组合为1个字
temp=temp|a;
tt=temp*0.0625; //温度在寄存器中是12位,分辨率是0.0625
temp=tt*10+0.5; //乘10表示小数点后只取1位,加0.5是四折五入
temp=temp+4; //误差补偿
return temp;
}

void readrom() //read the serial
{
uchar sn1,sn2;
dsreset();
delay(1);
tmpwritebyte(0x33);
sn1=tmpread();
sn2=tmpread();
}

void delay10ms() //delay
{
uchar a,b;
for(a=10;a>0;a--)
for(b=60;b>0;b--);
}

void display(uint temp) //显示程序
{
uchar A1,A2,A2t,A3,ser;
ser=temp/10;
SBUF=ser;
A1=temp/100;
A2t=temp%100;
A2=A2t/10;
A3=A2t%10;
la=0;
P0=table[A1]; //显示百位
la=1;
la=0;

wela=0;
P0=0x7e;
wela=1;
wela=0;
delay(2);

la=0;
P0=table1[A2]; //显示十位
la=1;
la=0;

wela=0;
P0=0x7d;
wela=1;
wela=0;
delay(2);

P0=table[A3]; //显示个位
la=1;
la=0;

P0=0x7b;
wela=1;
wela=0;
delay(1);
}

void main()
{
uchar a;
Init_Com();
do
{
tmpchange();
// delay(200);
for(a=10;a>0;a--)
{ display(tmp());
}
} while(1);
}

⑽ 求基于51单片机的温度计设计 测温传感器使用DS1631.只要C语言程序

真好,前些天写的程序复制上来给你看看吧,注释比较少有点乱。功能是读取DS18b20的温度1602显示,顺便显示了几个自定义字符。

#include<reg52.h>

#include<stdio.h>

sbitrs=P2^4;

sbitrw=P2^5;

sbiten=P2^6;

sbitdq=P1^0;

bitmark;

unsignedinttemp=0;

unsignedcharcodedat1[]="wellcomestudyC";

unsignedcharcodeERROR[]="ERROR";

unsignedcharmo[]={0x10,0x07,0x0C,0x08,0x08,0x0C,0x07,0x00,

0x00,0x0F,0x09,0x09,0x0F,0x09,0x09,0x0F,

0x00,0x0F,0x09,0x0F,0x09,0x0F,0x11,0x13,

0x1F,0x15,0x15,0x1F,0x1F,0x15,0x15,0x1F,

0x00,0x1F,0x04,0x04,0x04,0x04,0x1F,0x00,

0x00,0x04,0x04,0x04,0x0A,0x11,0x11,0x00,

0x00,0x1F,0x04,0x0F,0x05,0x05,0x1F,0x00,

0x10,0x07,0x0C,0x08,0x08,0x0C,0x07,0x00};

charcodetab[16]="0123456789ABCDEF";

/*1ms延时子程序*/

voiddelay_1ms(unsignedchartime)

{

unsignedchara,b;

for(a=time;a>0;a--)

for(b=200;b>0;b--);

}

/*2us延时子程序*/

voiddelay2us(unsignedchart)

{

while(--t);

}

/*1602命令写入子程序*/

voidwcom(unsignedcharcom)

{

rs=0;

rw=0;

P0=com;

delay_1ms(3);

en=1;

en=0;

}

/*1602数据写入子程序*/

voidwdat(unsignedchardat)

{

rs=1;

rw=0;

P0=dat;

delay_1ms(3);

en=1;

en=0;

}

/*1602初始化*/

voidstart()

{

wcom(0x38);

wcom(0x0c);

wcom(0x06);

wcom(0x01);

}

//1602显示用户自定义字符子程序

voiddisplay()

{

unsignedcharm=0;

for(m=0;m<64;m++)

{

wcom(0x40+m);//设定自定义字模数据的存储地址

wdat(mo[m]);

}

wcom(0xc8);//显示自定义字符“C”

for(m=0;m<8;m++)

{

wdat(0x00+m);

delay_1ms(255);

}

}

/*18b20复位子程序*/

bitds18b20(void)

{

bitflag;

dq=1;

delay2us(10);

dq=0;

delay2us(200);

delay2us(200);

dq=1;

delay2us(50);

flag=dq;

delay2us(25);

returnflag;

}

/*向18b20写入一个字节的数据*/

voidwrite_dat(unsignedchardat)

{

unsignedchari;

for(i=0;i<8;i++)

{

dq=0;

delay2us(2);

dq=dat&0x01;

delay2us(22);

dq=1;

dat>>=1;

}

}

/*读取18b20一个字节的数据*/

unsignedcharread_dat(void)

{

unsignedchari,dat=0;

for(i=0;i<8;i++)

{

dq=0;

dat>>=1;

dq=1;

if(dq)

dat|=0x80;

delay2us(25);

}

return(dat);

}

/*读取温度*/

voidget_temp(void)

{

unsignedinta,b;

ds18b20();

write_dat(0xcc);

write_dat(0x44);

delay_1ms(2);

ds18b20();

write_dat(0xcc);

write_dat(0xbe);

a=read_dat();

b=read_dat();

/*********************温度数据处理程序段*/

if((b&0xf8)==0xf8)

{

mark=1;

b<<=8;

temp=((~(a+b))+1)*0.625;

}

else

{

mark=0;

b<<=8;

temp=(a+b)*0.625;

}

}

voidmain()

{

unsignedcharm;

start();

wcom(0x80);

for(m=0;m<16;m++)

{

wdat(dat1[m]);

delay_1ms(155);

}

display();

while(1)

{

get_temp();

if(ds18b20()) //若18b20初始化不成功或不存在即显示ERROR

{

unsignedcharj;

wcom(0xc2);

for(j=0;j<6;j++)

{

wdat(ERROR[j]);

}

}

else

{

wcom(0xc2);

if(mark)

wdat(0xb0);

else

wdat(0xa0);

wdat(tab[temp/1000]);

wdat(tab[(temp%1000)/100]);

wdat(tab[((temp%1000)%100)/10]);

wdat(0x2e);

wdat(tab[((temp%1000)%100)%10]);

}

}

}