找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3484|回复: 7
收起左侧

用于生产线的多功能NTC电阻测试仪设计单片机源码 12864液晶显示

[复制链接]
ID:358930 发表于 2018-11-8 23:12 | 显示全部楼层 |阅读模式
制作出来的NTC电阻测试仪实物图如下:
20181108_225354.jpg

单片机源程序如下:
  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. sbit k= P3^7;   //k为转换开关,非自弹按键
  74. code unsigned int  vt_table[]=        // 电压温度对照表  440/2=220度(精度0.5)
  75.         {   
  76.             6000,5800,5700,5600,5500,5400,5300,5200,5100,5000,//0-5度左右
  77.                 4980,4960,4940,4920,4900,4880,4860,4840,4820,4800,//5-10度左右

  78.                 4780,4760,4740,4720,4700,4680,4660,4640,4620,4600,//11-15度左右
  79.                 4580,4560,4540,4520,4500,4480,4460,4440,4420,4400,//16-20度左右

  80.                 4360,4320,4280,4240,4200,4180,4160,4140,4120,4100, //21-25度左右
  81.                 4080,4060,4040,4020,4000,3980,3960,3940,3920,3900, //26-30度左右

  82.                 3890,3880,3870,3860,3850,3840,3830,3820,3810,3800, //31-35度左右
  83.                 3790,3780,3770,3760,3750,3740,3730,3720,3710,3700, //36-40度左右

  84.                 3690,3680,3670,3660,3650,3640,3630,3620,3610,3600, //41-45度左右
  85.                 3590,3580,3570,3560,3550,3540,3530,3520,3510,3500, //46-50度左右

  86.                 3480,3460,3440,3420,3400,3380,3360,3340,3320,3400, //41-50度左右
  87.                 3390,3380,3370,3360,3350,3340,3330,3320,3310,3300, //41-60度左右

  88.                 3290,3280,3270,3260,3250,3240,3230,3220,3210,3200, //51-60度左右
  89.                 3180,3160,3140,3120,3100,3080,3060,3040,3020,3000, //51-70度左右

  90.                 2980,2960,2940,2920,2900,2880,2860,2840,2820,2900, //61-70度左右
  91.                 2890,2880,2870,2860,2850,2840,2830,2820,2810,2800, //61-80度左右

  92.                 2790,2780,2770,2760,2750,2740,2730,2720,2710,2700, //71-80度左右
  93.                 2690,2680,2670,2660,2650,2640,2630,2620,2610,2600, //71-90度左右

  94.                 2580,2560,2540,2520,2500,2480,2460,2440,2420,2400, //81-85度左右               
  95.                 2380,2360,2340,2320,2300,2280,2260,2240,2220,2200, //91-100度左右

  96.                 2190,2180,2170,2160,2150,2140,2130,2120,2110,2100, //101-110度左右
  97.                 2095,2090,2085,2080,2075,2070,2065,2060,2055,2050, //101-110度左右

  98.                 2045,2040,2035,2030,2025,2020,2015,2010,2005,2000, //111-120度左右               
  99.                 1995,1990,1985,1980,1975,1970,1965,1960,1955,1950, //111-120度左右

  100.                 1945,1940,1935,1930,1925,1920,1915,1910,1905,1900, //121-130度左右
  101.                 1895,1890,1885,1880,1875,1870,1865,1860,1855,1850, //121-130度左右

  102.         1845,1840,1835,1830,1825,1820,1815,1810,1805,1800, //131-140度左右
  103.                 1795,1790,1785,1780,1775,1770,1765,1760,1755,1750, //131-140度左右

  104.                 1745,1740,1735,1730,1725,1720,1715,1710,1705,1700, //141-150度左右
  105.                 1695,1690,1685,1680,1675,1670,1665,1660,1655,1650, //141-150度左右

  106.                 1645,1640,1635,1630,1625,1620,1615,1610,1605,1600, //151-160度左右
  107.                 1595,1590,1585,1580,1575,1570,1565,1560,1555,1550, //151-160度左右

  108.                 1545,1540,1535,1530,1525,1520,1515,1510,1505,1500, //161-170度左右
  109.                 1495,1490,1485,1480,1475,1470,1465,1460,1455,1450, //161-170度左右

  110.                 1445,1440,1435,1430,1425,1420,1415,1410,1405,1400, //171-180度左右
  111.                 1395,1390,1385,1380,1375,1370,1365,1360,1355,1350, //171-180度左右

  112.                 1345,1340,1335,1330,1325,1320,1315,1310,1305,1300, //181-190度左右
  113.                 1295,1290,1285,1280,1275,1270,1265,1260,1255,1250, //181-190度左右

  114.                 1245,1240,1235,1230,1225,1220,1215,1210,1205,1200, //191-200度左右
  115.                 1195,1190,1185,1180,1175,1170,1165,1160,1155,1150, //191-200度左右

  116.                 1145,1140,1135,1130,1125,1120,1115,1110,1105,1100, //210-210度左右
  117.                 1095,1090,1085,1080,1075,1070,1065,1060,1055,1050, //210-210度左右

  118.                 1045,1040,1035,1030,1025,1020,1015,1010,1005,1000, //211-220度左右
  119.                 995,990,985,980,975,970,965,960,955,950, //211-220度左右
  120.                        
  121.         }; //查表每一组数代表1度。如vt_table[]=3949时为6度
  122. unsigned char code logo[]={  
  123. /*--  调入了一幅图像:logo.bmp  -- */
  124. /*--  宽度x高度=128x64 欢迎使用本产品LOGO --*/
  125. /*--  调入了一幅图像:C:\Documents and Settings\lwd\桌面\新建文件夹\X.bmp  --*/
  126. /*--  宽度x高度=128x64  --*/
  127. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  128. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  129. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  130. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  131. 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  132. 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X07,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  133. 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X3F,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  134. 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X7F,0XFC,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  135. 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  136. 0X00,0X00,0X00,0X00,0X00,0X00,0X01,0XFF,0XFF,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  137. 0X00,0X00,0X00,0X00,0X00,0X00,0X03,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,
  138. 0X00,0X00,0X00,0X00,0X00,0X00,0X0F,0XFF,0XFF,0XC0,0X00,0X00,0X00,0X00,0X00,0X00,
  139. 0X00,0X00,0X00,0X00,0X00,0X00,0X17,0XFF,0XFF,0XE0,0X00,0X00,0X00,0X00,0X00,0X00,
  140. 0X00,0X00,0X00,0X00,0X00,0X00,0X3F,0XFF,0XFF,0XF0,0X00,0X00,0X00,0X00,0X00,0X00,
  141. 0X00,0X00,0X00,0X00,0X00,0X00,0X6F,0XFF,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,
  142. 0X00,0X00,0X00,0X00,0X00,0X00,0X6F,0XFF,0XFF,0XFC,0X00,0X00,0X00,0X00,0X00,0X00,
  143. 0X00,0X00,0X00,0X00,0X00,0X00,0XEF,0XFF,0XFF,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,
  144. 0X00,0X00,0X00,0X00,0X00,0X01,0XE7,0XFF,0XFF,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,
  145. 0X00,0X00,0X00,0X00,0X00,0X01,0XE3,0XFF,0XFF,0XFF,0X00,0X00,0X00,0X00,0X00,0X00,
  146. 0X00,0X00,0X00,0X00,0X00,0X03,0XE3,0XFF,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,
  147. 0X00,0X00,0X00,0X00,0X00,0X07,0XE1,0XFF,0XFF,0XFF,0XC0,0X00,0X00,0X00,0X00,0X00,
  148. 0X00,0X00,0X00,0X00,0X00,0X07,0XC0,0XFF,0XFF,0XFF,0XC0,0X00,0X00,0X00,0X00,0X00,
  149. 0X00,0X00,0X00,0X00,0X00,0X0F,0XC0,0X7F,0XFF,0XFF,0XE0,0X00,0X00,0X00,0X00,0X00,
  150. 0X00,0X00,0X00,0X00,0X00,0X0F,0XE0,0X1F,0XFF,0XFF,0XE0,0X00,0X00,0X00,0X00,0X00,
  151. 0X00,0X00,0X00,0X00,0X00,0X1F,0XE0,0X07,0XFF,0XFF,0XF0,0X00,0X00,0X00,0X00,0X00,
  152. 0X00,0X00,0X00,0X00,0X00,0X1F,0XE0,0X01,0XFF,0XFF,0XF0,0X00,0X00,0X00,0X00,0X00,
  153. 0X00,0X00,0X00,0X00,0X00,0X1F,0XE0,0X00,0X3F,0XFF,0XF0,0X00,0X00,0X00,0X00,0X00,
  154. 0X00,0X00,0X00,0X00,0X00,0X1F,0XE0,0X00,0X01,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,
  155. 0X00,0X00,0X00,0X00,0X00,0X3F,0XE0,0X00,0X1C,0X03,0XF8,0X00,0X00,0X00,0X00,0X00,
  156. 0X00,0X00,0X00,0X00,0X00,0X3F,0XF0,0X00,0X1F,0XFC,0X78,0X00,0X00,0X00,0X00,0X00,
  157. 0X00,0X00,0X00,0X00,0X00,0X3F,0XF0,0X00,0X3F,0XFF,0X98,0X00,0X00,0X00,0X00,0X00,
  158. 0X00,0X00,0X00,0X00,0X00,0X3F,0XF0,0X00,0X7F,0XFF,0XC8,0X00,0X00,0X00,0X00,0X00,
  159. 0X00,0X00,0X00,0X00,0X00,0X3F,0XF8,0X0F,0XFF,0XFF,0XE8,0X00,0X00,0X00,0X00,0X00,
  160. 0X00,0X00,0X00,0X00,0X00,0X1F,0XF9,0XFF,0XFF,0XFF,0XE8,0X00,0X00,0X00,0X00,0X00,
  161. 0X00,0X00,0X00,0X00,0X00,0X1F,0XFC,0XFF,0XFF,0XFF,0XE0,0X00,0X00,0X00,0X00,0X00,
  162. 0X00,0X00,0X00,0X00,0X00,0X1F,0XFE,0XFF,0XFF,0XFF,0XC0,0X00,0X00,0X00,0X00,0X00,
  163. 0X00,0X00,0X00,0X00,0X00,0X0F,0XFF,0X7F,0XFF,0XFF,0XC0,0X00,0X00,0X00,0X00,0X00,
  164. 0X00,0X00,0X00,0X00,0X00,0X0F,0XFF,0X9F,0XFF,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,
  165. 0X00,0X00,0X00,0X00,0X00,0X07,0XFF,0XCF,0XFF,0XFE,0X00,0X00,0X00,0X00,0X00,0X00,
  166. 0X00,0X00,0X00,0X00,0X00,0X01,0XFF,0XE3,0XFF,0XF8,0X00,0X00,0X00,0X00,0X00,0X00,
  167. 0X00,0X00,0X00,0X00,0X00,0X00,0XFF,0XF8,0X3F,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  168. 0X00,0X00,0X00,0X00,0X00,0X00,0X07,0XFF,0X80,0X00,0X00,0X00,0X00,0X00,0X00,0X00,
  169. 0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,0X00,


  170. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  171. 0x00,0x00,0x00,0x20,0x3F,0xF8,0x00,0x00,0x00,0x03,0x07,0xFF,0x80,0x00,0x00,0x00,
  172. 0x00,0x00,0x00,0x30,0x3F,0xF8,0x00,0x00,0x00,0x06,0x07,0xFF,0x80,0x00,0x00,0x00,
  173. 0x00,0x00,0x00,0x38,0x03,0x80,0x00,0x00,0x00,0x0F,0xF6,0x01,0x80,0x00,0x00,0x00,
  174. 0x00,0x00,0x00,0x3C,0x03,0x80,0x00,0x00,0x00,0x1F,0xF6,0xFD,0x80,0x00,0x00,0x00,
  175. 0x00,0x00,0x00,0x06,0x03,0x80,0x00,0x00,0x00,0x71,0x86,0x01,0x80,0x00,0x00,0x00,
  176. 0x00,0x00,0x00,0x00,0x03,0x80,0x00,0x00,0x00,0x41,0x86,0x01,0x80,0x00,0x00,0x00,
  177. 0x00,0x00,0x00,0x30,0x03,0x80,0x00,0x00,0x00,0x0F,0xF6,0xFD,0x80,0x00,0x00,0x00,
  178. 0x00,0x00,0x00,0x38,0x03,0x80,0x00,0x00,0x00,0x0F,0xF6,0x85,0x80,0x00,0x00,0x00,
  179. 0x00,0x00,0x00,0x18,0x03,0x80,0x00,0x00,0x00,0x01,0x86,0x85,0x80,0x00,0x00,0x00,
  180. 0x00,0x00,0x00,0x0C,0x03,0x80,0x00,0x00,0x00,0x0F,0xF6,0x85,0x80,0x00,0x00,0x00,
  181. 0x00,0x00,0x00,0x00,0x03,0x80,0x00,0x00,0x00,0x0F,0xF6,0x85,0x80,0x00,0x00,0x00,
  182. 0x00,0x00,0x00,0x00,0x03,0x80,0x00,0x00,0x00,0x01,0x86,0xFD,0x80,0x00,0x00,0x00,
  183. 0x00,0x00,0x00,0x00,0x03,0x80,0x00,0x00,0x00,0x01,0x86,0x01,0x80,0x00,0x00,0x00,
  184. 0x00,0x00,0x00,0x03,0x03,0x80,0x00,0x00,0x00,0x01,0x86,0x01,0x80,0x00,0x00,0x00,
  185. 0x00,0x00,0x00,0x1E,0x03,0x80,0x00,0x00,0x00,0x01,0xA6,0x01,0x80,0x00,0x00,0x00,
  186. 0x00,0x00,0x00,0x7C,0x3F,0xF8,0x00,0x00,0x00,0x01,0xE6,0x03,0x80,0x00,0x00,0x00,
  187. 0x00,0x00,0x00,0xF8,0x3F,0xF8,0x00,0x00,0x00,0x00,0xC6,0x01,0x80,0x00,0x00,0x00,
  188. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  189. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  190. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  191. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  192. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  193. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  194. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"未命名文件",0*/
  195. /* (128 X 25 )*/


  196. };

  197. unsigned int num,i;
  198. uchar S1num,flag,second,minute,hour,week,day,month,year,fsec;//秒、分、时、星期、日、月、年
  199. bit keyflag=0;//按键标志位
  200. unsigned char code tabe[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};//查表法//0-9数字
  201. /*******************************延时函数**********************************************/
  202. void Delay1Ms(uchar t)
  203. {
  204.         uchar i;
  205.         for (;t>0;t--)
  206.                 {
  207.                 for (i=0;i<138;i++)
  208.                         {
  209.                         _nop_();_nop_();_nop_();_nop_();_nop_();
  210.                         _nop_();_nop_();_nop_();_nop_();_nop_();
  211.                         }
  212.                 }       
  213. }
  214. void Delay1s(uchar t)
  215. {
  216.         for (;t>0;t--)
  217.                 {
  218.             Delay1Ms(250);
  219.                 Delay1Ms(250);
  220.                 Delay1Ms(250);
  221.                 Delay1Ms(250);
  222.             }       
  223. }
  224. void delayus()//us微秒延时
  225. {
  226. _nop_();
  227. _nop_();
  228. _nop_();
  229. _nop_();
  230. }
  231. void delay(unsigned int n)
  232. {
  233.     unsigned int x;
  234.     while (n--)
  235.     {
  236.         x = 5000;
  237.         while (x--);
  238.     }
  239. }
  240.   void InitADC() //10位AD数据缓存
  241. {
  242. unsigned char i;
  243.    
  244.    P1ASF = 0x01;//设置P1.0为AD脚,P1ASF = 0x01 其他P1口为普通IO功能
  245.           
  246.     ADC_RES = 0;                    //清空AD输出高8位
  247.          
  248.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch0;
  249.     delay(8);                       //ADC power-on delay and Start A/D conversion
  250. }
  251. /*****************************向12864写入8位数据*************************************/
  252. void LCD12864_Wbyte(uchar byte)
  253. {
  254.         uchar i;

  255.         for(i=0;i<8;i++)
  256.                 {
  257.                 LCD12864_SCLK = 0;
  258.                 byte <<= 1;                         //左移待写入数据,使最高位移至CY
  259.                 LCD12864_STD = CY;        //写入一位数据
  260.                 LCD12864_SCLK = 1;
  261.                 LCD12864_SCLK = 0;   
  262.                 }
  263. }
  264. /***************************从12864读出8位数据***返回:sdat************************************/
  265. uchar LCD12864_Rbyte(void)
  266. {
  267.      uchar i,sdat,temp1,temp2;
  268.      temp1 = 0;
  269.      temp2 = 0;
  270. //==========12864的串行数据输出形式是D7-D6-D5-D4-0-0-0-0-D3-D2-D1-D0-0-0-0-0,故要度两个八位整合==============
  271.      for(i=0;i<8;i++)
  272.                 {
  273.                 temp1=temp1 << 1;
  274.                 LCD12864_SCLK = 0;
  275.                 LCD12864_SCLK = 1;            
  276.                 LCD12864_SCLK = 0;
  277.                 if( LCD12864_STD )        temp1|=0x01;        //tempe1:D7-D6-D5-D4-0-0-0-0
  278.                 }
  279.      for(i=0;i<8;i++)
  280.                 {
  281.                 temp2=temp2 << 1;
  282.                 LCD12864_SCLK = 0;
  283.                 LCD12864_SCLK = 1;            
  284.                 LCD12864_SCLK = 0;
  285.                 if( LCD12864_STD ) temp2|=0x01;   //tempe2:D3-D2-D1-D0-0-0-0-0
  286.                 }
  287.         sdat = ((temp1 & 0xf0)|(temp2 >> 4));  //取出D7\D6\D5\D4\D3\D2\D1\D0                    
  288.         return sdat;  //返回一个值(sdat)
  289. }
  290. /****************************读忙状态**************************************/
  291. void LCD12864_busy( void )
  292. {
  293.         do        LCD12864_Wbyte( LCD12864_R_COM );                //LCD12864_RW=11111,RW(1),RS(0),0
  294.         while( LCD12864_Rbyte() & 0x80 );         //读BF,直到BF == 0
  295. }
  296. /*************************dat_com=0写指令,dat_com=1写数据*****************************************/
  297. void LCD12864_W (bit dat_com,uchar byte)
  298. {
  299.         uchar temp;
  300.         if(dat_com == 0)         //为零,写入指令
  301.                 temp = LCD12864_W_COM;        //11111,RS(0),RW(0),0
  302.         else                            //否则,写入数据
  303.                 temp = LCD12864_W_DAT;        //11111,RS(1),RW(0),0
  304.         LCD12864_CS = 1;                //片选使能
  305.         LCD12864_busy();                //LCD忙检测
  306.         LCD12864_Wbyte(temp);        //写入模式选择,指令还是数据
  307.         LCD12864_Wbyte(byte&0xf0);        //写入字节
  308.         LCD12864_Wbyte((byte<<4)&0xf0);        //写入字节
  309.     LCD12864_CS = 0;                //片选关闭
  310. }
  311. /****************************LCD12864初始化**************************************/

  312. void LCD12864_Init(void)
  313. {
  314.         LCDRST=1;
  315.         LCD12864_PSB = 0;        //选择串口模式
  316.         LCD12864_W(LCD12864_COM,0x30);        //基本指令功能.
  317.         LCD12864_W(LCD12864_COM,0x03);        //允许输入卷动位址
  318.         LCD12864_W(LCD12864_COM,0x0c);                //脱离随眠状态,显示打开,关光标,反白关.
  319.         LCD12864_W(LCD12864_COM,0x01);                //清屏指令.
  320.         LCD12864_W(LCD12864_COM,0x06);        //AC自动加一,光标右移,整体显示不移动   
  321. }
  322. /**************************LCD12864字符位置自定义显示****************************************/
  323. void LCD12864_WPoss(uchar x,uchar y,uchar *buff)
  324. {
  325.         uchar addr,i=0;
  326.         switch (x)
  327.                 {
  328.                 case 0:addr=0x80;break;
  329.                 case 1:addr=0x90;break;
  330.                 case 2:addr=0x88;break;
  331.                 case 3:addr=0x98;break;
  332.                 }
  333.         addr=addr+y;

  334.         LCD12864_W(LCD12864_COM,LCD12864_COM_BASIC);        //8BitMCU,基本指令集合
  335.         LCD12864_W(LCD12864_COM,addr);                                        //显示在自定义位置

  336.         while(buff[i]!='\0')
  337.                 {       
  338.                 LCD12864_W(LCD12864_DAT,buff[i++]);
  339.                 if(++y==16)
  340.                         {
  341.                         y=0;
  342.                         if(++x==4) x=0;

  343.                         switch (x)
  344.                                 {
  345.                                 case 0:addr=0x80;break;
  346.                                 case 1:addr=0x90;break;
  347.                                 case 2:addr=0x88;break;
  348.                                 case 3:addr=0x98;break;
  349.                                 }
  350.                         addr=addr+y;
  351.                         LCD12864_W(LCD12864_COM,addr);
  352.                         }
  353.        
  354.                 }
  355. }
  356. /************************************以上为DS18B20内容******************************************/
  357. /******************DS18B20温度***********************/
  358. sbit    DS18B20=P0^6;
  359. #define DS18B20_H {DS18B20=1;}
  360. #define DS18B20_L {DS18B20=0;}
  361. uchar DS18B20_V() {return DS18B20;}
  362. void  Read_Temp();
  363. uchar DS18B20_Reset();
  364. void  DS18B20_WriteData(unsigned char wData);
  365. uchar DS18B20_ReadData();
  366. uchar g=2;//STC12比STC8951快的倍数(只有1-2倍可用)
  367. /***************************18B20温度返回*******wd******************/
  368. uchar temperature[2];//定义一个整合数据
  369. long wd()
  370. {
  371.         unsigned char temp_data;
  372.         long wd=0;//温度值清0

  373.         temp_data = temperature[1];
  374.         temp_data &= 0xf0; //取高4位
  375.         if (temp_data==0xf0) //判断是正温度还是负温度读数
  376.         {
  377.                 //负温度读数求补,取反加1,判断低8位是否有进位
  378.                 if (temperature[0]==0)
  379.                 { //有进位,高8位取反加1
  380.                         temperature[0]=~temperature[0]+1;
  381.                         temperature[1]=~temperature[1]+1;
  382.                 }
  383.                 else
  384.                 { //没进位,高8位不加1
  385.                         temperature[0]=~temperature[0]+1;
  386.                         temperature[1]=~temperature[1];
  387.                 }
  388.         }
  389.         wd=(temperature[1]*256+temperature[0])*(0.0625*10000);

  390.         return wd;//返回一个数据(温度)用于显示
  391. }
  392. /**********************读温度数据函数***********************************/
  393. void Read_Temp()
  394. {
  395.         unsigned char i;
  396.         DS18B20_Reset(); //复位
  397.         DS18B20_WriteData(0xcc); //跳过ROM命令
  398.         DS18B20_WriteData(0x44); //温度转换命令
  399.         DS18B20_Reset(); //复位
  400.         DS18B20_WriteData(0xcc); //跳过ROM命令
  401.         DS18B20_WriteData(0xbe); //读DS18B20温度暂存器命令
  402.         for (i=0;i<2;i++)
  403.         {
  404.                 temperature[i]=DS18B20_ReadData();
  405.         }
  406.         DS18B20_Reset(); //复位,结束读数据
  407. }
  408. /****************************DS18B20复位及存在检测******************************/
  409. uchar DS18B20_Reset()
  410. {
  411.         unsigned char i;
  412.         uchar flag; //DS18B20存在标志位
  413.         DS18B20_L; //拉低总线
  414.         for (i=(240*g);i>0;i--);//延时480微秒,产生复位脉冲
  415.         DS18B20_H; //释放总线
  416.         for (i=(40*g);i>0;i--); //延时80微秒对总线采样
  417.         flag = DS18B20_V();
  418.         for (i=(200*g);i>0;i--); //延时400微秒等待总线恢复
  419.         return (flag); //根据flag的值可以知道DS18B20是否存在或损坏
  420. } //可以加声音告警提示DS18B20故障
  421. /***********************写数据到DS18B20 ***********************************/
  422. void DS18B20_WriteData(unsigned char wData)
  423. {
  424.         unsigned char i,j;
  425.         for (i=8;i>0;i--)
  426.         {
  427.                 DS18B20_L; //拉低总线,产生写信号
  428.                 for (j=(7*g);j>0;j--); //延时14us
  429.                 if((bit)(wData&0x01)==1)//发送1位
  430.                 {
  431.                         DS18B20_H;
  432.                 }
  433.                 else
  434.                 {
  435.                         DS18B20_L;
  436.                 }

  437.                 for (j=(30*g);j>0;j--); //延时60us,写时序至少要60us
  438.                 DS18B20_H; //释放总线,等待总线恢复
  439.                 wData>>=1; //准备下一位数据的传送
  440.         }
  441. }
  442. /************************DS18B20中读出数据**********************************/
  443. unsigned char DS18B20_ReadData()
  444. {
  445.         unsigned char i,j,TmepData;
  446.         for (i=8;i>0;i--)
  447.         {
  448.                 TmepData>>=1;
  449.                 DS18B20_L; //拉低总线,产生读信号
  450.                 for (j=(2*g);j>0;j--); //延时4us
  451.                 DS18B20_H; //释放总线,准备读数据
  452.                 for (j=(4*g);j>0;j--); //延时8微秒读数据
  453.                 if (DS18B20_V()) TmepData |= 0x80;
  454.                 for (j=(15*g);j>0;j--); //延时30us
  455.                 DS18B20_H; //拉高总线,准备下一位数据的读取.
  456.         }
  457.         return (TmepData);//返回读到的数据
  458. }

  459. /********************写一个字节**************/
  460. void write_1302byte(uchar com)
  461. {
  462. uchar i;
  463. sclk=0;
  464. delayus();
  465. for(i=8;i>0;i--)
  466.   {
  467.    io=com&0x01;//只要是从低位取数,向高位一定要和0X01与
  468.    delayus();
  469.    sclk=1;//为写数据制造上升沿。
  470.    delayus();
  471.    sclk=0;//为下一次上升沿写下一个字节做准备
  472.    com>>=1;//将数据向右移一位,准备写入下一个数据
  473.   }       
  474. }
  475. /********************读一个字节***************/
  476. uchar read_1302byte()
  477. {
  478. uchar i,dat;
  479. delayus();
  480. for(i=8;i>0;i--)
  481.   {
  482.    dat>>=1;
  483.    if(io==1)
  484.    {
  485.      dat|=0x80;//将1取出,写在dat的最高位。
  486.    }
  487.    sclk=1;//把sclk拉高,为读一个字节的下降沿做准备
  488.    delayus();//稍等制造一个高电平
  489.    sclk=0;//为读一个字节制造下降沿
  490.    delayus();
  491.   }
  492. return dat;
  493. }
  494. /*************写入一个时间位*****************/
  495. void write_1302(uchar add,uchar dat)
  496. {
  497. rst=0;
  498. delayus();
  499. sclk=0;
  500. delayus();
  501. rst=1;
  502. write_1302byte(add);
  503. delayus();
  504. write_1302byte(dat);
  505. delayus();
  506. rst=0;
  507. }
  508. /****************读1302的地址******************/
  509. uchar read_1302add(uchar add)
  510. {
  511. uchar timedat;
  512. rst=0;
  513. _nop_();
  514. sclk=0;
  515. _nop_();
  516. rst=1;
  517. write_1302byte(add);//写入要读的地址
  518. timedat=read_1302byte();//将上面地址中的数据赋给timedat
  519. sclk=1;
  520. _nop_();
  521. rst=0;
  522. io=0;//字节读操作完后,将ds1302的IO端口置零就可以消除85、45和??闪现等问题
  523. return timedat;
  524. }
  525. /****************初始化1302*********************/
  526. void init_1302()
  527. {
  528.   flag=read_1302add(0x81);//读秒寄存器的最高位,读出时钟状态
  529. if(flag&0x80)//判断时钟是否关闭,若内部关闭,则初始,若没关闭,不初始化,还在走
  530. {
  531.    write_1302(0x8e,0x00);//去除写保护
  532.    write_1302(0x80,((10/10)<<4|(10%10)));//写秒寄存器,并写入初值55
  533.    write_1302(0x82,((25/10)<<4|(25%10)));//写分寄存器,并写入初值59
  534.    write_1302(0x84,((1/10)<<4|(1%10)));//写小时寄存器,并写入初值23
  535.    write_1302(0x86,((10/10)<<4|(10%10)));//写日寄存器,并写入初值18
  536.    write_1302(0x88,((4/10)<<4|(4%10)));//写月寄存器,并写入初值2
  537.    write_1302(0x8a,((2/10)<<4|(2%10)));//写周寄存器,并写入初值5
  538.    write_1302(0x8c,((18/10)<<4|(18%10)));//写年寄存器,并写入初值12,不能写2012年
  539.    write_1302(0x90,0xa5);//写充电方式
  540.    write_1302(0x8e,0x80);//加上写保护  去写保护和if(flag&0x80)//判断 可        改 时 间
  541.     }
  542. }
  543. /*****************读出秒的十进制数***************************/
  544. uchar readsecond()
  545. {
  546. uchar dat;                                                                                                                                         
  547. dat=read_1302add(0x81);
  548. second=((dat&0x70)>>4)*10+(dat&0x0f);
  549. return second;
  550. }
  551. /*****************读出分的十进制数***************************/
  552. uchar readminute()
  553. {
  554. uchar dat;
  555. dat=read_1302add(0x83);
  556. minute=((dat&0x70)>>4)*10+(dat&0x0f);
  557. return minute;
  558. }
  559. /*****************读出小时的十进制数***************************/
  560. uchar readhour()
  561. {
  562. uchar dat;
  563. dat=read_1302add(0x85);
  564. hour=((dat&0x70)>>4)*10+(dat&0x0f);
  565. return hour;
  566. }
  567. /*****************读出天的十进制数***************************/
  568. uchar readday()
  569. {
  570. uchar dat;
  571. dat=read_1302add(0x87);
  572. day=((dat&0x70)>>4)*10+(dat&0x0f);
  573. return day;
  574. }
  575. /*****************读出月的十进制数***************************/
  576. uchar readmonth()
  577. {
  578. uchar dat;
  579. dat=read_1302add(0x89);
  580. month=((dat&0x70)>>4)*10+(dat&0x0f);
  581. return month;
  582. }
  583. /*****************读出周的十进制数***************************/
  584. uchar readweek()
  585. {
  586. uchar dat;
  587. dat=read_1302add(0x8b);
  588. week=((dat&0x70)>>4)*10+(dat&0x0f);
  589. return week;
  590. }
  591. /*****************读出年的十进制数***************************/
  592. uchar readyear()
  593. {
  594. uchar dat;
  595. dat=read_1302add(0x8d);
  596. year=((dat&0xf0)>>4)*10+(dat&0x0f);
  597. return year;
  598. }
  599. /************************读出所有时间**********************/
  600. readtime()
  601. {
  602. readsecond();
  603. readminute();
  604. readhour();
  605. readday();
  606. readmonth();
  607. readweek();
  608. readyear();
  609. }


  610. /************************显示11************************************/

  611. void display11(long temp)
  612. {
  613.     uchar dt1,dt2,dt3,dt4,dt5,dt6,dt7,dt8;
  614.         //temp=12345678;
  615.         dt1 = temp%10;//1位
  616.         dt2 = temp%100/10;//2位
  617.         dt3 = temp%1000/100;//3位
  618.         dt4 = temp%10000/1000;//4位

  619.         dt5 = temp%100000/10000;//5位
  620.         dt6 = temp%1000000/100000;//6位
  621.         dt7 = temp%10000000/1000000;//7位
  622.         dt8 = temp/10000000;//8位             最高位  

  623.         LCD12864_WPoss(3,5,"  ");//第1行显示表1
  624.     // LCD12864_W(0,0x80+3);//LCD12864_W ((0或1),****)  0写指令  1写数据

  625.      //LCD12864_W(1,tabe[dt8]);//6位
  626.      //LCD12864_W(1,tabe[dt7]);//5位
  627.      LCD12864_W(1,tabe[dt6]);//4位
  628.      LCD12864_W(1,tabe[dt5]);//3位
  629.          //LCD12864_W(1,0x2e);
  630.          //LCD12864_W(1,tabe[dt4]);//4位
  631.     // LCD12864_W(1,tabe[dt3]);//3位
  632.          //LCD12864_W(1,tabe[dt2]);//4位
  633.      //LCD12864_W(1,tabe[dt1]);//3位
  634.      LCD12864_WPoss(3,7,"℃");//第1行显示表1
  635. }

  636. /************************display2显示2************************************/
  637. void display1(uint dat1,dat2,dat3)
  638. {       
  639.     uint ge1,ge2,ge3,shi1,shi2,shi3;
  640.     dat1=day;   
  641.     dat2=month;
  642.     dat3=year;  
  643.         ge1= dat1%10;//1位
  644.         shi1= dat1%100/10;//2位
  645.         ge2= dat2%10;//3位
  646.         shi2= dat2%100/10;//4位
  647.         ge3= dat3%10;//5位
  648.         shi3 = dat3%100/10;//6位
  649.         LCD12864_WPoss(3,0,"20");//第3行显示表1
  650.   // LCD12864_W(0,0x80+3);//LCD12864_W ((0或1),****)  0写指令  1写数据
  651.          readtime();//读出所有时间
  652.      LCD12864_W(1,tabe[shi3]);
  653.      LCD12864_W(1,tabe[ge3]);
  654.      LCD12864_W(1,0x2d);

  655.      LCD12864_W(1,tabe[shi2]);
  656.      LCD12864_W(1,tabe[ge2]);
  657.      LCD12864_W(1,0x2d);


  658.      LCD12864_W(1,tabe[shi1]);
  659.      LCD12864_W(1,tabe[ge1]);
  660. }
  661. /************************display2显示2************************************/
  662. void display2(uint dat1,dat2,dat3,dat4 )
  663. {
  664.     uint ge1,ge2,ge3,ge4,shi1,shi2,shi3,shi4;
  665.     dat1=second;   
  666.     dat2=minute;
  667.     dat3=hour;
  668.         dat4=week;  
  669.         ge1= dat1%10;//1位
  670.         shi1= dat1%100/10;//2位
  671.         ge2= dat2%10;//3位
  672.         shi2= dat2%100/10;//4位
  673.         ge3= dat3%10;//5位
  674.         shi3 = dat3%100/10;//6位
  675.         ge4= dat4%10;//7位
  676.         shi4 = dat4%100/10;//8位


  677.         LCD12864_WPoss(1,0,"时间:");//第1行显示表1
  678.   // LCD12864_W(0,0x80+3);//LCD12864_W ((0或1),****)  0写指令  1写数据
  679.          readtime();//读出所有时间
  680.      LCD12864_W(1,tabe[shi3]);
  681.      LCD12864_W(1,tabe[ge3]);
  682.      LCD12864_W(1,0x3a);

  683.      LCD12864_W(1,tabe[shi2]);
  684.      LCD12864_W(1,tabe[ge2]);
  685.      LCD12864_W(1,0x3a);


  686.      LCD12864_W(1,tabe[shi1]);
  687.      LCD12864_W(1,tabe[ge1]);

  688.          //LCD12864_W(1,0x2f);//显示"/ "
  689.          //LCD12864_W(1,tabe[shi4]);
  690.      //LCD12864_W(1,tabe[ge4]);        // 显示周
  691.         if(ge4==1){LCD12864_WPoss(1,7,"一"); }
  692.         if(ge4==2){LCD12864_WPoss(1,7,"二"); }
  693.         if(ge4==3){LCD12864_WPoss(1,7,"三"); }
  694.         if(ge4==4){LCD12864_WPoss(1,7,"四"); }
  695.         if(ge4==5){LCD12864_WPoss(1,7,"五"); }
  696.         if(ge4==6){LCD12864_WPoss(1,7,"六"); }
  697.         if(ge4==7){LCD12864_WPoss(1,7,"日"); }
  698. }
  699.   /************************显示温度和电阻计算3************************************/
  700. void display3(long temp1)
  701. {       
  702.     uchar dt1,dt2,dt3,dt4,dt5,dt6,dt7,dt8;
  703.         uchar x;
  704.         uint i;

  705.     num=(39*ad_out*(3470*(1/(273.15+15)-1/(273.15+25))))/2; //温度计算与修正约10K
  706.    for(i=0;i<440;i++)//判断采集电压值大于或者等于表格电压时,停下来并记录当前i值
  707.    {
  708.     if(num >= vt_table[i])
  709.        {
  710.         num=i;
  711.                 break;             //检测到即跳出循环,否则继续循环
  712.         }
  713.                 }                       
  714.            temp1=(num*10)/2;//放大10倍
  715.         if(temp1<1)
  716.         temp1=9999;        //最大
  717.         if(temp1<=400)// 回到26度以下充电才能再次开始
  718.         {
  719.          LCD12864_WPoss(0,1,"充电进行中∝");//第1行显示表1 ≈≈∝≠
  720.          display2();//显示时间 //Ok
  721.          bb=1;
  722.          ntcok=0;   //NTC OK
  723.          ntcno=1;
  724.          }
  725.          else
  726.          {
  727.          if(temp1>=800)//充电报警温度
  728.         {
  729.          LCD12864_WPoss(0,1,"充电中断  ≠");//第1行显示表1 ≈≈∝≠
  730.          
  731.          ntcok=1;   //NTC OK                                                                                                                                                                                             
  732.          for(x=2;x>0;x--)
  733.          {         
  734.          LCD12864_WPoss(1,0,"    超温报警!   ");//第1行显示表1 ≈≈∝≠
  735.          ntcno=0;
  736.          bb=0;
  737.          Delay1s(1);
  738.          LCD12864_WPoss(1,0,"                ");//第1行显示表1 ≈≈∝≠
  739.          ntcno=1;
  740.          bb=1;
  741.          Delay1s(1);
  742.          }                  
  743.          }
  744.          }               
  745.         dt1 = temp1%10;//1位
  746.         dt2 = temp1%100/10;//2位
  747.         dt3 = temp1%1000/100;//3位
  748.         dt4 = temp1%10000/1000;//4位

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

  753.         LCD12864_WPoss(2,0,"温度:");//第2行显示表1
  754.     //LCD12864_W(0,0x80+3);//LCD12864_W ((0或1),****)  0写指令  1写数据
  755.         //LCD12864_W(1,tabe[dt8]);//8位
  756.     //LCD12864_W(1,tabe[dt7]);//7位
  757.     //LCD12864_W(1,tabe[dt6]);//6位        // °         Ω℃℉
  758.     //LCD12864_W(1,tabe[dt5]);//5位
  759.      LCD12864_W(1,tabe[dt4]);//4位       
  760.      LCD12864_W(1,tabe[dt3]);//3位
  761.          LCD12864_W(1,tabe[dt2]);//2位
  762.          LCD12864_W(1,0x2e);// 显示点         
  763.          LCD12864_W(1,tabe[dt1]);//1位
  764.      LCD12864_WPoss(2,6,"℃");//第1行显示表1
  765. }   
  766.   /************************display4显示4************************************/
  767. void display4(uint temp1)
  768. {       
  769.     uchar dt1,dt2,dt3,dt4,dt5,dt6,dt7,dt8;
  770.         temp1=ad_out*(3270*(1/(273.15+25)-1/(273.15+85))); //温度计算与修正约10K
  771.         if(temp1>1250)
  772.         {temp1=9999;}                 
  773.         dt1 = temp1%10;//1位
  774.         dt2 = temp1%100/10;//2位
  775.         dt3 = temp1%1000/100;//3位
  776.         dt4 = temp1%10000/1000;//4位

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

  781.         LCD12864_WPoss(3,0,"电阻:");//第2行显示表1
  782.     //LCD12864_W(0,0x80+3);//LCD12864_W ((0或1),****)  0写指令  1写数据
  783.          //LCD12864_W(1,tabe[dt8]);//8位
  784.     //LCD12864_W(1,tabe[dt7]);//7位
  785.      //LCD12864_W(1,tabe[dt6]);//6位        // °         Ω℃℉
  786.      //LCD12864_W(1,tabe[dt5]);//5位
  787.      LCD12864_W(1,tabe[dt4]);//4位         
  788.      LCD12864_W(1,tabe[dt3]);//3位
  789.          LCD12864_W(1,0x2e);// 显示点
  790.          LCD12864_W(1,tabe[dt2]);//2位         
  791.          LCD12864_W(1,tabe[dt1]);//1位
  792.      LCD12864_WPoss(3,6,"K");//第1行显示表1
  793. }
  794. void Disp_img(unsigned char  *img)        //图形方式12864显示字模221 横向取膜
  795. {
  796.         unsigned char i,j;
  797.         unsigned int k = 0;

  798.         LCD12864_W(0,0x36); //图形方式
  799.         for(i=0;i<32;i++)
  800.           {
  801.                 LCD12864_W(0,0x80+i);
  802.                 LCD12864_W(0,0x80);
  803.             for(j=0;j<16;j++)
  804.                 {
  805.                         LCD12864_W(1,img[k++]);
  806.                 }
  807.           }

  808.         for(i=0;i<32;i++)
  809.           {
  810.                 LCD12864_W(0,0x80+i);
  811.                 LCD12864_W(0,0x88);
  812.             for(j=0;j<16;j++)
  813.                 {
  814.                         LCD12864_W(1,img[k++]);
  815.                   }
  816.         }
  817. }


  818. ////////////////////////*************第二*************************************************//////
  819. /************************显示1************************************/
  820. void display18(long temp)
  821. {
  822.     /*
  823.         uchar dt1,dt2,dt3,dt4,dt5,dt6,dt7,dt8;

  824.         dt1 = temp%10;//1位
  825.         dt2 = temp%100/10;//2位
  826.         dt3 = temp%1000/100;//3位
  827.         dt4 = temp%10000/1000;//4位

  828.         dt5 = temp%100000/10000;//5位
  829.         dt6 = temp%1000000/100000;//6位
  830.         dt7 = temp%10000000/1000000;//7位
  831.         dt8 = temp/10000000;//8位             最高位  

  832.         LCD12864_WPoss(1,0,"温度:");//第1行显示表1
  833.     // LCD12864_W(0,0x80+3);//LCD12864_W ((0或1),****)  0写指令  1写数据

  834.      LCD12864_W(1,tabe[dt6]);//6位
  835.      LCD12864_W(1,tabe[dt5]);//5位
  836.      LCD12864_W(1,0x2e);
  837.                                                                                                        
  838.      LCD12864_W(1,tabe[dt4]);//4位
  839.      LCD12864_W(1,tabe[dt3]);//3位
  840.      LCD12864_WPoss(1,6,"°C");//第1行显示表1
  841.          */
  842.         LCD12864_WPoss(0,1,"智能电阻测试");//第1行显示表1
  843.         //LCD12864_WPoss(1,0,"范围:NTC=10K");//第1行显示表1
  844. }
  845. /************************display2显示2************************************/
  846. /*
  847. void display28(uint dat1,dat2,dat3,dat4 )
  848. {
  849.     uint ge1,ge2,ge3,ge4,shi1,shi2,shi3,shi4;
  850.     dat1=second;   
  851.     dat2=minute;
  852.     dat3=hour;
  853.         dat4=week;  
  854.         ge1= dat1%10;//1位
  855.         shi1= dat1%100/10;//2位
  856.         ge2= dat2%10;//3位
  857.         shi2= dat2%100/10;//4位
  858.         ge3= dat3%10;//5位
  859.         shi3 = dat3%100/10;//6位
  860.         ge4= dat4%10;//7位
  861.         shi4 = dat4%100/10;//8位


  862.         LCD12864_WPoss(0,0,"时间:");//第1行显示表1
  863.   // LCD12864_W(0,0x80+3);//LCD12864_W ((0或1),****)  0写指令  1写数据
  864.          readtime();//读出所有时间
  865.      LCD12864_W(1,tabe[shi3]);
  866.      LCD12864_W(1,tabe[ge3]);
  867.      LCD12864_W(1,0x3a);

  868.      LCD12864_W(1,tabe[shi2]);
  869.      LCD12864_W(1,tabe[ge2]);
  870.      LCD12864_W(1,0x3a);


  871.      LCD12864_W(1,tabe[shi1]);
  872.      LCD12864_W(1,tabe[ge1]);

  873.          LCD12864_W(1,0x2f);
  874.          //LCD12864_W(1,tabe[shi4]);
  875.      LCD12864_W(1,tabe[ge4]);

  876. }
  877.   /************************显示温度和电阻计算3************************************/

  878. void display38(long temp1)
  879. {       
  880.     uchar dt1,dt2,dt3,dt4,dt5,dt6,dt7,dt8;
  881.         //temp1 = ad_out; //10位AD读取的数值是0-1024,
  882.         temp1=39*ad_out*(3470*(1/(273.15+15)-1/(273.15+25))); //温度计算与修正约10K
  883.       if(temp1>=1000&&temp1<10000)//>500&&<950/一个NTC约930K两个就大于950用于判断有几个或没有NTC在线                       
  884.            { pcs1++; //
  885.                     ntcok=0;//
  886.                  ntcno=1;//
  887.                     bb=0;//
  888.                  Delay1Ms(1000);//等值
  889.                  bb=1;                                     
  890.         dt1 = temp1%10;//1位
  891.         dt2 = temp1%100/10;//2位
  892.         dt3 = temp1%1000/100;//3位
  893.         dt4 = temp1%10000/1000;//4位

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

  898.         LCD12864_WPoss(2,0,"电阻:");//第2行显示表1
  899.     //LCD12864_W(0,0x80+3);//LCD12864_W ((0或1),****)  0写指令  1写数据
  900.          //LCD12864_W(1,tabe[dt8]);//8位
  901.     //LCD12864_W(1,tabe[dt7]);//7位
  902.      LCD12864_W(1,tabe[dt6]);//6位        // °         Ω℃℉
  903.      LCD12864_W(1,tabe[dt5]);//5位
  904.      LCD12864_W(1,tabe[dt4]);//4位
  905.          LCD12864_W(1,0x2e);// 显示点
  906.      LCD12864_W(1,tabe[dt3]);//3位
  907.          //LCD12864_W(1,tabe[dt2]);//2位         
  908.          //LCD12864_W(1,tabe[dt1]);//1位
  909.      LCD12864_WPoss(2,6,"K ");//第1行显示表1
  910.          LCD12864_WPoss(1,0,"    产品合格    ");//第2行显示表1         
  911.   }
  912.   else{
  913.    if(temp1>=10000&&temp1<16000)
  914.    {

  915.     dt1 = temp1%10;//1位
  916.         dt2 = temp1%100/10;//2位
  917.         dt3 = temp1%1000/100;//3位
  918.         dt4 = temp1%10000/1000;//4位

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

  923.         LCD12864_WPoss(2,0,"电阻:");//第2行显示表1
  924.     //LCD12864_W(0,0x80+3);//LCD12864_W ((0或1),****)  0写指令  1写数据
  925.          //LCD12864_W(1,tabe[dt8]);//8位
  926.     //LCD12864_W(1,tabe[dt7]);//7位
  927.      LCD12864_W(1,tabe[dt6]);//6位        // °         Ω℃℉
  928.      LCD12864_W(1,tabe[dt5]);//5位
  929.      LCD12864_W(1,tabe[dt4]);//4位
  930.          LCD12864_W(1,0x2e);// 显示点
  931.      LCD12864_W(1,tabe[dt3]);//3位
  932.          //LCD12864_W(1,tabe[dt2]);//2位         
  933.          //LCD12864_W(1,tabe[dt1]);//1位
  934.      LCD12864_WPoss(2,6,"K ");//第1行显示表1
  935.    }
  936.     else
  937.   {
  938.    LCD12864_WPoss(2,0,"电阻:*****");//第2行显示表1
  939.    LCD12864_WPoss(1,2,"        ");//第2行显示表1
  940.                     ntcok=1;//
  941.                  ntcno=0;//
  942.                     bb=1;//
  943.                  pcs1=0;//用于清除计数
  944.                  } }
  945. if(pcs1==3&&bb==1) // 同时满足两个条件,测试放手才计数
  946. {
  947. pcs++;
  948. if(pcs>9998)pcs=9999;        //如果最高温度高于99.9度就只显示99.9

  949. }

  950. }

  951.   /************************display4显示4************************************/
  952.   
  953. void display48(uint temp1)
  954. {       
  955.     uchar dt1,dt2,dt3,dt4,dt5,dt6,dt7,dt8;
  956.         temp1=pcs;                 
  957.         dt1 = temp1%10;//1位
  958.         dt2 = temp1%100/10;//2位
  959.         dt3 = temp1%1000/100;//3位
  960.         dt4 = temp1%10000/1000;//4位

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

  965.         LCD12864_WPoss(3,0,"已检: ");//第2行显示表1
  966.     //LCD12864_W(0,0x80+3);//LCD12864_W ((0或1),****)  0写指令  1写数据
  967.          //LCD12864_W(1,tabe[dt8]);//8位
  968.     //LCD12864_W(1,tabe[dt7]);//7位
  969.      //LCD12864_W(1,tabe[dt6]);//6位        // °         Ω℃℉
  970.      LCD12864_W(1,tabe[dt5]);//5位
  971.      LCD12864_W(1,tabe[dt4]);//4位
  972.          //LCD12864_W(1,0x2e);// 显示点
  973.      LCD12864_W(1,tabe[dt3]);//3位
  974.          LCD12864_W(1,tabe[dt2]);//2位         
  975.          LCD12864_W(1,tabe[dt1]);//1位
  976.      LCD12864_WPoss(3,6,"PCS ");//第1行显示表1
  977. }

  978. /*****************************main**********************************************/
  979. void main()
  980. {   
  981.     uchar j;
  982.         int i=0;
  983.         Delay1s(1);       
  984.         LCD12864_Init();
  985.         InitADC();                      //AD初始化
  986.     IE = 0xa0;                      //允许AD中断
  987.         init_1302();
  988.         for(j=1;j>0;j-- )
  989.         {
  990.          LCD12864_WPoss(0,0,"全智能插头测试仪");//第1行显示表1 ≈≈∝≠         
  991.          LCD12864_WPoss(1,1,"");//第1行显示表1 ≈≈∝≠         
  992.          LCD12864_WPoss(2,2,"NTC=10 k");//第1行显示表1 ≈≈∝≠         
  993.          LCD12864_WPoss(3,0,"苏州宝兴电线电缆");//第1行显示表1 ≈≈∝≠          
  994.          Delay1s(5);
  995.          LCD12864_WPoss(0,0,"                ");//第1行显示表1 ≈≈∝≠         
  996.          LCD12864_WPoss(1,0,"                ");//第1行显示表1 ≈≈∝≠         
  997.          LCD12864_WPoss(2,0,"                ");//第1行显示表1 ≈≈∝≠         
  998.          LCD12864_WPoss(3,0,"                ");//第1行显示表1 ≈≈∝≠
  999.          Delay1s(1);
  1000.          LCD12864_WPoss(0,0,"");//第1行显示表1 ≈≈∝≠         
  1001.          LCD12864_WPoss(1,1,"温度检测中--");//第1行显示表1 ≈≈∝≠         
  1002.          LCD12864_WPoss(2,2,"");//第1行显示表1 ≈≈∝≠         
  1003.          LCD12864_WPoss(3,0,"");//第1行显示表1 ≈≈∝≠           
  1004.          Delay1s(9);
  1005.          LCD12864_WPoss(0,0,"                ");//第1行显示表1 ≈≈∝≠         
  1006.          LCD12864_WPoss(1,0,"                ");//第1行显示表1 ≈≈∝≠         
  1007.          LCD12864_WPoss(2,0,"                ");//第1行显示表1 ≈≈∝≠         
  1008.          LCD12864_WPoss(3,0,"                ");//第1行显示表1 ≈≈∝≠
  1009.          Delay1s(1);
  1010.          }
  1011.          Disp_img(logo); //显示一幅画面
  1012.          Delay1s(20);
  1013.          LCD12864_Init(); //再次初始化用于返回
  1014.     while(1)
  1015. {               
  1016.                 EA = 0;
  1017.               Read_Temp(); //读取温度值
  1018.             Delay1Ms(100);//等温度值
  1019.                 EA = 1;// 打开AD中断
  1020.            if(k==0)
  1021.           {
  1022.             display18(wd());//显示温度值                                             
  1023.                 display38();//显示电压 //Ok
  1024.                 display48();//显示电压 //Ok
  1025.                 if(k1==0)pcs=0;//清除PCS计数display48();//显示日期 //Ok             
  1026.            }
  1027.            else
  1028.            {
  1029.             display11(wd());//显示日期 //Ok                           
  1030.                 display1();//显示时间 //Ok         
  1031.                 display3();//显示电压 //Ok
  1032.          
  1033.                 }
  1034. }
  1035. }
  1036.   void adc_isr() interrupt 5 using 1 //通道电压整合
  1037. {
  1038.     ADC_CONTR &= !ADC_FLAG;                                 //Clear ADC interrupt flag
  1039.     ad_out = (ADC_RES << 2) + ADC_LOW2;                     //高8位+低两位
  1040.         //if(++ch>7)ch=0;//循环显示8个通道AD采样
  1041.     ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch0;
  1042. }
复制代码
0.png
所有资料51hei提供下载:
用于生产线的多功能NTC电阻测试仪OK3.zip (90.3 KB, 下载次数: 66)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:1 发表于 2018-11-9 00:18 | 显示全部楼层
楼主能分享下原理图吗?
回复

使用道具 举报

ID:65956 发表于 2018-11-15 09:43 | 显示全部楼层
如果有提供原理图就更完美了
回复

使用道具 举报

ID:3802 发表于 2019-1-25 13:35 | 显示全部楼层
楼主能分享下原理图吗?
回复

使用道具 举报

ID:223841 发表于 2019-3-1 17:29 | 显示全部楼层
你这是*DS18B20,也不是NTC的程序啊。
回复

使用道具 举报

ID:358930 发表于 2019-3-1 22:14 来自手机 | 显示全部楼层
51黑51 发表于 2019-3-1 17:29
你这是*DS18B20,也不是NTC的程序啊。

仔细看,DS18B20是用来测环境温度的,NTC是测试产品的,不会显示温度,只显示NTC是否有效成在。这个不是NTC温度计,只是专用测试仪
回复

使用道具 举报

ID:223841 发表于 2019-3-5 09:48 | 显示全部楼层
冰冰洁洁 发表于 2019-3-1 22:14
仔细看,DS18B20是用来测环境温度的,NTC是测试产品的,不会显示温度,只显示NTC是否有效成在。这个不是N ...

所以你这是*DS18B20,也不是NTC的程序啊。
回复

使用道具 举报

ID:223841 发表于 2019-3-5 09:48 | 显示全部楼层
冰冰洁洁 发表于 2019-3-1 22:14
仔细看,DS18B20是用来测环境温度的,NTC是测试产品的,不会显示温度,只显示NTC是否有效成在。这个不是N ...

谢谢分享,谢谢分享,
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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