分享

TTP229触摸模块的51单片机驱动程序

 用久智能 2020-05-20
 网购了一块TTP229的触摸模块。模块中实际使用的是8229BSF集成块。本人用STC89C52搭建了测试电路。用12864液晶显示。
显示01-16,表示16个按钮的对应值。

制作出来的实物图如下:
TTP229.jpgTTP229_1.jpg

单片机源程序如下:
  1. /*********************************************************************************

  2. * 【作    者】:

  3. * 【版    本】:

  4. * 【函数功能】: 利用单线制DS18B20温度传感器, 并在液晶12864上显示

  5. * 【使用说明】: 触摸板P1的第一和第三跳线短接

  6. **********************************************************************************/

  7. #include <reg52.h>

  8. #include <string.h>

  9. #include <math.h>

  10. #include <stdio.h>

  11. #include <intrins.h>

  12. #define uchar unsigned char

  13. #define uint  unsigned int

  14. // 液晶现实属区区

  15. uchar code pic1[];

  16. uchar code pic2[];

  17. uchar code pic3[];

  18. /* 液晶控制接口 -----------------------------------------------*/

  19. sbit RS  = P0^7;

  20. sbit WRD = P0^6;

  21. sbit E   = P0^5;

  22. sbit PSB = P0^4;

  23. sbit RES = P0^3;

  24. sbit sign = P1^0;

  25. sbit sign1 = P1^1;

  26. // TTP229接口

  27. sbit SDA=P1^2;

  28. sbit SCL=P1^3;

  29. // 温度传感器接口

  30. sbit DQ=P3^7; //数据传输线接单片机的相应的引脚

  31. /* 温度测量用变量定义 -----------------------------------------------*/

  32. unsigned char tempL=0; //设全局变量

  33. unsigned char tempH=0;

  34. unsigned int sdate;//测量到的温度的整数部分

  35. unsigned char xiaoshu1;//小数第一位

  36. unsigned char xiaoshu2;//小数第二位

  37. unsigned char xiaoshu;//两位小数

  38. bit  fg=1;        //温度正负标志

  39. // 液晶处理函数

  40. void TransferData(char data1,bit DI);

  41. void display(void);

  42. void display_grapic(void);

  43. void delayms(uint n);

  44. void DisplayLine(uchar line1,uchar line2);

  45. void DisplayGraphic(uchar *adder);

  46. void delay(uint m);

  47. void lcd_mesg(uchar *adder1);

  48. void delay1ms(unsigned int t);

  49. // 18B20温度传感器函数

  50. void ReadTemperature(void);

  51. void Init_DS18B20(void);

  52. unsigned char ReadOneChar();

  53. void WriteOneChar(unsigned char dat);

  54. void Delay10us(unsigned int t);

  55. void Initial_com(void);

  56. // 扫描TTP229电容触摸键盘模块

  57. unsigned int TTP229B(void);

  58. /********************************************************************

  59. * 名称 : Convert(uchar In_Dat)

  60. * 功能 : 因为电路设计时,P2.0--P2.7接法刚好了资料中的相反,所以设计该函数。

  61. * 输入 : 1602资料上的值

  62. * 输出 : 送到1602的值

  63. ***********************************************************************/

  64. unsigned char Convert(uchar In_Dat) {

  65.     uchar i, Out_Dat;

  66.     for(i=0; i<8; i++){

  67.                 Out_Dat=  In_Dat;

  68.     }

  69.     return Out_Dat;

  70. }

  71. void initinal(void)  {         //LCD字库初始化程序

  72.         delay(40);             //大于40MS的延时程序

  73.         PSB=1;                 //设置为8BIT并口工作模式

  74.         delay(1);              //延时

  75.         RES=0;                 //复位

  76.         delay(1);              //延时

  77.         RES=1;                 //复位置高

  78.         delay(10);

  79.         TransferData(0x30,0);  //Extended Function Set :8BIT设置,RE=0: basic instruction set, G=0 :graphic display OFF

  80.         delay(100);            //大于100uS的延时程序

  81.         TransferData(0x30,0);  //Function Set

  82.         delay(37);             ////大于37uS的延时程序

  83.         TransferData(0x08,0);  //Display on Control

  84.         delay(100);            //大于100uS的延时程序

  85.         TransferData(0x10,0);  //Cursor Display Control光标设置

  86.         delay(100);            //大于100uS的延时程序

  87.         TransferData(0x0C,0);  //Display Control,D=1,显示开

  88.         delay(100);            //大于100uS的延时程序

  89.         TransferData(0x01,0);  //Display Clear

  90.         delay(10);             //大于10mS的延时程序

  91.         TransferData(0x06,0);  //Enry Mode Set,光标从右向左加1位移动

  92.         delay(100);            //大于100uS的延时程序

  93. }

  94. /********************************************************************

  95. * 名称 : initina2()

  96. * 功能 : 主函数

  97. * 输入 : 无

  98. * 输出 : 无

  99. ***********************************************************************/

  100. void     initina2(void)           //LCD显示图片(扩展)初始化程序

  101.           {

  102.            delay(40);             //大于40MS的延时程序

  103.            PSB=1;                 //设置为8BIT并口工作模式

  104.            delay(1);              //延时

  105.            RES=0;                 //复位

  106.            delay(1);              //延时

  107.            RES=1;                 //复位置高

  108.            delay(10);

  109.            TransferData(0x36,0);  //Extended Function Set RE=1: extended instruction

  110.            delay(100);            //大于100uS的延时程序

  111.            TransferData(0x36,0);  //Extended Function Set:RE=1: extended instruction set

  112.            delay(37);             ////大于37uS的延时程序

  113.            TransferData(0x3E,0);  //EXFUNCTION(DL=8BITS,RE=1,G=1)

  114.            delay(100);            //大于100uS的延时程序

  115.            TransferData(0x01,0);  //CLEAR SCREEN

  116.            delay(100);            //大于100uS的延时程序

  117.           }

  118. /********************************************************************

  119. * 名称 : Main()

  120. * 功能 : 主函数

  121. * 输入 : 无

  122. * 输出 : 无

  123. ***********************************************************************/

  124. void    main(void) {

  125.     uchar init18B20[]={

  126.                 "温度传感器18B20 "  

  127.                 "初始化中......  "

  128.                 "                "

  129.                 "                "

  130.         };

  131.         uchar curtemp[]={

  132.                 "当前温度:      "  

  133.                 "                "

  134.                 "                "

  135.                 "                "

  136.         };

  137.         uchar IC_DAT2[]={

  138.             "白日依山尽,    "                        //0x80

  139.             "欲穷千里目,    "                        //0x90

  140.             "黄河入海流。    "                        //0x88

  141.             "更上一层楼。    "                        //0x98

  142.         };

  143.         unsigned int key=0;

  144.         // 初始化串口

  145.         Initial_com();

  146.         initinal();                    //调用LCD字库初始化程序

  147.         delay(100);            //大于100uS的延时程序

  148.         lcd_mesg(IC_DAT2);     //显示中文汉字2

  149.         delayms(80);

  150.         sign = 0;

  151.     // 显示温度传感器18B20初始化中

  152.         initinal();                    //调用LCD字库初始化程序

  153.         delay(100);            //大于100uS的延时程序

  154.         lcd_mesg(init18B20);      //显示中文汉字1

  155.         delay(240);

  156.         delay(240);

  157.         Init_DS18B20(); //初始化

  158.         sign = 1;

  159.         delayms(80);

  160.         SDA=1;

  161.     SCL=1;

  162.         while(1) {

  163.                 sign1 = 0;

  164.                 // 初始化温度传感器并取得当前温度

  165.                 ReadTemperature();

  166.                 sign1=1;

  167.                 SBUF=sdate;

  168.                 delayms(20);

  169.                 SBUF=xiaoshu;

  170.                 // 转换温度数据为字符串

  171.                 // 整数部分

  172.                 curtemp[10]=48+sdate/10;

  173.                 curtemp[11]=48+sdate%10;

  174.                 // 小数点

  175.                 curtemp[12]='.';

  176.                 // 小数部分

  177.                 //curtemp[13]=48+xiaoshu/10;

  178.                 curtemp[13]=48+xiaoshu1;

  179.                 curtemp[14]=48+xiaoshu2;

  180.                 delayms(20);

  181.                 // 读键盘,显示按钮标号

  182.                 key = TTP229B();

  183.                 curtemp[16]='K';

  184.                 curtemp[17]='e';

  185.                 curtemp[18]='y';

  186.                 curtemp[19]=':';

  187.                 curtemp[20]=key/10 + 48;

  188.                 curtemp[21]=key%10 + 48;

  189.              lcd_mesg(curtemp);     //显示按钮编号

  190.         }

  191. }

  192. /********************************************************************

  193. * 名称 : lcd_mesg()

  194. * 功能 : 输出信息到LCD

  195. * 输入 : adder1 字符串信息

  196. * 输出 : 无

  197. ***********************************************************************/

  198. void lcd_mesg(unsigned char *adder1) {

  199.         unsigned char i;

  200.     TransferData(0x80,0);  //Set Graphic Display RAM Address

  201.     delay(100);

  202.         for(i=0;i<32;i++) {

  203.                 TransferData(*adder1,1);

  204.                 adder1++;

  205.         }

  206.     TransferData(0x90,0);  //Set Graphic Display RAM Address

  207.     delay(100);

  208.         for(i=32;i<64;i++) {

  209.                 TransferData(*adder1,1);

  210.                 adder1++;

  211.         }

  212. }

  213. /********************************************************************

  214. * 名称 : TTP229B()

  215. * 功能 : 扫描TTP229电容键盘(16按键)函数

  216. * 触摸结果直接输出只有8个,平时输出低电平,触摸按键键后,对应输出脚为高电平

  217. * 同时触摸按键,只有第一个生效

  218. * 输入 : 无

  219. * 输出 : 按键编号

  220. ***********************************************************************/

  221. unsigned int TTP229B(void) {

  222.         uchar key=0;

  223.         unsigned char i;

  224.     unsigned int temp=0x0000;

  225.         SDA=0;

  226.     delay(100);

  227.     SDA=1;

  228.         delay(20);

  229.            for(i=0;i<16;i++) {

  230.                   SCL=0;

  231.                 _nop_();;

  232.                 SCL=1;

  233.         _nop_();;

  234.                 if(SDA==0) {

  235.                         temp|=(1<<i);

  236.                 }

  237.         }

  238.            for (i=0;i<16;i++) {

  239.            if ((temp & (1<<i)) > 0) {

  240.                       key=i+1;

  241.            }

  242.         }

  243.         delayms(32);

  244.            return key;

  245. }

  246. /********************************************************************

  247. * 名称 : TransferData()

  248. * 功能 : 主函数

  249. * 输入 : 无

  250. * 输出 : 无

  251. ***********************************************************************/

  252. void TransferData(char data1,bit DI)  { //传送数据或者命令,当DI=0是,传送命令,当DI=1,传送数据.

  253.         WRD=0;

  254.         RS=DI;

  255.         delay(1);

  256.         P2=Convert(data1);

  257.         E=1;

  258.         delay(1);

  259.         E=0;

  260. }

  261. /********************************************************************

  262. * 名称 : delayms()

  263. * 功能 : 主函数

  264. * 输入 : 无

  265. * 输出 : 无

  266. ***********************************************************************/

  267. void delayms(unsigned int n) {            //延时10×n毫秒程序

  268.         unsigned int i,j;

  269.         for(i=0;i<n;i++)

  270.         for(j=0;j<2000;j++);

  271. }

  272. ///********************************************************************

  273. //* 名称 : Main()

  274. //* 功能 : 主函数

  275. //* 输入 : 无

  276. //* 输出 : 无

  277. //***********************************************************************/

  278. //void delay(unsigned int m) {            //延时程序

  279. //        unsigned int i,j;

  280. //        for(i=0;i<m;i++)

  281. //        for(j=0;j<10;j++);

  282. //}

  283. /********************************************************************

  284. * 名称 : DisplayGraphic()

  285. * 功能 : 主函数

  286. * 输入 : 无

  287. * 输出 : 无

  288. ***********************************************************************/

  289. void DisplayGraphic(unsigned char *adder) {

  290.         int i,j;

  291.         //*******显示上半屏内容设置

  292.            for(i=0;i<32;i++)  {            //

  293.                 TransferData((0x80 + i),0); //SET  垂直地址 VERTICAL ADD

  294.                 TransferData(0x80,0);       //SET  水平地址 HORIZONTAL ADD

  295.                 for(j=0;j<16;j++)

  296.                 {

  297.                  TransferData(*adder,1);

  298.                  adder++;

  299.                 }

  300.         }           

  301.         //*******显示下半屏内容设置

  302.            for(i=0;i<32;i++)  {

  303.                 TransferData((0x80 + i),0); //SET 垂直地址 VERTICAL ADD

  304.                 TransferData(0x88,0);       //SET 水平地址 HORIZONTAL ADD

  305.                 for(j=0;j<16;j++) {

  306.                 TransferData(*adder,1);

  307.                 adder++;

  308.                }

  309.     }

  310. }

  311. unsigned char code pic2[]=

  312. {

  313. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

  314. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

  315. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x07,0x80,0x00,0x00,0x00,0x00,0x00,0x00,

  316. 0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x01,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,

  317. 0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,

  318. 0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,

  319. 0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x07,0x80,0x00,0x00,0x00,0x00,0x00,

  320. 0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,

  321. 0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,

  322. 0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,

  323. 0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x00,0x00,

  324. 0x00,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,

  325. 0x00,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x00,0x01,0xE6,0x00,0x00,0x00,0x00,0x00,

  326. 0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x00,0x07,0x82,0x00,0x00,0x00,0x00,0x00,

  327. 0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x1E,0x02,0x00,0x00,0x00,0x00,0x00,

  328. 0x00,0x00,0x00,0x01,0xE0,0x00,0x00,0x00,0x00,0x78,0x03,0x00,0x00,0x00,0x00,0x00,

  329. 0x00,0x00,0x00,0x01,0xE0,0x00,0x00,0x00,0x01,0xE0,0x03,0x00,0x00,0x00,0x00,0x00,

  330. 0x00,0x00,0x00,0x01,0x78,0x00,0x00,0x00,0x07,0x80,0x01,0x00,0x00,0x00,0x00,0x00,

  331. 0x00,0x00,0x00,0x03,0x1E,0x00,0x00,0x00,0x1E,0x00,0x07,0x00,0x00,0x00,0x00,0x00,

  332. 0x00,0x00,0x00,0x03,0x07,0x80,0x00,0x00,0x78,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,

  333. 0x00,0x00,0x00,0x02,0x01,0xE0,0x00,0x01,0xE0,0x00,0x3F,0x00,0x00,0x00,0x00,0x00,

  334. 0x00,0x00,0x00,0x06,0x00,0x78,0x1F,0x07,0x80,0x01,0xF1,0x80,0x00,0x00,0x00,0x00,

  335. 0x00,0x00,0x00,0x0E,0x00,0x1E,0x3F,0x9E,0x00,0x03,0xF9,0x80,0x00,0x00,0x00,0x00,

  336. 0x00,0x00,0x00,0x0E,0x00,0x07,0xB3,0x78,0x00,0x0F,0xF9,0x80,0x00,0x00,0x00,0x00,

  337. 0x00,0x00,0x00,0x0F,0x80,0x01,0xFF,0xE0,0x00,0x79,0x98,0x80,0x00,0x00,0x00,0x00,

  338. 0x00,0x00,0x00,0x0F,0xE0,0x00,0x7F,0x80,0x00,0xE0,0xD8,0x80,0x00,0x00,0x00,0x00,

  339. 0x00,0x00,0x00,0x0F,0xF8,0x00,0x0C,0x00,0x07,0xE0,0xF8,0x80,0x00,0x00,0x00,0x00,

  340. 0x00,0x00,0x00,0x0E,0x7E,0x00,0x0C,0x00,0x1F,0xF0,0xF8,0x80,0x00,0x00,0x00,0x00,

  341. 0x00,0x00,0x00,0x0E,0x1F,0x80,0x0C,0x00,0x7E,0x70,0xDC,0x80,0x00,0x00,0x00,0x00,

  342. 0x00,0x00,0x00,0x0F,0x07,0xE0,0x0C,0x01,0xE3,0x70,0x5C,0xC0,0x00,0x00,0x00,0x00,

  343. 0x00,0x00,0x00,0x0F,0x81,0xF8,0x0C,0x07,0x83,0x70,0x5F,0xC0,0x00,0x00,0x00,0x00,

  344. 0x00,0x00,0x00,0x0D,0xE0,0x7E,0x0C,0x1F,0xC1,0xF0,0x5F,0xC0,0x00,0x00,0x00,0x00,

  345. 0x00,0x00,0x00,0x0F,0x78,0x3F,0x8C,0x7F,0xC1,0xB8,0x47,0xC0,0x00,0x00,0x00,0x00,

  346. 0x00,0x00,0x00,0x0F,0x1E,0x0F,0xED,0xEC,0xE1,0xB8,0xC7,0xC0,0x00,0x00,0x00,0x00,

  347. 0x00,0x00,0x00,0x1F,0x07,0x83,0xFF,0xC6,0xE1,0xB9,0xC7,0xC0,0x00,0x00,0x00,0x00,

  348. 0x00,0x00,0x00,0x1F,0x07,0xE0,0xFF,0xE7,0xE1,0xBF,0x07,0xC0,0x00,0x00,0x00,0x00,

  349. 0x00,0x00,0x00,0x1F,0x07,0xF8,0x3F,0xE7,0xE1,0xBF,0x07,0xC0,0x00,0x00,0x00,0x00,

  350. 0x00,0x00,0x00,0x1F,0x07,0x9E,0x0C,0xE6,0xE1,0x8F,0x07,0xC0,0x00,0x00,0x00,0x00,

  351. 0x00,0x00,0x00,0x1F,0x07,0x87,0x8C,0xE6,0xE3,0x8F,0x83,0xC0,0x00,0x00,0x00,0x00,

  352. 0x00,0x00,0x00,0x1F,0x0F,0x81,0xED,0xE6,0xE7,0x0F,0x83,0xC0,0x00,0x00,0x00,0x00,

  353. 0x00,0x00,0x00,0x1F,0x07,0x00,0x7F,0xE6,0xFE,0x0F,0x83,0x40,0x00,0x00,0x00,0x00,

  354. 0x00,0x00,0x00,0x1F,0x00,0x00,0x1E,0x76,0xFE,0x0F,0x83,0x40,0x00,0x00,0x00,0x00,

  355. 0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x72,0x1E,0x0F,0x83,0x40,0x00,0x00,0x00,0x00,

  356. 0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x7E,0x1A,0x0F,0x83,0x40,0x00,0x00,0x00,0x00,

  357. 0x00,0x00,0x00,0x1E,0x00,0x00,0x00,0x7C,0x1A,0x0F,0x83,0xC0,0x00,0x00,0x00,0x00,

  358. 0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x78,0x1A,0x0F,0x83,0xC0,0x00,0x00,0x00,0x00,

  359. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x1A,0x07,0x83,0xC0,0x00,0x00,0x00,0x00,

  360. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x1E,0x07,0x80,0x00,0x00,0x00,0x00,0x00,

  361. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x1F,0x07,0x80,0x00,0x00,0x00,0x00,0x00,

  362. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x1F,0x07,0x80,0x00,0x00,0x00,0x00,0x00,

  363. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x1F,0x07,0x80,0x00,0x00,0x00,0x00,0x00,

  364. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x1F,0x07,0x00,0x00,0x00,0x00,0x00,0x00,

  365. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x1F,0x00,0x00,0x00,0x00,0x08,0x00,0x00,

  366. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x1F,0x00,0x00,0x00,0x00,0x10,0x00,0x40,

  367. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x1F,0x00,0x00,0x00,0x00,0xFF,0x08,0x20,

  368. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x1F,0x00,0x00,0x00,0x00,0x28,0x05,0xFC,

  369. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x0C,0x00,0x00,0x00,0x00,0x48,0x00,0x40,

  370. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0xFF,0x08,0x88,

  371. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x00,0x00,0x08,0x05,0xFC,

  372. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x4A,0x00,0xA8,

  373. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x89,0x04,0xA8,

  374. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x01,0x08,0x88,0xA8,

  375. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x10,0xAA,

  376. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x01,0x2E,

  377. };

  378. /*

  379. ********************************************************************************

  380. ** 函数名称 : delay(unsigned char i)

  381. ** 函数功能 : 延时函数                这个延时程序的具体延时时间是time=i*8+10,适用于小于2ms的延时

  382. ********************************************************************************

  383. */

  384. void delay(unsigned int i)

  385. {

  386.          while(i--);

  387. }

  388. /*

  389. ********************************************************************************

  390. ** 函数名称 :  delay1ms(unsigned char i)

  391. ** 函数功能 : 延时函数        

  392. ********************************************************************************

  393. */

  394. void delay1ms(unsigned int t)

  395. {

  396. //for(i=124;i>0;i--);  //延时124*8+10=1002us

  397.      unsigned char a,b,c;

  398.         for(t;t>0;t--)

  399.             for(c=1;c>0;c--)

  400.                 for(b=142;b>0;b--)

  401.                     for(a=2;a>0;a--);

  402. }

  403. /*

  404. ********************************************************************************

  405. ** 函数名称 : Init_DS18B20(void)

  406. ** 函数功能 : 初始化

  407. ********************************************************************************

  408. */

  409. void Init_DS18B20(void)

  410. {

  411. unsigned char x=0;

  412. DQ=1; //DQ先置高

  413. Delay10us(60);//最小480,最大960

  414. DQ=0; //发送复位脉冲

  415. Delay10us(60);//最小480,最大960

  416. DQ=1; //拉高数据线

  417. Delay10us(6);//15-60us

  418. // x=DQ; //用X的值来判断初始化有没有成功,18B20存在的话X=0,否则X=1

  419. //delay(20);

  420. while(DQ==0);

  421. DQ=1;//让传感器释放总线,避免影响下一步

  422. }

  423. /*

  424. ********************************************************************************

  425. ** 函数名称 :  ReadOneChar()

  426. ** 函数功能 : 读一个字节

  427. ********************************************************************************

  428. */

  429. unsigned char  ReadOneChar()  //主机数据线先从高拉至低电平1us以上,再使数据线升为高电平,从而产生读信号

  430. {

  431.         unsigned char dat=0;

  432.         unsigned char mask,fmask;

  433.         for(mask=0x01;mask!=0;mask<<=1)//一个周期需要至少60us,但采样要在15us内完成

  434.         {

  435.                 DQ=0;

  436.                 _nop_();

  437.                 DQ=1;

  438.                 _nop_();

  439.                 _nop_();

  440.                 _nop_();

  441.                 _nop_();

  442.                 _nop_();

  443.                 _nop_();

  444.                 if(DQ==0)//读0

  445.                 {

  446.                         fmask=~mask;

  447.                         dat=dat&fmask;

  448.                 }

  449.                 else

  450.                 {

  451.                         dat|=mask;

  452.                 }

  453.                 Delay10us(5);

  454.                 DQ=1;

  455.         }

  456.         return dat;

  457. }

  458. /*

  459. ********************************************************************************

  460. ** 函数名称 : WriteOneChar(unsigned char dat)

  461. ** 函数功能 : 写一个字节

  462. //一个写周期为60-120us,主机在15--45us内对信号采样

  463. ********************************************************************************

  464. */

  465. void WriteOneChar(unsigned char dat)

  466. {

  467.   unsigned char i=0; //数据线从高电平拉至低电平,产生写起始信号。15us之内将所需写的位送到数据线上,

  468.   for(i=8;i>0;i--) //在15~60us之间对数据线进行采样,如果是高电平就写1,低写0发生。

  469.   {

  470.    DQ=0; //在开始另一个写周期前必须有1us以上的高电平恢复期。

  471.    DQ=dat&0x01;

  472.    Delay10us(6);//15-60us采样

  473.    DQ=1;

  474.    dat>>=1;

  475.   }

  476.   delay(4);

  477. }

  478. ……………………

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多