打印

求高手指教,8051f410单片机内部温度传感器的使用方法

[复制链接]
3887|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
枫恋00|  楼主 | 2012-8-1 09:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <c8051f410.H>
#include <intrins.h>
#include "stdio.h"
#include "math.h"
#include "string.h"
#define uchar unsigned char
#define uint unsigned int
uchar code lcd[]="tension is:";
uchar code lcd1[]="       C";
sbit   lcd_rs=P0^2;
sbit   lcd_rw=P0^1;
sbit   lcd_en=P0^0;
uchar num;
long adc_tl,adc_th,adc;//存放ad转换数据tl存放低八位,th存放高8位
float temp,aa;
/********************延时*************************************/
void delayms(uint z)    //延时ms
{
uint x,y;
for(x=z;x>0;x--)
  for(y=15;y>0;y--);
}
/****************lcd写指令控制命令****************************/
void write_com(uchar com)//lcd写指令控制命令
{
    delayms(10);
lcd_rs=0;
    lcd_rw=0;
P1=com;
lcd_en=1;
delayms(10);
lcd_en=0;
    delayms(10);
}
/**************lcd写数据命令**********************************/
void write_data(uchar date)//lcd写数据命令
{
    delayms(10);               
lcd_rs=1;
    lcd_rw=0;
P1=date;
delayms(10);
lcd_en=1;
delayms(10);
lcd_en=0;
}
/********************lcd初始化*******************************/
void lcd_init()
{   
    delayms(15);
write_com(0x38);   //设置lcd显示模式
    delayms(5);
write_com(0x38);
    delayms(5);
write_com(0x38);
write_com(0x0c);   //设置光标的显示/闪烁
write_com(0x06);   //设置显示后指针加1,并且光标移一位
write_com(0x01);   //清屏设置
write_com(0x80);   //设置字符从地址为10的位置开始显示
}
/*************初始化显示**************************************/
void init_play()    //初始化显示
{
   lcd_init();
   for(num=0;num<11;num++)
{
  write_data(lcd[num]);
  delayms(20);
}
write_com(0x80+0x40);
for(num=0;num<8;num++)
{
  write_data(lcd1[num]);
  delayms(20);
}
}
/******************8051f初始化*****************************/
void c8051f_init()
{
PCA0MD=0X00;//关闭看门狗。当WDTE=1时,不能改变PCA0MD寄存器的值
            //若要改变,必须先禁止看门狗定时器。
            //WDTE=0;关闭看门狗
OSCICN=0X82;//设置时钟振荡,为内部时钟,0x82为32分频
XBR0=0X00;
XBR1=0X40;//交叉开关使能,弱上拉使能。
          //XBARE=1;//使能交叉开关。
P0MDIN=0Xff;//设置P0.0为模拟输入。0为模拟输入,1为数字输入
P0MDOUT=0X00;//设置P0口为漏极开路:设置为漏极开路必须设置为弱上拉使能。
P0SKIP=0X00;//设置端**叉跳过使能。0为不跳过,
//P1MDIN=0Xff;
P1MDOUT=0X07;//lcd3根控制线设置为推挽
P1SKIP=0X07;
//P2MDIN=0Xff;//设置为数字输入
P2MDOUT=0X00; //lcd数据线设置为开漏
P2SKIP=0Xff;
}
void ad_init()
{
ADC0CN=0X80;//ad使能,设置启动ad转换方式为向AD0BUSY写1.对齐方式为右对齐。
            //ad转换为正常模式。
ADC0CF=0X00;//设置转换时钟周期,及转换次数为1次。
ADC0TK=0X04;//设置跟踪模式为后跟踪,
REF0CN=0X17;//设置基准电压为2.2v,内部温度传感器使能,
ADC0MX=0X18;//adc通道寄存器,选择内部温度传感器。
}
long ad_con()
{
adc=adc_tl+adc_th*256;
aa=(adc/4096)*2.2;
temp=(aa-0.776)/0.00286;
return temp;
}
void display()
{
long temp1;
uint a0,a1,a2,a3;
temp1=ad_con();
     a0=temp1/1000+0x30;
  a1=temp1/100%10+0x30;
  a2=temp1/10%10+0x30;
  a3=temp1%10+0x30;
  if(a0==0x30)        //如果第一位为0则不显示
   {
    a0=0x20;
   }
  write_com(0xc1);
  write_data(a0);
  
  write_com(0xc2);   
  write_data(a1);
  write_com(0xc3); //显示小数点
  write_data(0x2e);
  write_com(0xc4);
  write_data(a2);
  write_com(0xc5);
  write_data(a3);
}
void main()
{
c8051f_init();
ad_init();
lcd_init();
init_play();
while(1)
{  
  AD0EN=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
AD0BUSY=1;
delayms(10);
while(AD0BUSY)
{
adc_th=ADC0H;
adc_tl=ADC0L;
display();
}
}
}
这是我写的一个内部温度传感器的程序,但是lcd显示是乱码,而且adc0l与adc0h的值分别是141和12,不知道是为什么,请高手解答

相关帖子

沙发
ayb_ice| | 2012-8-1 11:16 | 只看该作者
多看手册,说的再详细不过了

使用特权

评论回复
板凳
枫恋00|  楼主 | 2012-8-1 11:44 | 只看该作者
2# ayb_ice 手册看了,还是不知道为什么,如果直接给一个数的话,还是会显示乱码。而且一直右移

使用特权

评论回复
地板
ayb_ice| | 2012-8-1 11:54 | 只看该作者
2# ayb_ice 手册看了,还是不知道为什么,如果直接给一个数的话,还是会显示乱码。而且一直右移
枫恋00 发表于 2012-8-1 11:44


明显的基本程序都有问题,先把这搞好再说吧

先下个中文的手册看看吧,早期的型号有中文手册,温度传感器部分好象都是一样的

使用特权

评论回复
5
duan281110040| | 2013-6-18 15:39 | 只看该作者
您好,我想请教一下怎么使用C8051F120片内温度传感器.片内温度传感器采样,为什么ADC0H和ADC0L始终等于0XFF和0X0F?具体程序见https://bbs.21ic.com/forum.php?mod=viewthread&tid=568757,不知道有什么高见,谢谢了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

60

帖子

0

粉丝