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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機+DS18B20溫度顯示問題,求教

[復制鏈接]
跳轉到指定樓層
樓主
本帖最后由 喵喵喵喵喵喵喵 于 2020-3-22 17:27 編輯



單片機源程序如下:

  1. #include<reg52.h>
  2. #include "intrins.h"
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. uchar a,miao,shi,fen,ri,yue,nian,week,keynum,temp,flagtime,ledcount,count,alarmflag,flagT/*時間分段標志*/,year1,month1,day1,lednum;
  6. uint flag;//取溫度

  7. bit c_moon;
  8. data uchar year_moon,month_moon,day_moon;

  9. #define h1 0x80 //LCD第一行的初始化位置
  10. #define h2 0x80+0x40 //LCD第二行初始化位置
  11. sbit Gled=P1^6;//定義粉色led燈的管腳
  12. sbit Yled=P3^7;//定義黃色led燈的管腳

  13. //定義1602相關管腳
  14. sbit rs=P2^7;
  15. sbit en=P2^5;
  16. sbit rw=P2^6;
  17. //sbit led=P2^3;/*控制背光:15腳(串聯10歐電阻)背光源正極*/
  18. //sbit busy=P0^7;//測忙線
  19. //DS1302芯片的管腳定義
  20. sbit IO=P2^2;
  21. sbit SCLK=P2^1;
  22. sbit RST=P2^3;

  23. sbit DQ=P2^0;/*定義DS18b20管腳*/

  24. sbit ACC0=ACC^0;//設置累加器
  25. sbit ACC7=ACC^7;

  26. //按鍵
  27. sbit key1=P3^0;//設置按鍵
  28. sbit key2=P3^4;
  29. sbit key3=P3^6;
  30. sbit beep=P1^7;//蜂鳴器,用于報時

  31. sbit lcdbusy=P0^7;

  32. void delay(uint z)//延時函數
  33. {
  34.         uint x,y;
  35.         for(x=z;x>0;x--)
  36.         for(y=110;y>0;y--);
  37. }
  38. void testbusy()//測忙
  39. {
  40.         P0=0xff;//注意是P0組
  41.         rs=0;
  42.         rw=1;
  43.         en=1;
  44.         while(lcdbusy);//等待不忙
  45.         en=0;
  46. }
  47. void writecom(uchar com)//寫入指令函數
  48. {
  49.         testbusy();
  50.         P0=com;
  51.         rs=0;
  52.         rw=0;
  53.         en=1;
  54.         en=0;
  55. }
  56. void writedata(uchar dat)//寫入數據函數
  57. {
  58.         testbusy();//先測忙
  59.         P0=dat;
  60.         rs=1;
  61.         rw=0;
  62.         en=1;
  63.         en=0;
  64. }
  65. void print(uchar a3,uchar *str)//寫字符串函數(沒有延時)
  66. {
  67.         writecom(a3|0x80);
  68.         while(*str!='\0')
  69.         {
  70.                 //delay(100);//延時一下
  71.                 writedata(*str++);
  72.         }
  73.         *str=0;
  74. }
  75. void print2(uchar a2,uchar *str)//用于頭字條的顯示延時
  76. {
  77.         writecom(a2|0x80);
  78.         while(*str!='\0')
  79.         {
  80.                 delay(130);//延時一下
  81.                 writedata(*str++);
  82.         }
  83.         *str=0;
  84. }
  85. void lcdinit()//1602初始化函數
  86. {
  87.         writecom(0x38);//設置為兩行顯示,8位顯示
  88.         writecom(0x0c);//開顯示,不顯示光標
  89.         writecom(0x06);//光標右移
  90.         writecom(0x01);//清零
  91.         print2(0x80,"^_^ @_@  U_U -_-");//第一行顯示制作者
  92.         print2(0x40,"Enjoy Your Life!");//第二行顯示制作人
  93.         delay(3000);// 延時3秒
  94.         //writecom(0x01);//再次清零
  95.         //writecom(h1);//第一行第一個字開始寫入
  96. }


  97. /*以下是溫度芯片DS18b20的相關函數*/
  98. void delay2(uint s)//延時,用于溫度程序部分
  99. {
  100.         while(s--);//區分i,用s表示
  101. }
  102. void Init_DS18B20(void)//初始化DS18b20
  103. {
  104.         uchar W=0;//注意是w
  105.         DQ=1;
  106.         delay2(8);
  107.         DQ=0;//拉低
  108.         delay2(29);//延時大于480us(此處延時時間不確定,實際時修改)
  109.         DQ=1;//拉高
  110.         delay2(3);//(時間不確定)
  111.         W=DQ;//稍作延時后如W=0則初始化成功
  112.         delay2(20);
  113. }
  114. uchar ReadOneChar(void)//DS18b20讀一個字節函數
  115. {
  116.         uchar i=0;
  117.         uchar dat=0;
  118.         for(i=8;i>0;i--)
  119.         {
  120.                 DQ=0;//給脈沖信號
  121.                 dat>>=1;//右移一位
  122.                 DQ=1;//給脈沖信號
  123.                 if(DQ)
  124.                 dat|=0x80;
  125.                 delay2(4);
  126.         }
  127.         return(dat);
  128. }
  129. void WriteOneChar(uchar dat)//寫一個字節函數
  130. {
  131.         uchar i=0;
  132.         for(i=8;i>0;i--)
  133.         {
  134.                 DQ=0;
  135.                 DQ=dat&0x01;
  136.                 delay2(5);
  137.                 DQ=1;
  138.                 dat>>=1;
  139.         }
  140. }
  141. uint ReadTemperature(void)//讀取溫度
  142. {
  143.         uchar a1=0;//用于合并
  144.         uchar b1=0;
  145.         uint t=0;
  146.         float tt=0;
  147.         Init_DS18B20();
  148.         WriteOneChar(0xCC);//跳過讀取序列號的操作
  149.         WriteOneChar(0x44);//啟動溫度轉換
  150.         Init_DS18B20();//再次初始化
  151.         WriteOneChar(0xCC);//跳過讀取序列號
  152.         WriteOneChar(0xBE);//讀取溫度寄存器
  153.         a1=ReadOneChar();//先讀取低位
  154.         b1=ReadOneChar();//后讀取高位
  155.         t=b1;
  156.         t<<=8;
  157.         t=t|a1;
  158.         tt=t*0.0625;
  159.         t=tt*10+0.5;//放大10倍并四舍五入
  160.         return(t);
  161. }

  162. /*下面是相關數據的顯示函數*/
  163. //溫度顯示函數
  164. void writetemp(uchar add,uint dat)//寫入溫度值函數指定位置
  165. {
  166.         uchar gw,sw,xw;//個位,十位,小數位(注意得到為三位有效數)
  167.         gw=dat%100/10;/*特別注意此處*/
  168.         sw=dat/100;
  169.         xw=dat%10;
  170.         writecom(h2+add);//h2為頭文件規定的值0x80+0x40
  171.         writedata(0x30+sw);//數字+30得到顯示碼
  172.         writedata(0x30+gw);//個位數
  173.         writedata(0x2e);//小數點
  174.         writedata(0x30+xw);//小數位
  175.         writedata(0xdf);//顯示“°”(度)
  176.         //writedata(0x43);//顯示“C”符號,為液晶字符的地址碼(考慮是否要)
  177. }
  178. /*以下是主函數部分*/
  179. void main()
  180. {
  181.         alarmflag=1;
  182.         //led=0;
  183.         lcdinit();//初始化液晶函數
  184.         ds1302_init();//DS1302時鐘芯片初始化函數
  185.         init();//定時器初始化函數
  186.         beep=0;
  187.         delay(200);
  188.         beep=1;
  189.         //led=0;
  190.         while(1)
  191.         {
  192.                 year1=(nian)/10*16+(nian)%10;//轉換為bcd碼
  193.                 month1=(yue)/10*16+(yue)%10;
  194.                 day1=(ri)/10*16+(ri)%10;
  195.                 chushihua();//初始化時間函數
  196.             Conversion(0,year1,month1,day1);//
  197.                 timealarm();//報時程序
  198.                 keyscan();//不斷掃面按鍵函數
  199.                 /*if(key2==1)//加鍵不按下時才有用
  200.                 {
  201.         ledcontrol();//背光控制
  202.                 } */
  203.         }
  204. }
  205. void timer0() interrupt 1//中斷任務:取數據并顯示
  206. {
  207.         TH0=(65536-60000)/256;//重新賦初值
  208.         TL0=(65536-60000)%256;
  209.         //讀取數據
  210.         flag=ReadTemperature();//讀取溫度(考慮是否放在此處)
  211.         miao=turnBCD(read_1302(0x81));//讀出秒
  212.         fen=turnBCD(read_1302(0x83));//讀出分
  213.         shi=turnBCD(read_1302(0x85));//讀出時
  214.         ri=turnBCD(read_1302(0x87));//讀出日
  215.         yue=turnBCD(read_1302(0x89));//讀出月
  216.         nian=turnBCD(read_1302(0x8d));//讀出年
  217.         week=turnBCD(read_1302(0x8b));//讀出周
  218.         //顯示數據
  219.         
  220.         if(((0<=miao)&&(miao<15))||(((miao/10==2)||(miao/10==4))&&(miao%10<=5))||((54<=miao)&&(miao<60))) /*顯示所有信息的時間段*/
  221.         {
  222.                 print(0x80,"20  /  /   W < >");
  223.                 writecom(h1+0x0c);
  224.                 writedata(0x7e);//→右箭頭
  225.                 writeday(8,ri);//顯示日
  226.                 writeday(5,yue);//顯示月
  227.                 writeday(2,nian);//顯示年
  228.                 writeweek(week);//顯示星期
  229.                 print(0x40,"  :  :          ");
  230.                 writetemp(9,flag);//顯示溫度,第二行顯示
  231.                 writetime(6,miao);//顯示出秒
  232.                 writetime(3,fen);//顯示出分
  233.                 writetime(0,shi);//顯示出時,第二行第一個開始
  234.         }

  235.         //if(15<=miao)/*當秒大于15時才顯示*/
  236.         //{
  237.                 if(((miao/10==1)||(miao/10==3))&&(miao%10>=5))
  238.                 {
  239.                 switch(flag/100)//取出溫度的十位數
  240.                 {
  241.                         case 0:print(0x80,"Pretty cold now!");
  242.                                    break;
  243.                         case 1:print(0x80,"little cold now!");
  244.                                    break;
  245.                         case 2:print(0x80,"It is warm now. ");
  246.                                    break;
  247.                         case 3:print(0x80,"It's hot !!!    ");
  248.                                    break;
  249.                         case 4:print(0x80,"Very very hot!!!");
  250.                                    break;
  251.                         case 5:print(0x80,"Very very hot!!!");
  252.                                    break;
  253.                         case 6:print(0x80,"Very very hot!!!");
  254.                                    break;
  255.                 }
  256.         
  257.                 //print(0x80,"It is warm now. ");
  258.                 print(0x40,"  :  :          ");
  259.                 writetemp(9,flag);//顯示溫度,第二行顯示
  260.                 writetime(6,miao);//顯示出秒
  261.                 writetime(3,fen);//顯示出分
  262.                 writetime(0,shi);//顯示出時,第二行第一個開始
  263.                 }
  264.                
  265. }

復制代碼

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 视频在线观看一区二区 | 日韩一区二区三区在线 | 男人的天堂在线视频 | 999精品视频| 国产一区中文字幕 | 激情a| 精品久久久久一区二区国产 | 国产成人在线播放 | 成人一区二区三区在线观看 | 久久国| 91av在线不卡 | 国产精品久久久久9999鸭 | 中文一区 | 成年人在线视频 | 精品国产91 | 久久精品91久久久久久再现 | 久久久久精 | 色爱综合网 | 夜夜夜夜夜夜曰天天天 | 久久爱一区 | 国产精品欧美一区二区 | 日韩欧美中文 | 中午字幕在线观看 | 国产精品久久久久久久久久久久冷 | 久久蜜桃资源一区二区老牛 | 精品国产一区二区三区成人影院 | 欧美一级黑人aaaaaaa做受 | 一区在线视频 | 国产精品不卡一区 | 婷婷亚洲综合 | 日本精品免费 | 欧美精品一区二区在线观看 | 91精品国产综合久久婷婷香蕉 | 九九久久99 | 久久小视频| 不卡的av在线| 九九av | 久久久久久久久久久久久久国产 | 最新中文字幕在线 | 视频一区在线观看 | 欧美精品成人 |