久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3845|回復: 4
打印 上一主題 下一主題
收起左側

全智能充電插頭溫度控制器雙NTC熱敏電阻植入 附單片機源碼

[復制鏈接]
跳轉到指定樓層
樓主
制作出來的實物圖如下:


充電插頭全智能超溫控制器的單片機源程序如下:
  1. #include <reg51.h>
  2. #include  <intrins.h>
  3. #define uchar unsigned char
  4. #define uint  unsigned int

  5. //STC12C5A60S2 特殊功能寄存器 關于AD部分的寄存器定義
  6. sfr ADC_CONTR   =   0xBC;           //ADC控制寄存器 通道配置
  7. sfr ADC_RES     =   0xBD;           //ADC高8位數據寄存器(存AD轉換的結果,共10位)
  8. sfr ADC_LOW2    =   0xBE;           //ADC低2位數據寄存器(存AD轉換的結果,共10位)
  9. sfr P1ASF       =   0x9D;           //P1第二功能選擇寄存器
  10. unsigned char ch0 ; //ADC通道選擇,本例程選擇P1.0為AD轉換,其他P1口做普通IO用 01234567
  11. unsigned int ad_out;//ADC_CONTR寄存器的位變量定義
  12. #define ADC_POWER   0x80            //ADC power control bit
  13. #define ADC_FLAG    0x10            //ADC complete flag
  14. #define ADC_START   0x08            //ADC start control bit
  15. #define ADC_SPEEDLL 0x00            //420 clocks
  16. #define ADC_SPEEDL  0x20            //280 clocks
  17. #define ADC_SPEEDH  0x40            //140 clocks
  18. #define ADC_SPEEDHH 0x60            //70 clocks
  19.   
  20. /***************************功能定義***************************/
  21. #define LCD12864_W_COM                        0xF8        //寫指令
  22. #define LCD12864_R_COM                        0xFC        //讀指令
  23. #define LCD12864_W_DAT                        0xFA        //寫數據
  24. #define LCD12864_R_DAT                        0xFE        //讀數據
  25. #ifndef __LCD12864_H__
  26. #define __LCD12864_H__
  27. #define LCD12864_COM 0        //輸入指令
  28. #define LCD12864_DAT 1        //輸入數據
  29. #define LCD12864_CLEAR                        0x01        //清除顯示
  30. #define LCD12864_CURSOR                        0x02        //位址歸位,游標回原點
  31. #define LCD12864_CURSOR_RLF                0x04        //光標左移,整體顯示不移動
  32. #define LCD12864_CURSOR_RRF                0x06        //光標右移,整體顯示不移動
  33. #define LCD12864_CURSOR_RLN                0x05        //光標左移,整體顯示移動
  34. #define LCD12864_CURSOR_RRN                0x07        //光標右移,整體顯示移動
  35. #define LCD12864_DIS_OFF                0x08        //顯示狀態全關
  36. #define LCD12864_DIS_ON                        0x0E        //顯示狀態開
  37. #define LCD12864_DIS_CUR_ON                0x0E        //游標顯示開
  38. #define LCD12864_DIS_CURS_ON        0x0F        //游標位置顯示開
  39. #define LCD12864_CURSOR_RL                0x10        //游標左移
  40. #define LCD12864_CURSOR_RR                0x14        //游標右移
  41. #define LCD12864_CURDIS_RL                0x18        //整體顯示左移,光標跟隨
  42. #define LCD12864_CURDIS_RR                0x1C        //整體顯示又移,光標跟隨
  43. #define LCD12864_COM_BASIC                0x30        //基本指令集動作
  44. #define LCD12864_COM_PLOT_ON        0x36        //擴展指令集動作,繪圖顯示ON
  45. #define LCD12864_COM_PLOT_OFF        0x34        //擴展指令集動作,繪圖顯示OFF
  46. #define LCD12864_STAND_TO                0x31        //進入待命模式
  47. #define LCD12864_PLACE_ROLL                0x03        //允許輸入卷動位址
  48. #define LCD12864_PLACE_IRAM                0x02        //允許輸入IRAM位址
  49. #define LCD12864_REVERES_13                0x04        //選擇一、三行同時作反白顯示
  50. #define LCD12864_REVERES_24                0x05        //選擇二、四行同時作反白顯示
  51. #define LCD12864_REST_ON                0x08        //進入睡眠模式
  52. #define LCD12864_REST_OFF                0x0C        //脫離睡眠模式
  53. #define LCD12864_W_COM                        0xF8        //寫指令
  54. #define LCD12864_R_COM                        0xFC        //讀指令
  55. #define LCD12864_W_DAT                        0xFA        //寫數據
  56. #define LCD12864_R_DAT                        0xFE        //讀數據
  57. //======串口模式=======
  58. sbit LCD12864_CS = P2^7;   //片選信號輸入
  59. sbit LCD12864_STD = P2^6;  //串行數據輸入
  60. sbit LCD12864_SCLK = P2^5; //串行移位脈沖輸入
  61. sbit LCD12864_PSB = P2^4;  //串并模式選擇 0:串口,1:并口
  62. sbit LCDRST  = P2^3;
  63. sbit sclk = P2^0;//1302
  64. sbit io= P2^1;//1302
  65. sbit rst= P2^2;//1302
  66. uint pcs=0;//計數
  67. uint pcs1=0;
  68. sbit bb= P1^7;   //bepp
  69. unsigned char frq;
  70. sbit ntcok= P1^6;   //NTC OK
  71. sbit ntcno= P1^5;   //NTC
  72. sbit k1= P1^4;   //NTC OK

  73. code unsigned int  vt_table[]=        // 電壓溫度對照表  440/2=220度(精度0.5)
  74.         {   
  75.             6000,5800,5700,5600,5500,5400,5300,5200,5100,5000,//0-5度左右
  76.                 4980,4960,4940,4920,4900,4880,4860,4840,4820,4800,//5-10度左右

  77.                 4780,4760,4740,4720,4700,4680,4660,4640,4620,4600,//11-15度左右
  78.                 …………
  79. …………
  80. …………限于本文篇幅 余下代碼請從51黑下載附件…………
  81.                 1095,1090,1085,1080,1075,1070,1065,1060,1055,1050, //210-210度左右

  82.                 1045,1040,1035,1030,1025,1020,1015,1010,1005,1000, //211-220度左右
  83.                 995,990,985,980,975,970,965,960,955,950, //211-220度左右
  84.                        
  85.         }; //查表每一組數代表1度。如vt_table[]=3949時為6度
  86. unsigned char code logo[]={  
  87. /*--  調入了一幅圖像:logo.bmp  -- */
  88. /*--  寬度x高度=128x64 歡迎使用本產品LOGO --*/
  89. /*--  調入了一幅圖像:C:\Documents and Settings\lwd\桌面\新建文件夾\X.bmp  --*/
  90. /*--  寬度x高度=128x64  --*/
  91. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  92. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  93. …………
  94. …………
  95. …………限于本文篇幅 余下代碼請從51黑下載附件…………
  96. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  97. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"未命名文件",0*/
  98. /* (128 X 25 )*/


  99. };
  100. unsigned int num,i;
  101. uchar S1num,flag,second,minute,hour,week,day,month,year,fsec;//秒、分、時、星期、日、月、年
  102. bit keyflag=0;//按鍵標志位
  103. unsigned char code tabe[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};//查表法//0-9數字
  104. /*******************************延時函數**********************************************/
  105. void Delay1Ms(uchar t)
  106. {
  107.         uchar i;
  108.         for (;t>0;t--)
  109.                 {
  110.                 for (i=0;i<138;i++)
  111.                         {
  112.                         _nop_();_nop_();_nop_();_nop_();_nop_();
  113.                         _nop_();_nop_();_nop_();_nop_();_nop_();
  114.                         }
  115.                 }       
  116. }
  117. void Delay1s(uchar t)
  118. {
  119.         for (;t>0;t--)
  120.                 {
  121.             Delay1Ms(250);
  122.                 Delay1Ms(250);
  123.                 Delay1Ms(250);
  124.                 Delay1Ms(250);
  125.             }       
  126. }
  127. void delayus()//us微秒延時
  128. {
  129. _nop_();
  130. _nop_();
  131. _nop_();
  132. _nop_();
  133. }
  134. void delay(unsigned int n)
  135. {
  136.     unsigned int x;
  137.     while (n--)
  138.     {
  139.         x = 5000;
  140.         while (x--);
  141.     }
  142. }
  143.   void InitADC() //10位AD數據緩存
  144. {
  145. unsigned char i;
  146.     // for(i=0;i<1;i++)//循環顯示8個P1.0--P1.7
  147.    //{
  148.    P1ASF = 0x01;//設置P1.0為AD腳,P1ASF = 0x01 其他P1口為普通IO功能
  149.          //delay(5);
  150.          //P1ASF = 0x02;
  151.          //delay(5);
  152.          //P1ASF = 0x03;
  153.          //delay(5);
  154.          //P1ASF = 0x04;
  155.          //delay(5);
  156.         // P1ASF = 0x05;
  157.          //delay(5);
  158.          //P1ASF = 0x06;
  159.          //delay(5);
  160.          //P1ASF = 0x07;
  161.          //delay(5);
  162.         //P1ASF = 0x08;//設置P1.7為AD腳,P1ASF = 0x08 其他P1口為普通IO功能
  163.          //delay(5);
  164. //        }
  165.     ADC_RES = 0;                    //清空AD輸出高8位
  166.         //if(++ch>7)ch=0;        //循環顯示8個通道AD采樣
  167.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch0;
  168.     delay(8);                       //ADC power-on delay and Start A/D conversion
  169. }


  170. /********************寫一個字節**************/
  171. void write_1302byte(uchar com)
  172. {
  173. uchar i;
  174. sclk=0;
  175. delayus();
  176. for(i=8;i>0;i--)
  177.   {
  178.    io=com&0x01;//只要是從低位取數,向高位一定要和0X01與
  179.    delayus();
  180.    sclk=1;//為寫數據制造上升沿。
  181.    delayus();
  182.    sclk=0;//為下一次上升沿寫下一個字節做準備
  183.    com>>=1;//將數據向右移一位,準備寫入下一個數據
  184.   }       
  185. }
  186. /********************讀一個字節***************/
  187. uchar read_1302byte()
  188. {
  189. uchar i,dat;
  190. delayus();
  191. for(i=8;i>0;i--)
  192.   {
  193.    dat>>=1;
  194.    if(io==1)
  195.    {
  196.      dat|=0x80;//將1取出,寫在dat的最高位。
  197.    }
  198.    sclk=1;//把sclk拉高,為讀一個字節的下降沿做準備
  199.    delayus();//稍等制造一個高電平
  200.    sclk=0;//為讀一個字節制造下降沿
  201.    delayus();
  202.   }
  203. return dat;
  204. }
  205. /*************寫入一個時間位*****************/
  206. void write_1302(uchar add,uchar dat)
  207. {
  208. rst=0;
  209. delayus();
  210. sclk=0;
  211. delayus();
  212. rst=1;
  213. write_1302byte(add);
  214. delayus();
  215. write_1302byte(dat);
  216. delayus();
  217. rst=0;
  218. }
  219. /****************讀1302的地址******************/
  220. uchar read_1302add(uchar add)
  221. {
  222. uchar timedat;
  223. rst=0;
  224. _nop_();
  225. sclk=0;
  226. _nop_();
  227. rst=1;
  228. write_1302byte(add);//寫入要讀的地址
  229. timedat=read_1302byte();//將上面地址中的數據賦給timedat
  230. sclk=1;
  231. _nop_();
  232. rst=0;
  233. io=0;//字節讀操作完后,將ds1302的IO端口置零就可以消除85、45和??閃現等問題
  234. return timedat;
  235. }
  236. /****************初始化1302*********************/
  237. void init_1302()
  238. {
  239.   flag=read_1302add(0x81);//讀秒寄存器的最高位,讀出時鐘狀態
  240. if(flag&0x80)//判斷時鐘是否關閉,若內部關閉,則初始,若沒關閉,不初始化,還在走
  241. {
  242.    write_1302(0x8e,0x00);//去除寫保護
  243.    write_1302(0x80,((10/10)<<4|(10%10)));//寫秒寄存器,并寫入初值55
  244.    write_1302(0x82,((23/10)<<4|(23%10)));//寫分寄存器,并寫入初值59
  245.    write_1302(0x84,((0/10)<<4|(0%10)));//寫小時寄存器,并寫入初值23
  246.    write_1302(0x86,((10/10)<<4|(10%10)));//寫日寄存器,并寫入初值18
  247.    write_1302(0x88,((4/10)<<4|(4%10)));//寫月寄存器,并寫入初值2
  248.    write_1302(0x8a,((2/10)<<4|(2%10)));//寫周寄存器,并寫入初值5
  249.    write_1302(0x8c,((18/10)<<4|(18%10)));//寫年寄存器,并寫入初值12,不能寫2012年
  250.    write_1302(0x90,0xa5);//寫充電方式
  251.    write_1302(0x8e,0x80);//加上寫保護  去寫保護和if(flag&0x80)//判斷 可        改 時 間
  252.     }
  253. }
  254. /*****************讀出秒的十進制數***************************/
  255. uchar readsecond()
  256. {
  257. uchar dat;                                                                                                                                         
  258. dat=read_1302add(0x81);
  259. second=((dat&0x70)>>4)*10+(dat&0x0f);
  260. return second;
  261. }
  262. /*****************讀出分的十進制數***************************/
  263. uchar readminute()
  264. {
  265. uchar dat;
  266. dat=read_1302add(0x83);
  267. minute=((dat&0x70)>>4)*10+(dat&0x0f);
  268. return minute;
  269. }
  270. /*****************讀出小時的十進制數***************************/
  271. uchar readhour()
  272. {
  273. uchar dat;
  274. dat=read_1302add(0x85);
  275. hour=((dat&0x70)>>4)*10+(dat&0x0f);
  276. return hour;
  277. }
  278. /*****************讀出天的十進制數***************************/
  279. uchar readday()
  280. {
  281. uchar dat;
  282. dat=read_1302add(0x87);
  283. day=((dat&0x70)>>4)*10+(dat&0x0f);
  284. return day;
  285. }
  286. /*****************讀出月的十進制數***************************/
  287. uchar readmonth()
  288. {
  289. uchar dat;
  290. dat=read_1302add(0x89);
  291. month=((dat&0x70)>>4)*10+(dat&0x0f);
  292. return month;
  293. }
  294. /*****************讀出周的十進制數***************************/
  295. uchar readweek()
  296. {
  297. uchar dat;
  298. dat=read_1302add(0x8b);
  299. week=((dat&0x70)>>4)*10+(dat&0x0f);
  300. return week;
  301. }
  302. /*****************讀出年的十進制數***************************/
  303. uchar readyear()
  304. {
  305. uchar dat;
  306. dat=read_1302add(0x8d);
  307. year=((dat&0xf0)>>4)*10+(dat&0x0f);
  308. return year;
  309. }
  310. /************************讀出所有時間**********************/
  311. readtime()
  312. {
  313. readsecond();
  314. readminute();
  315. readhour();
  316. readday();
  317. readmonth();
  318. readweek();
  319. readyear();
  320. }

  321. /*****************************向12864寫入8位數據*************************************/
  322. void LCD12864_Wbyte(uchar byte)
  323. {
  324.         uchar i;

  325.         for(i=0;i<8;i++)
  326.                 {
  327.                 LCD12864_SCLK = 0;
  328.                 byte <<= 1;                         //左移待寫入數據,使最高位移至CY
  329.                 LCD12864_STD = CY;        //寫入一位數據
  330.                 LCD12864_SCLK = 1;
  331.                 LCD12864_SCLK = 0;   
  332.                 }
  333. }
  334. /***************************從12864讀出8位數據***返回:sdat************************************/
  335. uchar LCD12864_Rbyte(void)
  336. {
  337.      uchar i,sdat,temp1,temp2;
  338.      temp1 = 0;
  339.      temp2 = 0;
  340. //==========12864的串行數據輸出形式是D7-D6-D5-D4-0-0-0-0-D3-D2-D1-D0-0-0-0-0,故要度兩個八位整合==============
  341.      for(i=0;i<8;i++)
  342.                 {
  343.                 temp1=temp1 << 1;
  344.                 LCD12864_SCLK = 0;
  345.                 LCD12864_SCLK = 1;            
  346.                 LCD12864_SCLK = 0;
  347.                 if( LCD12864_STD )        temp1|=0x01;        //tempe1:D7-D6-D5-D4-0-0-0-0
  348.                 }
  349.      for(i=0;i<8;i++)
  350.                 {
  351.                 temp2=temp2 << 1;
  352.                 LCD12864_SCLK = 0;
  353.                 LCD12864_SCLK = 1;            
  354.                 LCD12864_SCLK = 0;
  355.                 if( LCD12864_STD ) temp2|=0x01;   //tempe2:D3-D2-D1-D0-0-0-0-0
  356.                 }
  357.         sdat = ((temp1 & 0xf0)|(temp2 >> 4));  //取出D7\D6\D5\D4\D3\D2\D1\D0                    
  358.         return sdat;  //返回一個值(sdat)
  359. }
  360. /****************************讀忙狀態**************************************/
  361. void LCD12864_busy( void )
  362. {
  363.         do        LCD12864_Wbyte( LCD12864_R_COM );                //LCD12864_RW=11111,RW(1),RS(0),0
  364.         while( LCD12864_Rbyte() & 0x80 );         //讀BF,直到BF == 0
  365. }
  366. /*************************dat_com=0寫指令,dat_com=1寫數據*****************************************/
  367. void LCD12864_W (bit dat_com,uchar byte)
  368. {
  369.         uchar temp;
  370.         if(dat_com == 0)         //為零,寫入指令
  371.                 temp = LCD12864_W_COM;        //11111,RS(0),RW(0),0
  372.         else                            //否則,寫入數據
  373.                 temp = LCD12864_W_DAT;        //11111,RS(1),RW(0),0
  374.         LCD12864_CS = 1;                //片選使能
  375.         LCD12864_busy();                //LCD忙檢測
  376.         LCD12864_Wbyte(temp);        //寫入模式選擇,指令還是數據
  377.         LCD12864_Wbyte(byte&0xf0);        //寫入字節
  378.         LCD12864_Wbyte((byte<<4)&0xf0);        //寫入字節
  379.     LCD12864_CS = 0;                //片選關閉
  380. }
  381. /****************************LCD12864初始化**************************************/

  382. void LCD12864_Init(void)
  383. {
  384.         LCDRST=1;
  385.         LCD12864_PSB = 0;        //選擇串口模式
  386.         LCD12864_W(LCD12864_COM,0x30);        //基本指令功能.
  387.         LCD12864_W(LCD12864_COM,0x03);        //允許輸入卷動位址
  388.         LCD12864_W(LCD12864_COM,0x0c);                //脫離隨眠狀態,顯示打開,關光標,反白關.
  389.         LCD12864_W(LCD12864_COM,0x01);                //清屏指令.
  390.         LCD12864_W(LCD12864_COM,0x06);        //AC自動加一,光標右移,整體顯示不移動   
  391. }
  392. /**************************LCD12864字符位置自定義顯示****************************************/
  393. void LCD12864_WPoss(uchar x,uchar y,uchar *buff)
  394. {
  395.         uchar addr,i=0;
  396.         switch (x)
  397.                 {
  398.                 case 0:addr=0x80;break;
  399.                 case 1:addr=0x90;break;
  400.                 case 2:addr=0x88;break;
  401.                 case 3:addr=0x98;break;
  402.                 }
  403.         addr=addr+y;

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

  406.         while(buff[i]!='\0')
  407.                 {       
  408.                 LCD12864_W(LCD12864_DAT,buff[i++]);
  409.                 if(++y==16)
  410.                         {
  411.                         y=0;
  412.                         if(++x==4) x=0;

  413.                         switch (x)
  414.                                 {
  415.                                 case 0:addr=0x80;break;
  416.                                 case 1:addr=0x90;break;
  417.                                 case 2:addr=0x88;break;
  418.                                 case 3:addr=0x98;break;
  419.                                 }
  420.                         addr=addr+y;
  421.                         LCD12864_W(LCD12864_COM,addr);
  422.                         }
  423.        
  424.                 }
  425. }
  426. /************************************以上為DS18B20內容******************************************/
  427. /******************DS18B20溫度***********************/
  428. sbit    DS18B20=P0^6;
  429. #define DS18B20_H {DS18B20=1;}
  430. #define DS18B20_L {DS18B20=0;}
  431. uchar DS18B20_V() {return DS18B20;}
  432. void  Read_Temp();
  433. uchar DS18B20_Reset();
  434. void  DS18B20_WriteData(unsigned char wData);
  435. uchar DS18B20_ReadData();
  436. uchar g=2;//STC12比STC8951快的倍數(只有1-2倍可用)
  437. /***************************18B20溫度返回*******wd******************/
  438. uchar temperature[2];//定義一個整合數據
  439. long wd()
  440. {
  441.         unsigned char temp_data;
  442.         long wd=0;//溫度值清0

  443.         temp_data = temperature[1];
  444.         temp_data &= 0xf0; //取高4位
  445.         if (temp_data==0xf0) //判斷是正溫度還是負溫度讀數
  446.         {
  447.                 //負溫度讀數求補,取反加1,判斷低8位是否有進位
  448.                 if (temperature[0]==0)
  449.                 { //有進位,高8位取反加1
  450.                         temperature[0]=~temperature[0]+1;
  451.                         temperature[1]=~temperature[1]+1;
  452.                 }
  453.                 else
  454.                 { //沒進位,高8位不加1
  455.                         temperature[0]=~temperature[0]+1;
  456.                         temperature[1]=~temperature[1];
  457.                 }
  458.         }
  459.         wd=(temperature[1]*256+temperature[0])*(0.0625*10000);

  460.         return wd;//返回一個數據(溫度)用于顯示
  461. }
  462. /**********************讀溫度數據函數***********************************/
  463. void Read_Temp()
  464. {
  465.         unsigned char i;
  466.         DS18B20_Reset(); //復位
  467.         DS18B20_WriteData(0xcc); //跳過ROM命令
  468.         DS18B20_WriteData(0x44); //溫度轉換命令
  469.         DS18B20_Reset(); //復位
  470.         DS18B20_WriteData(0xcc); //跳過ROM命令
  471.         DS18B20_WriteData(0xbe); //讀DS18B20溫度暫存器命令
  472.         for (i=0;i<2;i++)
  473.         {
  474.                 temperature[i]=DS18B20_ReadData();
  475.         }
  476.         DS18B20_Reset(); //復位,結束讀數據
  477. }
  478. /****************************DS18B20復位及存在檢測******************************/
  479. uchar DS18B20_Reset()
  480. {
  481.         unsigned char i;
  482.         uchar flag; //DS18B20存在標志位
  483.         DS18B20_L; //拉低總線
  484.         for (i=(240*g);i>0;i--);//延時480微秒,產生復位脈沖
  485.         DS18B20_H; //釋放總線
  486.         for (i=(40*g);i>0;i--); //延時80微秒對總線采樣
  487.         flag = DS18B20_V();
  488.         for (i=(200*g);i>0;i--); //延時400微秒等待總線恢復
  489.         return (flag); //根據flag的值可以知道DS18B20是否存在或損壞
  490. } //可以加聲音告警提示DS18B20故障
  491. /***********************寫數據到DS18B20 ***********************************/
  492. void DS18B20_WriteData(unsigned char wData)
  493. {
  494.         unsigned char i,j;
  495.         for (i=8;i>0;i--)
  496.         {
  497.                 DS18B20_L; //拉低總線,產生寫信號
  498.                 for (j=(7*g);j>0;j--); //延時14us
  499.                 if((bit)(wData&0x01)==1)//發送1位
  500.                 {
  501.                         DS18B20_H;
  502.                 }
  503.                 else
  504.                 {
  505.                         DS18B20_L;
  506.                 }

  507.                 for (j=(30*g);j>0;j--); //延時60us,寫時序至少要60us
  508.                 DS18B20_H; //釋放總線,等待總線恢復
  509.                 wData>>=1; //準備下一位數據的傳送
  510.         }
  511. }
  512. /************************DS18B20中讀出數據**********************************/
  513. unsigned char DS18B20_ReadData()
  514. {
  515.         unsigned char i,j,TmepData;
  516.         for (i=8;i>0;i--)
  517.         {
  518.                 TmepData>>=1;
  519.                 DS18B20_L; //拉低總線,產生讀信號
  520.                 for (j=(2*g);j>0;j--); //延時4us
  521.                 DS18B20_H; //釋放總線,準備讀數據
  522.                 for (j=(4*g);j>0;j--); //延時8微秒讀數據
  523.                 if (DS18B20_V()) TmepData |= 0x80;
  524.                 for (j=(15*g);j>0;j--); //延時30us
  525.                 DS18B20_H; //拉高總線,準備下一位數據的讀取.
  526.         }
  527.         return (TmepData);//返回讀到的數據
  528. }
  529. /************************顯示11************************************/

  530. void display11(long temp)
  531. {
  532.     uchar dt1,dt2,dt3,dt4,dt5,dt6,dt7,dt8;
  533.         //temp=12345678;
  534.         dt1 = temp%10;//1位
  535.         dt2 = temp%100/10;//2位
  536.         dt3 = temp%1000/100;//3位
  537.         dt4 = temp%10000/1000;//4位

  538.         dt5 = temp%100000/10000;//5位
  539.         dt6 = temp%1000000/100000;//6位
  540.         dt7 = temp%10000000/1000000;//7位
  541.         dt8 = temp/10000000;//8位             最高位  

  542.         LCD12864_WPoss(3,5," ");//第1行顯示表1
  543.     // LCD12864_W(0,0x80+3);//LCD12864_W ((0或1),****)  0寫指令  1寫數據

  544.      //LCD12864_W(1,tabe[dt8]);//6位
  545.      //LCD12864_W(1,tabe[dt7]);//5位
  546.      LCD12864_W(1,tabe[dt6]);//4位
  547.      LCD12864_W(1,tabe[dt5]);//3位
  548.          //LCD12864_W(1,0x2e);
  549.          //LCD12864_W(1,tabe[dt4]);//4位
  550.     // LCD12864_W(1,tabe[dt3]);//3位
  551.          //LCD12864_W(1,tabe[dt2]);//4位
  552.      //LCD12864_W(1,tabe[dt1]);//3位
  553.      LCD12864_WPoss(3,7,"℃");//第1行顯示表1
  554. }

  555. /************************display2顯示2************************************/
  556. void display1(uint dat1,dat2,dat3)
  557. {       
  558.     uint ge1,ge2,ge3,shi1,shi2,shi3;
  559.     dat1=day;   
  560.     dat2=month;
  561.     dat3=year;  
  562.         ge1= dat1%10;//1位
  563.         shi1= dat1%100/10;//2位
  564.         ge2= dat2%10;//3位
  565.         shi2= dat2%100/10;//4位
  566.         ge3= dat3%10;//5位
  567.         shi3 = dat3%100/10;//6位
  568.         LCD12864_WPoss(3,0,"20");//第3行顯示表1
  569.   // LCD12864_W(0,0x80+3);//LCD12864_W ((0或1),****)  0寫指令  1寫數據
  570.          readtime();//讀出所有時間
  571.      LCD12864_W(1,tabe[shi3]);
  572.      LCD12864_W(1,tabe[ge3]);
  573.      LCD12864_W(1,0x2d);

  574.      LCD12864_W(1,tabe[shi2]);
  575.      LCD12864_W(1,tabe[ge2]);
  576.      LCD12864_W(1,0x2d);


  577.      LCD12864_W(1,tabe[shi1]);
  578.      LCD12864_W(1,tabe[ge1]);
  579. }
  580. /************************display2顯示2************************************/
  581. void display2(uint dat1,dat2,dat3,dat4 )
  582. {
  583.     uint ge1,ge2,ge3,ge4,shi1,shi2,shi3,shi4;
  584.     dat1=second;   
  585.     dat2=minute;
  586.     dat3=hour;
  587.         dat4=week;  
  588.         ge1= dat1%10;//1位
  589.         shi1= dat1%100/10;//2位
  590.         ge2= dat2%10;//3位
  591.         shi2= dat2%100/10;//4位
  592.         ge3= dat3%10;//5位
  593.         shi3 = dat3%100/10;//6位
  594.         ge4= dat4%10;//7位
  595.         shi4 = dat4%100/10;//8位


  596.         LCD12864_WPoss(1,0,"時間:");//第1行顯示表1
  597.   // LCD12864_W(0,0x80+3);//LCD12864_W ((0或1),****)  0寫指令  1寫數據
  598.          readtime();//讀出所有時間
  599.      LCD12864_W(1,tabe[shi3]);
  600.      LCD12864_W(1,tabe[ge3]);
  601.      LCD12864_W(1,0x3a);

  602.      LCD12864_W(1,tabe[shi2]);
  603.      LCD12864_W(1,tabe[ge2]);
  604.      LCD12864_W(1,0x3a);


  605.      LCD12864_W(1,tabe[shi1]);
  606.      LCD12864_W(1,tabe[ge1]);

  607.          //LCD12864_W(1,0x2f);//顯示"/ "
  608.          //LCD12864_W(1,tabe[shi4]);
  609.      //LCD12864_W(1,tabe[ge4]);        // 顯示周
  610.         if(ge4==1){LCD12864_WPoss(1,7,"一"); }
  611.         if(ge4==2){LCD12864_WPoss(1,7,"二"); }
  612.         if(ge4==3){LCD12864_WPoss(1,7,"三"); }
  613.         if(ge4==4){LCD12864_WPoss(1,7,"四"); }
  614.         if(ge4==5){LCD12864_WPoss(1,7,"五"); }
  615.         if(ge4==6){LCD12864_WPoss(1,7,"六"); }
  616.         if(ge4==7){LCD12864_WPoss(1,7,"日"); }
  617. }
  618.   /************************顯示溫度和電阻計算3************************************/
  619. void display3(long temp1)
  620. {       
  621.     uchar dt1,dt2,dt3,dt4,dt5,dt6,dt7,dt8;
  622.         uchar x;
  623.         uint i;

  624.     num=(39*ad_out*(3470*(1/(273.15+15)-1/(273.15+25))))/2; //溫度計算與修正約10K
  625.    for(i=0;i<440;i++)//判斷采集電壓值大于或者等于表格電壓時,停下來并記錄當前i值
  626.    {
  627.     if(num >= vt_table[i])
  628.        {
  629.         num=i;
  630.                 break;             //檢測到即跳出循環,否則繼續循環
  631.         }
  632.                 }                       
  633.            temp1=(num*10)/2;//放大10倍
  634.         if(temp1<1)
  635.         temp1=9999;        //最大
  636.         if(temp1<=400)// 回到26度以下充電才能再次開始
  637.         {
  638.          LCD12864_WPoss(0,1,"充電進行中∝");//第1行顯示表1 ≈≈∝≠
  639.          display2();//顯示時間 //Ok
  640.          bb=1;
  641.          ntcok=0;   //NTC OK
  642.          ntcno=1;
  643.          }
  644.          else
  645.          {
  646.          if(temp1>=800)//充電報警溫度
  647.         {
  648.          LCD12864_WPoss(0,1,"充電中斷  ≠");//第1行顯示表1 ≈≈∝≠
  649.          
  650.          ntcok=1;   //NTC OK                                                                                                                                                                                             
  651.          for(x=2;x>0;x--)
  652.          {         
  653.          LCD12864_WPoss(1,0,"    超溫報警!   ");//第1行顯示表1 ≈≈∝≠
  654.          ntcno=0;
  655.          bb=0;
  656.          Delay1s(1);
  657.          LCD12864_WPoss(1,0,"                ");//第1行顯示表1 ≈≈∝≠
  658.          ntcno=1;
  659.          bb=1;
  660.          Delay1s(1);
  661.          }                  
  662.          }
  663.          }               
  664.         dt1 = temp1%10;//1位
  665.         dt2 = temp1%100/10;//2位
  666.         dt3 = temp1%1000/100;//3位
  667.         dt4 = temp1%10000/1000;//4位

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

  672.         LCD12864_WPoss(2,0,"溫度:");//第2行顯示表1
  673.     //LCD12864_W(0,0x80+3);//LCD12864_W ((0或1),****)  0寫指令  1寫數據
  674.         //LCD12864_W(1,tabe[dt8]);//8位
  675.     //LCD12864_W(1,tabe[dt7]);//7位
  676.     //LCD12864_W(1,tabe[dt6]);//6位        // °         Ω℃℉
  677.     //LCD12864_W(1,tabe[dt5]);//5位
  678.      LCD12864_W(1,tabe[dt4]);//4位       
  679.      LCD12864_W(1,tabe[dt3]);//3位
  680.          LCD12864_W(1,tabe[dt2]);//2位
  681.          LCD12864_W(1,0x2e);// 顯示點         
  682.          LCD12864_W(1,tabe[dt1]);//1位
  683.      LCD12864_WPoss(2,6,"℃");//第1行顯示表1
  684. }   
  685.   /************************display4顯示4************************************/
  686. void display4(uint temp1)
  687. {       
  688.     uchar dt1,dt2,dt3,dt4,dt5,dt6,dt7,dt8;
  689.         temp1=ad_out*(3270*(1/(273.15+25)-1/(273.15+85))); //溫度計算與修正約10K
  690.         if(temp1>1250)
  691.         {temp1=9999;}                 
  692.         dt1 = temp1%10;//1位
  693.         dt2 = temp1%100/10;//2位
  694.         dt3 = temp1%1000/100;//3位
  695.         dt4 = temp1%10000/1000;//4位

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

  700.         LCD12864_WPoss(3,0,"電阻:");//第2行顯示表1
  701.     //LCD12864_W(0,0x80+3);//LCD12864_W ((0或1),****)  0寫指令  1寫數據
  702.          //LCD12864_W(1,tabe[dt8]);//8位
  703.     //LCD12864_W(1,tabe[dt7]);//7位
  704.      //LCD12864_W(1,tabe[dt6]);//6位        // °         Ω℃℉
  705.      //LCD12864_W(1,tabe[dt5]);//5位
  706.      LCD12864_W(1,tabe[dt4]);//4位         
  707.      LCD12864_W(1,tabe[dt3]);//3位
  708.          LCD12864_W(1,0x2e);// 顯示點
  709.          LCD12864_W(1,tabe[dt2]);//2位         
  710.          LCD12864_W(1,tabe[dt1]);//1位
  711.      LCD12864_WPoss(3,6,"k Ω");//第1行顯示表1
  712. }
  713. void Disp_img(unsigned char  *img)        //圖形方式12864顯示字模221 橫向取膜
  714. {
  715.         unsigned char i,j;
  716.         unsigned int k = 0;

  717.         LCD12864_W(0,0x36); //圖形方式
  718.         for(i=0;i<32;i++)
  719.           {
  720.                 LCD12864_W(0,0x80+i);
  721.                 LCD12864_W(0,0x80);
  722.             for(j=0;j<16;j++)
  723.                 {
  724.                         LCD12864_W(1,img[k++]);
  725.                 }
  726.           }

  727.         for(i=0;i<32;i++)
  728.           {
  729.                 LCD12864_W(0,0x80+i);
  730.                 LCD12864_W(0,0x88);
  731.             for(j=0;j<16;j++)
  732.                 {
  733.                         LCD12864_W(1,img[k++]);
  734.                   }
  735.         }
  736. }
  737. void Init_Timer0(void)
  738. {
  739. TMOD |= 0x01;          //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響                     
  740. //TH0=0x00;              //給定初值
  741. //TL0=0x00;
  742. EA=1;            //總中斷打開
  743. ET0=1;           //定時器中斷打開
  744. TR0=1;           //定時器開關打開
  745. }

  746. /*****************************main**********************************************/
  747. void main()
  748. {   
  749.     uchar j;
  750.         int i=0;
  751.         Delay1s(1);       
  752.         LCD12864_Init();
  753.     init_1302();
  754.         InitADC();                      //AD初始化
  755.     IE = 0xa0;                      //允許AD中斷
  756.         for(j=1;j>0;j-- )
  757.         {
  758.          LCD12864_WPoss(0,0,"全智能插頭測試儀");//第1行顯示表1 ≈≈∝≠         
  759.          LCD12864_WPoss(1,1,"");//第1行顯示表1 ≈≈∝≠         
  760.          LCD12864_WPoss(2,2,"NTC=10 k");//第1行顯示表1 ≈≈∝≠         
  761.          LCD12864_WPoss(3,0,"蘇州寶興電線電纜");//第1行顯示表1 ≈≈∝≠          
  762.          Delay1s(5);
  763.          LCD12864_WPoss(0,0,"                ");//第1行顯示表1 ≈≈∝≠         
  764.          LCD12864_WPoss(1,0,"                ");//第1行顯示表1 ≈≈∝≠         
  765.          LCD12864_WPoss(2,0,"                ");//第1行顯示表1 ≈≈∝≠         
  766.          LCD12864_WPoss(3,0,"                ");//第1行顯示表1 ≈≈∝≠
  767.          Delay1s(1);
  768.          LCD12864_WPoss(0,0,"");//第1行顯示表1 ≈≈∝≠         
  769.          LCD12864_WPoss(1,1,"溫度檢測中--");//第1行顯示表1 ≈≈∝≠         
  770.          LCD12864_WPoss(2,2,"");//第1行顯示表1 ≈≈∝≠         
  771.          LCD12864_WPoss(3,0,"");//第1行顯示表1 ≈≈∝≠           
  772.          Delay1s(9);
  773.          LCD12864_WPoss(0,0,"                ");//第1行顯示表1 ≈≈∝≠         
  774.          LCD12864_WPoss(1,0,"                ");//第1行顯示表1 ≈≈∝≠         
  775.          LCD12864_WPoss(2,0,"                ");//第1行顯示表1 ≈≈∝≠         
  776.          LCD12864_WPoss(3,0,"                ");//第1行顯示表1 ≈≈∝≠
  777.          Delay1s(1);
  778.          }
  779.          Disp_img(logo); //顯示一幅畫面
  780.          Delay1s(20);
  781.          LCD12864_Init(); //再次初始化用于返回
  782.          
  783.     while(1)
  784. {               
  785.                 EA = 0;
  786.               Read_Temp(); //讀取溫度值
  787.             Delay1Ms(100);//等溫度值
  788.                 EA = 1;// 打開AD中斷

  789.             display11(wd());//顯示日期 //Ok                           
  790.                 display1();//顯示時間 //Ok         
  791.                 display3();//顯示電壓 //Ok
  792.         //        display4();//顯示日期 //Ok
  793.        
  794. }
  795. }
  796.   void adc_isr() interrupt 5 using 1 //通道電壓整合
  797. {
  798.     ADC_CONTR &= !ADC_FLAG;                                 //Clear ADC interrupt flag
  799.     ad_out = (ADC_RES << 2) + ADC_LOW2;                     //高8位+低兩位
  800.         //if(++ch>7)ch=0;//循環顯示8個通道AD采樣
  801.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch0;
  802. }
復制代碼

所有資料51hei提供下載:
充電插頭全智能超溫控制器.zip (79.37 KB, 下載次數: 55)


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

使用道具 舉報

沙發
ID:1 發表于 2018-11-2 14:17 | 只看該作者
好東東 樓主能分享一下電路圖嗎?
回復

使用道具 舉報

板凳
ID:358930 發表于 2018-11-2 14:32 來自手機 | 只看該作者
admin 發表于 2018-11-2 14:17
好東東 樓主能分享一下電路圖嗎?

這個是因新能源充電汽車客戶要求制作的,只做了幾個樣品。按定義接線,不便上傳,且程序已更新,這個是開始的,
回復

使用道具 舉報

地板
ID:358930 發表于 2018-11-2 14:39 | 只看該作者
來張工作圖
回復

使用道具 舉報

5#
ID:358930 發表于 2018-11-2 14:45 來自手機 | 只看該作者
admin 發表于 2018-11-2 14:17
好東東 樓主能分享一下電路圖嗎?

程序運行圖片

20181102_132837.jpg (68.13 KB, 下載次數: 96)

20181102_132837.jpg
回復

使用道具 舉報

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

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产美女精品视频 | 日韩欧美一区二区三区免费观看 | 日本精品视频在线 | 精品日韩 | 中文字幕丁香5月 | 蜜臀久久99精品久久久久野外 | 久久精品国产一区二区三区不卡 | 精品久久久久久亚洲综合网 | 亚洲精品日韩视频 | 久久激情视频 | 91网视频| 国产精品乱码一区二区三区 | 99re在线视频观看 | 91九色porny首页最多播放 | 成年人在线观看视频 | 精品在线一区 | 天天干天天谢 | 密室大逃脱第六季大神版在线观看 | 91色综合| 午夜不卡一区二区 | 亚洲视频免费在线观看 | 欧美一区二区三区大片 | 日韩国产欧美一区 | 9久9久9久女女女九九九一九 | 一级片成人 | 犬夜叉在线观看 | 久久久蜜臀国产一区二区 | 精品国产乱码久久久久久闺蜜 | 日韩一区二区在线观看视频 | 在线看亚洲 | 美美女高清毛片视频免费观看 | 91精品久久久久久久久久 | 成人午夜免费网站 | 一区中文字幕 | 91av在线免费 | 91大神在线资源观看无广告 | www性色 | 亚洲高清一区二区三区 | 日韩欧美三区 | 91精品国产一区二区三区香蕉 | 最新av中文字幕 |