问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

c8051f020的温度传感器的具体用法

发布网友 发布时间:2022-04-22 14:49

我来回答

2个回答

热心网友 时间:2023-09-10 21:46

// 此程序为ADC0的应用例程 在中断模式使用定时器3溢出
// 作为开始转换信号来测量片内温度传感器
// ADC0的结果经过计算得到温度值显示在lcd1602液晶上
//
// 假设在XTAL1和XTAL2之间连接一个22.1184MHz晶体
//
// 系统时钟频率存储在全局常量SYSCLK

// ADC0采样率存储在全局常量SAMPLERATE0
//
// 目标器件: C8051F02x
// 链接工具 KEIL C51 6.03 / KEIL EVAL C51
//
//-----------------------------------------------------------------------------
// 包含文件
//-----------------------------------------------------------------------------
#include <c8051f020.h> // SFR声明
#include <stdio.h>
//-----------------------------------------------------------------------------
// C8051F02X的16位SFR定义
//-----------------------------------------------------------------------------
sfr16 DP = 0x82; // 数据指针
sfr16 TMR3RL = 0x92; // 定时器3重装值
sfr16 TMR3 = 0x94; // 定时器3计数器
sfr16 ADC0 = 0xbe; // ADC0数据
sfr16 ADC0GT = 0xc4; // ADC0大于窗口
sfr16 ADC0LT = 0xc6; // ADC0小于窗口
sfr16 RCAP2 = 0xca; // 定时器2捕捉/重装
sfr16 T2 = 0xcc; // 定时器2
sfr16 RCAP4 = 0xe4; // 定时器4捕捉/重装
sfr16 T4 = 0xf4; // 定时器4
sfr16 DAC0 = 0xd2; // DAC0数据
sfr16 DAC1 = 0xd5; // DAC1数据
//-----------------------------------------------------------------------------
// 全局常量
//-----------------------------------------------------------------------------
#define SYSCLK 22118400 // 系统时钟频率 Hz
#define BAUDRATE 9600 // UART波特率 bps
#define SAMPLERATE0 50000 // ADC0采样频率 Hz
#define uchar unsigned char
#define uint unsigned int
#define DataPort P2
sbit RS=P3^0;
sbit RW=P3^1;
sbit EN=P3^2;
sbit LED = P3^4; // LED=’1’ 意为ON
uchar code str1[]={"temperature: "};
uchar code str2[]={" "};
uchar data disdata[6];
uchar tflag;//温度正负标志
long temperature; // 温度为百分之一精度 度C
int temp_int, temp_frac; // 温度的整数和小数部分

//-----------------------------------------------------------------------------
// 函数原型
//-----------------------------------------------------------------------------
void SYSCLK_Init (void);
void PORT_Init (void);
void ADC0_Init (void);
void Timer3_Init (int counts);
void ADC0_ISR (void);
void delayms(uint ms);
void wr_com(uchar com);
void wr_dat(uchar dat);
void lcd_init();
void display(uchar *p);
void Temp_dsplay();
init_play();

//--------------------------------------------------------------
void delayms(uint ms) //延时程序
{ uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<100;j++);
}
//-------------------------------------------------------
void wr_com(uchar com)//写指令
{ delayms(1);
RS=0;
RW=0;
EN=0;
DataPort=com;
delayms(50);
EN=1;
delayms(50);
EN=0;
}
//----------------------------------------------------------------------
void wr_dat(uchar dat)//写数据//
{ delayms(1);;
RS=1;
RW=0;
EN=0;
DataPort=dat;
delayms(50);
EN=1;
delayms(50);
EN=0;
}
//-------------------------------------------------------------------
void lcd_init()//初始化设置//
{delayms(15);
wr_com(0x38);delayms(5);
wr_com(0x08);delayms(5);
wr_com(0x01);delayms(5);
wr_com(0x06);delayms(5);
wr_com(0x0c);delayms(5);
}
//---------------------------------------------------------
void display(uchar *p)//显示//
{
while(*p!='\0')
{
wr_dat(*p);
p++;
delayms(1);
}
}
//-----------------------------------------------------
init_play()//初始化显示
{ lcd_init();
wr_com(0x80);
display(str1);
wr_com(0xc0);
display(str2);
}
//-------------------------------------------------------
void Temp_dsplay()//温度值显示
{ uchar flagdat;
disdata[0]=temp_int/100+0x30;//百位数
disdata[1]=temp_int%100/10+0x30;//十位数
disdata[2]=temp_int%10+0x30;//个位数
disdata[3]=temp_frac/10+0x30;//小数位1
disdata[4]=temp_frac%10+0x30;//小数位2

if(tflag==0)
flagdat=0x20;//正温度不显示符号
else
flagdat=0x2d;//负温度显示负号:-
if(disdata[0]==0x30)
{disdata[0]=0x20;//如果百位为0,不显示
if(disdata[1]==0x30)
{disdata[1]=0x20;//如果百位为0,十位为0也不显示
}
}
wr_com(0xc0);
wr_dat(flagdat);//显示符号位
wr_com(0xc1);
wr_dat(disdata[0]);//显示百位
wr_com(0xc2);
wr_dat(disdata[1]);//显示十位
wr_com(0xc3);
wr_dat(disdata[2]);//显示个位
wr_com(0xc4);
wr_dat(0x2e);//显示小数点
wr_com(0xc5);
wr_dat(disdata[3]);//显示小数位
wr_com(0xc6);
wr_dat(disdata[4]);//显示小数位
}
//-----------------------------------------------------------------------------
// 全局变炼
//-----------------------------------------------------------------------------
long result; // ADC0 十选一值
//-----------------------------------------------------------------------------
// 主程序
//-----------------------------------------------------------------------------
void main (void)
{

WDTCN = 0xde; // 禁止看门狗定时器
WDTCN = 0xad;

SYSCLK_Init (); // 初始化振荡器
PORT_Init (); // 初始化数据交叉开关和通用IO口
Timer3_Init (SYSCLK/SAMPLERATE0); // 初始化定时器3溢出作为采样速率
ADC0_Init (); // 初始化ADC
lcd_init();
init_play();//初始化显示
AD0EN = 1; // 使能ADC
EA = 1; // 允许全局中断
while (1)
{
EA = 0; // 禁止中断
temperature = result; // 从全局变量得到ADC值
EA = 1; // 重新允许中断
// 计算温度误差为百分之一度
temperature = temperature - 41380;
temperature = (temperature * 100L) / 156;
temp_int = temperature / 100;
temp_frac = temperature - (temp_int * 100);
Temp_dsplay();
}
}
//-----------------------------------------------------------------------------
// 初始化子程序
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// 系统时钟初始化
//-----------------------------------------------------------------------------
//
// 此程序初始化系统时钟 使用22.1184MHz晶体作为时钟源
//
void SYSCLK_Init (void)
{
int i; // 延时计数器
OSCXCN = 0x67; // 起动外部振荡器晶体为 22.1184MHz
for (i=0; i < 256; i++) ; // 等待振荡器启动(>1ms)
while (!(OSCXCN & 0x80)) ; // 等待晶体振荡器稳定
OSCICN = 0x88; // 选择外部振荡器作为系统时钟源并使能丢失时钟检测器
}
//-----------------------------------------------------------------------------
// IO口初始化
//-----------------------------------------------------------------------------
//
// 配置数据交叉开关和通用IO口
//
void PORT_Init (void)
{

XBR1 = 0x00;
XBR2 = 0x40; // 允许数据交叉开关和弱上拉

P2MDOUT |= 0xff;
P3MDOUT |= 0xff;// 允许P3.4(LED)为推挽输出P3.0,P3.1,P3.2推挽输出
}
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
// ADC0初始化
//-----------------------------------------------------------------------------
//
// 配置ADC0 使用定时器3溢出作为转换源,转换结束产生中断
// 使用左对齐输出模式 使能ADC转换结束中断 禁止ADC
//
void ADC0_Init (void)
{
ADC0CN = 0x05; // 禁止ADC0; 正常跟踪模式
// 定时器3溢出ADC0开始转换 ADC0数据左对齐
REF0CN = 0x07; // 使能温度传感器, 片内 VREF和VREF 输出缓冲器
AMX0SL = 0x0f; // 选择温度传感器作为ADC为多路模拟输出
ADC0CF = (SYSCLK/2500000) << 3; // ADC 转换时钟=2.5MHz
ADC0CF |= 0x01; // PGA增益=2
EIE2 |= 0x02; // 允许ADC中断
}
//-----------------------------------------------------------------------------
// 定时器3初始化
//-----------------------------------------------------------------------------
//
// 配置定时器3为自动重装 时间间隔由<counts> 制定(不产生中断)
// 使用系统时钟作为时基.
//
void Timer3_Init (int counts)
{
TMR3CN = 0x02; // 停止定时器3; 清除TF3;
// 使用系统时钟作为时基
TMR3RL = -counts; // 初始化重装值
TMR3 = 0xffff; // 设置立即重装值
EIE2 &= ~0x01; // 禁止定时器3中断
TMR3CN |= 0x04; // 起动定时器3
}
//-----------------------------------------------------------------------------
// 中断服务程序
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// ADC0中断服务程序
//-----------------------------------------------------------------------------
//
// ADC0转换结束中断服务程序
// 我们将ADC0取样结果存储在全局变量<result>.
//
void ADC0_ISR (void) interrupt 15
{
AD0INT = 0; // ADC转换结束清除标志
result = ADC0; // 读ADC值
}
这是我修改的一个使用内部温度传感器的程序,做过测试可以用,你可以参考一下。

热心网友 时间:2023-09-10 21:47

AD转换开启,使工作为温度传感器的选择通道。同时把寄存器REF0CN中的温度传感器开启,其他和正常AD转换一样。。。试一试。。。。你会成功的。。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
鞋底是空心格子怎么办 鞋里有格子硌脚怎么办 买的鞋子里面是空心格子底硌脚怎么办 鞋子底是空心格子的怎样办 浅谈NY5196—2002有机茶 有机食品茶叶标准 茶叶的储藏运销:茶叶贮藏期的化学变化 东方美人茶要怎么储存?东方美人茶储存方法 乌龙茶贮运方法 有机乌龙茶是什么贮藏与运输的? 温度传感器区别 PTC和PT100一样吗 PT100三线制温度传感器怎么接线 怎么申请银联微信支付宝花呗信用卡四合一二维码? 有谁了解--温度传感器? 发动机冷却液温度传感器电路电压过高是什么原因? 火警报警器中使用温度传感器是什么原理? 问个简单的问题--主板上的温度传感器在哪? 银联微信支付宝三合一收款码是什么? 温度传感器的电气符号 朋友圈推广方案表格怎么做 银联微信支付宝三合一收款码? 朋友圈推广广告怎么做?怎么做吸引人 如何做一个朋友圈推广方案 仙界修仙小说txt全集免费下载 男人怎么增加雌性荷尔蒙或降阳补阴或不去喜欢女人 古代人如何采阳补阴的 怎么才能阳人阴差 如何增加精子?有人有办法吗? 直线、构造线、多段线各有什么作用的答案 眼线的画法步骤图黄瓜辣椒腌菜怎么腌 温度传感器是什么?有何作用? P0117 发动机冷却液温度传感器-电路输入电压低 温度传感器的精度一般多少? 在国外可以在虎牙平台上直播吗? 虎牙支持跨国直播吗 腾讯虎牙直播在越南国可以使用吗? 海外充值虎牙直播? 虎牙有没有外国主播 虎牙直播地区限制怎么解决 广州华多网络科技有限公司除了国内的YY直播,虎牙直播,国外都是哪些呢? 虎牙直播是哪个国家维护的? 什么直播平台? 我可以把国外直播平台别人正在直播的东西直接转播到国内的直播平台吗?比如熊猫或者虎牙这种。 虎牙在直播间开贵族跟主播开和自己开有啥区别 虎牙直播开始申请IPO了吗? 虎牙直播的豆子怎么卖出去? 404 Not Found 404 Not Found u盘无法打开 双击显示“请将磁盘驱动器插入” u盘无法打开(显示请插入驱动器)