C8051F320AD转换和温度传感器_第1页
C8051F320AD转换和温度传感器_第2页
C8051F320AD转换和温度传感器_第3页
C8051F320AD转换和温度传感器_第4页
C8051F320AD转换和温度传感器_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、-作者xxxx-日期xxxxC8051F320AD转换和温度传感器【精品文档】C8051F320内部有一个10位逐次逼近型ADC,可以工作在单端方式或者差分方式。一、简要原理 单片机内集成了2个多路选择器,分别作为ADC的正输入信号和负输入。 正输入端由寄存器AMX0P控制输入信号,可以是P1P3、温度传感器、VDD之一; 负输入端由寄存器AMX0N控制输入信号,可以是P1P3、VREF、GND之一。 单负输入端选择GND时,采用单端方式;其他情况则采用差分方式,即用正端相对于负端的电压进行转换。*采用并行口作为输入信号时,必须将对应输入引脚设为模拟输入,并且对应的SKIP要设置为1,即跳过二

2、、寄存器1、转换结果保存在两个8位寄存器ADC0H和ADC0L中,由于转换结果是10位,可以自由选择在寄存器中采用左对齐或者右对齐(下详)单端方式下,转换结果直接保存为10位的无符号数 差分方式下,结果保存为10位有符号整数(原说明:2的补码。未深究)2、温度传感器的输出电压由下面公式决定:V = 2.86(T)+ 776 (单位mv) 从图表看,最高只能在1000mv左右,也就是100时仅1V上下3、AD启动方式有六种启动方式,包括四个定时器溢出启动、特定位置1启动和P0.6上升沿启动。(下详) 采用中断时,中断号interrupt 104、跟踪方式 对跟踪不是很理解!5、寄存器AMX0P,

3、正输入通道选择寄存器00H10H,对应P1.0P3.0 0x1E对应温度传感器 0x1F对应VDD 寄存器XMXON,负输入通道选择寄存器 00H10H,对应P1.0P3.0 0x1E对应VREF 0x1F对应GND,此时为单端方式6、寄存器ADC0CF,配置寄存器,控制转换时钟,和数据保存方向 D7D3 时钟控制位,大意就是分频数,系统时钟与AD时钟的比值减1 D2,为0时数据右对齐,为1时左对齐7、寄存器ADC0CN,控制寄存器。 D7,AD使能,0时禁止转换 D6,跟踪方式,不懂 D5,中断标志位,要手动清0 D4,读取时为忙标志位,写入时可为启动标志位,但不知道要不要清0 D3,窗口比

4、较中断标志,不是很清楚 D2D0 转换方式选择,且受到D6影响。具体未深究。8、寄存器REF0CN,电压基准控制器 与AD的关系不完全明朗 D3 决定了电压基准D2 使能温度传感器下面是完整例程,但不包含12864的C文件。完整例程下载地址:#include c8051f3xx.h#include 12864.h#define uchar unsigned char#define uint unsigned intsfr16 TMR2RL = 0xca; / Timer2 reload value定时器2重载值sfr16 TMR2 = 0xcc; / Timer2 counter定时器2计数器

5、/这两行相当好用,直接把T2的四个8位寄存器重新定义成2个16位寄存器!uchar adnum3,adnum2,adnum1; /打算用来显示的数百位、十位和个位,在这里没有进行运算,只是直接的AD结果sbit led0=P05;/连了个发光二极管观察有没有死机。uchar code table=0123456789;/显示数据用uchar code hang117=1234567; /以下四行为12864初始显示的内容,不重要uchar code hang217=123456789 ;uchar code hang317=2011-7-10 星期日;uchar code hang417= 0

6、0:00:00 ; void Timer2_ISR (void) interrupt 5/ T2只是用来溢出的,没程序,清标志位而已 TF2H = 0; void Adc_ConvComplete_ISR (void) interrupt 10 /AD中断程序,除了清标志位,只是把数据送到12864第三行 AD0INT = 0; lcd_pos(3,0); adnum3 = ADC0H/100; adnum2 = (ADC0H%100)/10; adnum1 = (ADC0H%100)%10; disp_only(tableaaadnum3); disp_only(tableaaadnum2)

7、; disp_only(tableaaadnum1); void Port_Init (void) /端口初始化,哪个位要输入,就要设为模拟,并跳过 P1MDIN = 0x7F; P0MDIN = 0xff; P2MDIN = 0xff; P3MDIN = 0x00; P0MDOUT |= 0xfF; P1MDOUT |= 0x0F; P2MDOUT |= 0x0C; P1SKIP = 0x80; P0SKIP = 0x00; P2SKIP = 0x00; XBR0 = 0x00; XBR1 = 0x40; void Timer_Init (void) TMR2CN = 0x00; CKCON

8、 &= 0xF0; TMR2RL = 0; TMR2 = 0xffff; ET2 = 1; TR2 = 1; void ADC0_Init (void) REF0CN = 0x0E; / VDD作为基准电压,启用内部温度传感器 AMX0P = 0x10; / 10是P3.0,试过07(1.7)和1E(温度),都没问题 ADC0CF = 0xFC; / 11111,32分频? (*表示分频数-1=31) D2为1,左对齐 AMX0N = 0x1F; / 单端方式 ADC0CN = 0xC2; / T2溢出作为启动信号 EIE1 |= 0x08; / 开中断 void System_Init (v

9、oid) PCA0MD &= 0x40; OSCICN |= 0x03; Port_Init (); Timer_Init (); ADC0_Init ();void DelayMS(uint x) uchar i; while(x-) for(i=120;i0;i-); void main(void) System_Init (); lcd_init(); clr_screen(); DelayMS(100); lcd_pos(0,0); disp_chinese(hang1); lcd_pos(1,0); disp_chinese(hang2); lcd_pos(2,0); disp_chinese(hang3); lcd_pos(3,0); disp_chinese(hang4); EA = 1; while (1) led0=led0; DelayMS(5500); 测试结果:1、用开发板上的电位器,可以让高位结果在0255之间变化2、用温度传感器,室温下显示高位为65,*近笔记本风扇数秒后变成66,说明温度有变化,因为是高位,不明显,也没计算。3、用全新的南孚电池一节,显示稳定的121。_一、修改程序,将10位数字量转换成01023显示在屏幕上*用变位器,可以实现

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论