基于C8051F340单片机的内部温度传感器,测量温度的C程序

一、前言

C8051F340单片机片内的温度传感器,可以进行温度测量,温度传感器可配置为ADC的输入,通过ADC进行测量。

二、程序展示

1、头文件部分

#include "C8051F340.h"
unsigned int adh,adl;
void ADC0_Init(void);  //ADC0初始化函数
void PORT_Init(void);    //端口初始化
void delay(int i);
unsigned int TEMP_Test(void);
void TEMP_cal(void);

2、主程序部分

main()
{
	PCA0MD &= ~0x40;         //关闭看门狗
	OSCICN |= 0x03;          //使用内部12M晶振
	ADC0_Init();					   //ADC初始化
    PORT_Init();					   //端口初始化	
	TEMP_cal();
	while(1)
	{}
}

3、ADC初始化程序

void ADC0_Init(void)
{
   REF0CN  = 0x07;  //温度传感器使能位/使用内部参考电压VREF/内部模拟偏压发生器使能位
   AMX0P = 0x1e;                       // 配置为温度传感器
   AMX0N = 0x1F;                       // 单端输入
   ADC0CF  = 0xF8;                     // 采样值右对齐,如左对齐其值为FC
   ADC0CN  = 0xCA;                     //采用定时器2溢出后3个SAR时钟开转换

   EIE1   |= 0x08;                     //使能ADC中断
}

4、单次温度测量程序

unsigned int TEMP_Test(void)
{
	unsigned int ad_value;
	bit ad0_busy = 1;
	AD0BUSY = 1;           // 写‘1’到AD0BUSY 位启动转换
	while(ad0_busy)
	{
		ad0_busy = AD0BUSY;  // 读AD0BUSY,转换结束,AD0BUSY置0
	}
	adh = ADC0H;
	adl = ADC0L;
	ad_value = adh<<8+adl;
	return(ad_value)
}

5、10次测量平均值的程序

void TEMP_cal(void)
{
	unsigned char i;
	unsigned int temp=0;
	for(i=0, i<10, i++)
	{
		temp +=TEMP_Test();
		delay(10);
	}
	temp /=10;
}

6、延时程序

void delay(int n)
{
	unsigned j=1000;
	for(i=0,i<n,i++)
	{
		while(j--);
	}
}
  • 11
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个基于AT89C52单片机温度传感器程序示例: ```c #include<reg52.h> #include<intrins.h> #define DQ P2_0 // 设置DQ引脚为P2.0 sbit beep = P1^0; // 设置蜂鸣器引脚为P1.0 unsigned char temp; // 存储温度值 void delay_us(unsigned char t) // 延时函数,单位为微秒 { while(t--) { _nop_(); _nop_(); _nop_(); _nop_(); } } void delay_ms(unsigned int t) // 延时函数,单位为毫秒 { unsigned int i; while(t--) { for(i=0; i<125; i++); } } void ds18b20_init() // 初始化ds18b20温度传感器 { DQ = 1; delay_us(2); DQ = 0; delay_us(80); DQ = 1; delay_us(30); } void write_byte(unsigned char dat) // 写入一个字节的数据 { unsigned char i; for(i=0; i<8; i++) { DQ = 0; _nop_(); _nop_(); if(dat & 0x01) { DQ = 1; } else { DQ = 0; } dat >>= 1; delay_us(5); DQ = 1; } } unsigned char read_byte() // 读取一个字节的数据 { unsigned char i, dat = 0; for(i=0; i<8; i++) { DQ = 0; _nop_(); _nop_(); DQ = 1; _nop_(); _nop_(); dat >>= 1; if(DQ) { dat |= 0x80; } delay_us(5); } return dat; } void get_temp() // 获取温度值 { unsigned char temp_low, temp_high; ds18b20_init(); // 初始化ds18b20温度传感器 write_byte(0xcc); // 跳过ROM操作 write_byte(0x44); // 启动温度转换 delay_ms(750); // 等待转换完成 ds18b20_init(); // 初始化ds18b20温度传感器 write_byte(0xcc); // 跳过ROM操作 write_byte(0xbe); // 读取温度值 temp_low = read_byte(); // 读取温度值低八位 temp_high = read_byte(); // 读取温度值高八位 temp = (temp_high << 4) | (temp_low >> 4); // 计算温度值 } void main() { while(1) { get_temp(); // 获取温度值 if(temp > 30) // 判断温度是否超过30度 { beep = 1; // 开启蜂鸣器 } else { beep = 0; // 关闭蜂鸣器 } delay_ms(1000); // 延时1秒 } } ``` 这个程序可以通过DS18B20温度传感器来获取温度值,并通过蜂鸣器来判断温度是否超过30度。在程序中,我们使用了AT89C52单片机的GPIO口来连接DS18B20温度传感器和蜂鸣器,使用了延时函数来控制时序,实现了获取温度值和控制蜂鸣器的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xll_007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值