資源簡介
1. 用16盞以上的LED小燈,實現至少4種彩燈燈光效果(不含全部點亮,全部熄滅);
2. 可以用輸入按鈕在幾種燈光效果間切換;
3. 可以通過按鈕暫停彩燈效果,使小燈全亮,再次按下相同按鈕后繼續之前的效果;
4. 增加自動在幾種效果間切換的功能,并設置一個按鈕可以在自動模式和手動模式間切換;
5. 使用定時中斷延時。
程序中實現了十鐘燈光效果,分別是:
順時針流水燈、逆時針流水燈、交替閃爍、順時針對角燈、逆時針對角燈、順時針逐個點亮、順時針逐個熄滅、逆時針逐個點亮、逆時針逐個熄滅、二進制加法。

代碼片段和文件信息
/**************************************************************************************************
模塊名稱:51單片機彩燈控制器
模塊功能:實現十種循環彩燈控制
編寫人員:mengkun??(http://mkblog.cn)
編寫日期:2016/12/18
**************************************************************************************************/
#include?
#define?false?0
#define?true?1
#define?uchar?unsigned?char
#define?uint?unsigned?int
sbit?pause_key?=?P3^0; //暫停按鈕
sbit?auto_key?=?P3^1; //手動模式的效果切換
sbit?change_key?=?P3^2; //手動模式效果切換
sbit?pauseLed?=?P3^6; //暫停、啟動指示燈
sbit?autoLed?=?P3^7; //自動、手動模式指示燈
int?ledCode[8]={0xfe0xfd0xfb0xf70xef0xdf0xbf0x7f};?//led段碼(單個顯示)
int?ledCode2[8]={0xfe0xfc0xf80xf00xe00xc00x800x00};?//led段碼(半顯示半滅)
int?disCode[10]={0x030x9f0x250x0d0x990x490x410x1f0x010x09};?//數碼管段碼?0~9
void?displayLed(void); //顯示led的主函數
void?keyScan(void); //鍵盤掃描處理函數
void?Delay10ms(unsigned?int?n); //延時10ms
bit?isPause?=?false; //是否暫停
bit?isAuto?=?true; //是否自動運行
bit?isChange?=?false; //是否要切換下一個效果
uchar?time; ??//計時滿0.5s
uchar?types; //第幾種燈光顯示方案
uint?counts; //燈光的第幾個
/*******************************************************************************?
*?函?數?名??????????:?T0_INT
*?函數功能?????????:?T0定時器中斷函數
*?輸??????入?????????:?無
*?輸??????出?????????:?無?
*******************************************************************************/?
void?T0_INT(void)??interrupt?1
{?
TL0=?(65536-50000)/256;
TH0=?(65536-50000)%256;
time?++;
if(time?>=?10)?//定時時間:0.5s
{
time=0;
if(isChange?==?true) //可以變換下一種顯示效果了
{
counts?=?0;
types++; //顯示下一種效果
if(types?>?9)?types?=?0;?
P0?=?disCode[types]; //更新數碼管顯示
isChange?=?false;
}
displayLed();
counts++;
}
}
/*******************************************************************************?
*?函?數?名??????????:?main
*?函數功能?????????:?主函數
*?輸??????入?????????:?無
*?輸??????出?????????:?無?
*******************************************************************************/??
void?main(void)
{?
TMOD=0x61;?//0110?0001 //方式一
TL0=?(65536-50000)/256; //50ms
TH0=?(65536-50000)%256;
TR0=1; //開啟T0
ET0=1; //T0中斷允許
EA=1; //總中斷開啟
time?=?0; //定時器時間擴種(0.5s)
counts?=?0; //燈光的第幾次
types?=?0; //燈光顯示模式
pauseLed?=?0;?//暫停指示燈滅
P0?=?disCode[types]; //更新數碼管顯示
while(1)
{
keyScan(); //鍵盤掃描及處理
}
}
/*******************************************************************************?
*?函?數?名??????????:?keyScan
*?函數功能?????????:?鍵盤掃描處理
*?輸??????入?????????:?無
*?輸??????出?????????:?無?
*******************************************************************************/??
void?keyScan(void)
{
if(pause_key?==?0) //按下了暫停按鈕
{
Delay10ms(1);
if(pause_key?==?0)
{
isPause?=?~isPause;
pauseLed?=?isPause;
if(isPause?==?true)
{
ET0=0; //關閉T0中斷
P0?=?0xfd; //數碼管顯示?“-”
P1?=?0x00; //所有的燈都亮起來
P2?=?0x00;
}else{
ET0=1; //T0中斷允許
P0?=?disCode[types]; //更新數碼管顯示
displayLed();
}
while(
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????7622??2016-12-18?15:56??main.c
?????文件??????118971??2016-12-18?15:51??1.DSN
?????文件????????3397??2016-12-18?15:42??1.hex
- 上一篇:pic16f877a的跑馬燈
- 下一篇:ms12-020 xp補丁
評論
共有 條評論