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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機數碼管動態掃描程序DS12C887紅外遙控ds18b20

[復制鏈接]
跳轉到指定樓層
樓主
ID:70976 發表于 2014-12-26 21:21 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
///////////////////////////////////////////////////////////////////////////

/////////DS12C887+8位數碼管定時器中斷動態掃描遙控時鐘單片機程序模塊////////

///////////////////////////////////////////////////////////////////////////

[功能]    0: 8位數碼管定時器中斷動態掃描顯示
          1:通過單片機解碼紅外遙控編碼并按上圖方式顯示出來
          2:可通過遙控器調整時間,日期以及鬧鐘
          3:時鐘芯片采用DS12C887+,內部集成電池與晶體,不怕掉電丟時間信息
          4:在調整時間過程中會有動態效果(正在調試中!!!以經搞好了)
          5:在下一版本中會增計算器功能,也是用遙控器操作 值得大家期待!
          6: ds18b20溫度顯示(正在弄這個ds18b20)
          7:數碼管掃描數據在P0口通過鎖存器(74HC573)輸出,ds12c887的雙向數據則直接接P0口
//以下是C源文件==============================================================================
  1. #include <reg51.h>//80C51頭文件

  2. #define uint unsigned int//16bit無符整型0~465536
  3. #define ulint unsigned long int//32bit無符長整0~4294967295
  4. #define uchar unsigned char//8bit宏定義無符字符型0-256
  5. #define c(x) (x*120000/120000)// (x*216000/120000) //定義時鐘頻率便于紅外遙控解碼        



  6. //單片機硬件設置

  7. sbit duan = P2^0;//數碼管段選定義
  8. sbit wei   = P2^1;//數碼管位選定義

  9. sbit Ir_Pin=P3^3;//紅外接收端口
  10. sbit beep = P2^7;//蜂鳴器



  11. //時鐘芯片ds12c887控制引腳與單片機連接
  12. sbit dscs = P2^6;//時鐘片選
  13. sbit dsas = P2^5;//地址選取通
  14. sbit dsrw = P2^4;//讀寫輸入
  15. sbit dsds = P2^3;//數據選通或輸入
  16. sbit dsirq= P2^2;//中斷請求輸出
  17. sbit DQ =P2^2;//定義溫度傳感器(18b20)通信端口


  18. //字符碼表

  19. uchar code Led_Tab[]={//共陽數碼管字符碼

  20. 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,//0---f,ff全滅,
  21. 0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff,0xfe,0xbf,0xf7,0xc6,0x9c};//上,中,下3短橫線

  22. uchar code Led_Sel[]={//位碼

  23. 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

  24. //定義各個變量
  25. uchar shan_xia=0,zuo_you=8,Ir_Buf[4],ds_temp=0,i;//上下變量,左右變量,遙控數字,紅外結果

  26. bit ok=0,power=0,mute,ds=0,i_k=0;//ds為0時才準讀時鐘芯片,減少頻繁讀時鐘, i_k為5秒延時開關
  27. uint ms;//屏閃時基變量,溫度傳感變量
  28.                                    

  29. //以下是動態掃描變量
  30. uchar Led_Buf[8],Led_Buf_temp[8],Led_Index;//顯示緩沖區,調時閃動緩沖區,位碼索引


  31. //聲明子函數

  32. void init();//初始化
  33. void write_ds(uchar add,uchar date);//時鐘芯片寫函數
  34. uchar read_ds(uchar add);//時鐘芯片讀函數

  35. void delay(uint z);//延時

  36. void hyyk();//紅外遙控
  37. uint Ir_Get_Low();//低電平時間采集
  38. uint Ir_Get_High();//高電平時間采集

  39. //遙控調時,數值放入顯示緩沖區同步顯示,預寫時鐘
  40. //經數據采集函數(time_set())根據各項格式顯示特征識別后
  41. //按mute鍵寫時鐘芯片相應地址達到調整時鐘信息的目的

  42. void ykm_set();

  43. void time_set();//時間調整數據采集分析寫調時緩沖區函數

  44. void ykm_out();//遙控碼顯示

  45. void led_out(uchar add_1,uchar add_2,uchar add_3,uchar add_4);//送出地址,讀出信息,更新顯示緩沖區
  46. void led_flash(uchar k,uchar z);//調時閃爍  K為閃動開關  Z為閃動內容

  47. //溫度顯示子函數聲明
  48. void delay_18b20(uint i);//延時
  49. Init_DS18B20(void);//初始化函數
  50. WriteOneChar(uchar dat);//寫一個字節
  51. ReadOneChar(void);//讀一個字節
  52. ReadTemperature(void);//讀取溫度
  53. void out_18b20();//顯示
  54.             

  55. //主程序==================================================================================

  56. void main()//程序入口
  57. {
  58. init();//初始化
  59.      
  60. while(1)//循環等待中斷
  61.    {
  62.       hyyk();//遙控
  63.       if ((Ir_Buf[0]==0x02)&&(Ir_Buf[2]==0x14))//POWER鍵值翻轉并響鈴
  64.          {
  65.           ok=0;zuo_you=8;shan_xia=0;//有遙控power時復位ok與上下,左右值,取消閃屏顯示時間
  66.           power=(!power);
  67.           if(power==0)
  68.             {
  69.              delay(10);
  70.              beep=0;
  71.              delay(20);
  72.              beep=1;
  73.              }
  74.           Ir_Buf[2]=0xff;
  75.          }
  76. if (power==1){uchar i;mute=1; for(i=0;i<8;i++) Led_Buf_temp[i]=16;}//在power標志為1時關屏關鈴
  77.    
  78.      if(power==0)//power標志為0時根據shan_xia鍵值顯示內容
  79.         {
  80.         ykm_set();//遙控調時,調整好后按mute鍵寫時鐘
  81.         led_flash(ok,shan_xia);   
  82.           if(ok==0){ds=0;i_k=0;ds_temp=0;}
  83.           if(ds==0)
  84.            {
  85.               if(shan_xia==0)led_out(4,2,0,19);//時間
  86.      
  87.          else if(shan_xia==1)led_out(9,8,7,17);//日期
  88.             
  89.          else if(shan_xia==2)led_out(5,3,1,18);//鬧鐘
  90.             
  91.          else if(shan_xia==3)led_out(6,6,6,18);//星期
  92.          else if(shan_xia==4)out_18b20();//溫度
  93.             
  94.          else  ykm_out();//遙控碼
  95.            }
  96.       
  97.       ds=1;//關時鐘芯片讀與顯存刷新,在中斷掃描時會打開
  98.            //只有在需要顯示具體內容時才會訪問時鐘芯片對應的具體地址并更新顯示緩沖區
  99.             
  100.       //ok鍵值翻轉
  101.       if ((Ir_Buf[0]==0x02)&&(Ir_Buf[2]==0x15))
  102.       {
  103.       if((ok==1)&&(zuo_you<8)){zuo_you=8;i_k=1;i=1;}//如果是位閃狀態按ok鍵就進入全閃狀態
  104.       else {ok=(!ok);zuo_you=8;}//否則閃<==>不閃   狀態翻轉一次
  105.       //if(ok==0){i_k=0;ds_temp=0;}//不閃時可以刷新數據
  106.       Ir_Buf[2]=0xff;
  107.       }
  108.       
  109.       //MUTE鍵值翻轉并響鈴
  110.       if ((Ir_Buf[0]==0x02)&&(Ir_Buf[2]==0x0c))
  111.          {
  112.          if(((ok==1)&&(zuo_you>7))&&(ds_temp>0))time_set();//如果從位閃變為全閃并且8秒寫時鐘窗口打開則寫時鐘
  113.          else   mute=(!mute);//否則此鍵為靜音轉換功能
  114.          if(mute==0)
  115.            {
  116.             delay(10);
  117.             beep=0;
  118.             delay(20);
  119.             beep=1;
  120.            }
  121.          Ir_Buf[2]=0xff;
  122.         }

  123.       //按遙控器左鍵加一
  124.       if ((Ir_Buf[0]==0x02)&&(Ir_Buf[2]==0x11))
  125.       {
  126.       if(ok==0)mute=1;//如果沒有閃屏按此鍵關閉聲音
  127.          if(ok==1)
  128.          {
  129.          if(++zuo_you>7) zuo_you=0;//左移,超出苑圍轉到最右邊
  130.          while(Led_Buf[zuo_you]>9){if((++zuo_you)>7) zuo_you=0;}//正在如果要閃動的位不是十則一直數還
  131.          Ir_Buf[2]=0xff;
  132.          }           
  133.       }

  134.       //按遙控器右鍵減一   
  135.       if ((Ir_Buf[0]==0x02)&&(Ir_Buf[2]==0x10))
  136.       {
  137.       if(ok==0)mute=0;//如果沒有閃屏按此鍵打開聲音
  138.          if(ok==1)
  139.          {
  140.          if((--zuo_you)==255) zuo_you=7;//右移,超出苑圍轉到最左邊
  141.          while(Led_Buf[zuo_you]>9){if((--zuo_you)==255) zuo_you=7;}//正在閃動的位不是十進制數則一直移動開遙控
  142.          Ir_Buf[2]=0xff;
  143.          }
  144.       }
  145.    
  146.       //按遙控器上鍵加一
  147.       if ((Ir_Buf[0]==0x02)&&(Ir_Buf[2]==0x12))
  148.       {
  149.         if((ok==1)&&(zuo_you<8))
  150.          {
  151.          Led_Buf[zuo_you]++;//位閃狀態有上鍵按下對應位加一
  152.          if(Led_Buf[zuo_you]>9)Led_Buf[zuo_you]=0;//超出為0
  153.          }
  154.       else
  155.          {
  156.          zuo_you=8;//改變顯示內容時位閃變全屏閃
  157.          if(++shan_xia>5) shan_xia=0;//超出為0
  158.          }
  159.         Ir_Buf[2]=0xff;
  160.       }

  161.       //按遙控器下鍵減一   
  162.       if ((Ir_Buf[0]==0x02)&&(Ir_Buf[2]==0x13))
  163.       {
  164.         if((ok==1)&&(zuo_you<8))
  165.          {
  166.          Led_Buf[zuo_you]--;//位閃狀態有上鍵按下對應位減一
  167.          if(Led_Buf[zuo_you]==255)Led_Buf[zuo_you]=9;//超出則為9
  168.          }
  169.       else
  170.          {
  171.          zuo_you=8;//改變顯示內容時位閃變全屏閃
  172.          if((--shan_xia)==255) shan_xia=5;//自減,超出則為4
  173.          }
  174.         Ir_Buf[2]=0xff;
  175.       }
  176.    }
  177. }                        
  178. }   

  179. //數碼管掃描===============================================================
  180. timer0() interrupt 1 using 1//定時中斷發生,運行中斷函數
  181. {
  182. ms++;//屏閃時基
  183. if(ms>=500) ms=0;

  184.   if(i_k==1) //不閃屏時允許刷新讀寫信息
  185.    {
  186.    if(ms==0){if((++i)>8)i=0;}//延時8秒給mute鍵的寫時鐘芯片時間窗口,
  187.    ds_temp=i;
  188.    }
  189. if(ds_temp==0)i_k=0;

  190. if(((ok==1)&&(zuo_you<8))||(ds_temp>0))ds=1;//在全屏閃5秒內和位閃調時時不允許刷新顯存
  191. else ds=0;//ds為何0時才允許刷新顯存

  192. TL0=0x25;//12M 2ms(測試這個晶振誤差后的初值)
  193. TH0=0xf8;
  194.                
  195. //以下9行消隱
  196. dscs=1;//關掉時鐘片選讓數據接收口(74hc573數碼管的位碼和段碼鎖存器)得到純凈的數據信號
  197. duan=0;                             // 關閉段選
  198. wei=0;                              // 關閉位選

  199. P0=0x00;                            // 消陷碼
  200.     wei=1;                              // 打開位選
  201.     wei=0;                              // 關閉位選,鎖存消隱碼

  202.     P0=0xff;                            // 消隱碼
  203.     duan=1;                             // 打開段選
  204.     duan=0;                             // 關閉段選,鎖存消隱碼



  205. //數字顯示  在鎖存器的鎖存端出現下降沿時鎖存數據
  206. P0=Led_Tab[Led_Buf_temp[Led_Index]];// 數模段碼送P0口
  207. duan=1;// 打開段選
  208. duan=0;// 關閉段選,鎖存段碼

  209. P0=Led_Sel[Led_Index];// 位碼數據送P0口
  210. wei=1;// 打開位選
  211. wei=0;// 關閉位選,鎖存位碼
  212. if(++Led_Index>7) Led_Index=0;      
  213. }

  214. //初始化=============================================================================
  215. void init()
  216. {

  217. //以下9行消隱 在開機瞬間消除屏閃
  218. dscs=1;//關掉時鐘片選讓數據接收口(74hc573為數碼管的位碼和段碼鎖存器)得到純靜凈的數據信號

  219. duan=0;// 關閉段選
  220. wei=0;// 關閉位選

  221. P0=0xff;// 消隱碼
  222. duan=1;// 打開段選
  223. duan=0;// 關閉段選,鎖存消隱碼

  224. P0=0x00;// 消陷碼
  225. wei=1;// 打開位選
  226. wei=0;// 關閉位選,鎖存消隱碼

  227. //定時器設置   

  228. TMOD=0x11;            
  229. TL0=0xc5;//重裝初值              
  230. TH0=0xf1;//數碼管的刷新頻率2ms
  231. EA=1;//開定時總中斷
  232. ET0=1;//開定時器0中斷   用于遙控高低電平時間采集
  233. ET1=1;//開定時器1中斷
  234. TR0=1;//啟動定時器1     用于數碼管定時中斷掃描

  235. //以下是初始化時鐘芯片的控制寄存器A和B
  236. write_ds(0x0A,47);  //寫時鐘芯片DS12C887+A寄存器,打開振蕩器,啟動記時  輸出2HZ方波
  237. write_ds(0x0B,126); //寫時鐘芯片B




  238. }


  239. //寫時鐘芯片DS12C887+時序========(請參考DS12C887芯片手冊)

  240. void write_ds(uchar add,uchar date)
  241. {dscs=0;dsas=0;dsas=1;dsrw=1;dsds=1;P0=add;dsas=0;dsrw=0;P0=date;dsrw=1;dsas=1;dscs=1;}
  242.   
  243. //讀時鐘芯片DS12C887+時序========(請參考DS12C887芯片手冊)
  244. uchar read_ds(uchar add)
  245. {uchar ds_date;dscs=0;dsas=0;dsas=1;dsrw=1;dsds=1;P0=add;dsas=0;
  246. dsds=0;P0=0xff;ds_date=P0;dsds=1;dsas=1;dscs=1;return ds_date;}
  247.       
  248. //根據具體內容格式化輸出函數
  249. void led_out(uchar add_1,uchar add_2,uchar add_3,uchar add_4)
  250. {
  251. uchar a,b,c,d=add_4,i;
  252.   for(i=0;i<4;i++)
  253.    {
  254.    if(i==0) a=read_ds(add_1);
  255.    if(i==1) b=read_ds(add_2);
  256.    if(i==2) c=read_ds(add_3);
  257.    if(i==3) d=read_ds(add_4);
  258.    }
  259.    if(add_1==4)d=18;//時鐘間隔位
  260.    if(add_1==5)d=16;//鬧鐘間隔位
  261.   


  262.     if(add_1==4||add_1==5)//按不同的內容用不同的格式輸出(參數特征決定輸出內容)
  263.     {
  264.     Led_Buf[7]=a/10;//分離小時位數據   
  265.     Led_Buf[6]=a%10;                 
  266.     Led_Buf[4]=b/10;//分離分鐘位數據
  267.     Led_Buf[3]=b%10;
  268.     Led_Buf[1]=c/10;//分離秒鐘位數據
  269.     Led_Buf[0]=c%10;                 
  270.     Led_Buf[5]=d;   //間隔位   
  271.     Led_Buf[2]=d;
  272.     }

  273.     else if(add_1==9)
  274.     {
  275.     Led_Buf[7]=2;   //分離小時位數據   
  276.     Led_Buf[6]=0;                 
  277.     Led_Buf[5]=a/10;
  278.     Led_Buf[4]=a%10;//分離分鐘位數據
  279.     Led_Buf[3]=b/10;
  280.     Led_Buf[2]=b%10;
  281.     Led_Buf[1]=c/10;//分離秒鐘位數據
  282.     Led_Buf[0]=c%10;                 
  283.     }
  284.     else  for(i=0;i<8;i++) Led_Buf[i]=a;
  285. }


  286. //遙控碼顯示========================================================================
  287. void ykm_out()
  288. {
  289. uchar y;//由于使用過的鍵會對用戶碼全置1操作,所以在此根據用戶反碼取反操作還原用戶碼
  290. if(Ir_Buf[0]==0x02)y=(~Ir_Buf[3]);
  291. else y=Ir_Buf[2];

  292. Led_Buf[0]=Ir_Buf[3]&0xf;//結果裝入顯示緩沖區
  293. Led_Buf[1]=(Ir_Buf[3]/16)&0xf;//數據反碼
  294. Led_Buf[2]=y&0xf;
  295. Led_Buf[3]=(y/16)&0xf;//數據碼
  296. Led_Buf[4]=Ir_Buf[1]&0xf;
  297. Led_Buf[5]=(Ir_Buf[1]/16)&0xf;//用戶反碼
  298. Led_Buf[6]=Ir_Buf[0]&0xf;
  299. Led_Buf[7]=(Ir_Buf[0]/16)&0xf;//用戶碼

  300. }


  301. //遙控數字鍵直接預調時==================================================================================
  302. void ykm_set()//從最左第一位開始直接輸入一個0--9的數時顯示出來后自動右移一位,當到最右邊時轉到最左邊
  303. {

  304.    if((ok==1)&&((Ir_Buf[0]==0x02)&&(Ir_Buf[2]<10)))
  305.     {
  306.      if(zuo_you>7){zuo_you=7;ds=1;}//ds=1;保證此函數結束后不從寫 Led_Buf[7]
  307.   while(Led_Buf[zuo_you]>9){if((--zuo_you)==255) zuo_you=7;}//閃動的第7位不是十進制數則一直移動

  308.      if(Ir_Buf[2]<9)Led_Buf[zuo_you]=Ir_Buf[2]+1;//因為我的遙控器按1時數據碼是0x00,按2是0x01...,按0是0x09
  309.    else Led_Buf[zuo_you]=0;
  310.      if((--zuo_you)==255) {zuo_you=8;i_k=1;i=1;}//先右移,如果到最右邊一位則轉到最左邊一位
  311.   while(Led_Buf[zuo_you]>9){if((--zuo_you)==255)zuo_you=8;}//正在閃動的位不是十進制數則一直移動
  312.        Ir_Buf[2]=0xff;
  313.     }

  314.    if((ok==0)&&((Ir_Buf[0]==0x02)&&(Ir_Buf[2]<10)))
  315.     {
  316.     if(Ir_Buf[2]<6)shan_xia=Ir_Buf[2];
  317.     }
  318. }



  319. //調時閃動函數========================================================================
  320. void led_flash(uchar k,uchar z)//K為閃動開關,Z為閃動內容
  321. {
  322.    uchar x,y,a=k;
  323.    if(z==1)y=17;
  324.    else if(z==2)y=18;
  325.    else  y=19;
  326.      
  327.    if(a==0)for(x=0;x<8;x++)Led_Buf_temp[x]=Led_Buf[x];//正常狀態不閃動
  328.      
  329.    else//當K值不為0里閃動
  330.     {  
  331.        if(ms>220)for(x=0;x<8;x++){Led_Buf_temp[x]=Led_Buf[x];}//MS為閃動時基
  332.      else
  333.         {
  334.         if(zuo_you<=7)Led_Buf_temp[zuo_you]=y;
  335.       else  for(x=0;x<8;x++)Led_Buf_temp[x]=y;
  336.         }
  337.     }
  338. }



  339. //延時void delay(uint z)
  340. { uint x,y;for(x=z;x>0;x--)for(y=500;y>0;y--);}
  341. //紅外遙控=========================================================================
  342.    void hyyk()
  343. {
  344.    uint temp;
  345.    uchar i,j;

  346. temp=Ir_Get_Low();//低電平時間采集
  347. if(temp<c(8500) || temp>c(9500))    goto restart;//引導脈沖低電平在9ms    附近
  348. temp=Ir_Get_High();//高電平時間采集

  349. if(temp<c(4000) || temp>c(5000))    goto restart;//引導脈沖高電平在4。5ms 附近
  350. for(i=0;i<4;i++)//4個字節
  351.   for(j=0;j<8;j++)//每個字節8位  共32bit裝入Ir_Buf[4]
  352.     {
  353.     temp=Ir_Get_Low();
  354.     if(temp<c(200) || temp>c(800))  goto restart;//低電平時間符合
  355.     temp=Ir_Get_High();
  356.     if(temp<c(200) || temp>c(2000)) goto restart;//高電平時間符合
  357.     Ir_Buf[i]>>=1;//數據右移一位
  358.     if(temp>c(1120)) Ir_Buf[i]|=0x80;//高電平時間分析,大于1120us為1否則為0
  359.     }
  360. if(mute==0)//靜音功能,默認打開
  361. {
  362. beep=0;
  363. delay(15);
  364. beep=1;
  365. }
  366. restart://無效信號勻跳轉至此 加速循環提高程式運行效率
  367. TR1=0;//關定時器1中斷
  368. }

  369. //紅外低電平時間采集=======================================================================
  370. uint Ir_Get_Low()
  371. {                                       //定時器清0
  372. TL1=0;
  373. TH1=0;//開始記數
  374. TR1=1;//完成一次記數
  375. while(!Ir_Pin && (TH1&0x80)==0);               
  376. TR1=0;//關定時器
  377. return TH1*256+TL1;//反回記數值
  378. }
  379. //紅外高電平時間采集uint Ir_Get_High()

  380. {
  381. TL1=0;
  382. TH1=0;
  383. TR1=1;
  384. while(Ir_Pin && (TH1&0x80)==0);
  385. TR1=0;
  386. return TH1*256+TL1;
  387. }


  388. //時間調整數據采集分析寫調時緩沖區函數
  389. void time_set()
  390. {
  391.   uchar write[3]//write[3]為預寫緩沖區
  392.   ok=0;//當寫時鐘芯片后不閃,并可以馬上刷新屏幕
  393.   if((Led_Buf[2]==16)||(Led_Buf[2]==18))//此時顯示的是鬧鐘或時間,那么預寫緩沖區的數到顯示緩沖區相應的數
  394.       {
  395.        write[0]=Led_Buf[0]+Led_Buf[1]*10; //預寫秒位
  396.        write[1]=Led_Buf[3]+Led_Buf[4]*10; //預寫分位
  397.        write[2]=Led_Buf[6]+Led_Buf[7]*10; //預寫時位

  398.          if(Led_Buf[2]==18)               //是時間格式特征
  399.           {
  400.            write_ds(0x04,write[2]);       //寫時                     向時鐘芯片ds12c887+寫信息
  401.            write_ds(0x02,write[1]);       //寫分      
  402.            write_ds(0x00,write[0]);       //寫秒      
  403.           }
  404.          if(Led_Buf[2]==16)               //是鬧鐘格式特征
  405.           {
  406.            write_ds(0x05,write[2]);       //寫時(鬧鐘)               向時鐘芯片ds12c887+寫信息
  407.            write_ds(0x03,write[1]);       //寫分(鬧鐘)
  408.            write_ds(0x01,write[0]);       //寫秒(鬧鐘)
  409.           }      
  410.        }


  411.      
  412.     if((Led_Buf[7]==2)&&(Led_Buf[6]==0)&&(Led_Buf[3]<2)&&(Led_Buf[1]<4))//是日期的格式特征
  413.       {
  414.        write[0]=Led_Buf[0]+Led_Buf[1]*10;//預寫日
  415.        write[1]=Led_Buf[2]+Led_Buf[3]*10;//預寫月
  416.        write[2]=Led_Buf[4]+Led_Buf[5]*10;//預寫年
  417.        write_ds(0x09,write[2]);          //寫年                      向時鐘芯片ds12c887+寫信息
  418.        write_ds(0x08,write[1]);          //寫月
  419.        write_ds(0x07,write[0]);          //寫日
  420.        }


  421.      if((Led_Buf[1]==Led_Buf[2])&&(Led_Buf[6]==Led_Buf[7]))//是星期格式特征(先排除時間與鬧鐘格式再排除日期格式)
  422.       {

  423.        write[0]=Led_Buf[7];
  424.       // if(write[0]>7)write[0]=0;
  425.        write_ds(0x06,write[0]);         //寫星期                    向時鐘芯片ds12c887+寫信息
  426.       }
  427. }


  428. //以下全為溫度傳感函數

  429. //延時
  430. void delay_18b20(uint i)
  431. {while(i--);}


  432. //初始化函數
  433. Init_DS18B20(void)
  434. {
  435. uchar x=0;
  436. DQ = 1;    //DQ復位
  437. delay_18b20(8); //稍做延時
  438. DQ = 0;    //單片機將DQ拉低
  439. delay_18b20(80); //精確延時 大于 480us
  440. DQ = 1;    //拉高總線
  441. delay_18b20(14);
  442. x=DQ;      //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
  443. delay_18b20(20);
  444. }
  445. //讀一個字節
  446. ReadOneChar(void)
  447. {
  448. uchar i=0;
  449. uchar dat = 0;
  450. for (i=8;i>0;i--)
  451. {
  452. DQ = 0; //給脈沖信號
  453. dat>>=1;
  454. DQ = 1; //給脈沖信號
  455. if(DQ)
  456.    dat|=0x80;
  457. delay_18b20(4);
  458. }
  459. return(dat);
  460. }
  461. //寫一個字節
  462. WriteOneChar(unsigned char dat)
  463. {
  464. unsigned char i=0;
  465. for (i=8; i>0; i--)
  466. {
  467. DQ = 0;
  468. DQ = dat&0x01;
  469. delay_18b20(5);
  470. DQ = 1;
  471. dat>>=1;
  472. }
  473. delay_18b20(4);
  474. }
  475. //讀取溫度
  476. ReadTemperature(void)
  477. {
  478. unsigned char a=0;
  479. unsigned char b=0;
  480. unsigned char t=0;
  481. Init_DS18B20();
  482. WriteOneChar(0xCC);// 跳過讀序號列號的操作
  483. WriteOneChar(0x44);// 啟動溫度轉換
  484. Init_DS18B20();
  485. WriteOneChar(0xCC);//跳過讀序號列號的操作
  486. WriteOneChar(0xBE);//讀取溫度寄存器等(共可讀9個寄存器)前兩個就是溫度
  487. a=ReadOneChar();//讀取溫度值低位
  488. b=ReadOneChar();//讀取溫度值高位
  489. a=a>>4;//低位右移4位,舍棄小數部分
  490. t=b<<4;//高位左移4位,舍棄符號位
  491. t=t|a;           
  492. return(t);
  493. }

  494. void out_18b20()//溫度顯示函數
  495. {
  496. int temp_18b20;
  497. temp_18b20=ReadTemperature();
  498. Led_Buf[7]=16;
  499. Led_Buf[6]=16;
  500. Led_Buf[5]=16;
  501. Led_Buf[4]=16;
  502. Led_Buf[3]=temp_18b20/10;
  503. Led_Buf[2]=temp_18b20%10;
  504. Led_Buf[1]=20;
  505. Led_Buf[0]=21;

  506. }
復制代碼




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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲第一在线 | 中文一级片 | 欧美成人精品一区二区男人看 | 天天干天天操天天看 | 国产清纯白嫩初高生在线播放视频 | 午夜成人免费视频 | 日韩成人av在线 | 午夜男人的天堂 | 亚洲综合一区二区三区 | 九九热免费视频在线观看 | 黄色激情毛片 | 欧美中文字幕在线观看 | 日韩欧美国产一区二区三区 | 91久久精品视频 | 亚洲一区视频在线播放 | 国产伦精品一区二区三区高清 | 九九久久久 | 羞羞的视频免费看 | 热99视频| 视频一区中文字幕 | 91精品中文字幕一区二区三区 | 蜜桃精品视频在线 | 日韩中文字幕区 | www精品美女久久久tv | 亚洲色视频 | 美女在线国产 | 另类专区亚洲 | 欧美一区二区三区小说 | 日韩在线小视频 | 亚洲网址在线观看 | www.久久久.com | 在线观看免费黄色片 | 中文字幕亚洲免费 | 欧美精品成人一区二区三区四区 | 欧美一区在线视频 | 激情一区二区三区 | 一级毛片免费 | 日韩一区二区在线观看 | 午夜精品久久久久久久星辰影院 | 伊人91在线 | www国产精品|