找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

基于stc15w204s單片機(jī)的水晶倒計(jì)時(shí)牌制作 附代碼

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
基于stc15f204s的水晶倒計(jì)時(shí)牌
第一次在這發(fā)帖,如有不周請(qǐng)指正!

以前在網(wǎng)上發(fā)現(xiàn)了一個(gè)神操作,就是把搭棚電路封裝在滴膠里,美觀耐用且防止氧化。與其說(shuō)是電路制作,我覺(jué)得是藝術(shù)品。寒假正好沒(méi)事干,就搞了一個(gè)倒計(jì)時(shí)牌,把之前學(xué)的51單片機(jī)知識(shí)用一用,順便督促一下自己珍惜時(shí)間。
剛開(kāi)始是想用 STC15F104E(因?yàn)橘I(mǎi)多了)【注意,這個(gè)單片機(jī)內(nèi)部定時(shí)器是T0和T1,跟現(xiàn)在的新產(chǎn)品不一樣】 ,做了幾個(gè)功能發(fā)現(xiàn)到處出bug,而且下載器里面沒(méi)有這個(gè)型號(hào),數(shù)據(jù)手冊(cè)里面也只不過(guò)提了一兩次。后來(lái)一查發(fā)現(xiàn)這個(gè)型號(hào)早已經(jīng)停產(chǎn)了,而且它的定時(shí)器和外部中斷由BUG(怒)。于是換了個(gè)stc15w204s。工欲善其事必先利其器,計(jì)劃在面包板上先做程序,調(diào)試好確定管腳分配后再搭棚。面包板接觸不好(通。,所以做了個(gè)單片機(jī)轉(zhuǎn)接座:





程序不是很復(fù)雜,有的地方有點(diǎn)啰嗦(大神勿噴),這里簡(jiǎn)單解釋一下,整體思路是單片機(jī)驅(qū)動(dòng)hc595,595驅(qū)動(dòng)三位數(shù)碼管的段,單片機(jī)用9012擴(kuò)流驅(qū)動(dòng)數(shù)碼管的位,int0借1838b紅外接收,再加上ds1302時(shí)鐘芯片和ds18b20溫度芯片,還剩一個(gè)管腳接了rgb自閃燈(本來(lái)可以接紅外發(fā)射實(shí)現(xiàn)數(shù)據(jù)雙向傳輸?shù),不過(guò)我懶得寫(xiě)程序和功能了)平時(shí)單片機(jī)就是while(1)等待,刷新、ir接收什么的全靠?jī)蓚(gè)定時(shí)器T0 T1和外部中斷0觸發(fā)。紅外接收程序是我自己想的,非常繁瑣(本可以簡(jiǎn)單一些,不過(guò)我這么寫(xiě)可以最大程度上減少誤觸發(fā))。

單片機(jī)代碼如下:
  1. #include<STC15.h>
  2. #include<stdio.h>
  3. #include<INTRINS.H>
  4. sfr WDT_COUNTER = 0xc1;//【下載的時(shí)候請(qǐng)勾選‘上電復(fù)位由硬件啟動(dòng)看門(mén)狗’】
  5. //sbit CLR_WDT = WDT_COUNTER^5; //軟件置1,防止誤殺
  6. /*
  7. STC15w204s單片機(jī),。數(shù)碼管共陽(yáng),0亮1滅。
  8. 使用兩片74hc595擴(kuò)充管腳數(shù)目,連接ds1302時(shí)鐘芯片和1838B紅外接收頭。

  9. **********IR接收程序(NEC協(xié)議)************
  10. 基于狀態(tài)機(jī),拒絕軟件delay函數(shù),只使用一個(gè)定
  11. 時(shí)器和一個(gè)中斷(必須支持上升/下降沿中斷),
  12. 有利于系統(tǒng)資源的節(jié)約。程序錯(cuò)誤無(wú)累計(jì),利于
  13. 長(zhǎng)期穩(wěn)定運(yùn)行。使用定時(shí)器作為時(shí)間基準(zhǔn),如需
  14. 要移植程序,只需要按照源程序時(shí)間要求重新生
  15. 成定時(shí)器初始化函數(shù)。其中所有關(guān)鍵組件,均已
  16. 在其后注明【這是計(jì)劃的一部分】。
  17. *******************************2020年2月20日
  18. BUG記錄:
  19. int0輸入信息量過(guò)大會(huì)造成程序跑飛
  20. */
  21. typedef unsigned char u8;//【這是計(jì)劃的一部分】
  22. typedef unsigned int u16;

  23. //595引腳連接(待定)Q0對(duì)應(yīng)低位,Q7對(duì)應(yīng)高位
  24. sbit ser=P5^5;  //也叫SI
  25. sbit srclk=P1^5;  //刷新輸出,上升沿有效
  26. sbit rclk=P1^4;  //內(nèi)部移位,上升沿有效

  27. //1838B
  28. sbit ir=P3^2;//【這是計(jì)劃的一部分】

  29. //18B20
  30. sbit DSPORT=P5^4;

  31. //DS1302
  32. sbit RST=P1^3;           //控制器復(fù)位        高電平時(shí)才能工作,其實(shí)與復(fù)位關(guān)系不大
  33. sbit DSIO=P1^2;           //數(shù)據(jù)
  34. sbit SCLK=P1^1;           //時(shí)

  35. //led
  36. sbit led=P1^0;

  37. //有關(guān)于紅外接收的狀態(tài)標(biāo)志位,定時(shí)器用t0,中斷用int0。【這是計(jì)劃的一部分】
  38. bit iract=0;        //紅外活動(dòng)
  39. u8 irstate=0;        //紅外接受狀態(tài)0-6{未激活;報(bào)頭低;報(bào)頭升;報(bào)頭高;報(bào)頭降;高電平;低電平}
  40. bit started=0;        //已收到報(bào)頭,請(qǐng)忽視報(bào)尾
  41. bit t0reset=0;        //定時(shí)器0溢出就回到等待狀態(tài)
  42. bit int0reset=0;        //int0觸發(fā)就回到等待狀態(tài)
  43. bit int0negfall=0;        //忽視int0的下降沿(只允許上升沿中斷)
  44. u8 bitamount=0;        //收到的總位數(shù)(0-32)
  45. bit irbit=0; //當(dāng)前ir位數(shù)
  46. u8 ir1=0x00,ir2=0xff,ir3=0x00,ir4=0xff;//ir接受結(jié)果
  47. bit irreceived=0;//如有待處理的紅外信息,此位置1
  48. u8 irresult=0;//irdecode函數(shù)解碼結(jié)果

  49. //system
  50. u16 data count=1000;
  51. u8 data stat=1;//0熄屏;1正常帶溫度;2正常無(wú)溫度;3設(shè)置界面(3set,4h十位,5h個(gè)位,6d百位,7d十位,8d個(gè)位)
  52. u8 data days=123; //倒計(jì)時(shí)應(yīng)該顯示的天數(shù),同步存放于0000h
  53. u8 data wk=0x00;//上次查詢(xún)到的星期,將與此次查詢(xún)到的比較同步存放于0001h
  54. u8 data keynum=0;//按鍵輸入的數(shù)字
  55. //sbit led=P1^2;

  56. //顯示相關(guān)變量
  57. u8 code duan[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0x11,0xc1,0x63,0x85,0x61,0x71,//0-15
  58.                                                                 0x02,0x9e,0x24,0x0c,0x98,0x48,0x40,0x1e,0x00,0x08,0x10,0xc0,0x62,0x84,0x60,0x70,//16-31
  59.                                                                 0xff,0xef,0x91};//數(shù)碼管顯示,0-9,A,b,C,d,E,F,不亮,(5)(14),_,H,(13).0-34
  60. u8 data num2,num1,num0;
  61. u8 data w=2;//數(shù)碼管的位號(hào)
  62. sbit wei0=P3^3;
  63. sbit wei1=P3^7;
  64. sbit wei2=P3^6;

  65. //18b20
  66. int temp;//溫度*100

  67. //1302
  68. //---DS1302時(shí)鐘初始化2016年5月7日星期六12點(diǎn)00分00秒。---//
  69. //---存儲(chǔ)順序是秒,分,時(shí),  日,  月, 星期, 周年,存儲(chǔ)格式是用BCD碼---//
  70. //u8 TIME[7] = {0, 0, 0x12, 0x07, 0x05, 0x06, 0x16};
  71. u8 TIME[7]= {0x00, 0x55, 0x23, 0x15, 0x10, 0x02, 0x19}; //星期是time[5],小時(shí)是time【2】
  72. u8 timeset[7]={0x00, 0x02, 0x13, 0x07, 0x12, 0x06, 0x19};
  73. //---DS1302寫(xiě)入和讀取時(shí)分秒的地址命令---//
  74. //---秒分時(shí)日月周年 最低位讀寫(xiě)位;-------//
  75. u8 code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
  76. u8 code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};         //兩者的區(qū)別只在于末位(發(fā)送的時(shí)候作為最先發(fā)送的)用于決定該命令是讀還是寫(xiě)


  77. //基本函數(shù)
  78. void hc595write();
  79. void intinit();
  80. void Timer1Init();

  81. //紅外相關(guān)函數(shù)
  82. void irinit();
  83. void irdecode();

  84. //溫度相關(guān)函數(shù)
  85. void Ds18b20Init();
  86. void Ds18b20WriteByte(unsigned char dat);
  87. unsigned char Ds18b20ReadByte();
  88. int Ds18b20ReadTemp();

  89. //eeprom相關(guān)函數(shù)
  90. void iaperase(unsigned char addrh,unsigned char addrl);
  91. void iapwrite(unsigned char addrh,unsigned char addrl,unsigned char dat);
  92. unsigned char iapread(unsigned char addrh,unsigned char addrl);
  93. void iaprst();

  94. //ds1302相關(guān)函數(shù)
  95. void Ds1302Write(u8 addr, u8 dat);
  96. u8 Ds1302Read(u8 addr);
  97. void Ds1302set();
  98. void Ds1302ReadTime();

  99. void intinit()
  100. {
  101.         EA=1;
  102.         ET0=1;
  103.         //ET1=1;
  104.         IE2=0x04;  //T2使能,T2的優(yōu)先級(jí)固定為低。IE2不可位尋址,ET2在右數(shù)第三位。
  105.         EX0=1;  //P3.2中斷使能
  106.         IT0=1;  //P3.2僅接受下降沿中斷【這是計(jì)劃的一部分】
  107.         PX0=1;  //P3.2中斷優(yōu)先級(jí)高,又因?yàn)樽匀粌?yōu)先級(jí)的緣故,高于T0。
  108.         PT0=1;  //T0優(yōu)先級(jí)高
  109.         //PT1=0;  //T1優(yōu)先級(jí)低
  110. }

  111. void Timer2Init(void)                //5毫秒@11.0592MHz
  112. {
  113.         AUXR &= 0xFB;                //定時(shí)器時(shí)鐘12T模式
  114.         T2L = 0x00;                //設(shè)置定時(shí)初值
  115.         T2H = 0xEE;                //設(shè)置定時(shí)初值
  116.         AUXR |= 0x10;                //定時(shí)器2開(kāi)始計(jì)時(shí)
  117. }

  118. void irdecode()
  119. {
  120.         switch(ir3)
  121.         {
  122.                 case 0x16:
  123.                         irresult=0;
  124.                         break;
  125.                 case 0x0c:
  126.                         irresult=1;
  127.                         break;
  128.                 case 0x18:
  129.                         irresult=2;
  130.                         break;
  131.                 case 0x5e:
  132.                         irresult=3;
  133.                         break;
  134.                 case 0x08:
  135.                         irresult=4;
  136.                         break;
  137.                 case 0x1c:
  138.                         irresult=5;
  139.                         break;
  140.                 case 0x5a:
  141.                         irresult=6;
  142.                         break;
  143.                 case 0x42:
  144.                         irresult=7;
  145.                         break;
  146.                 case 0x52:
  147.                         irresult=8;
  148.                         break;
  149.                 case 0x4a:
  150.                         irresult=9;
  151.                         break;
  152.                 case 0x45:
  153.                         irresult=10;//電源鍵
  154.                         break;
  155.                 case 0x47:
  156.                         irresult=11;//菜單鍵
  157.                         break;
  158.                 case 0x15:
  159.                         irresult=12;//播放鍵
  160.                         break;
  161.                
  162.         }
  163. }

  164. void irinit()  //紅外接受狀態(tài)0的初始化函數(shù)【這是計(jì)劃的一部分】,狀態(tài)標(biāo)志初始化,定時(shí)器初始化,int0初始化,數(shù)據(jù)接收配置初始化
  165. {
  166.         iract=0;
  167.         irstate=0;//紅外接受狀態(tài)0-6{未激活;報(bào)頭低;報(bào)頭升;報(bào)頭高;報(bào)頭降;高電平;低電平}
  168.         started=0;
  169.         t0reset=0;
  170.         int0reset=0;
  171.         int0negfall=0;
  172.         EX0=1;  //P3.2中斷使能
  173.         IT0=1;  //P3.2僅接受下降沿中斷【這是計(jì)劃的一部分】
  174.         PX0=1;
  175.         
  176.         AUXR &= 0x7F;                //定時(shí)器時(shí)鐘12T模式
  177.         TMOD &= 0xF0;                //設(shè)置定時(shí)器模式(先清零)
  178.         TMOD |= 0x01;                //設(shè)置定時(shí)器模式(再寫(xiě)入)統(tǒng)一規(guī)定:T0,16位不自動(dòng)重裝載,12T。
  179.         TF0 = 0;                //清除TF0標(biāo)志
  180.         TR0 = 0;                //定時(shí)器0不計(jì)時(shí)
  181.         
  182.         EX0=1;  //P3.2中斷使能
  183.         IT0=1;  //P3.2僅接受下降沿中斷
  184.         PX0=1;  //P3.2中斷優(yōu)先級(jí)高,又因?yàn)樽匀粌?yōu)先級(jí)的緣故,高于T0。
  185.         
  186.         bitamount=0;
  187.         
  188. }

  189. void hc595write(void)          //給595輸入數(shù)據(jù)c是數(shù)碼管,最后送進(jìn)去的那一位出現(xiàn)在q0
  190. {
  191.         u8 t=0,a=0,shu=0x00;//t是循環(huán)變量,a是待發(fā)送的值,先發(fā)送級(jí)聯(lián)的那片,顯示8段,再發(fā)送直連的
  192.         wei2=1;
  193.         wei1=1;
  194.         wei0=1;
  195.         switch(w)
  196.         {
  197.                 case 0:
  198.                         shu=duan[num0];
  199.                         break;
  200.                 case 1:
  201.                         shu=duan[num1];
  202.                         break;
  203.                 case 2:
  204.                         shu=duan[num2];
  205.                         break;
  206.         }
  207.         for(t=0;t<=7;t++)//數(shù)字區(qū),8位
  208.         {
  209.                 if((shu&0x01)==0)
  210.                         ser=0;
  211.                 else
  212.                         ser=1;
  213.                 rclk=1;
  214.                 rclk=0;
  215.                 shu=shu>>1;
  216.         }

  217.         if(w>=2)//可以控制掃描順序
  218.                 w=0;
  219.         else
  220.                 w++;

  221.         srclk=1;
  222.         srclk=0;
  223.         switch(w)
  224.                 {
  225.                         case 0:
  226.                                 wei0=0;
  227.                                 break;
  228.                         case 1:
  229.                                 wei1=0;
  230.                                 break;
  231.                         case 2:
  232.                                 wei2=0;
  233.                                 break;
  234.                 }
  235. }

  236. void main() //    我是main函數(shù)
  237. {
  238.         int a=3;
  239.         led=1;
  240.         srclk=0;
  241.         rclk=0;
  242.         ser=0;
  243.         wk=iapread(0x00,0x01);
  244.         days=iapread(0x00,0x00);
  245.         intinit(); //【這是計(jì)劃的一部分】
  246.         Timer2Init();
  247.         WDT_COUNTER=0x37;//【這不是計(jì)劃的一部分】
  248.         irinit();
  249.         num2=24;
  250.         num1=24;
  251.         num0=24;//試機(jī)
  252.         while(1)
  253.         {
  254.           //跑飛的時(shí)候while(1)里面的內(nèi)容仍然正常執(zhí)行
  255.         }
  256. }

  257. void timer2() interrupt 12//正常顯示的掃描刷新步驟
  258. {
  259.         if(irreceived==1)//有按鍵剛剛按下且未處理
  260.         {
  261.                 irdecode();
  262.                 switch(irresult)
  263.                 {
  264.                         case 10://電源鍵
  265.                         {
  266.                                 if(stat==0)
  267.                                 {        
  268.                                         stat=1;
  269.                                         num2=days/100;
  270.                                         num1=(days%100)/10;
  271.                                         num0=days%10;
  272.                                 }
  273.                                 else
  274.                                 {
  275.                                         stat=0;
  276.                                         num2=32;
  277.                                         num1=32;
  278.                                         num0=32;
  279.                                         hc595write();
  280.                                 }
  281.                                 break;
  282.                         }
  283.                         case 11://菜單鍵
  284.                         {
  285.                                 if(stat<=2)
  286.                                 {
  287.                                         stat=3;//確認(rèn)進(jìn)入設(shè)置模式
  288.                                         num2=34;//H
  289.                                         num1=33;//_
  290.                                         num0=34;//H
  291.                                 }
  292.                                 else
  293.                                 {
  294.                                         stat=1;
  295.                                 }
  296.                                 break;
  297.                         }
  298.                         case 12://播放鍵
  299.                         {
  300.                                 if(stat==1)
  301.                                         stat=2;
  302.                                 if(stat==2)
  303.                                         stat=1;
  304.                                         break;
  305.                         }
  306.                         case 0:
  307.                                 led=~led;
  308.                         case 1:
  309.                         case 2:
  310.                         case 3:
  311.                         case 4:
  312.                         case 5:
  313.                         case 6:
  314.                         case 7:
  315.                         case 8:
  316.                         case 9:
  317.                                 keynum=irresult;//先記錄下鍵值
  318.                                 switch (stat)
  319.                                 {
  320.                                         case 3:
  321.                                                 timeset[2]=keynum*16;
  322.                                         num1=keynum;
  323.                                         num0=33;//_
  324.                                         stat=4;
  325.                                         break;
  326.                                         case 4:
  327.                                                 timeset[2]=timeset[2]+keynum;
  328.                                         num2=33;//_
  329.                                         num1=13;//d
  330.                                         num0=13;//d
  331.                                         stat=5;
  332.                                         break;
  333.                                         case 5:
  334.                                                 days=keynum*100;
  335.                                         num2=keynum;
  336.                                         num1=33;//_
  337.                                         num0=13;//d
  338.                                         stat=6;
  339.                                         break;
  340.                                         case 6:
  341.                                                 days=days+keynum*10;
  342.                                         num1=keynum;
  343.                                         num0=33;//_
  344.                                         stat=7;
  345.                                         break;
  346.                                         case 7:
  347.                                                 days=days+keynum;
  348.                                         Ds1302set();//向ds1302寫(xiě)入小時(shí)
  349.                                         iaperase(0x00,0x00);
  350.                                         iapwrite(0x00,0x00,days);
  351.                                         Ds1302ReadTime();
  352.                                         wk=TIME[5];
  353.                                         iapwrite(0x00,0x01,wk);//向eeprom寫(xiě)入正確的天數(shù)和星期
  354.                                         num2=days/100;
  355.                                         num1=(days%100)/10;
  356.                                         num0=days%10;//更新顯示內(nèi)容
  357.                                                 stat=1;
  358.                                         break;

  359.                                 }
  360.                                 break;
  361.                 }
  362.                 irreceived=0;
  363.         }
  364.         if(count>0)
  365.         {
  366.                 count--;
  367.                 if(count==1000)
  368.                         WDT_COUNTER=WDT_COUNTER|0x10; //WDT喂狗【這是計(jì)劃的一部分】
  369.         }
  370.         else
  371.         {
  372.                 count=2000;//count溢出之時(shí),應(yīng)向時(shí)鐘芯片詢(xún)問(wèn)日期,1000->5s
  373.                 WDT_COUNTER=WDT_COUNTER|0x10; //WDT喂狗【這是計(jì)劃的一部分】
  374.                 Ds1302ReadTime();
  375.                 if(wk!=TIME[5])//星期數(shù)發(fā)生變化
  376.                 {
  377.                         wk=TIME[5];//更新星期
  378.                         if(days>0)
  379.                                 days--;//更新天數(shù)
  380.                         else
  381.                                 stat=0;
  382.                         iaperase(0x00,0x00);
  383.                         iapwrite(0x00,0x00,days);
  384.                         iapwrite(0x00,0x01,wk);//向eeprom寫(xiě)入正確的天數(shù)和星期
  385.                 }
  386.         }
  387.         if((stat==1)&&(count==1500))//
  388.         {
  389.                 temp=Ds18b20ReadTemp();
  390.                 num2=temp % 10000 / 1000;
  391.                 num1=(temp % 1000 / 100)+16;
  392.                 num0=temp % 100 / 10;
  393.         }
  394.         else if((stat==1|stat==2)&&count==1000)
  395.         {
  396.                 num2=days/100;
  397.                 num1=(days%100)/10;
  398.                 num0=days%10;
  399.                 //num2=33;
  400.                 //num1=TIME[2]/16;
  401.                 //num0=TIME[2]%16;
  402.         }
  403.         
  404.         if(stat==0)
  405.         {
  406.                
  407.         }
  408.         else
  409.         {
  410.                 hc595write();
  411.         }
  412. }

  413. void timer0() interrupt 1
  414. {
  415.         if(t0reset==0)//定時(shí)器0溢出就回到等待狀態(tài)標(biāo)志位
  416.         {
  417.                 if(irstate==1)
  418.                 {
  419.                         irstate=2;        //紅外接受狀態(tài)0-6{未激活;報(bào)頭低;報(bào)頭升;報(bào)頭高;報(bào)頭降;高電平;低電平}
  420.                         t0reset=1;        //定時(shí)器0溢出就回到等待狀態(tài)
  421.                         int0reset=0;        //int0觸發(fā)就回到等待狀態(tài)
  422.                         int0negfall=1;        //忽視int0的下降沿(只允許上升沿中斷)
  423.                         IT0=0;  //P3.2=1僅接收下降沿中斷,=0上下皆可
  424.                         
  425.                         AUXR &= 0x7F;                //定時(shí)器時(shí)鐘12T模式,2ms
  426.                         TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
  427.                         TMOD |= 0x01;                //設(shè)置定時(shí)器模式
  428.                         TL0 = 0xCD;                //設(shè)置定時(shí)初值
  429.                         TH0 = 0xF8;                //設(shè)置定時(shí)初值
  430.                         TF0 = 0;                //清除TF0標(biāo)志
  431.                         TR0 = 1;                //定時(shí)器0開(kāi)始計(jì)時(shí)
  432.                 }
  433.                 else if(irstate==3)
  434.                 {
  435.                         irstate=4;        //紅外接受狀態(tài)0-6{未激活;報(bào)頭低;報(bào)頭升;報(bào)頭高;報(bào)頭降;高電平;低電平}
  436.                         t0reset=1;        //定時(shí)器0溢出就回到等待狀態(tài)
  437.                         int0reset=0;        //int0觸發(fā)就回到等待狀態(tài)
  438.                         int0negfall=1;        //忽視int0的下降沿(只允許上升沿中斷)
  439.                         IT0=0;  //=1僅接收下降沿中斷,=0上下皆可
  440.                         
  441.                         AUXR &= 0x7F;                //定時(shí)器時(shí)鐘12T模式  2.5ms
  442.                         TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
  443.                         TMOD |= 0x01;                //設(shè)置定時(shí)器模式
  444.                         TL0 = 0x00;                //設(shè)置定時(shí)初值
  445.                         TH0 = 0xF7;                //設(shè)置定時(shí)初值
  446.                         TF0 = 0;                //清除TF0標(biāo)志
  447.                         TR0 = 1;                //定時(shí)器0開(kāi)始計(jì)時(shí)
  448.                 }
  449.                 else if(irstate==5)//重頭戲:判斷邏輯值【6-long】
  450.                 {
  451.                         irstate=6;        //紅外接受狀態(tài)0-6{未激活;報(bào)頭低;報(bào)頭升;報(bào)頭高;報(bào)頭降;
  452.                         irbit=1;
  453.                         //out=0;
  454.                         
  455.                         t0reset=0;        //定時(shí)器0溢出就回到等待狀態(tài)
  456.                         int0reset=0;        //int0觸發(fā)就回到等待狀態(tài)
  457.                         int0negfall=1;        //忽視int0的下降沿(只允許上升沿中斷)
  458.                         IT0=0;  //=1僅接收下降沿中斷,=0上下皆可
  459.                         
  460.                         AUXR &= 0x7F;                //定時(shí)器時(shí)鐘12T模式 1200us
  461.                         TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
  462.                         TMOD |= 0x01;                //設(shè)置定時(shí)器模式
  463.                         TL0 = 0xAE;                //設(shè)置定時(shí)初值
  464.                         TH0 = 0xFB;                //設(shè)置定時(shí)初值
  465.                         TF0 = 0;                //清除TF0標(biāo)志
  466.                         TR0 = 1;                //定時(shí)器0開(kāi)始計(jì)時(shí)
  467.                         
  468.                         if(bitamount<=7)  //【禁忌二重奏之一】
  469.                         {
  470.                                 ir1=ir1>>1;
  471.                                 ir1=ir1+(irbit*0x80);
  472.                         }
  473.                         else if(bitamount<=15)
  474.                         {
  475.                                 ir2=ir2>>1;
  476.                                 ir2=ir2+(irbit*0x80);
  477.                                 
  478.                         }
  479.                         else if(bitamount<=23)
  480.                         {
  481.                                 ir3=ir3>>1;
  482.                                 ir3=ir3+(irbit*0x80);
  483.                         }
  484.                         else
  485.                         {
  486.                                 ir4=ir4>>1;
  487.                                 ir4=ir4+(irbit*0x80);
  488.                         }
  489.                         
  490.                         bitamount++;
  491.                         
  492.                         if(bitamount>=32)
  493.                         {
  494.                                 irreceived=1;
  495.                                 irinit();
  496.                                 
  497.                         }
  498.                 }
  499.         }
  500.         else
  501.         {
  502.                
  503.                 irinit();
  504.         }
  505. }


  506. void int0() interrupt 0
  507. {
  508.         _nop_();
  509.         _nop_();
  510.         _nop_();
  511.         if((ir==1)|(int0negfall==0))//如果“忽視下降沿”標(biāo)志位為1時(shí)(&)為下降沿(輸入端=0),就不能執(zhí)行下面的程序。
  512.         {
  513.                 if(int0reset==1)//如果“觸發(fā)中斷即復(fù)位”標(biāo)志位為1,就立刻復(fù)位。
  514.                 {
  515.                         
  516.                         irinit();
  517.                         
  518.                 }
  519.                 else//好戲開(kāi)始
  520.                 {
  521.                                 if(irstate==0)//報(bào)頭低開(kāi)始   0未激活;1報(bào)頭低;2報(bào)頭升;3報(bào)頭高;4報(bào)頭降;5高電平;6低電平
  522.                                 {
  523.                                         iract=1;        //紅外活動(dòng)
  524.                                         irstate=1;        //紅外接受狀態(tài)0-6{未激活;報(bào)頭低;報(bào)頭升;報(bào)頭高;報(bào)頭降;高電平;低電平}
  525.                                         t0reset=0;        //定時(shí)器0溢出就回到等待狀態(tài)
  526.                                         int0reset=1;        //int0觸發(fā)就回到等待狀態(tài)
  527.                                         int0negfall=0;        //忽視int0的下降沿(只允許上升沿中斷)
  528.                                         IT0=0;  //=1僅接收下降沿中斷,=0上下皆可
  529.                                        
  530.                                         AUXR &= 0x7F;                //8毫秒@11.0592MHz 定時(shí)器時(shí)鐘12T模式
  531.                                         TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
  532.                                         TMOD |= 0x01;                //設(shè)置定時(shí)器模式
  533.                                         TL0 = 0x33;                //設(shè)置定時(shí)初值
  534.                                         TH0 = 0xE3;                //設(shè)置定時(shí)初值
  535.                                         TF0 = 0;                //清除TF0標(biāo)志
  536.                                         TR0 = 1;                //定時(shí)器0開(kāi)始計(jì)時(shí)
  537.                                 
  538.                                 }
  539.                                 else if(irstate==2)//報(bào)頭高開(kāi)始
  540.                                 {
  541.                                         irstate=3;        //紅外接受狀態(tài)0-7{未激活;報(bào)頭低;報(bào)頭升;報(bào)頭高;報(bào)頭降;高電平1;高電平2;低電平}
  542.                                         t0reset=0;        //定時(shí)器0溢出就回到等待狀態(tài)
  543.                                         int0reset=1;        //int0觸發(fā)就回到等待狀態(tài)
  544.                                         int0negfall=0;        //忽視int0的下降沿(只允許上升沿中斷),下降沿此時(shí)不會(huì)觸發(fā)reset
  545.                                         IT0=0;  //=1僅接收下降沿中斷,=0上下皆可
  546.                                        
  547.                                         AUXR &= 0x7F;                //定時(shí)器時(shí)鐘12T模式 3.5ms
  548.                                         TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
  549.                                         TMOD |= 0x01;                //設(shè)置定時(shí)器模式
  550.                                         TL0 = 0x66;                //設(shè)置定時(shí)初值
  551.                                         TH0 = 0xF3;                //設(shè)置定時(shí)初值
  552.                                         TF0 = 0;                //清除TF0標(biāo)志
  553.                                         TR0 = 1;                //定時(shí)器0開(kāi)始計(jì)時(shí)
  554.                                        
  555.                                 }
  556.                                 else if(irstate==4)//高電平開(kāi)始【5-first】
  557.                                 {
  558.                                         irstate=5;        //紅外接受狀態(tài)0-6{未激活;報(bào)頭低;報(bào)頭升;報(bào)頭高;報(bào)頭降;高電平;低電平}
  559.                                         t0reset=0;        //定時(shí)器0溢出就回到等待狀態(tài)
  560.                                         int0reset=0;        //int0觸發(fā)就回到等待狀態(tài)
  561.                                         int0negfall=0;        //忽視int0的下降沿(只允許上升沿中斷)
  562.                                         IT0=1;  //P3.2=1僅接收下降沿中斷,=0上下皆可
  563.                                        
  564.                                         AUXR &= 0x7F;                //定時(shí)器時(shí)鐘12T模式  840us
  565.                                         TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
  566.                                         TMOD |= 0x01;                //設(shè)置定時(shí)器模式
  567.                                         TL0 = 0xFA;                //設(shè)置定時(shí)初值
  568.                                         TH0 = 0xFC;                //設(shè)置定時(shí)初值
  569.                                         TF0 = 0;                //清除TF0標(biāo)志
  570.                                         TR0 = 1;                //定時(shí)器0開(kāi)始計(jì)時(shí)
  571.                                        
  572.                                         //out=1;
  573.                                        
  574.                                         if(started==0)//收到的是報(bào)頭
  575.                                         {
  576.                                                 started=1;
  577.                                         }
  578.                                         else//收到的是報(bào)尾
  579.                                         {
  580.                                                 iract=0;
  581.                                                 started=0;
  582.                                                 irinit();
  583.                                         }
  584.                                 }
  585.                                 else if(irstate==5)//低電平開(kāi)始【6-short】
  586.                                 {
  587.                                         irstate=6;        //紅外接受狀態(tài)0-6{未激活;報(bào)頭低;報(bào)頭升;報(bào)頭高;報(bào)頭降;高電平;低電平}
  588.                                         irbit=0;
  589.                                         //out=0;
  590.                                        
  591.                                         t0reset=1;        //定時(shí)器0溢出就回到等待狀態(tài)
  592.                                         int0reset=0;        //int0觸發(fā)就回到等待狀態(tài)
  593.                                         int0negfall=1;        //忽視int0的下降沿(只允許上升沿中斷)
  594.                                         IT0=0;  //P3.2=1僅接收下降沿中斷,=0上下皆可
  595.                                        
  596.                                         AUXR &= 0x7F;                //定時(shí)器時(shí)鐘12T模式 840us
  597.                                         TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
  598.                                         TMOD |= 0x01;                //設(shè)置定時(shí)器模式
  599.                                         TL0 = 0xFA;                //設(shè)置定時(shí)初值
  600.                                         TH0 = 0xFC;                //設(shè)置定時(shí)初值
  601.                                         TF0 = 0;                //清除TF0標(biāo)志
  602.                                         TR0 = 1;                //定時(shí)器0開(kāi)始計(jì)時(shí)
  603.                                        
  604.                                         if(bitamount<=7)  //【禁忌二重奏之二】
  605.                                         {
  606.                                                 ir1=ir1>>1;
  607.                                                 ir1=ir1+(irbit*0x80);
  608.                                         }
  609.                                         else if(bitamount<=15)
  610.                                         {
  611.                                                 ir2=ir2>>1;
  612.                                                 ir2=ir2+(irbit*0x80);
  613.                                                 
  614.                                         }
  615.                                         else if(bitamount<=23)
  616.                                         {
  617.                                                 ir3=ir3>>1;
  618.                                                 ir3=ir3+(irbit*0x80);
  619.                                         }
  620.                                         else
  621.                                         {
  622.                                                 ir4=ir4>>1;
  623.                                                 ir4=ir4+(irbit*0x80);
  624.                                         }
  625.                                        
  626.                                         bitamount++;
  627.                                        
  628.                                         if(bitamount>=32)
  629.                                         {
  630.                                                 irreceived=1;
  631.                                                 irinit();
  632.                                                 
  633.                                         }
  634.                                 }
  635.                                 else if(irstate==6)//收到上升沿信號(hào),由低電平轉(zhuǎn)為高電平狀態(tài)【5-repeat】
  636.                                 {
  637.                                         irstate=5;        //紅外接受狀態(tài)0-6{未激活;報(bào)頭低;報(bào)頭升;報(bào)頭高;報(bào)頭降;高電平;低電平}
  638.                                         t0reset=0;        //定時(shí)器0溢出就回到等待狀態(tài)
  639.                                         int0reset=0;        //int0觸發(fā)就回到等待狀態(tài)
  640.                                         int0negfall=0;        //忽視int0的下降沿(只允許上升沿中斷)
  641.                                         IT0=1;  //P3.2=1僅接收下降沿中斷,=0上下皆可
  642.                                        
  643.                                         AUXR &= 0x7F;                //定時(shí)器時(shí)鐘12T模式  840us
  644.                                         TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
  645.                                         TMOD |= 0x01;                //設(shè)置定時(shí)器模式
  646.                                         TL0 = 0xFA;                //設(shè)置定時(shí)初值
  647.                                         TH0 = 0xFC;                //設(shè)置定時(shí)初值
  648.                                         TF0 = 0;                //清除TF0標(biāo)志
  649.                                         TR0 = 1;                //定時(shí)器0開(kāi)始計(jì)時(shí)
  650.                                        
  651.                                         //out=1;
  652.                                        
  653.                                 }
  654.                                 
  655.                 }
  656.         }
  657.         
  658. }

  659. /*
  660. 日志:在完成了數(shù)碼管顯示和定時(shí)
  661. 器中斷的基礎(chǔ)上,新增了狀態(tài)機(jī)查
  662. 詢(xún)紅外信號(hào)輸入的功能,在15w204
  663. s上能穩(wěn)定運(yùn)行。2020-2-21

  664. */

  665. void Ds18b20Init()
  666. {
  667.         unsigned char i,j;
  668.         DSPORT=1;                         //將總線拉高4us
  669.         _nop_();
  670.         _nop_();
  671.         i = 8;
  672.         while (--i);
  673.         DSPORT=0;                        //然后拉低總線480us
  674.         i = 6;
  675.         j = 38;
  676.         do
  677.         {
  678.                 while (--j);
  679.         } while (--i);
  680.         DSPORT=1;                        //然后拉高總線,如果DS18B20做出反應(yīng)會(huì)將在15us~60us后總線拉低
  681.         i = 6;
  682.         j = 38;
  683.         do
  684.         {
  685.                 while (--j);
  686.         } while (--i);
  687. }

  688. void Ds18b20WriteByte(unsigned char dat)
  689. {
  690.         unsigned char i,j,e;
  691.         for(e=8;e>0;e--)
  692.         {
  693.                 DSPORT=0;                        //每寫(xiě)入一位數(shù)據(jù)之前先把總線拉低1us
  694.                 _nop_();
  695.                 _nop_();
  696.                 _nop_();
  697.                 DSPORT=dat&0x01; //然后寫(xiě)入一個(gè)數(shù)據(jù),從最低位開(kāi)始
  698.                 i = 1;//延時(shí)68us,持續(xù)時(shí)間最少60us
  699.                 j = 184;
  700.                 do
  701.                 {
  702.                         while (--j);
  703.                 } while (--i);               
  704.                 DSPORT=1;        //然后釋放總線,至少1us給總線恢復(fù)時(shí)間才能接著寫(xiě)入第二個(gè)數(shù)值
  705.                 dat>>=1;
  706.         }
  707. }

  708. unsigned char Ds18b20ReadByte()
  709. {
  710.         unsigned char byte,i,j;
  711.         for(j=8;j>0;j--)
  712.         {
  713.                 DSPORT=0;//先將總線拉低1us
  714.                 _nop_();
  715.                 _nop_();
  716.                 _nop_();
  717.                 byte>>=1;
  718.                 DSPORT=1;//然后釋放總線
  719.                 _nop_();//延時(shí)15us等待數(shù)據(jù)穩(wěn)定[]
  720.                 i = 39;
  721.                 while (--i);
  722.                 if(DSPORT)
  723.                         byte|=0x80;
  724.                 i = 122;//delay45us
  725.                 while (--i);
  726.         }
  727.         return byte;
  728. }

  729. int Ds18b20ReadTemp()
  730. {
  731.         int temp=0;
  732.         int tp;
  733.         u8 i,j;
  734.         unsigned char tmh,tml;
  735.         Ds18b20Init();
  736.         Ds18b20WriteByte(0xcc);
  737.         Ds18b20WriteByte(0x44);
  738.         _nop_();//delay125us
  739.         _nop_();
  740.         i = 2;
  741.         j = 84;
  742.         do
  743.         {
  744.                 while (--j);
  745.         } while (--i);
  746.         Ds18b20Init();
  747.         Ds18b20WriteByte(0xcc);
  748.         Ds18b20WriteByte(0xbe);
  749.         tml=Ds18b20ReadByte();
  750.         tmh=Ds18b20ReadByte();
  751.         
  752.         temp=tmh;
  753.         temp<<=8;
  754.         temp|=tml;
  755.         if((temp&0xf800)==0xf800)        //*0.0625是把16進(jìn)制轉(zhuǎn)化位10進(jìn)制所需,原始信息里的16代表1攝氏度。                        
  756.         {
  757.                 temp=temp-1;//如果溫度是零下,此處未加入負(fù)溫度標(biāo)志位,所以顯示的還是正的
  758.                 temp=~temp;
  759.                 tp=temp;
  760.                 temp=tp*0.0625*100+0.5;
  761.         }
  762.         else
  763.         {                        
  764.                 tp=temp;//如果溫度是零上
  765.                 temp=tp*0.0625*100+0.5;        
  766.         }
  767.         return temp;
  768. }
  769. /*
  770. 日志 移植了某大佬的ds18b20程序,
  771. 并使之能在stc-y5內(nèi)核單片機(jī)上運(yùn)
  772. 行。正常情況下輸出的16bit信息可
  773. 以表示12位精度的溫度,但是stc單
  774. 片機(jī)不支持浮點(diǎn)數(shù)運(yùn)算,所以temp
  775. 是乘了100的。所有延時(shí)函數(shù)(微秒
  776. 級(jí))均已內(nèi)置,無(wú)需調(diào)用,也不費(fèi)
  777. 什么時(shí)間。           2020-2-24
  778. */

  779. //eeprom操作--IAP法

  780. void iaprst()  //復(fù)位
  781. {
  782.         IAP_CONTR=0;
  783.         IAP_CMD=0;
  784.         IAP_TRIG=0;
  785.         IAP_ADDRH=0x80;
  786. }

  787. unsigned char iapread(unsigned char addrh,unsigned char addrl)
  788. {
  789.         unsigned char dat;
  790.         IAP_CONTR=0x83;  //適用于12mhz以下的頻率
  791.         IAP_CMD=1;
  792.         IAP_ADDRL=addrl;
  793.         IAP_ADDRH=addrh;
  794.         IAP_TRIG=0x5a;
  795.         IAP_TRIG=0xa5;
  796.         _nop_();
  797.         _nop_();
  798.         dat=IAP_DATA;
  799.         iaprst();
  800.         return dat;
  801. }

  802. void iapwrite(unsigned char addrh,unsigned char addrl,unsigned char dat)
  803. {
  804.         IAP_CONTR=0x83;//適用于12mhz以下的頻率
  805.         IAP_CMD=2;
  806.         IAP_ADDRL=addrl;
  807.         IAP_ADDRH=addrh;
  808.         IAP_DATA=dat;
  809.         IAP_TRIG=0x5a;
  810.         IAP_TRIG=0xa5;
  811.         _nop_();
  812.         _nop_();
  813.         iaprst();
  814. }

  815. void iaperase(unsigned char addrh,unsigned char addrl)
  816. {
  817.         IAP_CONTR=0x83;//適用于12mhz以下的頻率
  818.         IAP_CMD=3;
  819.         IAP_ADDRL=addrl;
  820.         IAP_ADDRH=addrh;
  821.         IAP_TRIG=0x5a;
  822.         IAP_TRIG=0xa5;
  823.         _nop_();
  824.         _nop_();
  825.         iaprst();
  826. }
  827. /*
  828. 日志 增加了關(guān)于eeprom的操作的函數(shù)
  829. ,現(xiàn)學(xué)現(xiàn)賣(mài),一共就三個(gè)函數(shù)(iapinit
  830. 不需要管),204s就只有兩個(gè)扇區(qū),
  831. 0000-01ff,0200-03ff,每個(gè)地址號(hào)
  832. 都能存儲(chǔ)一個(gè)char,一共是1024個(gè)。
  833. 使用方法:(先讀出原有數(shù)據(jù),)再
  834. 擦除扇區(qū)(擦除地址是扇區(qū)的首地址
  835. ),然后寫(xiě)入新值,(最后讀出來(lái))。
  836. 打算用0000存儲(chǔ)倒計(jì)時(shí)還剩多少天,
  837. 0001存儲(chǔ)當(dāng)前的日期。程序上電先把
  838. 日期和倒數(shù)讀到ram里,每隔幾秒詢(xún)
  839. 問(wèn)1302,若有不同,則ram日期更新
  840. ,倒數(shù)減一(檢測(cè)大于0),重寫(xiě)
  841. eeprom。           2020-2-25
  842. */


  843. /*******************************************************************************
  844. * 函 數(shù) 名         : Ds1302Write
  845. * 函數(shù)功能                   : 向DS1302命令(地址+數(shù)據(jù))
  846. * 輸    入         : addr,dat
  847. * 輸    出         : 無(wú)
  848. *******************************************************************************/

  849. void Ds1302Write(u8 addr, u8 dat)
  850. {
  851.         u8 n;
  852.         RST = 0;
  853.         _nop_();

  854.         SCLK = 0;//先將SCLK置低電平。
  855.         _nop_();
  856.         RST = 1; //然后將RST(CE)置高電平。
  857.         _nop_();

  858.         for (n=0; n<8; n++)//開(kāi)始傳送八位地址命令
  859.         {
  860.                 DSIO = addr & 0x01;//數(shù)據(jù)從低位開(kāi)始傳送
  861.                 addr >>= 1;
  862.                 SCLK = 1;//數(shù)據(jù)在上升沿時(shí),DS1302讀取數(shù)據(jù)
  863.                 _nop_();  //時(shí)鐘高電平時(shí)數(shù)據(jù)需要保持不動(dòng)
  864.                 SCLK = 0;
  865.                 _nop_();
  866.         }
  867.         for (n=0; n<8; n++)//寫(xiě)入8位數(shù)據(jù)
  868.         {
  869.                 DSIO = dat & 0x01;
  870.                 dat >>= 1;
  871.                 SCLK = 1;//數(shù)據(jù)在上升沿時(shí),DS1302讀取數(shù)據(jù)
  872.                 _nop_();
  873.                 SCLK = 0;
  874.                 _nop_();        
  875.         }        
  876.                  
  877.         RST = 0;//傳送數(shù)據(jù)結(jié)束
  878.         _nop_();
  879. }

  880. /*******************************************************************************
  881. * 函 數(shù) 名         : Ds1302Read
  882. * 函數(shù)功能                   : 讀取一個(gè)地址的數(shù)據(jù)
  883. * 輸    入         : addr
  884. * 輸    出         : dat
  885. *******************************************************************************/

  886. u8 Ds1302Read(u8 addr)
  887. {
  888.         u8 n,dat,dat1;
  889.         RST = 0;
  890.         _nop_();

  891.         SCLK = 0;//先將SCLK置低電平。
  892.         _nop_();
  893.         RST = 1;//然后將RST(CE)置高電平。
  894.         _nop_();

  895.         for(n=0; n<8; n++)//開(kāi)始傳送八位地址命令
  896.         {
  897.                 DSIO = addr & 0x01;//數(shù)據(jù)從低位開(kāi)始傳送
  898.                 addr >>= 1;
  899.                 SCLK = 1;//數(shù)據(jù)在上升沿時(shí),DS1302讀取數(shù)據(jù)
  900.                 _nop_();
  901.                 SCLK = 0;//DS1302下降沿時(shí),放置數(shù)據(jù)
  902.                 _nop_();
  903.         }
  904.         _nop_();
  905.         for(n=0; n<8; n++)//讀取8位數(shù)據(jù)
  906.         {
  907.                 dat1 = DSIO;//從最低位開(kāi)始接收
  908.                 dat = (dat>>1) | (dat1<<7);
  909.                 SCLK = 1;
  910.                 _nop_();
  911.                 SCLK = 0;//DS1302下降沿時(shí),放置數(shù)據(jù)
  912.                 _nop_();
  913.         }

  914.         RST = 0;
  915.         _nop_();        //以下為DS1302復(fù)位的穩(wěn)定時(shí)間,必須的。
  916.         SCLK = 1;
  917.         _nop_();
  918.         DSIO = 0;
  919.         _nop_();
  920.         DSIO = 1;
  921.         _nop_();
  922.         return dat;        
  923. }

  924. /*******************************************************************************
  925. * 函 數(shù) 名         : Ds1302Init
  926. * 函數(shù)功能                   : 初始化DS1302.
  927. * 輸    入         : 無(wú)
  928. * 輸    出         : 無(wú)
  929. *******************************************************************************/

  930. void Ds1302set()         
  931. {
  932.         u8 n;
  933.         Ds1302Write(0x8E,0X00);                 //關(guān)閉寫(xiě)保護(hù)功能
  934.         for (n=0; n<7; n++)//寫(xiě)入7個(gè)字節(jié)的時(shí)鐘信號(hào):分秒時(shí)日月周年          !!!此操作會(huì)破壞原有的時(shí)間數(shù)據(jù)!!
  935.         {
  936.                 Ds1302Write(WRITE_RTC_ADDR[n],timeset[n]);        
  937.         }
  938.         Ds1302Write(0x8E,0x80);                 //打開(kāi)寫(xiě)保護(hù)功能
  939. }

  940. /*******************************************************************************
  941. * 函 數(shù) 名         : Ds1302ReadTime
  942. * 函數(shù)功能                   : 讀取時(shí)鐘信息
  943. * 輸    入         : 無(wú)
  944. * 輸    出         : 無(wú)
  945. *******************************************************************************/

  946. void Ds1302ReadTime()
  947. {
  948.         u8 n;
  949.         for (n=0; n<7; n++)//讀取7個(gè)字節(jié)的時(shí)鐘信號(hào):分秒時(shí)日月周年
  950.         {
  951.                 TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);
  952.         }
  953.                
  954. }
  955. /*
  956. 添加了ds1302函數(shù),通過(guò)全局變量傳遞
  957. 數(shù)據(jù)。通過(guò)每5秒鐘檢測(cè)一下星期并與
  958. ram里面的值比較,若有變化就日期減
  959. 一,并更新eeprom里面的值。注意ds1302
  960. 的數(shù)據(jù)格式,比如’13點(diǎn)’不是0x0c,
  961. 而是0x13,此之謂8421bcd碼.
  962. */
復(fù)制代碼
stc15.h可以用stc下載工具添加了mcu型號(hào)到keil中后再keil的文件夾里面找到,所有的函數(shù)都在里面了,幫助沒(méi)黑幣的小白真正實(shí)現(xiàn)白嫖),標(biāo)有這是計(jì)劃的一部分的是與ir接收相關(guān)的函數(shù)(包括看門(mén)狗設(shè)置)。說(shuō)實(shí)在的,這是我首次給51單片機(jī)寫(xiě)這么長(zhǎng)的代碼。里面有的函數(shù)是我之前學(xué)的時(shí)候借鑒壇里大神的,在此表示感謝。


硬件制作
搭棚過(guò)程是先從數(shù)碼管做起的(隔壁五家的垃圾數(shù)碼管雖然便宜,可挑了半天才找到個(gè)好的)


搭棚的過(guò)程沒(méi)怎么拍全,因?yàn)楫?dāng)時(shí)自己也沒(méi)有做下去的信心

評(píng)分

參與人數(shù) 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:519251 發(fā)表于 2020-3-4 00:29 | 只看該作者
剛剛不知咋的點(diǎn)發(fā)布了,不好意思,還沒(méi)更完,
搭棚的過(guò)程沒(méi)怎么拍全,因?yàn)楫?dāng)時(shí)自己也不確定會(huì)不會(huì)爛尾
我的設(shè)計(jì)是先用銅絲把數(shù)碼管的 段 引腳引出并重新排序,放在下面一排,并接上8個(gè)限流電阻;位引腳上直接焊接上擴(kuò)流三極管,三個(gè)擴(kuò)流三極管共同引出一個(gè)vcc,基極接限流電阻到單片機(jī)。由于三個(gè)三極管在上面一層,所以單片機(jī)也安排在上面。單片機(jī)下面的空間自然就是74hc595了,三根引腳(ser,srclk,rclk)直接往上走連到單片機(jī),單片機(jī)旁邊再抽空安排一塊ds1302,再見(jiàn)縫插針連上溫度傳感器ds18b29和一體化紅外接收頭和七彩自閃led。就是這一塊的供電有點(diǎn)繞。
因?yàn)閿?shù)據(jù)大多是點(diǎn)對(duì)點(diǎn)的,所以我的建議是先走數(shù)據(jù)線,后走供電線。而且電阻盡量直接連到ic的引腳上,這樣可以降低ic被燙壞的概率。如果不能的話ic引腳上最好預(yù)先上錫,再把銅絲燒熱后貼上去。1mm銅絲導(dǎo)熱能力驚人,t12勉強(qiáng)夠用,小心燙手。不建議用恒溫烙鐵,因?yàn)楹銣乩予F容易把銅絲燒的過(guò)熱,導(dǎo)致另一頭已經(jīng)焊好的焊點(diǎn)也脫落下來(lái)。
話不多說(shuō)了,相信愛(ài)折騰的朋友自己可以解決搭棚焊的問(wèn)題。上圖:





下面支架上覺(jué)得太空了,就焊了個(gè)英文單詞Persist(堅(jiān)持)
"堅(jiān)持,才是勝利!加油,奧里給!"
此時(shí),全部的電路和程序均已經(jīng)調(diào)試完畢,接下來(lái)就是準(zhǔn)備用滴膠封起來(lái)了。

滴膠封裝
封裝之前還要解決一個(gè)問(wèn)題,就是電源插座的問(wèn)題。
如果不做任何處理的話,滴膠將流入電源孔內(nèi),導(dǎo)致無(wú)法接電。
我的解決辦法就是用潤(rùn)滑脂把它填滿(mǎn),雖然有點(diǎn)浪費(fèi),但事實(shí)上很有效,且沒(méi)有影響到導(dǎo)電性。
(鑒于我買(mǎi)的那管潤(rùn)滑脂質(zhì)量太差,以至于在空氣中放一會(huì)就會(huì)干燥失效,我覺(jué)得這也不算是浪費(fèi))
用美紋紙膠帶蓋起來(lái)順便做個(gè)銘牌:
接下來(lái)就是激動(dòng)人心的澆筑環(huán)節(jié)了:
用的模具是5*5*5的滴膠標(biāo)本模具,
我用的是3:1硬膠,這次沒(méi)做好消氣泡的工作,留了點(diǎn)遺憾,如果有好的消氣泡方法,望不吝賜教!

三日等待,一朝脫模:
這種模具比較深,不好弄,建議千萬(wàn)別加油性潤(rùn)滑劑(不好洗),不需要加任何液體,只需要用厚一點(diǎn)的紙片撐開(kāi)四壁,自然就能一點(diǎn)點(diǎn)弄出來(lái)了。還有,這種硅膠模容易有劃痕,別用太尖銳的東西。
小心去除電源孔的封堵:

完成!
成品圖賞:

顯示溫度:

原創(chuàng)作品,轉(zhuǎn)載請(qǐng)注明出處!
有問(wèn)題或者建議的話可以加樓主QQ跤♂流:2764497627,請(qǐng)備注:51黑倒計(jì)時(shí)牌

P00303-130144.jpg (3.14 MB, 下載次數(shù): 99)

P00303-130144.jpg

評(píng)分

參與人數(shù) 1黑幣 +8 收起 理由
王朗的誘惑 + 8 優(yōu)雅,藝術(shù),有內(nèi)味了

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

板凳
ID:519251 發(fā)表于 2020-3-4 00:30 | 只看該作者
代碼一個(gè)字沒(méi)改,可能有些奇怪的話,大家別在意
回復(fù)

使用道具 舉報(bào)

地板
ID:214276 發(fā)表于 2020-3-15 04:24 | 只看該作者
絕對(duì)的動(dòng)手達(dá)人,能出張?jiān)韴D那就能學(xué)習(xí)了。
回復(fù)

使用道具 舉報(bào)

5#
ID:695749 發(fā)表于 2020-3-15 19:12 | 只看該作者
動(dòng)手能力強(qiáng),想象力豐富,敢于實(shí)踐,謝謝分享!
回復(fù)

使用道具 舉報(bào)

6#
ID:377382 發(fā)表于 2020-4-5 13:27 | 只看該作者
謝謝分享!
回復(fù)

使用道具 舉報(bào)

7#
ID:17204 發(fā)表于 2020-4-15 16:12 | 只看該作者
高手在人間,藝術(shù)品了!
回復(fù)

使用道具 舉報(bào)

8#
ID:161785 發(fā)表于 2021-8-7 11:54 來(lái)自手機(jī) | 只看該作者
正需要,就是不知道如何調(diào)剩余時(shí)間
回復(fù)

使用道具 舉報(bào)

9#
ID:471579 發(fā)表于 2021-8-12 15:32 | 只看該作者
太厲害了,真是牛人
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表