找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3220|回复: 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, 下载次数: 50)


分享到:  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, 下载次数: 59)

20181102_132837.jpg
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表