欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2842|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

STC12單片汽車工況12864顯示

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:358930 發(fā)表于 2018-10-17 22:34 來自觸屏版 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
#include <reg51.h>
#include  <intrins.h>
#define uchar unsigned char
#define uint  unsigned int
#define ulong  unsigned long
uint tmp;//tmp電壓值

//STC12C5A60S2 特殊功能寄存器 關(guān)于AD部分的寄存器定義
sfr ADC_CONTR   =   0xBC;           //ADC控制寄存器 通道配置
sfr ADC_RES     =   0xBD;           //ADC高8位數(shù)據(jù)寄存器(存AD轉(zhuǎn)換的結(jié)果,共10位)
sfr ADC_LOW2    =   0xBE;           //ADC低2位數(shù)據(jù)寄存器(存AD轉(zhuǎn)換的結(jié)果,共10位)
sfr P1ASF       =   0x9D;           //P1第二功能選擇寄存器
unsigned char ch=0 ; //ADC通道選擇,本例程選擇P1.0為AD轉(zhuǎn)換,其他P1口做普通IO用 01234567
unsigned int ad_out;//ADC_CONTR寄存器的位變量定義
#define ADC_POWER   0x80            //ADC power control bit
#define ADC_FLAG    0x10            //ADC complete flag
#define ADC_START   0x08            //ADC start control bit
#define ADC_SPEEDLL 0x00            //420 clocks
#define ADC_SPEEDL  0x20            //280 clocks
#define ADC_SPEEDH  0x40            //140 clocks
#define ADC_SPEEDHH 0x60            //70 clocks
/***************************功能定義***************************/
#define LCD12864_W_COM                        0xF8        //寫指令
#define LCD12864_R_COM                        0xFC        //讀指令
#define LCD12864_W_DAT                        0xFA        //寫數(shù)據(jù)
#define LCD12864_R_DAT                        0xFE        //讀數(shù)據(jù)
#ifndef __LCD12864_H__
#define __LCD12864_H__
#define LCD12864_COM 0        //輸入指令
#define LCD12864_DAT 1        //輸入數(shù)據(jù)
#define LCD12864_CLEAR                        0x01        //清除顯示
#define LCD12864_CURSOR                        0x02        //位址歸位,游標(biāo)回原點
#define LCD12864_CURSOR_RLF                0x04        //光標(biāo)左移,整體顯示不移動
#define LCD12864_CURSOR_RRF                0x06        //光標(biāo)右移,整體顯示不移動
#define LCD12864_CURSOR_RLN                0x05        //光標(biāo)左移,整體顯示移動
#define LCD12864_CURSOR_RRN                0x07        //光標(biāo)右移,整體顯示移動
#define LCD12864_DIS_OFF                0x08        //顯示狀態(tài)全關(guān)
#define LCD12864_DIS_ON                        0x0E        //顯示狀態(tài)開
#define LCD12864_DIS_CUR_ON                0x0E        //游標(biāo)顯示開
#define LCD12864_DIS_CURS_ON        0x0F        //游標(biāo)位置顯示開
#define LCD12864_CURSOR_RL                0x10        //游標(biāo)左移
#define LCD12864_CURSOR_RR                0x14        //游標(biāo)右移
#define LCD12864_CURDIS_RL                0x18        //整體顯示左移,光標(biāo)跟隨
#define LCD12864_CURDIS_RR                0x1C        //整體顯示又移,光標(biāo)跟隨
#define LCD12864_COM_BASIC                0x30        //基本指令集動作
#define LCD12864_COM_PLOT_ON        0x36        //擴展指令集動作,繪圖顯示ON
#define LCD12864_COM_PLOT_OFF        0x34        //擴展指令集動作,繪圖顯示OFF
#define LCD12864_STAND_TO                0x31        //進入待命模式
#define LCD12864_PLACE_ROLL                0x03        //允許輸入卷動位址
#define LCD12864_PLACE_IRAM                0x02        //允許輸入IRAM位址
#define LCD12864_REVERES_13                0x04        //選擇一、三行同時作反白顯示
#define LCD12864_REVERES_24                0x05        //選擇二、四行同時作反白顯示
#define LCD12864_REST_ON                0x08        //進入睡眠模式
#define LCD12864_REST_OFF                0x0C        //脫離睡眠模式
#define LCD12864_W_COM                        0xF8        //寫指令
#define LCD12864_R_COM                        0xFC        //讀指令
#define LCD12864_W_DAT                        0xFA        //寫數(shù)據(jù)
#define LCD12864_R_DAT                        0xFE        //讀數(shù)據(jù)
//======串口模式=======
sbit LCD12864_CS = P2^7;   //片選信號輸入
sbit LCD12864_STD = P2^6;  //串行數(shù)據(jù)輸入
sbit LCD12864_SCLK = P2^5; //串行移位脈沖輸入

sbit LCD12864_PSB = P2^4;  //串并模式選擇 0:串口,1:并口
sbit LCDRST  = P2^3;
unsigned char code tabe[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};//查表法//0-9數(shù)字

//定義溫度1數(shù)據(jù)變量
float wdd = 0;//單精度浮點型變量眼3.4*10^38----(-3.4*10^38)  占4個字節(jié)小數(shù)點后7-8位
//double wdd = 0;//雙精度浮點型變量        小數(shù)點后15-16位
ulong x = 0;
uint  wd;//定義一個溫度用于顯示
sbit  SO=P1^1;  //P1.0口與SO相連
sbit  CS=P1^2;  //P1.1口與CS相連
sbit  SCK=P1^3; //P1.2口與SCK相連


//定義溫度2數(shù)據(jù)變量
float wdd2 = 0;//單精度浮點型變量眼3.4*10^38----(-3.4*10^38)  占4個字節(jié)小數(shù)點后7-8位
//double wdd = 0;//雙精度浮點型變量        小數(shù)點后15-16位
ulong x2 = 0;
uint  wd2;//定義一個溫度用于顯示
sbit  SO2=P1^4;  //P3.2口與SO相連
sbit  CS2=P1^5;  //P3.3口與CS相連
sbit  SCK2=P1^6; //P3.4口與SCK相連


sbit sclk = P2^0;//1302
sbit io= P2^1;//1302
sbit rst= P2^2;//1302
uchar S1num,flag,second,minute,hour,week,day,month,year,fsec;//秒、分、時、星期、日、月、年
bit keyflag=0;//按鍵標(biāo)志位


sbit  F1=P3^2;  //降溫風(fēng)扇1
sbit  F2=P3^3; //降溫風(fēng)扇2
/*******************************延時函數(shù)**********************************************/
void Delay1Ms(uint t)
{
        uchar i;
        for (;t>0;t--)
                {
                for (i=0;i<138;i++)
                        {
                        _nop_();_nop_();_nop_();_nop_();_nop_();
                        _nop_();_nop_();_nop_();_nop_();_nop_();
                        }
                }       
}
void Delay1s(uchar t)
{
        for (;t>0;t--)
                {
            Delay1Ms(250);
                Delay1Ms(250);
                Delay1Ms(250);
                Delay1Ms(250);
            }       
}
void delayus()//us微秒延時
{
_nop_();
_nop_();
_nop_();
_nop_();
}
void delay(unsigned int n)
{
    unsigned int x;
    while (n--)
    {
        x = 5000;
        while (x--);
    }
}
void InitADC() //10位AD數(shù)據(jù)緩存
{
    P1ASF = 0x01;//設(shè)置P1.0為AD腳,P1ASF = 0x01 其他P1口為普通IO功能
    ADC_RES = 0;                    //清空AD輸出高8位
        //if(++ch>7)ch=0;        //循環(huán)顯示8個通道AD采樣
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
    delay(8);                       //ADC power-on delay and Start A/D conversion
}

/********************寫一個字節(jié)**************/
void write_1302byte(uchar com)
{
uchar i;
sclk=0;
delayus();
for(i=8;i>0;i--)
  {
   io=com&0x01;//只要是從低位取數(shù),向高位一定要和0X01與
   delayus();
   sclk=1;//為寫數(shù)據(jù)制造上升沿。
   delayus();
   sclk=0;//為下一次上升沿寫下一個字節(jié)做準(zhǔn)備
   com>>=1;//將數(shù)據(jù)向右移一位,準(zhǔn)備寫入下一個數(shù)據(jù)
  }       
}
/********************讀一個字節(jié)***************/
uchar read_1302byte()
{
uchar i,dat;
delayus();
for(i=8;i>0;i--)
  {
   dat>>=1;
   if(io==1)
   {
     dat|=0x80;//將1取出,寫在dat的最高位。
   }
   sclk=1;//把sclk拉高,為讀一個字節(jié)的下降沿做準(zhǔn)備
   delayus();//稍等制造一個高電平
   sclk=0;//為讀一個字節(jié)制造下降沿
   delayus();
  }
return dat;
}
/*************寫入一個時間位*****************/
void write_1302(uchar add,uchar dat)
{
rst=0;
delayus();
sclk=0;
delayus();
rst=1;
write_1302byte(add);
delayus();
write_1302byte(dat);
delayus();
rst=0;
}
/****************讀1302的地址******************/
uchar read_1302add(uchar add)
{
uchar timedat;
rst=0;
_nop_();
sclk=0;
_nop_();
rst=1;
write_1302byte(add);//寫入要讀的地址
timedat=read_1302byte();//將上面地址中的數(shù)據(jù)賦給timedat
sclk=1;
_nop_();
rst=0;
io=0;//字節(jié)讀操作完后,將ds1302的IO端口置零就可以消除85、45和??閃現(xiàn)等問題
return timedat;
}
/****************初始化1302*********************/
void init_1302()
{
  flag=read_1302add(0x81);//讀秒寄存器的最高位,讀出時鐘狀態(tài)
  if(flag&0x80)//判斷時鐘是否關(guān)閉,若內(nèi)部關(guān)閉,則初始,若沒關(guān)閉,不初始化,還在走
{
   write_1302(0x8e,0x00);//去除寫保護
   write_1302(0x80,((10/10)<<4|(10%10)));//寫秒寄存器,并寫入初值55
   write_1302(0x82,((22/10)<<4|(22%10)));//寫分寄存器,并寫入初值59
   write_1302(0x84,((11/10)<<4|(11%10)));//寫小時寄存器,并寫入初值23
   write_1302(0x86,((16/10)<<4|(16%10)));//寫日寄存器,并寫入初值18
   write_1302(0x88,((6/10)<<4|(6%10)));//寫月寄存器,并寫入初值2
   write_1302(0x8a,((6/10)<<4|(6%10)));//寫周寄存器,并寫入初值5
   write_1302(0x8c,((18/10)<<4|(18%10)));//寫年寄存器,并寫入初值12,不能寫2012年
   write_1302(0x90,0xa5);//寫充電方式
   write_1302(0x8e,0x80);//加上寫保護
}
}
/*****************讀出秒的十進制數(shù)***************************/
uchar readsecond()
{
uchar dat;
dat=read_1302add(0x81);
second=((dat&0x70)>>4)*10+(dat&0x0f);
return second;
}
/*****************讀出分的十進制數(shù)***************************/
uchar readminute()
{
uchar dat;
dat=read_1302add(0x83);
minute=((dat&0x70)>>4)*10+(dat&0x0f);
return minute;
}
/*****************讀出小時的十進制數(shù)***************************/
uchar readhour()
{
uchar dat;
dat=read_1302add(0x85);
hour=((dat&0x70)>>4)*10+(dat&0x0f);
return hour;
}
/*****************讀出天的十進制數(shù)***************************/
uchar readday()
{
uchar dat;
dat=read_1302add(0x87);
day=((dat&0x70)>>4)*10+(dat&0x0f);
return day;
}
/*****************讀出月的十進制數(shù)***************************/
uchar readmonth()
{
uchar dat;
dat=read_1302add(0x89);
month=((dat&0x70)>>4)*10+(dat&0x0f);
return month;
}
/*****************讀出周的十進制數(shù)***************************/
uchar readweek()
{
uchar dat;
dat=read_1302add(0x8b);
week=((dat&0x70)>>4)*10+(dat&0x0f);
return week;
}
/*****************讀出年的十進制數(shù)***************************/
uchar readyear()
{
uchar dat;
dat=read_1302add(0x8d);
year=((dat&0xf0)>>4)*10+(dat&0x0f);
return year;
}
/************************讀出所有時間**********************/
readtime()
{
readsecond();
readminute();
readhour();
readday();
readmonth();
readweek();
readyear();
}
//********************************熱電偶1************************************************//
unsigned long Re_Convert() //熱電偶數(shù)據(jù)--讀取溫度
{ uchar i;
  unsigned long Temp_2;
  Temp_2=0;
  _nop_();_nop_(); _nop_();_nop_();
  CS=1;
  _nop_();_nop_(); _nop_();_nop_();
  SCK=0;
  //Delay1s(1); //不低于(52機)100MS不然數(shù)據(jù)無法刷新 STC12不低于(52機)1 S
  Delay1Ms(1200); //不低于(52機)100MS不然數(shù)據(jù)無法刷新 STC12不低于(52機)1 & (1200MS)
  SCK=0;
  SCK=0;                                                                                                                                                 
  CS=0;
  for(i=0;i<16;i++)//16位數(shù)據(jù)讀取
     {
          Temp_2<<=1;//向右移一位
          _nop_();_nop_();_nop_(); _nop_();_nop_();
           SCK=1;//上升
       if(SO==1)
           {Temp_2=Temp_2|0x01;}
           else
           Temp_2=Temp_2|0x00;
           _nop_(); _nop_();_nop_(); _nop_();_nop_();                                                                                  
       SCK=0;
          _nop_();_nop_();_nop_(); _nop_();_nop_();
     }     
  Temp_2=Temp_2<<1;        //向左移一位,取0-14位
  Temp_2=Temp_2>>3;        //向右移4位,取3-14位
  //Temp_2=1024.123456;//測試正常運行不要
  return(Temp_2); //返回溫度  
  
}
//********************************熱電偶2*************************************************//
unsigned long Re_Convert2() //熱電偶數(shù)據(jù)--讀取溫度
{ uchar i;
  unsigned long Temp_2;
  Temp_2=0;
  _nop_();_nop_(); _nop_();_nop_();
  CS2=1;
  _nop_();_nop_(); _nop_();_nop_();
  SCK2=0;
  //Delay1s(1); //不低于(52機)100MS不然數(shù)據(jù)無法刷新 STC12不低于(52機)1 S
  Delay1Ms(1200); //不低于(52機)100MS不然數(shù)據(jù)無法刷新 STC12不低于(52機)1 & (1200MS)
  SCK2=0;
  SCK2=0;                                                                                                                                                 
  CS2=0;
  for(i=0;i<16;i++)//16位數(shù)據(jù)讀取
     {
          Temp_2<<=1;//向右移一位
          _nop_();_nop_();_nop_(); _nop_();_nop_();
           SCK2=1;//上升
       if(SO2==1)
           {Temp_2=Temp_2|0x01;}
           else
           Temp_2=Temp_2|0x00;
           _nop_(); _nop_();_nop_(); _nop_();_nop_();                                                                                  
       SCK2=0;
          _nop_();_nop_();_nop_(); _nop_();_nop_();
     }     
  Temp_2=Temp_2<<1;        //向左移一位,取0-14位
  Temp_2=Temp_2>>3;        //向右移4位,取3-14位
  //Temp_2=1024.123456;//測試正常運行不要
  return(Temp_2); //返回溫度  
  
}
/*****************************向12864寫入8位數(shù)據(jù)*************************************/
void LCD12864_Wbyte(uchar byte)
{
        uchar i;

        for(i=0;i<8;i++)
                {
                LCD12864_SCLK = 0;
                byte <<= 1;                         //左移待寫入數(shù)據(jù),使最高位移至CY
                LCD12864_STD = CY;        //寫入一位數(shù)據(jù)
                LCD12864_SCLK = 1;
                LCD12864_SCLK = 0;   
                }
}
/***************************從12864讀出8位數(shù)據(jù)***返回:sdat************************************/
uchar LCD12864_Rbyte(void)
{
     uchar i,sdat,temp1,temp2;
     temp1 = 0;
     temp2 = 0;
//==========12864的串行數(shù)據(jù)輸出形式是D7-D6-D5-D4-0-0-0-0-D3-D2-D1-D0-0-0-0-0,故要度兩個八位整合==============
     for(i=0;i<8;i++)
                {
                temp1=temp1 << 1;
                LCD12864_SCLK = 0;
                LCD12864_SCLK = 1;            
                LCD12864_SCLK = 0;
                if( LCD12864_STD )        temp1|=0x01;        //tempe1:D7-D6-D5-D4-0-0-0-0
                }
     for(i=0;i<8;i++)
                {
                temp2=temp2 << 1;
                LCD12864_SCLK = 0;
                LCD12864_SCLK = 1;            
                LCD12864_SCLK = 0;
                if( LCD12864_STD ) temp2|=0x01;   //tempe2:D3-D2-D1-D0-0-0-0-0
                }
        sdat = ((temp1 & 0xf0)|(temp2 >> 4));  //取出D7\D6\D5\D4\D3\D2\D1\D0                    
        return sdat;  //返回一個值(sdat)
}
/****************************讀忙狀態(tài)**************************************/
void LCD12864_busy( void )
{
        do        LCD12864_Wbyte( LCD12864_R_COM );                //LCD12864_RW=11111,RW(1),RS(0),0
        while( LCD12864_Rbyte() & 0x80 );         //讀BF,直到BF == 0
}
/*************************dat_com=0寫指令,dat_com=1寫數(shù)據(jù)*****************************************/
void LCD12864_W (bit dat_com,uchar byte)
{
        uchar temp;
        if(dat_com == 0)         //為零,寫入指令
                temp = LCD12864_W_COM;        //11111,RS(0),RW(0),0
        else                            //否則,寫入數(shù)據(jù)
                temp = LCD12864_W_DAT;        //11111,RS(1),RW(0),0
        LCD12864_CS = 1;                //片選使能
        LCD12864_busy();                //LCD忙檢測
        LCD12864_Wbyte(temp);        //寫入模式選擇,指令還是數(shù)據(jù)
        LCD12864_Wbyte(byte&0xf0);        //寫入字節(jié)
        LCD12864_Wbyte((byte<<4)&0xf0);        //寫入字節(jié)
    LCD12864_CS = 0;                //片選關(guān)閉
}
/****************************LCD12864初始化**************************************/

void LCD12864_Init(void)
{
        LCDRST=1;
        LCD12864_PSB = 0;        //選擇串口模式
        LCD12864_W(LCD12864_COM,0x30);        //基本指令功能.
        LCD12864_W(LCD12864_COM,0x03);        //允許輸入卷動位址
        LCD12864_W(LCD12864_COM,0x0c);                //脫離隨眠狀態(tài),顯示打開,關(guān)光標(biāo),反白關(guān).
        LCD12864_W(LCD12864_COM,0x01);                //清屏指令.
        LCD12864_W(LCD12864_COM,0x06);        //AC自動加一,光標(biāo)右移,整體顯示不移動   
}
/**************************LCD12864字符位置自定義顯示****************************************/
void LCD12864_WPoss(uchar x,uchar y,uchar *buff)
{
        uchar addr,i=0;
        switch (x)
                {
                case 0:addr=0x80;break;
                case 1:addr=0x90;break;
                case 2:addr=0x88;break;
                case 3:addr=0x98;break;
                }
        addr=addr+y;

        LCD12864_W(LCD12864_COM,LCD12864_COM_BASIC);        //8BitMCU,基本指令集合
        LCD12864_W(LCD12864_COM,addr);                                        //顯示在自定義位置

        while(buff[i]!='\0')
                {       
                LCD12864_W(LCD12864_DAT,buff[i++]);
                if(++y==16)
                        {
                        y=0;
                        if(++x==4) x=0;

                        switch (x)
                                {
                                case 0:addr=0x80;break;
                                case 1:addr=0x90;break;
                                case 2:addr=0x88;break;
                                case 3:addr=0x98;break;
                                }
                        addr=addr+y;
                        LCD12864_W(LCD12864_COM,addr);
                        }
       
                }
}
void Disp_img(unsigned char  *img)        //圖形方式12864顯示字模221 橫向取膜
{
        unsigned char i,j;
        unsigned int k = 0;

        LCD12864_W(0,0x36); //圖形方式
        for(i=0;i<32;i++)
          {
                LCD12864_W(0,0x80+i);
                LCD12864_W(0,0x80);
            for(j=0;j<16;j++)
                {
                        LCD12864_W(1,img[k++]);
                }
          }

        for(i=0;i<32;i++)
          {
                LCD12864_W(0,0x80+i);
                LCD12864_W(0,0x88);
            for(j=0;j<16;j++)
                {
                        LCD12864_W(1,img[k++]);
                  }
        }
}          
/************************顯示1 *********************************/
                                                          
void display1(long temp)
{
    uchar dt1,dt2,dt3,dt4,dt5,dt6,dt7,dt8;
        //temp=12345678;
              x=Re_Convert(); //讀取溫度//X=讀到的值
                    wdd=25*x;//溫度量化 X 0.25//取后兩位就X25         
                     wd =(uint)wdd;//浮點型變量轉(zhuǎn)換成uint型變量16位
              //wd=wd-48;//計算                                            
              wd=wd/2;//計算        
        dt1 = temp%10;//1位
        dt2 = temp%100/10;//2位
        dt3 = temp%1000/100;//3位
        dt4 = temp%10000/1000;//4位

        dt5 = temp%100000/10000;//5位
        dt6 = temp%1000000/100000;//6位
        dt7 = temp%10000000/1000000;//7位
        dt8 = temp/10000000;//8位             最高位  
        if(wd>9999)
         {
        LCD12864_WPoss(2,0,"水溫:");//第1行顯示表1
    // LCD12864_W(0,0x80+3);//LCD12864_W ((0或1),****)  0寫指令  1寫數(shù)據(jù)

     //LCD12864_W(1,tabe[dt8]);//6位
     //LCD12864_W(1,tabe[dt7]);//5位
     //LCD12864_W(1,tabe[dt6]);//4位
     LCD12864_W(1,tabe[dt5]);//3位
         LCD12864_W(1,tabe[dt4]);//4位
     LCD12864_W(1,tabe[dt3]);//3位
        // LCD12864_W(1,0x2e);
         //LCD12864_W(1,tabe[dt2]);//4位
     //LCD12864_W(1,tabe[dt1]);//3位
     //LCD12864_WPoss(1,6,"℃");//第1行顯示表1
         }
         else
         {
        LCD12864_WPoss(2,0,"水溫:");//第1行顯示表1
    // LCD12864_W(0,0x80+3);//LCD12864_W ((0或1),****)  0寫指令  1寫數(shù)據(jù)

     //LCD12864_W(1,tabe[dt8]);//6位
     //LCD12864_W(1,tabe[dt7]);//5位
     //LCD12864_W(1,tabe[dt6]);//4位
     //LCD12864_W(1,tabe[dt5]);//3位
         LCD12864_W(1,tabe[dt4]);//4位
     LCD12864_W(1,tabe[dt3]);//3位
         //LCD12864_W(1,0x2e);
         //LCD12864_W(1,tabe[dt2]);//4位
     //LCD12864_W(1,tabe[dt1]);//3位
    // LCD12864_WPoss(1,6,"℃");//第1行顯示表1
         }
}
/************************顯示2 *********************************/
                                                          
void display2(long temp)
{
    uchar dt1,dt2,dt3,dt4,dt5,dt6,dt7,dt8;
        //temp=12345678;
              x2=Re_Convert2(); //讀取溫度//X=讀到的值
                    wdd2=25*x2;//溫度量化 X 0.25//取后兩位就X25         
                     wd2 =(uint)wdd2;//浮點型變量轉(zhuǎn)換成uint型變量16位
              //wd=wd-48;//計算                                            
              wd2=wd2/2;//計算        
        dt1 = temp%10;//1位
        dt2 = temp%100/10;//2位
        dt3 = temp%1000/100;//3位
        dt4 = temp%10000/1000;//4位

        dt5 = temp%100000/10000;//5位
        dt6 = temp%1000000/100000;//6位
        dt7 = temp%10000000/1000000;//7位
        dt8 = temp/10000000;//8位             最高位
        if(wd2>9999)
         {
        LCD12864_WPoss(2,4,"空調(diào):");//第1行顯示表1
    // LCD12864_W(0,0x80+3);//LCD12864_W ((0或1),****)  0寫指令  1寫數(shù)據(jù)

     //LCD12864_W(1,tabe[dt8]);//6位
     //LCD12864_W(1,tabe[dt7]);//5位
     //LCD12864_W(1,tabe[dt6]);//4位
     LCD12864_W(1,tabe[dt5]);//3位
         LCD12864_W(1,tabe[dt4]);//4位
     LCD12864_W(1,tabe[dt3]);//3位
        // LCD12864_W(1,0x2e);
         //LCD12864_W(1,tabe[dt2]);//4位
     //LCD12864_W(1,tabe[dt1]);//3位
     //LCD12864_WPoss(2,6,"℃");//第1行顯示表1
         }
         else
         {
        LCD12864_WPoss(2,4,"空調(diào):");//第1行顯示表1
    // LCD12864_W(0,0x80+3);//LCD12864_W ((0或1),****)  0寫指令  1寫數(shù)據(jù)

     //LCD12864_W(1,tabe[dt8]);//6位
     //LCD12864_W(1,tabe[dt7]);//5位
     //LCD12864_W(1,tabe[dt6]);//4位
     //LCD12864_W(1,tabe[dt5]);//3位
         LCD12864_W(1,tabe[dt4]);//4位
     LCD12864_W(1,tabe[dt3]);//3位
         //LCD12864_W(1,0x2e);
         //LCD12864_W(1,tabe[dt2]);//4位
     //LCD12864_W(1,tabe[dt1]);//3位
     //LCD12864_WPoss(2,6,"℃");//第1行顯示表1
         }
}
/************************顯示3 *********************************/
void display3(uint dat1,dat2,dat3,dat4 )
{
    uint ge1,ge2,ge3,ge4,shi1,shi2,shi3,shi4;
    dat1=second;   
    dat2=minute;
    dat3=hour;
        dat4=week;  
        ge1= dat1%10;//1位
        shi1= dat1%100/10;//2位
        ge2= dat2%10;//3位
        shi2= dat2%100/10;//4位
        ge3= dat3%10;//5位
        shi3 = dat3%100/10;//6位
        ge4= dat4%10;//7位
        shi4 = dat4%100/10;//8位


        LCD12864_WPoss(0,0," ");//第1行顯示表1
  // LCD12864_W(0,0x80+3);//LCD12864_W ((0或1),****)  0寫指令  1寫數(shù)據(jù)
         readtime();//讀出所有時間
     LCD12864_W(1,tabe[shi3]);
     LCD12864_W(1,tabe[ge3]);
     LCD12864_W(1,0x3a);

     LCD12864_W(1,tabe[shi2]);
     LCD12864_W(1,tabe[ge2]);
     LCD12864_W(1,0x3a);


     LCD12864_W(1,tabe[shi1]);
     LCD12864_W(1,tabe[ge1]);

         LCD12864_WPoss(0,5,"星期");//第1行顯示表1
         //LCD12864_W(1,tabe[shi4]);
     LCD12864_W(1,tabe[ge4]);

}                                                          
  /************************顯示4************************************/
void display4(long temp1)
{       
    uchar dt1,dt2,dt3,dt4,dt5,dt6,dt7,dt8;
        tmp = ((ad_out * 50) / 1024)+5; //10位AD讀取的數(shù)值是0-1024,
        //將這個值轉(zhuǎn)換成對應(yīng)的0-5V電壓(放大了10倍)        +5為二極管0.5V壓降修正
        if(tmp<6){tmp=0;}//去二極管0.5V壓降修正
        temp1 = tmp;
        dt1 = temp1%10;//1位
        dt2 = temp1%100/10;//2位
        dt3 = temp1%1000/100;//3位
        dt4 = temp1%10000/1000;//4位

        dt5 = temp1%100000/10000;//5位
        dt6 = temp1%1000000/100000;//6位
        dt7 = temp1%10000000/1000000;//7位
        dt8 = temp1/10000000;//8位             最高位  

        LCD12864_WPoss(1,0,"電壓:");//第2行顯示表1
    // LCD12864_W(0,0x80+3);//LCD12864_W ((0或1),****)  0寫指令  1寫數(shù)據(jù)
         //LCD12864_W(1,tabe[dt8]);//8位
    //LCD12864_W(1,tabe[dt7]);//7位
    // LCD12864_W(1,tabe[dt6]);//6位
     //LCD12864_W(1,tabe[dt5]);//5位
     //LCD12864_W(1,tabe[dt4]);//4位
     LCD12864_W(1,tabe[dt3]);//3位
         LCD12864_W(1,tabe[dt2]);//2位
         LCD12864_W(1,0x2e);// 顯示點
         LCD12864_W(1,tabe[dt1]);//1位             

     //LCD12864_WPoss(2,5,"V ");//第1行顯示表1
}
  /************************顯示4************************************/
void display5(long temp1)
{       
     
        if(F1==0)
        {
        LCD12864_WPoss(3,0,"1 啟動");//第2行顯示表1
           }
        else
        {
        LCD12864_WPoss(3,0,"1 停止");//第2行顯示表1
           }
        if(F2==0)
        {
        LCD12864_WPoss(3,5,"2 啟動");//第2行顯示表1
           }
        else
        {
        LCD12864_WPoss(3,5,"2 停止");//第2行顯示表1
           }
   LCD12864_WPoss(3,3,"(FS)");//第2行顯示表1

}
/************************顯示3 *********************************/
void display6(uint dat1,dat2,dat3,dat4 )
{
    uint ge1,ge2,ge3,ge4,shi1,shi2,shi3,shi4;
    dat1=month;   
    dat2=day;
     
        ge1= dat1%10;//1位
        shi1= dat1%100/10;//2位
        ge2= dat2%10;//3位
        shi2= dat2%100/10;//4位



        LCD12864_WPoss(1,5,"");//第1行顯示表1
  // LCD12864_W(0,0x80+3);//LCD12864_W ((0或1),****)  0寫指令  1寫數(shù)據(jù)
         readtime();//讀出所有時間
     LCD12864_W(1,tabe[shi1]);
     LCD12864_W(1,tabe[ge1]);

     LCD12864_W(1,0x2f);

     LCD12864_W(1,tabe[shi2]);
     LCD12864_W(1,tabe[ge2]);
      



}       
/*****************************main**********************************************/
void main()
{           
        LCD12864_Init();
        init_1302();
        InitADC();                      //AD初始化
    IE = 0xa0;                      //允許AD中斷
        EA = 1;// 打開AD中斷
        F1=        1;
        F2=        1;
    while(1)
{                                 
                  display1(wd);//顯示//溫度顯示
                  display2(wd2);//顯示//溫度顯示
                  display3();//顯示//溫度顯示
                  display4();//顯示電壓 //Ok
                  display5();//顯示風(fēng)扇
                  display6();//顯示                                                             
                 }                                                                                                                       
}
void adc_isr() interrupt 5 using 1 //通道電壓整合
{
    ADC_CONTR &= !ADC_FLAG;                                 //Clear ADC interrupt flag
    ad_out = (ADC_RES << 2) + ADC_LOW2;                     //高8位+低兩位
        //if(++ch>7)ch=0;//循環(huán)顯示8個通道AD采樣
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
}

評分

參與人數(shù) 1黑幣 +12 收起 理由
tieq1952 + 12 很給力!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:1 發(fā)表于 2018-10-17 22:39 | 只看該作者
補全原理圖或者詳細說明一下電路連接即可獲得100+黑幣
回復(fù)

使用道具 舉報

板凳
ID:358930 發(fā)表于 2018-10-17 22:51 | 只看該作者
本工程結(jié)合了,1302時間芯片,18B20溫度芯片,MAX6675熱電偶,AD電壓測量,于一身,用于汽車測量,非常實用。電路連接參照定義就可以,另要一片12V降到5V的電路板,汽車電壓為12V,單片機為5V,已做出成品,包測試通過。且多器件共存相關(guān)測試通過。

評分

參與人數(shù) 1黑幣 +60 收起 理由
admin + 60 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

地板
ID:411479 發(fā)表于 2018-10-18 04:26 來自觸屏版 | 只看該作者
學(xué)習(xí)了,感謝分享,有實物展示就更好了。
回復(fù)

使用道具 舉報

5#
ID:358930 發(fā)表于 2018-10-18 06:34 來自觸屏版 | 只看該作者
冰冰潔潔 發(fā)表于 2018-10-17 22:51
本工程結(jié)合了,1302時間芯片,18B20溫度芯片,MAX6675熱電偶,AD電壓測量,于一身,用于汽車測量,非常實用 ...

完成后的圖片

20181017_222017.jpg (42.99 KB, 下載次數(shù): 31)

20181017_222017.jpg
回復(fù)

使用道具 舉報

6#
ID:253767 發(fā)表于 2018-10-18 07:14 | 只看該作者
謝謝分享!!!
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表