![]() |
發(fā)布時間: 2024-5-2 17:59
正文摘要:雖然定時插座很便宜 但diy是一種樂趣 現(xiàn)在的手機(jī)都是快充 很快充滿 適合睡覺用 也適合電車用 最大可以設(shè)置12小時定時 5個LED燈組合顯示時間 如程序圖所示 帶記憶功能 為了減少不必要的刷寫 長按按鍵 ... |
lkc8210 發(fā)表于 2024-8-26 11:35 else執(zhí)行一條與執(zhí)行多條的區(qū)別 就一條else(xxx;)毛病 |
ouco123 發(fā)表于 2024-8-25 10:30 正確寫法是else {nj_num=1;} |
ouco123 發(fā)表于 2024-8-25 10:30 這句和 nj_num++; if(nj_num>8)nj_num=1; 一樣 循環(huán)一周又從1開句 而不是從0開始 |
![]() 請問樓主:這里代碼正確嗎? 紅筆標(biāo)記的。 |
zmc419 發(fā)表于 2024-5-18 18:57 晚上睡覺用的 太耀眼了不好 |
1860774xxxx 發(fā)表于 2024-5-3 15:55 四個燈用不同顏色更好 |
黑色蜂鳥 發(fā)表于 2024-5-3 14:22 可以啊 現(xiàn)在也是二進(jìn)制 有空間的話 有多的IO口 上12個也夠 自己喜歡貝 |
bd5fna 發(fā)表于 2024-5-3 13:49 哦 是哦 我都沒注意看 |
直接4個指示燈,按二進(jìn)制編碼 |
原理圖和程序?qū)Σ簧希存I和繼電器畫錯了。 #include <STC8G.H> //此文件中定義了單片機(jī)的一些特殊功能寄存器 #include "STC8G_EEPROM.h" //STC8G內(nèi)部EEPROM驅(qū)動 sbit anjian1=P1^7; //按鍵引腳定義 sbit jidianqi=P1^0; //繼電器引腳定義 typedef unsigned char u8; //無符號字符形數(shù)據(jù)類型進(jìn)行聲明定義 定義名稱u8 所占位數(shù)8位 范圍0~255 typedef unsigned int u16; //無符號整形數(shù)據(jù)類型進(jìn)行聲明定義 定義名稱u16 所占位數(shù)16位 范圍0~65535 u8 fen,miao; //分 秒 變量 bit ajyxzz1,EP_num; //條件允許終止 用于每次操作只允許執(zhí)行一次 防止重復(fù)執(zhí)行 u16 weimiao; /*1T 12M晶振 延時函數(shù) Delay_ms(1)時大約1ms*/ void Delay_ms(u16 ms) { u8 i,j; while(ms--) { for(i=0; i<7; i++) for(j=0; j<99; j++); } } /*io端口配置*/ void STCIO_in() { P1M0 = 0x00; P1M1 = 0x00; //配置P1為準(zhǔn)雙向輸出輸入 P3M0 = 0x00; P3M1 = 0x00; //配置P3為準(zhǔn)雙向輸出輸入 //P5M0 = 0x00; //P5M1 = 0x00; //配置P5為準(zhǔn)雙向輸出輸入 } /*定時計數(shù)器配置*/ void Timer0_Init(void) //1毫秒@12.000MHz 16位自動重裝 { AUXR |= 0x80; //定時器時鐘1T模式 TMOD &= 0xF0; //設(shè)置定時器模式 TL0 = 0x20; //設(shè)置定時初始值 TH0 = 0xD1; //設(shè)置定時初始值 TF0 = 0; //清除TF0標(biāo)志 //TR0 = 1; //定時器0開始計時 ET0 = 1; //使能定時器0中斷 EA=1; //定時器總開關(guān) } /*主函數(shù)*/ void main() { u8 nj_num; //按鍵累計變量 u16 cn_num; //按鍵長短按累計變量 u16 fne_num; //分鐘累計變量 STCIO_in(); //io端口初始化 jidianqi=1; //關(guān)閉繼電器 此時斷電 P3=0x00; //開機(jī)LED全撿 開 Delay_ms(1000); //延時約1秒 P3=0xff; //開機(jī)LED全撿 關(guān) Timer0_Init(); //定時計數(shù)器初始化 while(1) { if(anjian1==0)//判斷時加按鍵是否按下 { Delay_ms(5); //延時消抖 if(anjian1==0) //再次判斷時加按鍵是否按下 { ajyxzz1=0; //按鍵條件復(fù)位 等待下一次按鍵操作 cn_num++; //長按累計器開始計數(shù) if(cn_num>1000) //長按操作 約3秒 { P3=0xff; if(EP_num==0) //這里添加一個條件允許終止 不能它一直重復(fù)擦除寫數(shù)據(jù) { IapErase(0x0400); //擦除EEPROM IapProgram(0x0400, nj_num); //寫數(shù)據(jù)到EEPROM EP_num=1; //數(shù)據(jù)寫好了 馬上終止 防止程序循環(huán)重復(fù)執(zhí)行 } Delay_ms(200); } } } else { if(cn_num>0&&cn_num<500&&ajyxzz1==0) //短按操作 { if(nj_num==0) { nj_num = IapRead(0x0400); //讀EEPROM nj_num = nj_num-1; } if(nj_num<12)nj_num=nj_num+1; else(nj_num=1); miao=0; //清零秒 fen=0; //清零分 jidianqi=0; //啟動繼電器 此時開始通電 TR0 = 1; //定時器開始計數(shù) ajyxzz1=1; //執(zhí)行完畢 條件終止 防止重復(fù)執(zhí)行 } cn_num=0; //按鍵長短按累計變量復(fù)位 等待下一次執(zhí)行 EP_num=0; //EEPROM條件允許終止復(fù)位 等待下一次執(zhí)行 } if(nj_num>0) { switch(nj_num) //顯示LED燈與時長選擇 { case 1:P3=0x7f;fne_num=60;break; //0111 1111 1小時 case 2:P3=0xbf;fne_num=120;break; //1011 1111 2小時 case 3:P3=0xdf;fne_num=180;break; //1101 1111 3小時 case 4:P3=0xef;fne_num=240;break; //1110 1111 4小時 case 5:P3=0xf7;fne_num=300;break; //1111 0111 5小時 case 6:P3=0x77;fne_num=360;break; //0111 0111 6小時 5+1 case 7:P3=0xb7;fne_num=420;break; //1011 0111 7小時 5+2 case 8:P3=0xd7;fne_num=480;break; //1101 0111 8小時 5+3 case 9:P3=0xe7;fne_num=540;break; //1110 0111 9小時 5+4 case 10:P3=0x67;fne_num=600;break; //0110 0111 10小時 5+4+1 case 11:P3=0xa7;fne_num=660;break; //1010 0111 11小時 5+4+2 case 12:P3=0xc7;fne_num=720;break; //1100 0111 12小時 5+4+3 } if(fen==fne_num) //判斷時間是否到了 { TR0 = 0; //關(guān)閉定時器 P3 = 0xff; //關(guān)閉所有LED燈 jidianqi=1; //關(guān)閉繼電器 此時斷電 weimiao = 0; //毫秒清零 miao = 0; //清零秒 fen = 0; //清零分 nj_num = 0; //按鍵累計變量清零 } } } } /*定時器0*/ void Timer0_Isr(void) interrupt 1 { weimiao++; if(weimiao==1000) //1000毫秒=1秒 { miao++; //秒 weimiao=0; //毫秒清零 if(miao==60) //60秒=1分鐘 { fen++; //分 miao=0; //分清零 } } } |
昨晚用了一次 晚上LED有限刺眼 LED限流電阻已換成5K 這個可以跟據(jù)自己須求改動 |
Powered by 單片機(jī)教程網(wǎng)