(整理)C8051F040_内部温度传感器C程序.
温度传感器C程序
void tempchange(void);
uint get_temp();
void delay(uint z);
void write_com(uchar com);
void write_data(uchar date);
sbit ds=P2^2; //温度传感器信号线
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void initlcd()
{dula=0;
wela=0;
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
{ uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{ testb=dat&0x01;
dat=dat>>1;
if(testb) //写 1
{ ds=0;
i++;i++;
ds=1;
for(i=1;i<=8;i++)
{ j=tempreadbit();
dat=(j<<7)|(dat>>1);//读出的数据最低位在最前面,这样刚好一个字节在DAT里
}
return(dat);
}
void tempwritebyte(uchar dat)//向18B20写一个字节数据
基于C8051F040单片机的红外瓦斯传感器的设计与研究
1 红外气体检 测原 理
不 同 气体 对 红外 光有 着 不 同 的 吸收 光谱 , 体 气 的特 征光 谱 吸收 强度 与该 气 体 的 浓度 相 关 , 用这 利
一
原 理可 以测 量 出气体 浓度 。非 对称 双原 子 和多原
图 1 红 外 光 谱 吸 收式 瓦斯 探 头 原 理 不 意 图
5 V
C 0 10 0 8 5F 4 光 源驱 ● 一
●一动 电路 — 一
—
I × + 频率/ I 电流输 出 I
2 传 感 器 硬 件 框 图
2 2 主 控芯 片 C U选择 . P
C 0 1 0 0是 C g a 公 司生 产 的 功 能 强 大 的 8 5 F4 y nl 新 型单 片 机 , 单 片 机 具 有 高 速 的 8 5 该 0 1控 制 器 内 核 ,4 的 程 序 存 储 器 , 按 扇 区 在 运 行 中编 程 , 6K 可
t e e tg sc nc n r t n. r i r v n h t o o d tc a o e ta i o Fo mp o i g t e daa c mm u i ain r t n e ib lt CAN us me h d n c to a e a d r la ii y, b to
红外 光 谱 吸收式 瓦斯 探头 示意 图如 图 1 示 。光 源 所 由 C U控 制 以 2 5H P . z的 频 率 调 制 , 线 经 反 射 镜 光
作者简介 : 谢子殿(92 , , 16 )男 黑龙江鹤岗市人, 教授 , 主要从事计算 机测控 , 矿井信 息监测, 煤矿电气控制方面工作。
的 IO 口控制三极管 的通断 , IO 口输 出低 电平 时 , / 当 /
C8051F040中文数据手册
1. 系统概论C8051 F04X 系列单片机是集成在一块芯片上的混合信号系统级单片机,分64个I/O端口管脚(如C8051F040/2)或者32个I/O端口管脚(如C8051F041/3)两类,同时有一个CAN2.0B 集成控制器。
其最突出的特征见下表,涉及的主要设备特征在1.1中详解。
. 25MIPS高速流水线式CIP-51控制器内核. CAN2.0B 控制对应的有32个信息对象,且每一个都有它自己的屏蔽位. 在系统,全速,非插入式调试接口. 有12位的ADC(C8051F040/1)或10位的ADC(C8051F042/3),带有PGA和模拟复用开关. 对于12位的ADC(峰峰值为60伏)的高压差分放大输入可通过编程得到. 有8位的多通道DAC,带有PGA和模拟复用开关. 有两个12位DAC,通过编程更新时序. 64KB的可编程FLASH存储器. RAM可存储4352(4096+256)字节. 外部内存接口可寻址64K字节. SPI,SMBus/I2C和(2)UART串行接口通过硬件实现. 5个16位通用定时器. 可编程计数/定时阵列有6个捕捉/比较模块. 片内有看门狗定时器,VDD监视器,温度传感器由于有片内VDD监视器,看门狗定时器和时钟震荡器,C8051F04X系列单片机称得上是真正独立的片上系统。
通过使用软件可以用程序很好的管理模拟和数字外设FLASH存储器甚至还有在系统重新编程能力,可提供非易失数据存储,并允许现场更新8051程序。
片内JTAG调试支持功能允许对安装在最终应用系统上的单片机进行非侵入失式(不占用片内资源),全速在系统调试。
该调试系统支持和修改存储器和寄存器,支持断点,观察点,单步及运行和停机命令。
在使用JTAG调试时所有的模拟和数字外设都可全功能运行。
每个单片机都可在工业温度范围-45-+85℃内采用 2.7伏到3.6V 的工作电压,端口I/O,/RST和JTAM引脚允许5V的输入信号电压。
绞车模拟器,关于直流电机驱动电路的设计
摘要本文主要是对绞车模拟器的研究。
其研究意义就是实现绞车控制,对航空吊放声纳,舰船拖曳声纳的施放深度,施放速度进行调控。
对声纳的释放和回收起到很大作用。
主要思想是通过C8051F040芯片进行控制,采集到的信号由LM298N 进行处理,通过利用直流电机和旋转编码器[1],模拟绞车转动,并模拟绞车各个开关量,给控制系统提供速度反馈信号以及绞车状态信号。
从而实现绞车的正转,反转,急停,控制绞车转速。
系统由电压控制,直流电机驱动电路,光耦隔离电路,绞控盒,旋转编码器组成。
利用PWM脉宽调制控制原理控制直流电机的方法,闭环控制原理来控制电路的输入输出和转速控制。
最后对C8051F020的初始化编程和程序调制,讨论了在调试程序中遇到的问题,完成了整个电路的最终调试。
达到了毕业设计任务书的要求。
关键词:C8051F020 ,绞车,PWM脉宽调制,直流电机驱动ABSTRACTThis paper is the winch controller. Significance of their research is to realize the winch control, air sonar, ship towed sonar depth cast, cast speed control. The release and recovery of sonar played a significant role. The main idea is to control through the C8051F040 chip, the signal collected by the LM298N processing, through the use of DC motors and rotary encoders, analog winch rotation, and various analog switch winch, to the control system to provide speed feedback signals and status signals the winch. In order to achieve the winch forward, reverse, stop, control winch speed. System consists of voltage control, DC motor drive circuit, opto isolation circuit, control box cutter, rotary encoder components. Using pulse width modulation PWM control of DC motor control theory approach, closed-loop control principles to control the input and output circuit and speed control.Finally, the initial programming and procedures C8051F020 modulation, discussed the problems encountered in the debugger, complete the final commissioning of the entire circuit. Mission statement to the graduation requirements of the task.KEY WORDS: C8051F020, winch, PWM pulse width modulation, DC motor drive目录摘要 (I)ABSTRACT (II)第1章概论 (1)第2章基础知识概述 (2)2.1 C8051F040单片机 (2)2.1.1 C8051F040简介 (2)2.1.2 C8051F040特性 (2)2.1.3 C8041F040引脚及功能 (3)2.1.4 C8051F040工作特性 (4)2.1.5 C8051存储器操作命令代码及其含义 (6)2.2 L298N电机驱动芯片 (8)2.2.1 简介 (8)2.2.2L298N工作原理 (9)2.3 6N137光耦隔离 (10)2.3.1简介 (10)2.3.2 6n137原理 (11)2.4 小结 (12)第3章电路设计 (13)3.1 设计技术指标 (13)3.2 总体电路框图 (13)3.3部分电路设计 (14)3.3.1C8051F040信号输入输出 (14)3.3.2直流电机控制电路 (14)3.3.3旋转编码器 (16)3.4 总体电路设计 (18)3.5 小结 (19)第4章软件设计 (20)4.1 Keil软件 (20)4.2程序流程框图 (21)4.3 C8051F040初始化 (21)4.4 PWM脉宽调制和PCA计数 (22)4.5 主函数与主程序 (23)4.6 调试结果 (28)4.7小结 (30)参考文献 (31)致谢 (32)毕业设计小结 (33)附录 (34)第1章概论随着我国国防科技的发展,航海事业正迅猛进步,在水下声纳方面的研究过程中.航空吊放声纳还有舰船拖曳声纳越来越重要。
STM内部温度传感器串口显示完整程序
[80乙NN入fP86TLN£W8乙丄dflCTM丄入门]:各霸尅勒昭护轴兀(g) @ @ @•4r耳5F第誓曹a审嚣敢尊®猱姆W WISS T M 3 2 F 1 0 3 内部温度传感器用串口传递到P C ±显示程序如下:#include "”ttinclude#include "”ttinclude <>ttdefine DR_ADDRESS ((uint32_t) 0x4001244C) n\r〃,a, b, c, d);Delay_ARMJISHU(8000000);}}void ADC_GP 10_Conf i gur at ion (vo id) //ADC 配置函数{GPIO_InitTypeDef GPIO_InitStructure;//PCO作为模拟通道10输入引脚=GPI0_Pin_0; 〃管脚 1=GPIO_Mode_AIN;//输入模式GPI0_Init(GPI0C, &GPI0_InitStructure);//GPI0 组当前STM32芯片内部温度为:00&8°C.当M-STM32芯片內部温度为:0047°C .当前STM32芯片内部温度为;00489 .当前STM32芯片內部温度为:0触TC.当前STM32芯片内部温度为;0047^C .当前STM32芯片内部温度为:如匸TC.当前STM32芯片内部温度为:0047ff C .当前STM32芯片内部温度为:0047^C .当M-STM32芯片內部温度为:0047°C .当前STM32芯片内部温度为;8047^ .当前STM32芯片內部温度为:0酣6°C.关于一些数据格式的定义解释:ttifndef _STM32F10x_TYPE_H#define _STM32F10x_TYPE_Htypedef signed long?s32;typedef signed char?s8;typedef signed long?const sc32;typedef signed short const scl6;typedef signed charconst sc8: typedef volatile signed long?vs32;超级终端显示如下: 当前STM32芯片內部温度为:0046°C .typedef signed short sl6;typedef volatile signed short vsl6:volatile unsigned charconst vuc8;typedef enum {FALSE 二 0, TRUE 二!FALSE} bool: typedef enum {RESET = 0, typedef volatile signed char?vs8:typedef volatile signed long?const vsc32;typedef volatile signed short const vscl6:typedef volatile signed charconst vsc8:typedef unsigned long?u32; typedef unsigned short ul6:typedef unsigned char?u8;typedef unsigned long?const uc32;typedef unsigned short constucl6;typedef unsigned charconst uc8; typedef volatile unsigned long?vu32;typedef volatile unsigned short vul6:typedef volatile unsigned char?vu8;typedef volatile unsigned long?const vuc32:typedef volatile unsignedshort const vucl6;typedefSET = !RESET} FlagStatus, ITStatus;typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState;ttdefineIS_FUNCTIONAL_STATE(STATE) (((STATE)二二DISABLE) | ((STATE)二二ENABLE)) typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrorStatus;ttdefine U8JIAX? ((u8) 255)ttdefine S8_MAX?((s8)127)ttdefine S8_MIN?((s8)-128)ttdefine U16J1AX? ((ul6) 65535u)ttdefine S16JIAX?((sl6) 32767)ttdefine S16_MIN?((sl6)-32768)ttdefine U32JIAX?ttdefine S32JIAX?ttdefine S32_MIN?ttendif。
内部温度传感器串口显示完整程序
STM32F103 内部温度传感器用串口传递到PC上显示程序如下:#include ""#include ""#include ""#include <>#define DR_ADDRESS ((uint32_t)0x4001244C) n\r", a, b, c, d);Delay_ARMJISHU(8000000);}}void ADC_GPIO_Configuration(void) //ADC配置函数{GPIO_InitTypeDef GPIO_InitStructure;//PC0 作为模拟通道10输入引脚= GPIO_Pin_0; //管脚1= GPIO_Mode_AIN;//输入模式GPIO_Init(GPIOC, &GPIO_InitStructure); //GPIO组}超级终端显示如下:关于一些数据格式的定义解释:#ifndef __STM32F10x_TYPE_H#define __STM32F10x_TYPE_Htypedef signed longs32;typedef signed short s16;typedef signed chars8;typedef signed longconst sc32;?typedef signed short const sc16;?typedef signed charconst sc8;typedef volatile signed longvs32;typedef volatile signed short vs16;typedef volatile signed charvs8;typedef volatile signed longconst vsc32;?typedef volatile signed short const vsc16;?typedef volatile signed charconst vsc8; typedef unsigned longu32;typedef unsigned short u16;typedef unsigned charu8;typedef unsigned longconst uc32;?typedef unsigned short const uc16;?typedef unsigned charconst uc8;typedef volatile unsigned longvu32;typedef volatile unsigned short vu16;typedef volatile unsigned charvu8;typedef volatile unsigned longconst vuc32;?typedef volatile unsigned short const vuc16;?typedef volatile unsigned charconst vuc8;typedef enum {FALSE = 0, TRUE = !FALSE} bool;typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus;typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState;#define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE))typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrorStatus;#define U8_MAX((u8)255)#define S8_MAX((s8)127)#define S8_MIN((s8)-128)#define U16_MAX((u16)65535u) #define S16_MAX((s16)32767) #define S16_MIN((s16)-32768) #define U32_MAX((u32)95uL) #define S32_MAX((s32)47)#define S32_MIN((s32)-48)#endif。
单片机原理及接口技术A第6章
第6章 高性能单片机C8051F040
在大多数应用中,该引脚应直接连接 VDD VREF VREFD VREF0 VREF2 AIN0.0 AIN0.1 AIN0.2 AIN0.3 HVCAP HVREF HVAIN+ HVAINCANTX CANRX DAC0 DAC1 12 15 16 17 18 19 20 21 22 23 24 25 7 6 100 99 模拟 I/O 模拟输入 模拟输入 模拟输入 模拟输入 模拟输入 模拟输入 模拟输入 模拟 I/O 模拟输入 模拟输入 模拟输入 数字输出 数字输入 模拟输出 模拟输出 带隙电压基准输出 DAC 的电压基准输入 ADC0 的电压基准输入 ADC2 的电压基准输入 ADC0 输入通道 0(详见 ADC0 说明) ADC0 输入通道 1(详见 ADC0 说明) ADC0 输入通道 2(详见 ADC0 说明) ADC0 输入通道 3(详见 ADC0 说明) 高压差分放大器电容 高压差分放大器基准 高压差分放大器正信号输入 高压差分放大器负信号输入 控制器局域网发送输出 控制器局域网接收输入 数/模转换器 0 的电压输出 数/模转换器 1 的电压输出
第6章 高性能单片机C8051F040
P5.1/A9 P5.2/A10 P5.3/A11 P5.4/A12 P5.5/A13 P5.6/A14 P5.7/A15 87 86 85 84 83 82 81 数字 I/O 数字 I/O 数字 I/O 数字 I/O 数字 I/O 数字 I/O 数字 I/O P5.1 详见输入/输出端口部分 P5.2 详见输入/输出端口部分 P5.3 详见输入/输出端口部分 P5.4 详见输入/输出端口部分 P5.5 详见输入/输出端口部分 P5.6 详见输入/输出端口部分 P5.7 详见输入/输出端口部分 外部存储器地址总线位 8(复用方式)。外部存储 P6.0/A8m/A0 80 数字 I/O 器地址总线位 0(非复用方式)。P6.0 详见输入/输出 端口部分 P6.1/A9m/A1 P6.2/A10m/A2 P6.3/A11m/A3 P6.4/A12m/A4 P6.5/A13m/A5 P6.6/A14m/A6 P6.7/A15m/A7 79 78 77 76 75 74 73 数字 I/O 数字 I/O 数字 I/O 数字 I/O 数字 I/O 数字 I/O 数字 I/O P6.1 详见输入/输出端口部分 P6.2 详见输入/输出端口部分 P6.3 详见输入/输出端口部分 P6.4 详见输入/输出端口部分 P6.5 详见输入/输出端口部分 P6.6 详见输入/输出端口部分 P6.7 详见输入/输出端口部分
C8051F040开发系统板使用说明书
第一章 C8051F040开发系统板简介1.1 开发系统的组成Cygnal C8051F040单片机开发系统主要由Cygnal 片上系统单片机开发工具、C8051F040片上系统单片机和系统试验板三部分组成,应用该系统可进行片上系统单片机较典型应用的试验,请参见以下介绍。
1.2 Cygnal C8051F单片机开发工具简介开发工具概述Cygnal 的开发工具实质上就是计算机IDE 调试环境软件及计算机RS-232到C8051F单片机JTAG 口的协议转换器(EC2-N1)的组合。
Cygnal C8051F系列全部的单片机片内均设计有调试电路该调试电路通过边界扫描方式获得单片机片内信息,通过10线的JTAG接口与开发工具连接以便于进行对单片机在片编程调试。
该开发系统板中的核心部分是Cygnal C8051F040单片机。
适配器(EC2-N1)一端与计算机相连,另一端与C8051F单片机的JTAG口相连,应用Cygnal 供应的IDE调试环境就可以进行非侵入式、全速的在系统编程(ISP)和调试。
Cygnal 开发工具支持视察和修改存储器和寄存器支持断点、视察点、堆栈指示器、单步、运行和停止吩咐。
调试时不须要额外的目标RAM、程序存储器、定时器或通信通道,并且全部的模拟和数字外设都正常工作。
开发工具主要技术指标●支持的目标系统:全部C8051Fxxx 系列单片机;●系统时钟:最大可达25MHz;●通过RS232接口与PC机连接;●支持汇编语言和C51源代码级调试;●第三方工具支持Keil C。
IDE 软件运行环境要求PC机能够运行开发工具软件并能与串行适配器通信。
对PC机有如下系统要求:●Windows 95/98/Me/NT/2000/XP 操作系统;●32MB RAM;●40MB 自由硬盘空间;●空闲的COM 口。
开发工具与PC 机硬件连接硬件连接及软件安装:●将JTAG 扁平电缆与串行示配器EC2 连接●将JTAG 扁平电缆的另一端与目标系统连接●将RS232 串行电缆的一端与EC2 连接●连接RS232 串行电缆的另一端到PC●给目标系统上电●插入CD 并运行SETUP.EXE 将IDE 软件安装到您的PC 机●在PC 机的起先菜单的程序项中选择Cygnal IDE 点击Cygnal 图标运行IDE软件。
单片机控制的温度传感器C语言程序
EA = 1;
}
/*数据转换*/
void DigitalConvert()
{
uchar total = 0;
tempsign = (temp_h >> 7) & 0x01; //得出符号位
if(tempsign == 0)//正数的处理方法
{
uint i = 0;
bit b = 0;
DO = 0; //产生读时隙
i++;//维持低电平至少1us
DO = 1; //1us以上后拉高
Delayus(2); //延时8us,DO下降沿15内ds18b20输出的数据才有效
b = DO; //读取数据
Delayus(40);//每个读时隙至少持续60us
}
/*写一个字节*/
void Writebyte(uchar byte_to_write)
{
uchar i = 0;
uchar j = 0;
bit write_bit = 0;
for(j=0; j<8; j++)
{
write_bit =(byte_to_write & 0x01);
if(write_bit == 1) //写1
return(b);
}
/*读取一个字节*/
uchar Readbyte()
{
uchar byte_read = 0;
uchar i, j;ቤተ መጻሕፍቲ ባይዱ
for(i=0; i<8; i++)
{
j = Readbit();
基于C8051F040单片机的温度测控系统
基于C8051F040单片机的温度测控系统温度遥控遥测是远程实现对温度的测量与控制,特别适合那些环境恶劣,测量人员不容易接近的场合,近年来在工农业生产中应用广泛。
根据遥控遥测系统的特点,提出了对水温遥控遥测的设计方案。
1 总体方案设计温度遥控遥测系统主要由微处理器系统、测温模块、加热模块、通信模块、液位模块以及上位机软件等组成。
系统构成如图1所示。
测温模块测量液体温度后,把温度数值发送给微处理器,当温度变化达到一定值后,加热模块开始加热,首先可以在设定的时间内,加热到设定的温度并稳定在该温度一段时间。
系统还可以按照设计好的各温度节点进行分段折线加热,精度很高。
测液位模块实时测量液体液位,并传给微处理器。
系统通过两个通信模块实现遥测遥控,上位机设好温度参数后,通过通信模块传给远处的微处理器,微处理器按照上位机设定好的温度控制加热模块进行加热,同时微处理器把液体温度和液位高度通过通信模块传给上位机软件,通过上位机软件界面可以实时显示和监测液体温度和高度。
显示模块把系统的温度、高度等各项数据实时显示在液晶屏幕上。
程序采用PID算法,建立比例、积分、微分数学模型,控制TCA785移相触发器正负触发可控硅BAT-20对受热物质加热。
移相触发双向可控硅调压精准,无级调压,较好地融合了超调和加热时间之间的矛盾;遥感遥测使用PTR-2000与上位机通信,在0到100℃范围内可任意设定、控制水温。
PTR- 2000通信距离远,准确率高,PC机界面实时显示温度曲线,温度、液位上下限设定。
并具有温度曲线采样率设定、温度曲线打印功能。
2 硬件设计系统硬件主要由C8051F040单片机最小系统、PTR2000无线通信模块、TCA785移相调压控制模块、Ptl00测温模块、WDK505测液位模块等组成。
2.1 C8051F040单片机最小系统最小系统以单片机C8051F04O为核心,包括晶体振荡电路、复位电路、抗干扰电路、电压基准电路和电源部分。
单片机控制的温度传感器C语言程序代码(WORD档)9页word
单片机控制的温度传感器C语言程序代码(WORD档)9页word#include#define DO P3_7#define SEG P0 //数码管自左至右依次为1234位#define MS2L 0x18 //1ms的延时参数#define MS2H 0xfc#define uchar unsigned char#define uint unsigned intuchar code comm[4] = {0x01,0x02,0x04,0x08};uchar code seg[10] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};uchar code seg_add_dicimal[10] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};uchar code seg_dicimal[2] ={0xc0, 0x92};uchar k = 0;uchar temp_l = 0;uchar temp_h = 0;uchar tempsign = 0;uchar hundreds = 0;uchar tens = 0;uchar ones = 0;uchar low_four = 0;/*延时以ms为单位的t时间*/void Delay(uint t)uint i;while(t--)for(i=0; i<125; i++)/*us级延时,延时时间约4+2*i*/void Delayus(uchar i)while(--i);/*产生复位脉冲,等待应答信号*/void Resetpaulse()DO = 0; //拉低约600usDelayus(150);Delayus(150);DO = 1;//产生上升沿,延时约15~60us Delayus(30);while(~DO); //等待应答信号/*读取数据一位*/bit Readbit()uint i = 0;bit b = 0;DO = 0; //产生读时隙i++; //维持低电平至少1usDO = 1; //1us以上后拉高Delayus(2); //延时8us,DO下降沿15内ds18b20输出的数据才有效 b = DO; //读取数据Delayus(40); //每个读时隙至少持续60usreturn(b);/*读取一个字节*/uchar Readbyte()uchar byte_read = 0;uchar i, j;for(i=0; i<8; i++)j = Readbit();byte_read = (j<<="">return(byte_read);/*写一个字节*/void Writebyte(uchar byte_to_write)uchar i = 0;uchar j = 0;bit write_bit = 0;for(j=0; j<8; j++)write_bit = (byte_to_write & 0x01);if(write_bit == 1) //写1DO = 0; //产生写时隙Delayus(3); //延时15usDO = 1; //写1Delayus(40); //延时,写时隙不得低于60uselseDO = 0; //产生写时隙Delayus(50); //延时,保持低约60us~120usDO = 1;i++;byte_to_write = byte_to_write >> 1;/*配置ds18b20,9位分辨率 */void Configurate()EA = 0;Resetpaulse(); //发出复位脉冲,每次操作都从复位开始Delay(1);Writebyte(0xcc); //skip room命令Writebyte(0x4e);Writebyte(0x7f);Writebyte(0x80);Writebyte(0x1f);EA = 1;/*启动温度转换*/void StartConvert()Resetpaulse(); // 发出复位脉冲,每次操作都从复位开始Delay(1);EA = 0;Writebyte(0xcc); //skip room命令Writebyte(0x44); //启动温度转换命令EA = 1;/*读取温度值*/void ReadTempreture()EA = 0;Resetpaulse(); // 发出复位脉冲,每次操作都从复位开始Delay(1);Writebyte(0xcc); //skip room命令Writebyte(0xbe); //读取暂存器命令temp_l = Readbyte(); //存储温度低字节值(整数部分低四位和小数部分)temp_h = Readbyte(); //存储温度高字节值(其中高五位为符号位) EA = 1;/*数据转换*/void DigitalConvert()uchar total = 0;tempsign = (temp_h >> 7) & 0x01; //得出符号位if(tempsign == 0) //正数的处理方法total = ((temp_h << 4)&0xf0) | ((temp_l >> 4)&0x0f); //取整数。
CAN新书45
写方向(读方向): 写方向(读方向):
Mask: Access Mask Bits : 1:传送 :传送Identifier Mask + MDir + MXtd到消息对象 到消息对象 0:屏蔽位不变 : Arb: Access Arbitration Bits : 1: 传送 Identifier + Dir + Xtd + MsgVal 到消息对象. : 到消息对象 0: 标识位不变 : Control:Access Control Bits : 1:传送控制位到消息对象。 :传送控制位到消息对象。 0:控制位不变。 :控制位不变。 ClrIntPnd: Clear Interrupt Pending Bit : TxRqst/NewDat:Access Transmission Request Bit : 1: 置位 TxRqst位 : 位 0: TxRqst位不变 : 位不变 Data A:Access Data Bytes 0-3 : 1:传送第 个数据字节到消息对象。 :传送第0~3个数据字节到消息对象。 个数据字节到消息对象 0:第0~3个字节数据字节不改变。 个字节数据字节不改变。 : 个字节数据字节不改变 Data B:Access Data Bytes 4-7 : 1:传送第 个数据字节到消息对象。 :传送第4~7个数据字节到消息对象。 个数据字节到消息对象 0:第4~7个字节数据字节不改变。 个字节数据字节不改变。 : 个字节数据字节不改变
命令掩码寄存器:定义了IFx消息缓冲器的数据方向。 IFx消息缓冲器的数据方向 ② IFx 命令掩码寄存器:定义了IFx消息缓冲器的数据方向。
WR/RD:读/写 : 写 1:写入。数据从 的消息缓冲器写入到消息对象(已被 的消息缓冲器写入到消息对象( :写入。数据从IFx的消息缓冲器写入到消息对象 IFx 命令请求寄存器指定) 命令请求寄存器指定) 0:读出。数据从消息对象(已被 :读出。数据从消息对象(已被IFx 命令请求寄存器指 定) 读出至IFx的消息缓冲器 读出至 的消息缓冲器
C8051F040_内部温度传感器C程序
附录一://内部温度传感器调试程序////利用过采样实现16位精度////ADC0_TEMP_PRO.c#include <C8051F040.h>#define ADC0START temppage=SFRPAGE;SFRPAGE=0x00;AD0BUSY=1;SFRPAGE=temppage#define STACK_LEN 128//采样128次,再将128个数据总和除以8//处理后的数据相当于16个原始数据之和,在数值表现形式上为16bittypedef unsigned int uint;typedef unsigned char uchar;typedef unsigned long ulong;sfr16 RCAP2=0xca;sfr16 RCAP3=0xca;sfr16 RCAP4=0xca;sfr16 TMR4=0xcc;sfr16 TMR3=0xcc;sfr16 TMR2=0xcc;sfr16 PCA0CP0=0xfb;sfr16 PCA0CP1=0xfd;sfr16 PCA0CP2=0xe9;sfr16 PCA0CP3=0xeb;sfr16 PCA0CP4=0xed;sfr16 PCA0CP5=0xe1;sfr16 ADC0VAL=0xbe;sfr16 ADC0GT=0xc4;sfr16 ADC0LT=0xc6;uchar temppage;bit isnewdata;uint kk;float temp;uchar stack_index;ulong total;xdata float t[20];//存放温度检测数据,为20个数据xdata uint mystack[STACK_LEN];//过采样数据数组void adc0_mux(uchar type,uchar source);void adc0_source(uchar source);void p3anolog_ini(uchar port);void HVDA_ini(uchar gaind);void adc0_ini();void delay1ms(uint time);void config();void adc0_mux(uchar type,uchar source){//type 配置测量方式为差动还是单端输入//source 为ADC0通道选择(共有9个通道)SFRPAGE=0x00;AMX0CF=type;AMX0SL=source;}void adc0_source(uchar source){//ADC0通道选择,为adc0_mux()的简化函数SFRPAGE=0x00;AMX0SL=source;}void p3anolog_ini(uchar port){//配置p3口模拟输入管脚SFRPAGE=0x00;AMX0PRT=port;SFRPAGE=0x0f;P3MDIN&=~port;//将相应管脚配置成模拟输入口}void HVDA_ini(uchar gaind){//高压差动放大器配置SFRPAGE=0x00;HV A0CN=gaind;}void adc0_ini(){SFRPAGE=0x00;ADC0CF=0x80;//ADC0时钟为系统时钟17分频,PGA增益为1ADC0CN=0x80;/*AD0EN=1,ADC0模块使能AD0TM=0,ADC0为连续跟踪模式AD0CM1:AD0CM0=00b,为AD0BUSY启动方式AD0LJST=0,数据存储格式右对齐,即ADC0H存放12bit高四位*/REF0CN&=0x0f;//AD0VRS=0,ADC0参考电压为VREFAREF0CN|=0x07;//TEMPE=1,内部温度传感器工作/*BIASE=1,偏移产生器工作REFBE=1,内部参考电平工作,电路部分须将VREF参考输出(C8051F40的第12管脚)与VREF0(C8051F040的16管脚相连,并最好并联一个4.7uF和0.1uF的旁路电容以电平滤波*/adc0_source(9);//选择第9通道,即选择温度信号为AD转换EIE2 |= 0x02; //开ADC0中断}void delay1ms(uint time){//延迟1msuint i;uint j;for (i=0;i<time;i++){for(j=0;j<300;j++);}}void config(){//crossbar 使能,但并没有进行外围设备配置WDTCN = 0x07; // Watchdog Timer Control RegisterWDTCN = 0xDE; // Disable WDTWDTCN = 0xAD;SFRPAGE = 0x0F;XBR0 = 0x00; // XBAR0: Initial Reset ValueXBR1 = 0x00; // XBAR1: Initial Reset ValueXBR2 = 0x40; // crossbar使能与否并不影响此程序运行XBR3 = 0x00; // XBAR3: Initial Reset ValueSFRPAGE = 0x0F;P0MDOUT = 0x00; // Output configuration for P0P1MDOUT = 0x00; // Output configuration for P1P2MDOUT = 0x00; // Output configuration for P2P3MDOUT = 0x00; // Output configuration for P3P4MDOUT = 0x00; // Output configuration for P4P5MDOUT = 0x00; // Output configuration for P5P6MDOUT = 0x00; // Output configuration for P6P7MDOUT = 0x00; // Output configuration for P7P1MDIN = 0xFF; // Input configuration for P1P2MDIN = 0xFF; // Input configuration for P2P3MDIN = 0xFF; // Input configuration for P3SFRPAGE = 0x0F;CLKSEL = 0x00; // Oscillator Clock SelectorOSCXCN = 0x00; // EXTERNAL Oscillator Control Register OSCICN = 0x84; // Internal Oscillator Control Register}void main(){char i;config();adc0_ini();//ADC0初始化ADC0START;//ADC0启动EA=1;i=0;stack_index=0;while(1){if(isnewdata){//由该位查询ADC0转化值是否更新if(stack_index==STACK_LEN)for(i=0,total=0;i<STACK_LEN;i++)total+=stack[i];total/=8;//此时total的值即为16bit精度采样值temp=(float)total/65536.0;temp*=2.43;temp-=0.776;temp/=0.00286;//将测量值转化成真实温度值isnewdata=0;t[i]=temp;//将温度检测值存入长度为20的数组中i++;if(i>19)i=0;//在此设断点,观察程序运行结果delay1ms(100);ADC0START;}}}void ADC0_ISR() interrupt 15{//ADC0中断SFRPAGE=0x00;AD0INT=0;isnewdata=1;if(stack_index>=STACK_LEN)//STACK_LEN需小于等于256,否则stack_index要定义成uint型数据stack_index=0;stack[stack_index]=ADC0V AL;stack_index++;}。
基于C8051F的单片机温度测量系统
基于C8051F的单片机温度测量系统一、引言单片机是一种集成了微处理器、存储器和各种外设接口的集成电路芯片,具有体积小、功耗低、成本低等优势,在各个领域得到广泛应用。
温度测量是许多领域中必不可少的一项任务,如工业控制、环境监测、医疗设备等。
本文将介绍一种基于C8051F单片机的温度测量系统的设计与实现。
二、C8051F单片机概述C8051F系列是由Silicon Laboratories公司开发的一种高性能、低功耗的8位单片机。
它采用了高度集成的架构,包括CPU、存储器、模拟和数字外设等,能够满足各种应用的需求。
C8051F系列单片机具有丰富的通信接口和强大的计算能力,是温度测量系统设计的理想选择。
三、温度传感器(TMP36)介绍温度传感器是测量温度的重要组成部分,常用的温度传感器有热电偶、热敏电阻、温度传感芯片等。
本系统采用TMP36温度传感器,它是一种低成本、精度高的模拟输出传感器。
TMP36能够测量-40℃到+125℃范围内的温度,并以模拟电压的形式输出。
四、硬件设计1. 单片机选择本系统选择C8051F020作为单片机,它具有高速、低功耗和丰富的外设接口,能够满足温度测量系统的要求。
2. 温度传感器接口电路设计温度传感器TMP36的输出电压范围为0V-2.0V,需要通过电压比较器将模拟输出转换为数字信号。
本系统采用了C8051F020内部的ADC(模数转换器)来完成电压的数字转换。
3. 显示模块设计为了方便用户观察温度数值,本系统采用了LCD模块作为显示设备。
C8051F020具有并行接口和串行接口,可以与各种类型的LCD模块进行通信。
五、软件设计1. 系统初始化在系统启动时,需要对单片机和外设进行初始化设置,包括ADC模块的配置、LCD模块的初始化等。
2. 温度测量在主程序中,通过读取ADC的数值,可以得到温度传感器的电压值。
根据TMP36的输入输出特性,可以将电压转换为温度值,并显示在LCD上。
C8051F040_内部温度传感器C程序
C8051F040_内部温度传感器C程序附录一://内部温度传感器调试程序////利用过采样实现16位精度////ADC0_TEMP_PRO.c#include#define ADC0START temppage=SFRPAGE;SFRPAGE=0x00;AD0BUSY=1;SFRPAGE=tem ppage #define STACK_LEN 128//采样128次,再将128个数据总和除以8//处理后的数据相当于16个原始数据之和,在数值表现形式上为16bittypedef unsigned int uint;typedef unsigned char uchar;typedef unsigned long ulong;sfr16 RCAP2=0xca;sfr16 RCAP3=0xca;sfr16 RCAP4=0xca;sfr16 TMR4=0xcc;sfr16 TMR3=0xcc;sfr16 TMR2=0xcc;sfr16 PCA0CP0=0xfb;sfr16 PCA0CP1=0xfd;sfr16 PCA0CP2=0xe9;sfr16 PCA0CP3=0xeb;sfr16 PCA0CP4=0xed;sfr16 PCA0CP5=0xe1;sfr16 ADC0VAL=0xbe;sfr16 ADC0GT=0xc4;sfr16 ADC0LT=0xc6;uchar temppage;bit isnewdata;uint kk;float temp;uchar stack_index;ulong total;xdata float t[20];//存放温度检测数据,为20个数据xdata uint mystack[STACK_LEN];//过采样数据数组void adc0_mux(uchar type,uchar source);void adc0_source(uchar source);void p3anolog_ini(uchar port);void HVDA_ini(uchar gaind);void adc0_ini();void delay1ms(uint time);void config();void adc0_mux(uchar type,uchar source){//type 配置测量方式为差动还是单端输入//source 为ADC0通道选择(共有9个通道)SFRPAGE=0x00;AMX0CF=type;AMX0SL=source;}void adc0_source(uchar source){//ADC0通道选择,为adc0_mux()的简化函数SFRPAGE=0x00;AMX0SL=source;}void p3anolog_ini(uchar port){//配置p3口模拟输入管脚SFRPAGE=0x00;AMX0PRT=port;SFRPAGE=0x0f;P3MDIN&=~port;//将相应管脚配置成模拟输入口}void HVDA_ini(uchar gaind){//高压差动放大器配置SFRPAGE=0x00;HVA0CN=gaind;}void adc0_ini(){SFRPAGE=0x00;ADC0CF=0x80;//ADC0时钟为系统时钟17分频,PGA增益为1 ADC0CN=0x80;/*AD0EN=1,ADC0模块使能AD0TM=0,ADC0为连续跟踪模式AD0CM1:AD0CM0=00b,为AD0BUSY启动方式AD0LJST=0,数据存储格式右对齐,即ADC0H存放12bit高四位*/REF0CN&=0x0f;//AD0VRS=0,ADC0参考电压为VREFAREF0CN|=0x07;//TEMPE=1,内部温度传感器工作/*BIASE=1,偏移产生器工作REFBE=1,内部参考电平工作,电路部分须将VREF参考输出(C8051F40的第12管脚)与VREF0(C8051F040的16管脚相连,并最好并联一个4.7uF和0.1uF的旁路电容以电平滤波*/adc0_source(9);//选择第9通道,即选择温度信号为AD转换EIE2 |= 0x02; //开ADC0中断}void delay1ms(uint time){//延迟1msuint i;uint j;for (i=0;i<time;i++){< bdsfid="147" p=""></time;i++){<> for(j=0;j<300;j++);}}void config(){//crossbar 使能,但并没有进行外围设备配置WDTCN = 0x07; // Watchdog Timer Control RegisterWDTCN = 0xDE; // Disable WDTWDTCN = 0xAD;SFRPAGE = 0x0F;XBR0 = 0x00; // XBAR0: Initial Reset ValueXBR1 = 0x00; // XBAR1: Initial Reset ValueXBR2 = 0x40; // crossbar使能与否并不影响此程序运行XBR3 = 0x00; // XBAR3: Initial Reset ValueSFRPAGE = 0x0F;P0MDOUT = 0x00; // Output configuration for P0P1MDOUT = 0x00; // Output configuration for P1P2MDOUT = 0x00; // Output configuration for P2P3MDOUT = 0x00; // Output configuration for P3P4MDOUT = 0x00; // Output configuration for P4P5MDOUT = 0x00; // Output configuration for P5P6MDOUT = 0x00; // Output configuration for P6P7MDOUT = 0x00; // Output configuration for P7P1MDIN = 0xFF; // Input configuration for P1P2MDIN = 0xFF; // Input configuration for P2P3MDIN = 0xFF; // Input configuration for P3SFRPAGE = 0x0F;CLKSEL = 0x00; // Oscillator Clock SelectorOSCXCN = 0x00; // EXTERNAL Oscillator Control Register OSCICN = 0x84; // Internal Oscillator Control Register } void main(){char i;config();adc0_ini();//ADC0初始化ADC0START;//ADC0启动EA=1;i=0;stack_index=0;while(1){if(isnewdata){//由该位查询ADC0转化值是否更新if(stack_index==STACK_LEN)for(i=0,total=0;i<stack_len;i++)< bdsfid="187" p=""></stack_len;i++)<>total+=stack[i];total/=8;//此时total的值即为16bit精度采样值temp=(float)total/65536.0;temp*=2.43;temp-=0.776;temp/=0.00286;//将测量值转化成真实温度值isnewdata=0;t[i]=temp;//将温度检测值存入长度为20的数组中i++;if(i>19)i=0;//在此设断点,观察程序运行结果delay1ms(100);ADC0START;}}}void ADC0_ISR() interrupt 15{//ADC0中断SFRPAGE=0x00;AD0INT=0;isnewdata=1;if(stack_index>=STACK_LEN)//STACK_LEN需小于等于256,否则stack_index要定义成uint型数据stack_index=0;stack[stack_index]=ADC0VAL;stack_index++;}(注:本资料素材和资料部分来自网络,仅供参考。
单片机中温度传感器模块的工作流程
一、介绍单片机和温度传感器模块在现代科技领域中,单片机和传感器模块起着至关重要的作用。
单片机是一种集成电路芯片,具有微型计算机的所有功能,可以独立地完成数据处理、控制和通信等功能。
而温度传感器模块则是一种可以测量周围环境温度的设备,通常被广泛应用于工业控制、温度监测和自动化系统中。
二、单片机中温度传感器模块的作用在单片机系统中,温度传感器模块可以实现对环境温度的实时监测和控制,例如在温室大棚中可以通过温度传感器模块来监测和调节温室内的温度,从而为植物提供适宜的生长环境。
在家用电器中,温度传感器模块也被用于测量设备的工作温度,以确保设备的稳定性和安全性。
温度传感器模块在单片机系统中起着非常重要的作用。
三、单片机中温度传感器模块的工作流程1、初始化在单片机中使用温度传感器模块之前,首先需要对单片机进行初始化设置。
这包括设置单片机的输入输出引脚、时钟频率、通讯协议等。
2、连接温度传感器模块将温度传感器模块与单片机进行连接,通常采用I2C、SPI、UART等通讯协议。
这样单片机就可以通过相应的通讯协议与温度传感器模块进行数据交换。
3、读取温度数据单片机通过相应的通讯协议向温度传感器模块发送读取命令,模块在收到命令后会开始测量环境温度,并将温度数据传输回单片机。
4、数据处理单片机接收到温度数据后,可以进行相应的数据处理操作,例如将温度数据转换为人类可读的温度值,并进行单位换算等。
5、控制输出根据温度数据的处理结果,单片机可以进一步控制其他设备的工作状态,例如控制风扇、加热器等来调节环境温度。
四、单片机中温度传感器模块的应用举例1、温室温度控制系统在温室中安装有温度传感器模块和单片机,可以实现自动调节温室内的温度,保障植物的生长环境。
2、家用空调系统家用空调系统中通常也会配备温度传感器模块和单片机,以实现对室内温度的精准监测和控制。
3、工业加热系统在工业生产过程中,温度传感器模块和单片机可以用于监测和控制加热设备的温度,确保生产过程的稳定性和安全性。
基于c8051f340单片机的温度测量报警系统参考模板
计算机与信息学院智能检测项目设计实践设计报告项目名称:基于80C51F340的智能温度报警器组长:冯春博组员:杨嘉倩花陈韵范雪华专业:计算机科学与技术专业班级:11级计科C1班日期:2014 年6月23日基于8051F340的智能温度报警器摘要基于8051F340的智能温度报警器,利用PT100温度传感器,通过热敏传感器进行温度的测量,当检测到的温度大于设置温度时报警器会开始报警,此报警器可被广泛的运用与餐厅,学校,娱乐场所,厂房等等。
当然同时也可以被用于农田以及其他对温度范围有很高要求的地方。
可以说,智能温度报警器不但可以减少或排除一些感知不到的危害,同时也使温度控制智能化。
关键词:自动报警;PT100;智能;应用范围广;自动测温;Intelligent temperature alarm system basedon 80C51F340AbstractIntelligent temperature alarm system based on 8051F340, using PT100 temperature sensor, temperature measurements were performed by a thermal sensor, when the detected temperature greater than degrees that was set is the alarm willstart the alarm, the alarm can be used with a wide range of restaurants, schools,places of entertainment, plant etc.. Of course, also can be used for farmland and other temperature range with high requirement of the local. Can say, the intelligent temperature alarm not only can reduce or eliminate the hazards are not aware of, but also the intelligent temperature control.Keywords: automatic alarm; PT100; intelligent; wide application range; automatic measurement;目录第1章设计方案 (4)1.1设计分析及要求 (4)第2章硬件电路设计 (4)2.1 单片机8051F340简介 (4)2.2硬件电路设计 (5)热敏电阻PT100简介 (5)2.2.2 参数计算 (6)2.2.3 误差分析 (7)第3章程序设计 (8)3.1 程序流程图 (8)3.2 各部分功能实现的程序 (8)第4章测试结果 (13)第5章结论 (14)附录 (16)第1章设计方案本系统设计是基于PT100热敏电阻作为温度传感器的温度测量系统,在整个系统中,8051f340作为单片机, LM324N作为运算放大器, Nokia5110(3V-5V)作为液晶显示器,本设计运用多种实用软件,编写了相应的软件程序,在PCB上,布置一系列的芯片、电阻、电容等元件,通过PCB上的导线相连,构成电路,实现了测量温度并在液晶上显示的功能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
附录一:
//内部温度传感器调试程序//
//利用过采样实现16位精度//
//ADC0_TEMP_PRO.c
#include <C8051F040.h>
#define ADC0START temppage=SFRPAGE;SFRPAGE=0x00;AD0BUSY=1;SFRPAGE=temppage
#define STACK_LEN 128
//采样128次,再将128个数据总和除以8
//处理后的数据相当于16个原始数据之和,在数值表现形式上为16bit
typedef unsigned int uint;
typedef unsigned char uchar;
typedef unsigned long ulong;
sfr16 RCAP2=0xca;
sfr16 RCAP3=0xca;
sfr16 RCAP4=0xca;
sfr16 TMR4=0xcc;
sfr16 TMR3=0xcc;
sfr16 TMR2=0xcc;
sfr16 PCA0CP0=0xfb;
sfr16 PCA0CP1=0xfd;
sfr16 PCA0CP2=0xe9;
sfr16 PCA0CP3=0xeb;
sfr16 PCA0CP4=0xed;
sfr16 PCA0CP5=0xe1;
sfr16 ADC0VAL=0xbe;
sfr16 ADC0GT=0xc4;
sfr16 ADC0LT=0xc6;
uchar temppage;
bit isnewdata;
uint kk;
float temp;
uchar stack_index;
ulong total;
xdata float t[20];//存放温度检测数据,为20个数据
xdata uint mystack[STACK_LEN];//过采样数据数组
void adc0_mux(uchar type,uchar source);
void adc0_source(uchar source);
void p3anolog_ini(uchar port);
void HVDA_ini(uchar gaind);
void adc0_ini();
void delay1ms(uint time);
void config();
void adc0_mux(uchar type,uchar source){//type 配置测量方式为差动还是单端输入
//source 为ADC0通道选择(共有9个通道)
SFRPAGE=0x00;
AMX0CF=type;
AMX0SL=source;
}
void adc0_source(uchar source){//ADC0通道选择,为adc0_mux()的简化函数SFRPAGE=0x00;
AMX0SL=source;
}
void p3anolog_ini(uchar port){//配置p3口模拟输入管脚
SFRPAGE=0x00;
AMX0PRT=port;
SFRPAGE=0x0f;
P3MDIN&=~port;//将相应管脚配置成模拟输入口
}
void HVDA_ini(uchar gaind){//高压差动放大器配置
SFRPAGE=0x00;
HV A0CN=gaind;
}
void adc0_ini(){
SFRPAGE=0x00;
ADC0CF=0x80;//ADC0时钟为系统时钟17分频,PGA增益为1
ADC0CN=0x80;
/*AD0EN=1,ADC0模块使能
AD0TM=0,ADC0为连续跟踪模式
AD0CM1:AD0CM0=00b,为AD0BUSY启动方式
AD0LJST=0,数据存储格式右对齐,即ADC0H存放12bit高四位*/
REF0CN&=0x0f;//AD0VRS=0,ADC0参考电压为VREFA
REF0CN|=0x07;//TEMPE=1,内部温度传感器工作
/*BIASE=1,偏移产生器工作
REFBE=1,内部参考电平工作,电路部分须将VREF参考输出(C8051F40的第12管脚)与VREF0(C8051F040的16管脚相连,并最好并联一个4.7uF和0.1uF的旁路电容以电平滤波*/
adc0_source(9);//选择第9通道,即选择温度信号为AD转换
EIE2 |= 0x02; //开ADC0中断
}
void delay1ms(uint time){//延迟1ms
uint i;
uint j;
for (i=0;i<time;i++){
for(j=0;j<300;j++);
}
}
void config(){//crossbar 使能,但并没有进行外围设备配置WDTCN = 0x07; // Watchdog Timer Control Register
WDTCN = 0xDE; // Disable WDT
WDTCN = 0xAD;
SFRPAGE = 0x0F;
XBR0 = 0x00; // XBAR0: Initial Reset Value
XBR1 = 0x00; // XBAR1: Initial Reset Value
XBR2 = 0x40; // crossbar使能与否并不影响此程序运行
XBR3 = 0x00; // XBAR3: Initial Reset Value
SFRPAGE = 0x0F;
P0MDOUT = 0x00; // Output configuration for P0
P1MDOUT = 0x00; // Output configuration for P1
P2MDOUT = 0x00; // Output configuration for P2
P3MDOUT = 0x00; // Output configuration for P3
P4MDOUT = 0x00; // Output configuration for P4
P5MDOUT = 0x00; // Output configuration for P5
P6MDOUT = 0x00; // Output configuration for P6
P7MDOUT = 0x00; // Output configuration for P7
P1MDIN = 0xFF; // Input configuration for P1
P2MDIN = 0xFF; // Input configuration for P2
P3MDIN = 0xFF; // Input configuration for P3
SFRPAGE = 0x0F;
CLKSEL = 0x00; // Oscillator Clock Selector
OSCXCN = 0x00; // EXTERNAL Oscillator Control Register OSCICN = 0x84; // Internal Oscillator Control Register
}
void main(){
char i;
config();
adc0_ini();//ADC0初始化
ADC0START;//ADC0启动
EA=1;
i=0;
stack_index=0;
while(1){
if(isnewdata){//由该位查询ADC0转化值是否更新
if(stack_index==STACK_LEN)
for(i=0,total=0;i<STACK_LEN;i++)
total+=stack[i];
total/=8;//此时total的值即为16bit精度采样值
temp=(float)total/65536.0;
temp*=2.43;
temp-=0.776;
temp/=0.00286;//将测量值转化成真实温度值
isnewdata=0;
t[i]=temp;//将温度检测值存入长度为20的数组中
i++;
if(i>19)
i=0;//在此设断点,观察程序运行结果
delay1ms(100);
ADC0START;
}
}
}
void ADC0_ISR() interrupt 15{//ADC0中断
SFRPAGE=0x00;
AD0INT=0;
isnewdata=1;
if(stack_index>=STACK_LEN)//STACK_LEN需小于等于256,否则stack_index要定义成uint型数据
stack_index=0;
stack[stack_index]=ADC0V AL;
stack_index++;
}。