fhl2397 发表于 2010-1-11 20:54:07

(原创)NTC热敏电阻结合1621液晶测温系统程序

刚刚接触NEC不久,希望和大家共同学习,共同提高,我的QQ:386132185,希望能和更多的网友认识,加我的朋友请标明是学习单片机的。谢谢


http://cache.amobbs.com/bbs_upload782111/files_24/ourdev_525028.jpg
(原文件名:000.jpg)




#include<io78f9234.h>
#include<intrinsics.h>
//#include<migration.h>
#pragma location = 0X0080
__root const unsigned char XUAN=0X98;//选项字节,设置实用外部高速时钟电路
#define _NOP __no_operation()
#define ucharunsigned char
#define uint   unsigned int
#define clrwdt()WDTM=0x77//屏蔽看门狗
#define BIAS 0X52//LCD1/2偏压,4个COM端_在改程序中命令标志为3为:100,命令代码末尾任意
#define SYSDIS 0X00//关闭系统振荡器和LCD偏压发生器
#define SYSEN 0X02//打开系统振荡器
#define LCDOFF 0X04//关闭LCD偏压发生器
#define LCDON 0X06//开启LCD偏压发生器
#define XTAL 0X28//外部时钟源
#define RC256 0X30//片内RC振荡器
#define TONEON 0X12//打开声音输出
#define TONEOFF 0X10//关闭声音输出
#define WDTDIS 0X0a//看门狗溢出标志输出失效
#define WDTEN 0X0c//看门狗溢出标志有效
#define NORMAL 0Xc6//普通模式
#define dat P12_bit.no0//数据引脚
#define cs P13_bit.no0//片选引脚
#define wr P4_bit.no5//写信号引脚
__saddr uchar i;
__saddr uint adbuff;
__saddr unsigned long adsum,adaver;
__saddr uint shifen,ge,shi,a;
__saddr uchar disbuff={0xFA,0x60,0xD6,0xF4,0x6C,0xBC,0xBE,0xE0,0xFE,0xFC};//显示缓存,数据,每个地址发两次,从高到低,每次发送4位,用于显示个位数字
//延时,毫秒级
void delayms(uint ms)//准确延时1ms,当ms=1时
{
uint i,j;
for(i=0;i<ms;i++)
    for(j=0;j<460;j++);
}
//发送数据函数,高位在前发送,用于传送格式代码和地址
void wrhdata(uchar data,uchar cnt)
{
uchar i;
for(i=0;i<cnt;i++)
{
    if((data&0x80)==0)
      dat=0;
    else dat=1;
    __no_operation();
    wr=0;
    __no_operation();
    __no_operation();
    wr=1;
    data<<=1;
}
}
//发送数据函数,低位在前发送,用于发送数据
void wrldata(uchar data,uchar cnt)
{
uchar i;
for(i=0;i<cnt;i++)
{
    if((data&0x01)==0)
      dat=0;
    else dat=1;
    wr=0;
    __no_operation();
    wr=1;
    data>>=1;
}
}
//发送命令代码函数
void sendcmd(uchar cmd)
{
cs=0;
__no_operation();
wrhdata(0x80,4);
wrhdata(cmd,8);
__no_operation();
cs=1;
}
//发送普通命令代码函数
void sendcmdNORMAL(uchar cmd)
{
cs=0;
__no_operation();
wrhdata(0x90,4);
wrhdata(cmd,8);
__no_operation();
cs=1;
}
//写入数据函数
void senddata(uchar addr,uchar data)
{
cs=0;
__no_operation();
wrhdata(0xa0,3);
wrhdata(addr<<2,6);
wrldata(data,4);
cs=1;
__no_operation();
}
//按地址顺序写数据
void lightobo(uint ms,uchar data)
{
uchar i,addr;
addr=0;
for(i=0;i<32;i++)
{
    senddata(addr,data);
    delayms(ms);
    __no_operation();
    __no_operation();
    __no_operation();
    addr=addr+1;
}
}
/*#pragma vector=INTAD_vect
__interrupt void INTAD_Server(void)
{
ADIF=0;
adbuff=ADCR;
i++;
if(i<20)
{
    adsum=adsum+adbuff;
}
else __no_operation(),i=0;
adaver=adsum/(i+1);
ADCS=0;
ADCE=0;
}*/
void main()
{
PCC=0X00;//以下两行为设置cpu时钟为8M
PPCC=0X00;
WDTM=0X77;//屏蔽看门狗
PM4=0X02;//设置P4口位输入、输出状态
//P4=0x00;//设置P4口初值
MK1=0X85;//屏蔽外部中断3
INTM1=0X01;//设定外部中断3上升沿有效
PMK3=0; //允许外部中断3
__enable_interrupt();//开中断
PM12_bit.no0=0;//设定数据位输出口状态
P4_bit.no0=1;//点亮背光板
P0=0X07;//设定p0口状态
PM0=0X07;//设定p00,p01,p02为输入端口
PU0=0X07;//p00,p01,p02使用内部上拉电阻
//P0_bit.no3=0;
sendcmd(RC256);//初始化1621
sendcmd(BIAS);
sendcmd(SYSEN);
sendcmd(LCDON);
sendcmdNORMAL(NORMAL);
P2=0X00;
PMC2=0X01;
PM2=0XF1;
PU2=0X00;
ADM=0X20;
while(1)
{
    ADM_bit.no0=1;//ADCE=1;
    ADS=0X00;
    __no_operation();
    __no_operation();
    ADM_bit.no7=1;//ADCS=1;
    for(i=0;i<4;i++)
    {
      ADIF=0;
      while(!ADIF)
      {
      __no_operation();
      }
      adbuff=ADCR;
    }
    ADM_bit.no7=0;//ADCS=0;
    ADM_bit.no0=0;//ADCE=0;
    adsum=adbuff+adbuff+adbuff+adbuff;
    adaver=adsum/4;
    a=(3783018-5000*adaver)/475;//除取整,包含十位,个位,十分位,百分位
    shi=a/1000;
    ge=a%1000/100;
    shifen=a%100/10;
    senddata(0x12,disbuff>>4);
    senddata(0x13,disbuff);
    senddata(0x10,disbuff>>4);
    senddata(0x11,disbuff);
    senddata(0x0e,disbuff>>4);
    senddata(0x0f,disbuff+1);
    delayms(500);
}
}

microampere 发表于 2010-1-12 17:21:04

回复【楼主位】fhl2397
-----------------------------------------------------------------------

抢个沙发!

szwsh 发表于 2010-1-13 17:46:03

回复【楼主位】fhl2397
-----------------------------------------------------------------------
非常感谢楼主提供了很好的学习资料!

markxu 发表于 2011-4-11 16:46:58

mark

fhl2397 发表于 2011-4-27 19:41:20

自己顶一下

hz77776666 发表于 2011-4-28 16:48:50

ding

liuyuehui135 发表于 2011-6-3 12:35:42

xuexiyixiale

lubyudf 发表于 2013-7-24 17:12:45

很好 谢谢楼主分享

niepan 发表于 2014-1-2 11:25:00

学习学习!

dh645a 发表于 2014-2-23 15:55:29

楼主,这是什么一个原理,可以详解吗,

dh645a 发表于 2014-2-23 15:56:13

好想是一条公式就解决了,不是查表

yanzhiwei 发表于 2015-12-9 15:11:50

直接采集AD转换进行计算的

a=(3783018-5000*adaver)/475;//除取整,包含十位,个位,十分位,百分位


楼主3783018、475是什么数值呢?
页: [1]
查看完整版本: (原创)NTC热敏电阻结合1621液晶测温系统程序