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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3918|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

單片機數(shù)碼管動態(tài)掃描程序DS12C887紅外遙控ds18b20

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

/////////DS12C887+8位數(shù)碼管定時器中斷動態(tài)掃描遙控時鐘單片機程序模塊////////

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

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

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

  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;//數(shù)據(jù)選通或輸入
  16. sbit dsirq= P2^2;//中斷請求輸出
  17. sbit DQ =P2^2;//定義溫度傳感器(18b20)通信端口


  18. //字符碼表

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

  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;//上下變量,左右變量,遙控數(shù)字,紅外結(jié)果

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

  29. //以下是動態(tài)掃描變量
  30. uchar Led_Buf[8],Led_Buf_temp[8],Led_Index;//顯示緩沖區(qū),調(diào)時閃動緩沖區(qū),位碼索引


  31. //聲明子函數(shù)

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

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

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

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

  42. void ykm_set();

  43. void time_set();//時間調(diào)整數(shù)據(jù)采集分析寫調(diào)時緩沖區(qū)函數(shù)

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

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

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

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

  56. void main()//程序入口
  57. {
  58. init();//初始化
  59.      
  60. while(1)//循環(huán)等待中斷
  61.    {
  62.       hyyk();//遙控
  63.       if ((Ir_Buf[0]==0x02)&&(Ir_Buf[2]==0x14))//POWER鍵值翻轉(zhuǎn)并響鈴
  64.          {
  65.           ok=0;zuo_you=8;shan_xia=0;//有遙控power時復(fù)位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標(biāo)志為1時關(guān)屏關(guān)鈴
  77.    
  78.      if(power==0)//power標(biāo)志為0時根據(jù)shan_xia鍵值顯示內(nèi)容
  79.         {
  80.         ykm_set();//遙控調(diào)時,調(diào)整好后按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;//關(guān)時鐘芯片讀與顯存刷新,在中斷掃描時會打開
  98.            //只有在需要顯示具體內(nèi)容時才會訪問時鐘芯片對應(yīng)的具體地址并更新顯示緩沖區(qū)
  99.             
  100.       //ok鍵值翻轉(zhuǎn)
  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;}//如果是位閃狀態(tài)按ok鍵就進(jìn)入全閃狀態(tài)
  104.       else {ok=(!ok);zuo_you=8;}//否則閃<==>不閃   狀態(tài)翻轉(zhuǎn)一次
  105.       //if(ok==0){i_k=0;ds_temp=0;}//不閃時可以刷新數(shù)據(jù)
  106.       Ir_Buf[2]=0xff;
  107.       }
  108.       
  109.       //MUTE鍵值翻轉(zhuǎn)并響鈴
  110.       if ((Ir_Buf[0]==0x02)&&(Ir_Buf[2]==0x0c))
  111.          {
  112.          if(((ok==1)&&(zuo_you>7))&&(ds_temp>0))time_set();//如果從位閃變?yōu)槿W并且8秒寫時鐘窗口打開則寫時鐘
  113.          else   mute=(!mute);//否則此鍵為靜音轉(zhuǎn)換功能
  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;//如果沒有閃屏按此鍵關(guān)閉聲音
  127.          if(ok==1)
  128.          {
  129.          if(++zuo_you>7) zuo_you=0;//左移,超出苑圍轉(zhuǎn)到最右邊
  130.          while(Led_Buf[zuo_you]>9){if((++zuo_you)>7) zuo_you=0;}//正在如果要閃動的位不是十則一直數(shù)還
  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;//右移,超出苑圍轉(zhuǎn)到最左邊
  141.          while(Led_Buf[zuo_you]>9){if((--zuo_you)==255) zuo_you=7;}//正在閃動的位不是十進(jìn)制數(shù)則一直移動開遙控
  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]++;//位閃狀態(tài)有上鍵按下對應(yīng)位加一
  152.          if(Led_Buf[zuo_you]>9)Led_Buf[zuo_you]=0;//超出為0
  153.          }
  154.       else
  155.          {
  156.          zuo_you=8;//改變顯示內(nèi)容時位閃變?nèi)灵W
  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]--;//位閃狀態(tài)有上鍵按下對應(yīng)位減一
  167.          if(Led_Buf[zuo_you]==255)Led_Buf[zuo_you]=9;//超出則為9
  168.          }
  169.       else
  170.          {
  171.          zuo_you=8;//改變顯示內(nèi)容時位閃變?nèi)灵W
  172.          if((--shan_xia)==255) shan_xia=5;//自減,超出則為4
  173.          }
  174.         Ir_Buf[2]=0xff;
  175.       }
  176.    }
  177. }                        
  178. }   

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

  184.   if(i_k==1) //不閃屏?xí)r允許刷新讀寫信息
  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秒內(nèi)和位閃調(diào)時時不允許刷新顯存
  191. else ds=0;//ds為何0時才允許刷新顯存

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

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

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



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

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

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

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

  219. duan=0;// 關(guān)閉段選
  220. wei=0;// 關(guān)閉位選

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

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

  227. //定時器設(shè)置   

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

  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. //根據(jù)具體內(nèi)容格式化輸出函數(shù)
  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)//按不同的內(nèi)容用不同的格式輸出(參數(shù)特征決定輸出內(nèi)容)
  263.     {
  264.     Led_Buf[7]=a/10;//分離小時位數(shù)據(jù)   
  265.     Led_Buf[6]=a%10;                 
  266.     Led_Buf[4]=b/10;//分離分鐘位數(shù)據(jù)
  267.     Led_Buf[3]=b%10;
  268.     Led_Buf[1]=c/10;//分離秒鐘位數(shù)據(jù)
  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;   //分離小時位數(shù)據(jù)   
  276.     Led_Buf[6]=0;                 
  277.     Led_Buf[5]=a/10;
  278.     Led_Buf[4]=a%10;//分離分鐘位數(shù)據(jù)
  279.     Led_Buf[3]=b/10;
  280.     Led_Buf[2]=b%10;
  281.     Led_Buf[1]=c/10;//分離秒鐘位數(shù)據(jù)
  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操作,所以在此根據(jù)用戶反碼取反操作還原用戶碼
  290. if(Ir_Buf[0]==0x02)y=(~Ir_Buf[3]);
  291. else y=Ir_Buf[2];

  292. Led_Buf[0]=Ir_Buf[3]&0xf;//結(jié)果裝入顯示緩沖區(qū)
  293. Led_Buf[1]=(Ir_Buf[3]/16)&0xf;//數(shù)據(jù)反碼
  294. Led_Buf[2]=y&0xf;
  295. Led_Buf[3]=(y/16)&0xf;//數(shù)據(jù)碼
  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. //遙控數(shù)字鍵直接預(yù)調(diào)時==================================================================================
  302. void ykm_set()//從最左第一位開始直接輸入一個0--9的數(shù)時顯示出來后自動右移一位,當(dāng)?shù)阶钣疫厱r轉(zhuǎn)到最左邊
  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;保證此函數(shù)結(jié)束后不從寫 Led_Buf[7]
  307.   while(Led_Buf[zuo_you]>9){if((--zuo_you)==255) zuo_you=7;}//閃動的第7位不是十進(jìn)制數(shù)則一直移動

  308.      if(Ir_Buf[2]<9)Led_Buf[zuo_you]=Ir_Buf[2]+1;//因為我的遙控器按1時數(shù)據(jù)碼是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;}//先右移,如果到最右邊一位則轉(zhuǎn)到最左邊一位
  311.   while(Led_Buf[zuo_you]>9){if((--zuo_you)==255)zuo_you=8;}//正在閃動的位不是十進(jìn)制數(shù)則一直移動
  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. //調(diào)時閃動函數(shù)========================================================================
  320. void led_flash(uchar k,uchar z)//K為閃動開關(guān),Z為閃動內(nèi)容
  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];//正常狀態(tài)不閃動
  328.      
  329.    else//當(dāng)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;//引導(dǎo)脈沖低電平在9ms    附近
  348. temp=Ir_Get_High();//高電平時間采集

  349. if(temp<c(4000) || temp>c(5000))    goto restart;//引導(dǎo)脈沖高電平在4。5ms 附近
  350. for(i=0;i<4;i++)//4個字節(jié)
  351.   for(j=0;j<8;j++)//每個字節(jié)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;//數(shù)據(jù)右移一位
  358.     if(temp>c(1120)) Ir_Buf[i]|=0x80;//高電平時間分析,大于1120us為1否則為0
  359.     }
  360. if(mute==0)//靜音功能,默認(rèn)打開
  361. {
  362. beep=0;
  363. delay(15);
  364. beep=1;
  365. }
  366. restart://無效信號勻跳轉(zhuǎn)至此 加速循環(huán)提高程式運行效率
  367. TR1=0;//關(guān)定時器1中斷
  368. }

  369. //紅外低電平時間采集=======================================================================
  370. uint Ir_Get_Low()
  371. {                                       //定時器清0
  372. TL1=0;
  373. TH1=0;//開始記數(shù)
  374. TR1=1;//完成一次記數(shù)
  375. while(!Ir_Pin && (TH1&0x80)==0);               
  376. TR1=0;//關(guān)定時器
  377. return TH1*256+TL1;//反回記數(shù)值
  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. //時間調(diào)整數(shù)據(jù)采集分析寫調(diào)時緩沖區(qū)函數(shù)
  389. void time_set()
  390. {
  391.   uchar write[3]//write[3]為預(yù)寫緩沖區(qū)
  392.   ok=0;//當(dāng)寫時鐘芯片后不閃,并可以馬上刷新屏幕
  393.   if((Led_Buf[2]==16)||(Led_Buf[2]==18))//此時顯示的是鬧鐘或時間,那么預(yù)寫緩沖區(qū)的數(shù)到顯示緩沖區(qū)相應(yīng)的數(shù)
  394.       {
  395.        write[0]=Led_Buf[0]+Led_Buf[1]*10; //預(yù)寫秒位
  396.        write[1]=Led_Buf[3]+Led_Buf[4]*10; //預(yù)寫分位
  397.        write[2]=Led_Buf[6]+Led_Buf[7]*10; //預(yù)寫時位

  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;//預(yù)寫日
  415.        write[1]=Led_Buf[2]+Led_Buf[3]*10;//預(yù)寫月
  416.        write[2]=Led_Buf[4]+Led_Buf[5]*10;//預(yù)寫年
  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. //以下全為溫度傳感函數(shù)

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


  432. //初始化函數(shù)
  433. Init_DS18B20(void)
  434. {
  435. uchar x=0;
  436. DQ = 1;    //DQ復(fù)位
  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. //讀一個字節(jié)
  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. //寫一個字節(jié)
  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);// 啟動溫度轉(zhuǎn)換
  484. Init_DS18B20();
  485. WriteOneChar(0xCC);//跳過讀序號列號的操作
  486. WriteOneChar(0xBE);//讀取溫度寄存器等(共可讀9個寄存器)前兩個就是溫度
  487. a=ReadOneChar();//讀取溫度值低位
  488. b=ReadOneChar();//讀取溫度值高位
  489. a=a>>4;//低位右移4位,舍棄小數(shù)部分
  490. t=b<<4;//高位左移4位,舍棄符號位
  491. t=t|a;           
  492. return(t);
  493. }

  494. void out_18b20()//溫度顯示函數(shù)
  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. }
復(fù)制代碼




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

使用道具 舉報

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

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美极品在线观看 | 麻豆精品久久久 | 精品香蕉一区二区三区 | 国产wwwcom| 99久久婷婷国产综合精品电影 | 精品二 | 中文字幕在线看第二 | 亚洲人在线播放 | 日韩一区二区视频 | 国产精品久久久久久 | 在线婷婷 | 国产xxx在线观看 | 日韩精品区 | 日韩免费在线 | 性天堂网| 成人深夜福利在线观看 | 亚洲精品综合 | 免费看黄色小视频 | 亚洲欧美综合精品另类天天更新 | 午夜视频在线观看网站 | 国产午夜精品久久久久 | 欧美精品91爱爱 | 在线观看中文字幕视频 | 欧美日韩视频在线 | 久久久久久久国产 | 亚洲v日韩v综合v精品v | 免费一级黄 | www.日本三级| 日韩中文字幕视频在线 | 精品伊人 | 久久精品网 | 久久国产婷婷国产香蕉 | 三级免费av | 国产精品美女 | 久久成人免费 | 日韩成人免费av | 精品久久久网站 | 青青操91| 日韩在线视频一区二区三区 | 精品久久久久久久 | 亚洲高清视频一区二区 |