#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,不知道是为什么,请高手解答 |