找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

M8,ICCAVR下的18B20程序

[复制链接]
慧龙 发表于 2010-5-13 23:25:04 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
  1. /* m818b20.c 2004-11-19
  2. 本程序为采用mega8 和18b20的温度采集程序
  3. 选用mega8内部8M RC震荡,18b20 数据线接pd6,数据线和vcc间接一4.7k上拉电阻
  4. 感谢dfgeoff 嗜血蜗牛提供的资料*/

  5. #include <iom8v.h> //和单片机类型相对应的头文件,选择Atmega8做实验;
  6. #include <macros.h>
  7. #define uchar unsigned char
  8. #define uint unsigned int
  9. void init_1820();
  10. write_1820(uchar x);
  11. uchar read_1820();
  12. void send_byte(uchar x);
  13. void delay(uint x);
  14. void disp_led(uchar buffer,uchar control);
  15. uchar disp_table[16] = {
  16. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  17. 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  18. uchar dp;
  19. long count;
  20. void main(void) //主函数
  21. {
  22. disp_led(0,0);
  23. delay(2000);
  24. OSCCAL=0X9d;//系统时钟校准,不同的芯片和不同的频率,
  25. DDRC=0xff;
  26. DDRD=0XFF;
  27. PORTD=0XFF;
  28. WDR(); //看门狗计数清零
  29. WDTCR=0x0F;
  30. PORTC=0xff;
  31. while(1)
  32. {
  33. uchar i,temh,teml;
  34. init_1820(); //复位18b20
  35. write_1820(0xcc); // 发出转换命令
  36. write_1820(0x44);
  37. delay(400);
  38. init_1820();
  39. WDR();
  40. write_1820(0xcc); //发出读命令
  41. write_1820(0xbe);
  42. teml=read_1820(); //读数据
  43. temh=read_1820();
  44. //for(i=0;i<7;i++) //测试用
  45. //{
  46. //send_byte(0x40);
  47. //send_byte(disp_table[0&0x0f]);
  48. //}
  49. //send_byte(disp_table[temh>>4]);
  50. //send_byte(disp_table[temh&0x0f]);
  51. //send_byte(disp_table[teml>>4]);
  52. //send_byte(disp_table[teml&0x0f]);
  53. count=(temh*256+teml)*6.25; //计算具体温度
  54. WDR();
  55. disp_led(0,1); //显示温度
  56. for(i=0;i<100;i++) //每次转换需要延时200ms以上
  57. delay(1000);
  58. }
  59. }
  60. void delay(uint x) //1.5us左右
  61. {
  62. while(x)
  63. {
  64. x--;
  65. }
  66. }
  67. void init_1820()
  68. {
  69. PORTD|=(1<<6);
  70. PORTD&=~(1<<6);
  71. delay(3000); //480us以上
  72. PORTD|=(1<<6);
  73. DDRD&=~(1<<6);
  74. delay(40); //15~60us
  75. while(PIND&(1<<6))
  76. {
  77. // disp_led(3,0);
  78. // for(;;)
  79. //{}
  80. }
  81. DDRD|=(1<<6);
  82. PORTD|=(1<<6);
  83. delay(150); //60~240us
  84. }
  85. write_1820(uchar x)
  86. {
  87. uchar m;
  88. for(m=0;m<8;m++)
  89. {
  90. PORTD&=~(1<<6);
  91. if(x&(1<<m)) //写数据,从低位开始
  92. PORTD|=(1<<6);
  93. else
  94. PORTD&=~(1<<6);
  95. delay(40); //15~60us
  96. PORTD|=(1<<6);
  97. }
  98. PORTD|=(1<<6);
  99. }


  100. uchar read_1820()
  101. {
  102. uchar temp,k,n;
  103. temp=0;
  104. for(n=0;n<8;n++)
  105. {
  106. PORTD&=~(1<<6);
  107. //delay(2);
  108. PORTD|=(1<<6);
  109. //delay(3);
  110. DDRD&=~(1<<6);
  111. k=(PIND&(1<<6)); //读数据,从低位开始
  112. if(k)
  113. temp|=(1<<n);
  114. else
  115. temp&=~(1<<n);
  116. delay(50); //60~120us
  117. DDRD|=(1<<6);
  118. }
  119. return (temp);
  120. }

  121. void send_byte(uchar x) //以下为显示程序
  122. {
  123. uchar i;
  124. for(i=0;i<8;i++)
  125. {
  126. PORTC&=~(1<<5); // PC5为底 为164提供时钟信号
  127. if((x&(1<<(7-i)))||((dp==1)&&(i==0))) //判断每位数据的电平,及小数点判断
  128. PORTC|=(1<<4); //若为高着PC4输出高电平
  129. else
  130. PORTC&=~(1<<4); //若为低着输出低电平
  131. PORTC|=(1<<5); //PC5 提供始终信号
  132. }
  133. //PORTC|=((1<<0)|(1<<1)|(1<<2));
  134. }
  135. //显示程序 CONTROL为控制显示 BUFFER为显示数据
  136. void disp_led(uchar buffer,uchar control)
  137. {
  138. uchar i,temp[6];
  139. uint tempcount;
  140. dp=0;
  141. switch(control)
  142. {
  143. case 0: //CONTROL为零全部数码管显示buffer
  144. {
  145. for(i=0;i<11;i++)
  146. send_byte(disp_table[buffer%10]);//显示数字
  147. break;
  148. }
  149. case 1: //control为1,显示count中的数据为6位
  150. {
  151. tempcount=count;
  152. for(i=0;i<6;i++) //取出每位中的数据
  153. {
  154. temp[i]=tempcount%10;
  155. tempcount/=10;
  156. }
  157. send_byte(disp_table[buffer/10]); //最开始显示buffer数据
  158. send_byte(disp_table[buffer%10]);
  159. send_byte(0x00);
  160. send_byte(0x00);
  161. send_byte(0x00);
  162. for(i=0;i<6;i++)
  163. {
  164. if(i==3)
  165. dp=1; //小数点控制位
  166. send_byte(disp_table[temp[5-i]]);
  167. dp=0;
  168. }
  169. break;
  170. }
  171. }
  172. PORTC|=(1<<4);
  173. }
复制代码
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-12-23 13:51 , Processed in 0.054827 second(s), 10 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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