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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STC15F104單片機紅外定時手機充電器(成品制作)最終版源碼

[復制鏈接]
跳轉到指定樓層
樓主
給家人做的定時手機充電器,再也不用睡到半夜起來撥電了
網上買現成的不如自己做,既可掌握知識又能節省成本部分組件設計成可更換式,以方便更換管理員請幫忙調整下圖片順序,謝謝!

制作出來的實物圖如下:


說明:


單片機源程序如下:
  1. /*
  2. 1  IRC_CLKO/INT2/CLKOUT1/T0/RST/P3^4                   8  RSTOUT_LOW/INT1/P3^3
  3. 2  VCC(5V)                                                                           7  INT0/P3^2
  4. 3  INT3/CLKOUT0/T1/P3^5                                                   6  P3^1/TXD
  5. 4  GND                                                                                   5  INT4/P3^0/RXD
  6. 燒錄時,燒錄器的VCC接2腳,TXD接5腳,RXD接6腳,GND接4腳
  7. */
  8. //////STC15F104////////////
  9. #include <STC15F2K60S2.H>
  10. #include <intrins.h>
  11. #define uchar unsigned char
  12. #define uint unsigned int
  13. #define T50MS (65536-50000) //12T模式

  14. /*************        用戶系統配置        **************/
  15. //燒錄頻率請選12.000MHz
  16. #define MAIN_Fosc                12000000L        //定義主時鐘, 模擬串口和紅外接收會自動適應。5~36MHZ

  17. #define D_TIMER0                125                        //選擇定時器時間, us, 紅外接收要求在60us~250us之間

  18. #define        User_code                0x00FF                //定義紅外接收用戶碼(38K的迷你遙控器通用)


  19. /*************        以下宏定義用戶請勿修改        **************/
  20. #define freq_base                        (MAIN_Fosc / 1200)
  21. #define Timer0_Reload                (65536 - (D_TIMER0 * freq_base / 10000))

  22. /*************        本地變量聲明        **************/
  23. bit                P_IR_RX_temp;                //Last sample
  24. bit                B_IR_Sync;                        //已收到同步標志
  25. uchar        IR_SampleCnt;                //采樣計數
  26. uchar        IR_BitCnt;                        //編碼位數
  27. uchar        IR_UserH;                        //用戶碼(地址)高字節
  28. uchar        IR_UserL;                        //用戶碼(地址)低字節
  29. uchar        IR_data;                        //數據原碼
  30. uchar        IR_DataShit;                //數據反碼

  31. bit                B_IrUserErr;                //User code error flag
  32. bit                B_IR_Press;                        //Key press flag,include repeat key.
  33. uchar        IR_code;                        //IR code        紅外鍵碼

  34. /*注:此處數碼管只支持四針的TM1637數碼管*/
  35. sbit SCL=P3^4; //接四針數碼管的CLK腳
  36. sbit SDA=P3^3; //接四針數碼管的DIO腳
  37. sbit KG    =P3^1;                        //開關(接LED負極,LED正極接VCC 或 接繼電器IN口)
  38. sbit FMQ   =P3^0;                        //蜂鳴器(接蜂鳴器負極,蜂鳴器正極接VCC)
  39. sbit P_IR_RX    =P3^2;           //定義紅外接收輸入端口
  40. uint i2,shi,fen,miao; //shi=時,fen=分,miao=秒
  41. uint i1,ontime,offtime; //ontime=開啟時間,offtime=關閉時間
  42. uchar k,data1=0x01; //k=模式值
  43. bit b;
  44. //uchar a[4];    //儲存用戶碼、用戶反碼與鍵數據碼、鍵數據反碼

  45. //數碼管
  46. uint smg_ge,smg_shi,smg_bai,smg_qian,dadt;
  47. unsigned char code xsbcdbuf[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77}; //0-9及二個點

  48. /*************        本地函數聲明        **************/
  49. /////////////////////  以下是數碼管顯示部分   /////////////////////
  50. void IIC_delay(void) //IIC延時
  51. {
  52.     unsigned char i;
  53.     for(i=0;i<20;i++) _nop_();
  54. }
  55. void start_IIC(void) //啟動IIC

  56. {
  57.     SCL=1; //給芯片發送開始信號
  58.     SDA=1;
  59.     IIC_delay();
  60.     SDA=0;
  61.     IIC_delay();
  62.     SCL=0; //開始信號傳送完
  63.     IIC_delay();
  64. }
  65. void stop_IIC(void) //停止IIC
  66. {
  67.     SCL=0;
  68.     IIC_delay();
  69.     SDA=0;
  70.     IIC_delay();
  71.     SCL=1;
  72.     IIC_delay();
  73.     SDA=1;
  74. }
  75. void ack_IIC()
  76. {
  77.     SCL=0;
  78.     _nop_();_nop_();_nop_();
  79.     while(SDA);
  80.     SCL=1;
  81.     _nop_();_nop_();_nop_();
  82.     SCL=0;
  83. }
  84. void WriteByte(unsigned char WriteData) //寫一個字節數據
  85. {
  86.     unsigned char i;
  87.     for(i=0;i<8;i++)//開始傳送8位數據,每循環一次傳送一位數據
  88.     {
  89.         SCL=0;
  90.         IIC_delay();
  91.         WriteData=WriteData>>1;
  92.         SDA=CY;
  93.         IIC_delay();
  94.         SCL=1;
  95.         IIC_delay();
  96.     }
  97. //8位數據傳送完
  98.     ack_IIC(); //判斷芯片發過來的ACK應答信號
  99. }
  100. void write_LEDSROM(unsigned char addr,unsigned char WData) //寫一字節數據到LEDSROM
  101. {
  102.     start_IIC(); //調用開始信號
  103.     WriteByte(addr); //寫起始地址命令(0C0H),地址00H單元。
  104.     WriteByte(WData);//給顯示寄存器寫顯示數據,值可根據實參改變
  105.     stop_IIC(); //調用結束信號,一個字節命令發送完畢,可以發送下一個命令
  106. }
  107. void xsled(void) //寫數據到LED
  108. {
  109.     SDA=1;
  110.     SCL=1;
  111.     start_IIC(); //調用開始信號
  112.     WriteByte(0x44);//寫命令40H(數據設置)
  113.     stop_IIC(); //調用結束信號,一個字節命令發送完畢,可以發送下一個命令
  114.     write_LEDSROM(0xC0,xsbcdbuf[smg_qian]); //第一個數碼管
  115.     write_LEDSROM(0xC1,xsbcdbuf[smg_bai]|0x80);  //第二個數碼管  加|0x80 則點亮數碼管中間的兩個小點        
  116.     write_LEDSROM(0xC2,xsbcdbuf[smg_shi]); //第三個數碼管
  117.     write_LEDSROM(0xC3,xsbcdbuf[smg_ge]);//第四個數碼管
  118.     IIC_delay();
  119.     start_IIC(); //調用開始信號
  120.     WriteByte(0x8a); //送開屏命令,(8BH),亮度可以根據低三位調節。//顯示亮度
  121.     stop_IIC(); //調用結束信號,一個字節命令發送完畢,可以發送下一個命令
  122. }
  123. void jisuan()  //計算
  124. {     
  125.     smg_qian=dadt/60/10; //計算小時(十位) 顯示在第四位數碼管
  126.         smg_bai=dadt/60%10;         //計算小時(個位) 顯示在第三位數碼管
  127.     smg_shi=(dadt%60)/10; //計算分鐘(十位) 顯示在第二位數碼管
  128.     smg_ge=(dadt%60)%10;  //計算分鐘(個位) 顯示在第一位數碼管
  129. }
  130. void Close_SMG() //關閉數碼管
  131. {
  132.         dadt=0;        //清零
  133.         write_LEDSROM(0xC0,0x00); //關第一個數碼管
  134.         write_LEDSROM(0xC1,0x00);  //關第二個數碼管
  135.         write_LEDSROM(0xC2,0x00); //關第三個數碼管
  136.         write_LEDSROM(0xC3,0x00);//關第四個數碼管
  137. }
  138. /////////////////////  以上是數碼管顯示部分   /////////////////////

  139. //////////////////////////////////////////
  140. void delay1ms(void)        //延時
  141. {
  142.    unsigned char i,j;        
  143.          for(i=0;i<10;i++)
  144.           for(j=0;j<33;j++)
  145.            ;                 
  146. }

  147. ////////////////////////////////////////////
  148. void delay(unsigned char n) //延時
  149. {
  150.    unsigned char i;
  151.         for(i=0;i<n;i++)
  152.            delay1ms();
  153. }
  154. ////////////////////////////////////////////
  155. void beep()                //蜂鳴器響一聲函數
  156. {
  157.    FMQ=0;                         //開啟蜂鳴器
  158.    delay(250);       //延時
  159.    FMQ=1;           //關閉蜂鳴器     
  160. }

  161. /////////////////////////////////////////////////////////////
  162. //根據需要自行修改
  163. void Model_2(void)
  164. {
  165.          ontime=40;        //開啟時間
  166.         offtime=40;        //關閉時間
  167. }
  168. /////////////////////////////////////////////////////////////
  169. void Model_3(void)
  170. {
  171.          ontime=100;        //開啟時間
  172.         offtime=40;        //關閉時間
  173. }
  174. /////////////////////////////////////////////////////////////
  175. void Model_4(void)
  176. {
  177.          ontime=200;        //開啟時間
  178.         offtime=80;        //關閉時間
  179. }
  180. /////////////////////////////////////////////////////////////
  181. void Model_5(void)
  182. {
  183.          ontime=700;        //開啟時間
  184.         offtime=300; //關閉時間
  185. }
  186. /////////////////////////////////////////////////////////////
  187. //判斷接收的編碼,執行相應功能(根據需要自行修改)
  188. void _data_(void)
  189. {
  190.          switch(IR_data)        //紅外接收成功
  191.         {
  192.                 case 0x45:
  193.                 k++;if(k==6) k=1;i1=0;b=1;
  194.                 beep();break;    //開機及模式調節。蜂鳴器響一聲 提示解碼成功,模式切換時i1必須清零
  195.                 case 0x44:
  196.                 shi=shi+30;        //每按一次加30分鐘
  197.                 dadt=shi; //賦值
  198.                 jisuan(); //計算
  199.             xsled();  //寫數據到LED                                                
  200.                 if(shi>2880) //最大48小時
  201.                 {
  202.                         shi=2880; //最大不能超過2天 //shi=0;Close_SMG(); //關屏
  203.                 }
  204.                 beep();break;
  205.                 case 0x47:
  206.                 k=0; //關機
  207.                 Close_SMG(); //關閉數碼管
  208.                 beep();break;
  209.         }
  210.         IR_data=0x00; //必須清零
  211. }
  212. ////////////////////////////////////////////
  213. void main(void)         //主函數
  214. {

  215.         IE   = 0x82;   //開總中斷和T0中斷允許
  216.         IE2  = 0x04;   //T2中斷允許
  217.         TMOD = 0;                //for STC15Fxxx系列        Timer0 as 16bit reload timer.
  218.         TH0  = Timer0_Reload / 256;
  219.         TL0  = Timer0_Reload % 256;
  220.         T2L  = T50MS;  //初始化計時值5ms中斷一次
  221.     T2H  = T50MS >> 8;
  222.         TR0  =1;
  223.         k    =0;

  224.         while(1)  //無限循環
  225.         {
  226.                 switch(k) //判斷k的值
  227.                 {
  228.                         case 0: AUXR=0x00;         //k=0時T2關閉中斷
  229.                                         i1=0;                 //記得計時清零
  230.                                         shi=0;                 //關閉時,定時時長也清零
  231.                                         KG=1;                 //關閉
  232.                                         break;
  233.                         case 1: AUXR=0x10;         //k不等于0時打開中斷
  234.                                         break;
  235.                         case 2: AUXR=0x10;         //k=2~5時啟動相應模式
  236.                                         Model_2();         //模式2
  237.                                         break;
  238.                         case 3: AUXR=0x10;
  239.                                         Model_3();         //模式3
  240.                                         break;
  241.                         case 4: AUXR=0x10;
  242.                                         Model_4();         //模式4
  243.                                         break;
  244.                         case 5: AUXR=0x10;
  245.                                         Model_5();         //模式5
  246.                                         break;
  247.                 }
  248.                
  249.                
  250.                
  251.         }                        
  252. }
  253. /*************紅外接收部分程序是引用STC官方的資料******************************/
  254. /******************** 紅外采樣時間宏定義, 用戶不要隨意修改        *******************/

  255. #if ((D_TIMER0 <= 250) && (D_TIMER0 >= 60))
  256.         #define        D_IR_sample                        D_TIMER0                //定義采樣時間,在60us~250us之間
  257. #endif

  258. #define D_IR_SYNC_MAX                (15000/D_IR_sample)        //SYNC max time
  259. #define D_IR_SYNC_MIN                (9700 /D_IR_sample)        //SYNC min time
  260. #define D_IR_SYNC_DIVIDE        (12375/D_IR_sample)        //decide data 0 or 1
  261. #define D_IR_DATA_MAX                (3000 /D_IR_sample)        //data max time
  262. #define D_IR_DATA_MIN                (600  /D_IR_sample)        //data min time
  263. #define D_IR_DATA_DIVIDE        (1687 /D_IR_sample)        //decide data 0 or 1
  264. #define D_IR_BIT_NUMBER                32                                        //bit number

  265. //*******************************************************************************************
  266. //**************************** IR RECEIVE MODULE ********************************************

  267. void IR_RX_HT6121(void)
  268. {
  269.         uchar        SampleTime;

  270.         IR_SampleCnt++;                                                        //Sample + 1

  271.         F0 = P_IR_RX_temp;                                                //Save Last sample status
  272.         P_IR_RX_temp = P_IR_RX;                                        //Read current status
  273.         if(F0 && !P_IR_RX_temp)                                        //Last sample is high,and current sample is low, so is fall edge
  274.         {
  275.                 SampleTime = IR_SampleCnt;                        //get the sample time
  276.                 IR_SampleCnt = 0;                                        //Clear the sample counter

  277.                          if(SampleTime > D_IR_SYNC_MAX)                B_IR_Sync = 0;        //large the Maxim SYNC time, then error
  278.                 else if(SampleTime >= D_IR_SYNC_MIN)                                        //SYNC
  279.                 {
  280.                         if(SampleTime >= D_IR_SYNC_DIVIDE)
  281.                         {
  282.                                 B_IR_Sync = 1;                                        //has received SYNC
  283.                                 IR_BitCnt = D_IR_BIT_NUMBER;        //Load bit number
  284.                         }
  285.                 }
  286.                 else if(B_IR_Sync)                                                //has received SYNC
  287.                 {
  288.                         if(SampleTime > D_IR_DATA_MAX)                B_IR_Sync=0;        //data samlpe time to large
  289.                         else
  290.                         {
  291.                                 IR_DataShit >>= 1;                                        //data shift right 1 bit
  292.                                 if(SampleTime >= D_IR_DATA_DIVIDE)        IR_DataShit |= 0x80;        //devide data 0 or 1
  293.                                 if(--IR_BitCnt == 0)                                //bit number is over?
  294.                                 {
  295.                                         B_IR_Sync = 0;                                        //Clear SYNC
  296.                                         if(~IR_DataShit == IR_data)                //判斷數據正反碼
  297.                                         {
  298.                                                 if((IR_UserH == (User_code / 256)) &&
  299.                                                         IR_UserL == (User_code % 256))
  300.                                                                 B_IrUserErr = 0;        //User code is righe
  301.                                                 else        B_IrUserErr = 1;        //user code is wrong
  302.                                                         
  303.                                                 IR_code      = IR_data;
  304.                                                 B_IR_Press   = 1;                        //數據有效
  305.                                                 _data_();
  306.                                         }
  307.                                 }
  308.                                 else if((IR_BitCnt & 7)== 0)                //one byte receive
  309.                                 {
  310.                                         IR_UserL = IR_UserH;                        //Save the User code high byte
  311.                                         IR_UserH = IR_data;                                //Save the User code low byte
  312.                                         IR_data  = IR_DataShit;                        //Save the IR data byte
  313.                                 }
  314.                         }
  315.                 }
  316.         }
  317. }

  318. /********************** Timer0中斷函數************************/
  319. void timer0 (void) interrupt 1
  320. {
  321.         IR_RX_HT6121();         //紅外
  322. }

  323. ///////////////////////////////////////////
  324. void time2(void ) interrupt 12
  325. {        
  326.         TR0=0;      //T2中斷期間關閉T0中斷
  327.         if(k==1)        //k=1時,常開
  328.                 KG=0;        //開關
  329.         else
  330.         {
  331.                 i1++; //計次數
  332.                 if(b==1) //b=開啟和關閉狀態
  333.                 {
  334. ……………………

  335. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
STC15F104紅外 定時器 TM1637數碼管(終極版).zip (46.39 KB, 下載次數: 71)


評分

參與人數 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:424598 發表于 2018-11-30 09:39 | 只看該作者
用廢棄的化妝品盒,給我的板子安個家

IMG_20181130_092234.jpg (76.21 KB, 下載次數: 91)

IMG_20181130_092234.jpg

IMG_20181130_092243.jpg (75.74 KB, 下載次數: 107)

IMG_20181130_092243.jpg
回復

使用道具 舉報

板凳
ID:424598 發表于 2018-11-30 11:18 | 只看該作者
  1. void xsled(void) //寫數據到LED
復制代碼
  1. void time2(void ) interrupt 12
  2. {       
  3.         TR0=0;      //T2中斷期間關閉T0中斷
  4.         if(k==1)        //k=1時,常開
  5.                 KG=0;        //開關
  6.         else
  7.         {
  8.                 i1++; //計次數
  9.                 if(b==1) //b=開啟和關閉狀態
  10.                 {
  11.                         KG=0; //開關
  12.                         if(i1==ontime)           //開啟時間
  13.                         {
  14.                                 i1=0;
  15.                                 b=0;
  16.                         }
  17.                 }
  18.                 if(b==0)
  19.                 {
  20.                         KG=1; //開關
  21.                         if(i1==offtime)           //關閉時間
  22.                         {
  23.                                 i1=0;
  24.                                 b=1;
  25.                         }
  26.                 }
  27.         }               

  28.         if(shi)        //當shi大于0分鐘時,啟動定時功能
  29.         {
  30.                 i2++; //計次數
  31.                 if(i2==20)
  32.                 {
  33.                         i2=0; //計數清零                                               
  34.                         miao++;         //秒
  35.                         dadt=shi; //賦值
  36.                         jisuan(); //計算
  37.                     xsled();  //寫數據到LED
  38.                 }
  39.                 if(miao==60) //60秒
  40.                 {
  41.                         miao=0;         //秒清零
  42.                         shi--; //減1分鐘
  43.                        
  44.                 }               
  45.                 if(shi==0)         //時
  46.                 {
  47.                         k=0; //關機
  48.                         Close_SMG(); //關閉數碼管
  49.                 }
  50.         }
  51.         TR0=1;        //T2中斷結束,開啟T0中斷
  52. }
復制代碼
替換以上二段代碼, 可以讓數碼管中間的二點以每秒的速度, 亮和滅
回復

使用道具 舉報

地板
ID:438886 發表于 2018-12-6 22:54 來自手機 | 只看該作者
ssk7793 發表于 2018-11-30 11:18
替換以上二段代碼, 可以讓數碼管中間的二點以每秒的速度, 亮和滅

快上原理圖^_^
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美专区在线 | 亚洲精品免费观看 | 欧美成人精品 | 欧美精品一区二区三区四区 | 午夜一级黄色片 | 91九色视频| 精品久久电影 | 国产999精品久久久久久绿帽 | 波多野结衣一区二区三区在线观看 | 久久久久国产精品一区二区 | 欧美日韩一区二区在线观看 | 国产精品亚洲片在线播放 | 欧美一二三| 久久久av | 午夜免费成人 | 久久99国产精品 | 久久久久久久av | 男人天堂99 | 欧美午夜激情在线 | 欧美一区在线视频 | 成人在线播放网站 | 中文字幕一区二区三区四区五区 | 色频 | 日韩欧美国产精品一区二区 | 日本五月婷婷 | 成年网站在线观看 | 中文字幕国产精品 | 成av在线 | 欧美成人一级 | 精品在线播放 | 国产精品区一区二区三 | av黄色在线| 国产不卡一区 | 中文字幕91| 国产91在线播放 | 国产成人精品网站 | 日批日韩在线观看 | 午夜爱爱毛片xxxx视频免费看 | 欧美色综合天天久久综合精品 | 久草在线在线精品观看 | 国产一区二区日韩 |