制作出來的實物圖如下:
20181102_132914.jpg (346.87 KB, 下載次數: 56)
下載附件
2018-11-2 13:39 上傳
20181102_132853.jpg (326.25 KB, 下載次數: 46)
下載附件
2018-11-2 13:39 上傳
20181102_132851.jpg (322.94 KB, 下載次數: 41)
下載附件
2018-11-2 13:39 上傳
0.png (12.11 KB, 下載次數: 66)
下載附件
2018-11-2 14:13 上傳
充電插頭全智能超溫控制器的單片機源程序如下:
- #include <reg51.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- //STC12C5A60S2 特殊功能寄存器 關于AD部分的寄存器定義
- sfr ADC_CONTR = 0xBC; //ADC控制寄存器 通道配置
- sfr ADC_RES = 0xBD; //ADC高8位數據寄存器(存AD轉換的結果,共10位)
- sfr ADC_LOW2 = 0xBE; //ADC低2位數據寄存器(存AD轉換的結果,共10位)
- sfr P1ASF = 0x9D; //P1第二功能選擇寄存器
- unsigned char ch0 ; //ADC通道選擇,本例程選擇P1.0為AD轉換,其他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 //寫數據
- #define LCD12864_R_DAT 0xFE //讀數據
- #ifndef __LCD12864_H__
- #define __LCD12864_H__
- #define LCD12864_COM 0 //輸入指令
- #define LCD12864_DAT 1 //輸入數據
- #define LCD12864_CLEAR 0x01 //清除顯示
- #define LCD12864_CURSOR 0x02 //位址歸位,游標回原點
- #define LCD12864_CURSOR_RLF 0x04 //光標左移,整體顯示不移動
- #define LCD12864_CURSOR_RRF 0x06 //光標右移,整體顯示不移動
- #define LCD12864_CURSOR_RLN 0x05 //光標左移,整體顯示移動
- #define LCD12864_CURSOR_RRN 0x07 //光標右移,整體顯示移動
- #define LCD12864_DIS_OFF 0x08 //顯示狀態全關
- #define LCD12864_DIS_ON 0x0E //顯示狀態開
- #define LCD12864_DIS_CUR_ON 0x0E //游標顯示開
- #define LCD12864_DIS_CURS_ON 0x0F //游標位置顯示開
- #define LCD12864_CURSOR_RL 0x10 //游標左移
- #define LCD12864_CURSOR_RR 0x14 //游標右移
- #define LCD12864_CURDIS_RL 0x18 //整體顯示左移,光標跟隨
- #define LCD12864_CURDIS_RR 0x1C //整體顯示又移,光標跟隨
- #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 //寫數據
- #define LCD12864_R_DAT 0xFE //讀數據
- //======串口模式=======
- sbit LCD12864_CS = P2^7; //片選信號輸入
- sbit LCD12864_STD = P2^6; //串行數據輸入
- sbit LCD12864_SCLK = P2^5; //串行移位脈沖輸入
- sbit LCD12864_PSB = P2^4; //串并模式選擇 0:串口,1:并口
- sbit LCDRST = P2^3;
- sbit sclk = P2^0;//1302
- sbit io= P2^1;//1302
- sbit rst= P2^2;//1302
- uint pcs=0;//計數
- uint pcs1=0;
- sbit bb= P1^7; //bepp
- unsigned char frq;
- sbit ntcok= P1^6; //NTC OK
- sbit ntcno= P1^5; //NTC
- sbit k1= P1^4; //NTC OK
- code unsigned int vt_table[]= // 電壓溫度對照表 440/2=220度(精度0.5)
- {
- 6000,5800,5700,5600,5500,5400,5300,5200,5100,5000,//0-5度左右
- 4980,4960,4940,4920,4900,4880,4860,4840,4820,4800,//5-10度左右
- 4780,4760,4740,4720,4700,4680,4660,4640,4620,4600,//11-15度左右
- …………
- …………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
- 1095,1090,1085,1080,1075,1070,1065,1060,1055,1050, //210-210度左右
- 1045,1040,1035,1030,1025,1020,1015,1010,1005,1000, //211-220度左右
- 995,990,985,980,975,970,965,960,955,950, //211-220度左右
-
- }; //查表每一組數代表1度。如vt_table[]=3949時為6度
- unsigned char code logo[]={
- /*-- 調入了一幅圖像:logo.bmp -- */
- /*-- 寬度x高度=128x64 歡迎使用本產品LOGO --*/
- /*-- 調入了一幅圖像:C:\Documents and Settings\lwd\桌面\新建文件夾\X.bmp --*/
- /*-- 寬度x高度=128x64 --*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- …………
- …………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"未命名文件",0*/
- /* (128 X 25 )*/
- };
- unsigned int num,i;
- uchar S1num,flag,second,minute,hour,week,day,month,year,fsec;//秒、分、時、星期、日、月、年
- bit keyflag=0;//按鍵標志位
- unsigned char code tabe[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};//查表法//0-9數字
- /*******************************延時函數**********************************************/
- void Delay1Ms(uchar 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數據緩存
- {
- unsigned char i;
- // for(i=0;i<1;i++)//循環顯示8個P1.0--P1.7
- //{
- P1ASF = 0x01;//設置P1.0為AD腳,P1ASF = 0x01 其他P1口為普通IO功能
- //delay(5);
- //P1ASF = 0x02;
- //delay(5);
- //P1ASF = 0x03;
- //delay(5);
- //P1ASF = 0x04;
- //delay(5);
- // P1ASF = 0x05;
- //delay(5);
- //P1ASF = 0x06;
- //delay(5);
- //P1ASF = 0x07;
- //delay(5);
- //P1ASF = 0x08;//設置P1.7為AD腳,P1ASF = 0x08 其他P1口為普通IO功能
- //delay(5);
- // }
- ADC_RES = 0; //清空AD輸出高8位
- //if(++ch>7)ch=0; //循環顯示8個通道AD采樣
- ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch0;
- delay(8); //ADC power-on delay and Start A/D conversion
- }
- /********************寫一個字節**************/
- void write_1302byte(uchar com)
- {
- uchar i;
- sclk=0;
- delayus();
- for(i=8;i>0;i--)
- {
- io=com&0x01;//只要是從低位取數,向高位一定要和0X01與
- delayus();
- sclk=1;//為寫數據制造上升沿。
- delayus();
- sclk=0;//為下一次上升沿寫下一個字節做準備
- com>>=1;//將數據向右移一位,準備寫入下一個數據
- }
- }
- /********************讀一個字節***************/
- 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拉高,為讀一個字節的下降沿做準備
- delayus();//稍等制造一個高電平
- sclk=0;//為讀一個字節制造下降沿
- 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();//將上面地址中的數據賦給timedat
- sclk=1;
- _nop_();
- rst=0;
- io=0;//字節讀操作完后,將ds1302的IO端口置零就可以消除85、45和??閃現等問題
- return timedat;
- }
- /****************初始化1302*********************/
- void init_1302()
- {
- flag=read_1302add(0x81);//讀秒寄存器的最高位,讀出時鐘狀態
- if(flag&0x80)//判斷時鐘是否關閉,若內部關閉,則初始,若沒關閉,不初始化,還在走
- {
- write_1302(0x8e,0x00);//去除寫保護
- write_1302(0x80,((10/10)<<4|(10%10)));//寫秒寄存器,并寫入初值55
- write_1302(0x82,((23/10)<<4|(23%10)));//寫分寄存器,并寫入初值59
- write_1302(0x84,((0/10)<<4|(0%10)));//寫小時寄存器,并寫入初值23
- write_1302(0x86,((10/10)<<4|(10%10)));//寫日寄存器,并寫入初值18
- write_1302(0x88,((4/10)<<4|(4%10)));//寫月寄存器,并寫入初值2
- write_1302(0x8a,((2/10)<<4|(2%10)));//寫周寄存器,并寫入初值5
- write_1302(0x8c,((18/10)<<4|(18%10)));//寫年寄存器,并寫入初值12,不能寫2012年
- write_1302(0x90,0xa5);//寫充電方式
- write_1302(0x8e,0x80);//加上寫保護 去寫保護和if(flag&0x80)//判斷 可 改 時 間
- }
- }
- /*****************讀出秒的十進制數***************************/
- uchar readsecond()
- {
- uchar dat;
- dat=read_1302add(0x81);
- second=((dat&0x70)>>4)*10+(dat&0x0f);
- return second;
- }
- /*****************讀出分的十進制數***************************/
- uchar readminute()
- {
- uchar dat;
- dat=read_1302add(0x83);
- minute=((dat&0x70)>>4)*10+(dat&0x0f);
- return minute;
- }
- /*****************讀出小時的十進制數***************************/
- uchar readhour()
- {
- uchar dat;
- dat=read_1302add(0x85);
- hour=((dat&0x70)>>4)*10+(dat&0x0f);
- return hour;
- }
- /*****************讀出天的十進制數***************************/
- uchar readday()
- {
- uchar dat;
- dat=read_1302add(0x87);
- day=((dat&0x70)>>4)*10+(dat&0x0f);
- return day;
- }
- /*****************讀出月的十進制數***************************/
- uchar readmonth()
- {
- uchar dat;
- dat=read_1302add(0x89);
- month=((dat&0x70)>>4)*10+(dat&0x0f);
- return month;
- }
- /*****************讀出周的十進制數***************************/
- uchar readweek()
- {
- uchar dat;
- dat=read_1302add(0x8b);
- week=((dat&0x70)>>4)*10+(dat&0x0f);
- return week;
- }
- /*****************讀出年的十進制數***************************/
- 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();
- }
- /*****************************向12864寫入8位數據*************************************/
- void LCD12864_Wbyte(uchar byte)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- LCD12864_SCLK = 0;
- byte <<= 1; //左移待寫入數據,使最高位移至CY
- LCD12864_STD = CY; //寫入一位數據
- LCD12864_SCLK = 1;
- LCD12864_SCLK = 0;
- }
- }
- /***************************從12864讀出8位數據***返回:sdat************************************/
- uchar LCD12864_Rbyte(void)
- {
- uchar i,sdat,temp1,temp2;
- temp1 = 0;
- temp2 = 0;
- //==========12864的串行數據輸出形式是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)
- }
- /****************************讀忙狀態**************************************/
- 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寫數據*****************************************/
- 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 //否則,寫入數據
- temp = LCD12864_W_DAT; //11111,RS(1),RW(0),0
- LCD12864_CS = 1; //片選使能
- LCD12864_busy(); //LCD忙檢測
- LCD12864_Wbyte(temp); //寫入模式選擇,指令還是數據
- LCD12864_Wbyte(byte&0xf0); //寫入字節
- LCD12864_Wbyte((byte<<4)&0xf0); //寫入字節
- LCD12864_CS = 0; //片選關閉
- }
- /****************************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); //脫離隨眠狀態,顯示打開,關光標,反白關.
- LCD12864_W(LCD12864_COM,0x01); //清屏指令.
- LCD12864_W(LCD12864_COM,0x06); //AC自動加一,光標右移,整體顯示不移動
- }
- /**************************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);
- }
-
- }
- }
- /************************************以上為DS18B20內容******************************************/
- /******************DS18B20溫度***********************/
- sbit DS18B20=P0^6;
- #define DS18B20_H {DS18B20=1;}
- #define DS18B20_L {DS18B20=0;}
- uchar DS18B20_V() {return DS18B20;}
- void Read_Temp();
- uchar DS18B20_Reset();
- void DS18B20_WriteData(unsigned char wData);
- uchar DS18B20_ReadData();
- uchar g=2;//STC12比STC8951快的倍數(只有1-2倍可用)
- /***************************18B20溫度返回*******wd******************/
- uchar temperature[2];//定義一個整合數據
- long wd()
- {
- unsigned char temp_data;
- long wd=0;//溫度值清0
- temp_data = temperature[1];
- temp_data &= 0xf0; //取高4位
- if (temp_data==0xf0) //判斷是正溫度還是負溫度讀數
- {
- //負溫度讀數求補,取反加1,判斷低8位是否有進位
- if (temperature[0]==0)
- { //有進位,高8位取反加1
- temperature[0]=~temperature[0]+1;
- temperature[1]=~temperature[1]+1;
- }
- else
- { //沒進位,高8位不加1
- temperature[0]=~temperature[0]+1;
- temperature[1]=~temperature[1];
- }
- }
- wd=(temperature[1]*256+temperature[0])*(0.0625*10000);
- return wd;//返回一個數據(溫度)用于顯示
- }
- /**********************讀溫度數據函數***********************************/
- void Read_Temp()
- {
- unsigned char i;
- DS18B20_Reset(); //復位
- DS18B20_WriteData(0xcc); //跳過ROM命令
- DS18B20_WriteData(0x44); //溫度轉換命令
- DS18B20_Reset(); //復位
- DS18B20_WriteData(0xcc); //跳過ROM命令
- DS18B20_WriteData(0xbe); //讀DS18B20溫度暫存器命令
- for (i=0;i<2;i++)
- {
- temperature[i]=DS18B20_ReadData();
- }
- DS18B20_Reset(); //復位,結束讀數據
- }
- /****************************DS18B20復位及存在檢測******************************/
- uchar DS18B20_Reset()
- {
- unsigned char i;
- uchar flag; //DS18B20存在標志位
- DS18B20_L; //拉低總線
- for (i=(240*g);i>0;i--);//延時480微秒,產生復位脈沖
- DS18B20_H; //釋放總線
- for (i=(40*g);i>0;i--); //延時80微秒對總線采樣
- flag = DS18B20_V();
- for (i=(200*g);i>0;i--); //延時400微秒等待總線恢復
- return (flag); //根據flag的值可以知道DS18B20是否存在或損壞
- } //可以加聲音告警提示DS18B20故障
- /***********************寫數據到DS18B20 ***********************************/
- void DS18B20_WriteData(unsigned char wData)
- {
- unsigned char i,j;
- for (i=8;i>0;i--)
- {
- DS18B20_L; //拉低總線,產生寫信號
- for (j=(7*g);j>0;j--); //延時14us
- if((bit)(wData&0x01)==1)//發送1位
- {
- DS18B20_H;
- }
- else
- {
- DS18B20_L;
- }
- for (j=(30*g);j>0;j--); //延時60us,寫時序至少要60us
- DS18B20_H; //釋放總線,等待總線恢復
- wData>>=1; //準備下一位數據的傳送
- }
- }
- /************************DS18B20中讀出數據**********************************/
- unsigned char DS18B20_ReadData()
- {
- unsigned char i,j,TmepData;
- for (i=8;i>0;i--)
- {
- TmepData>>=1;
- DS18B20_L; //拉低總線,產生讀信號
- for (j=(2*g);j>0;j--); //延時4us
- DS18B20_H; //釋放總線,準備讀數據
- for (j=(4*g);j>0;j--); //延時8微秒讀數據
- if (DS18B20_V()) TmepData |= 0x80;
- for (j=(15*g);j>0;j--); //延時30us
- DS18B20_H; //拉高總線,準備下一位數據的讀取.
- }
- return (TmepData);//返回讀到的數據
- }
- /************************顯示11************************************/
- void display11(long temp)
- {
- uchar dt1,dt2,dt3,dt4,dt5,dt6,dt7,dt8;
- //temp=12345678;
- 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位 最高位
- LCD12864_WPoss(3,5," ");//第1行顯示表1
- // LCD12864_W(0,0x80+3);//LCD12864_W ((0或1),****) 0寫指令 1寫數據
- //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,0x2e);
- //LCD12864_W(1,tabe[dt4]);//4位
- // LCD12864_W(1,tabe[dt3]);//3位
- //LCD12864_W(1,tabe[dt2]);//4位
- //LCD12864_W(1,tabe[dt1]);//3位
- LCD12864_WPoss(3,7,"℃");//第1行顯示表1
- }
- /************************display2顯示2************************************/
- void display1(uint dat1,dat2,dat3)
- {
- uint ge1,ge2,ge3,shi1,shi2,shi3;
- dat1=day;
- dat2=month;
- dat3=year;
- 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位
- LCD12864_WPoss(3,0,"20");//第3行顯示表1
- // LCD12864_W(0,0x80+3);//LCD12864_W ((0或1),****) 0寫指令 1寫數據
- readtime();//讀出所有時間
- LCD12864_W(1,tabe[shi3]);
- LCD12864_W(1,tabe[ge3]);
- LCD12864_W(1,0x2d);
- LCD12864_W(1,tabe[shi2]);
- LCD12864_W(1,tabe[ge2]);
- LCD12864_W(1,0x2d);
- LCD12864_W(1,tabe[shi1]);
- LCD12864_W(1,tabe[ge1]);
- }
- /************************display2顯示2************************************/
- void display2(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(1,0,"時間:");//第1行顯示表1
- // LCD12864_W(0,0x80+3);//LCD12864_W ((0或1),****) 0寫指令 1寫數據
- 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_W(1,0x2f);//顯示"/ "
- //LCD12864_W(1,tabe[shi4]);
- //LCD12864_W(1,tabe[ge4]); // 顯示周
- if(ge4==1){LCD12864_WPoss(1,7,"一"); }
- if(ge4==2){LCD12864_WPoss(1,7,"二"); }
- if(ge4==3){LCD12864_WPoss(1,7,"三"); }
- if(ge4==4){LCD12864_WPoss(1,7,"四"); }
- if(ge4==5){LCD12864_WPoss(1,7,"五"); }
- if(ge4==6){LCD12864_WPoss(1,7,"六"); }
- if(ge4==7){LCD12864_WPoss(1,7,"日"); }
- }
- /************************顯示溫度和電阻計算3************************************/
- void display3(long temp1)
- {
- uchar dt1,dt2,dt3,dt4,dt5,dt6,dt7,dt8;
- uchar x;
- uint i;
- num=(39*ad_out*(3470*(1/(273.15+15)-1/(273.15+25))))/2; //溫度計算與修正約10K
- for(i=0;i<440;i++)//判斷采集電壓值大于或者等于表格電壓時,停下來并記錄當前i值
- {
- if(num >= vt_table[i])
- {
- num=i;
- break; //檢測到即跳出循環,否則繼續循環
- }
- }
- temp1=(num*10)/2;//放大10倍
- if(temp1<1)
- temp1=9999; //最大
- if(temp1<=400)// 回到26度以下充電才能再次開始
- {
- LCD12864_WPoss(0,1,"充電進行中∝");//第1行顯示表1 ≈≈∝≠
- display2();//顯示時間 //Ok
- bb=1;
- ntcok=0; //NTC OK
- ntcno=1;
- }
- else
- {
- if(temp1>=800)//充電報警溫度
- {
- LCD12864_WPoss(0,1,"充電中斷 ≠");//第1行顯示表1 ≈≈∝≠
-
- ntcok=1; //NTC OK
- for(x=2;x>0;x--)
- {
- LCD12864_WPoss(1,0," 超溫報警! ");//第1行顯示表1 ≈≈∝≠
- ntcno=0;
- bb=0;
- Delay1s(1);
- LCD12864_WPoss(1,0," ");//第1行顯示表1 ≈≈∝≠
- ntcno=1;
- bb=1;
- Delay1s(1);
- }
- }
- }
- 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(2,0,"溫度:");//第2行顯示表1
- //LCD12864_W(0,0x80+3);//LCD12864_W ((0或1),****) 0寫指令 1寫數據
- //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,6,"℃");//第1行顯示表1
- }
- /************************display4顯示4************************************/
- void display4(uint temp1)
- {
- uchar dt1,dt2,dt3,dt4,dt5,dt6,dt7,dt8;
- temp1=ad_out*(3270*(1/(273.15+25)-1/(273.15+85))); //溫度計算與修正約10K
- if(temp1>1250)
- {temp1=9999;}
- 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(3,0,"電阻:");//第2行顯示表1
- //LCD12864_W(0,0x80+3);//LCD12864_W ((0或1),****) 0寫指令 1寫數據
- //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,0x2e);// 顯示點
- LCD12864_W(1,tabe[dt2]);//2位
- LCD12864_W(1,tabe[dt1]);//1位
- LCD12864_WPoss(3,6,"k Ω");//第1行顯示表1
- }
- 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++]);
- }
- }
- }
- void Init_Timer0(void)
- {
- TMOD |= 0x01; //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響
- //TH0=0x00; //給定初值
- //TL0=0x00;
- EA=1; //總中斷打開
- ET0=1; //定時器中斷打開
- TR0=1; //定時器開關打開
- }
- /*****************************main**********************************************/
- void main()
- {
- uchar j;
- int i=0;
- Delay1s(1);
- LCD12864_Init();
- init_1302();
- InitADC(); //AD初始化
- IE = 0xa0; //允許AD中斷
- for(j=1;j>0;j-- )
- {
- LCD12864_WPoss(0,0,"全智能插頭測試儀");//第1行顯示表1 ≈≈∝≠
- LCD12864_WPoss(1,1,"");//第1行顯示表1 ≈≈∝≠
- LCD12864_WPoss(2,2,"NTC=10 k");//第1行顯示表1 ≈≈∝≠
- LCD12864_WPoss(3,0,"蘇州寶興電線電纜");//第1行顯示表1 ≈≈∝≠
- Delay1s(5);
- LCD12864_WPoss(0,0," ");//第1行顯示表1 ≈≈∝≠
- LCD12864_WPoss(1,0," ");//第1行顯示表1 ≈≈∝≠
- LCD12864_WPoss(2,0," ");//第1行顯示表1 ≈≈∝≠
- LCD12864_WPoss(3,0," ");//第1行顯示表1 ≈≈∝≠
- Delay1s(1);
- LCD12864_WPoss(0,0,"");//第1行顯示表1 ≈≈∝≠
- LCD12864_WPoss(1,1,"溫度檢測中--");//第1行顯示表1 ≈≈∝≠
- LCD12864_WPoss(2,2,"");//第1行顯示表1 ≈≈∝≠
- LCD12864_WPoss(3,0,"");//第1行顯示表1 ≈≈∝≠
- Delay1s(9);
- LCD12864_WPoss(0,0," ");//第1行顯示表1 ≈≈∝≠
- LCD12864_WPoss(1,0," ");//第1行顯示表1 ≈≈∝≠
- LCD12864_WPoss(2,0," ");//第1行顯示表1 ≈≈∝≠
- LCD12864_WPoss(3,0," ");//第1行顯示表1 ≈≈∝≠
- Delay1s(1);
- }
- Disp_img(logo); //顯示一幅畫面
- Delay1s(20);
- LCD12864_Init(); //再次初始化用于返回
-
- while(1)
- {
- EA = 0;
- Read_Temp(); //讀取溫度值
- Delay1Ms(100);//等溫度值
- EA = 1;// 打開AD中斷
- display11(wd());//顯示日期 //Ok
- display1();//顯示時間 //Ok
- display3();//顯示電壓 //Ok
- // display4();//顯示日期 //Ok
-
- }
- }
- 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;//循環顯示8個通道AD采樣
- ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch0;
- }
復制代碼
所有資料51hei提供下載:
充電插頭全智能超溫控制器.zip
(79.37 KB, 下載次數: 55)
2018-11-2 13:38 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|