性无码一区二区三区在线观看,少妇被爽到高潮在线观看,午夜精品一区二区三区,无码中文字幕人妻在线一区二区三区,无码精品国产一区二区三区免费

  • 回復
  • 收藏
  • 點贊
  • 分享
  • 發(fā)新帖

【原創(chuàng)】高山云----STC單片機改調(diào)光臺燈

很多現(xiàn)有的臺燈都不具備調(diào)光的功能,只有一個電源開關,現(xiàn)用STC15F104E/STC15F104W等8腳芯片進行改造。利用單片機內(nèi)部的EEPROM功能進行數(shù)據(jù)的掉電保存。

項目設計要求:

     1.通過臺燈適配器上的電源開關來進行調(diào)光切換。

     2.調(diào)光分成4個檔位,分別對應pwm占空比的:25%,50%,75%,100%

     3.程序帶記憶功能,上電時間超過6秒鐘單片機將記住此時的亮度數(shù)據(jù)(及占空比),關燈后下次打開依舊為上次的亮度

     4.調(diào)光切換,上電后在6秒鐘以內(nèi),每開關一次,亮度將向后變化一次,如果當前為100%,下次切換后為25%的亮度

有了以上的設計要求后就可以自己寫代碼和搭硬件電路了。

全部回復(45)
正序查看
倒序查看
2014-05-29 14:55

臺燈適配器圖片:

臺燈開關,增加的電路會裝在這個開關中

最暗時候的燈珠亮度

最暗時候的PWM波形

實際調(diào)試的電路

一下是原理圖,方塊內(nèi)部的部分電路最后全部裝到適配器上的開關里

0
回復
2014-05-29 15:06
@yueyunno1
臺燈適配器圖片:[圖片]臺燈開關,增加的電路會裝在這個開關中[圖片]最暗時候的燈珠亮度[圖片]最暗時候的PWM波形[圖片]實際調(diào)試的電路[圖片]一下是原理圖,方塊內(nèi)部的部分電路最后全部裝到適配器上的開關里[圖片]
#include "reg51.h"
#include "intrins.h"

typedef bit BOOL;
typedef unsigned char BYTE;
typedef unsigned int WORD;

#define T1MS (65536-500) //12T模式

sfr AUXR = 0x8e;                    //Auxiliary register

/*---------------------------------------------------------------------*/
/*--   端口定義                 ---------------------------------------*/
/*---------------------------------------------------------------------*/
#define PORT_3 P3
#define HIGH 1
#define LOW	 0

sbit PWM_OUT_PORT   = P3^2;		   //	LED_RED	 LED_GREEN
sbit LED   = P3^3;
/*---------------------------------------------------------------------*/
/*--   變量定義                 ---------------------------------------*/
/*---------------------------------------------------------------------*/
BYTE i,j;
BYTE test_num;
BYTE POWER_ON_TEMP_f;
BYTE POWER_ON_TIME;
BYTE READ_POWER_ON_TIME;
BOOL ON_OFF_Flag;

unsigned long POWER_ON_TEMP;

//-----------------------------------------------
sfr IAP_DATA    =   0xC2;               //IAP數(shù)據(jù)寄存器
sfr IAP_ADDRH   =   0xC3;               //IAP地址寄存器高字節(jié)
sfr IAP_ADDRL   =   0xC4;               //IAP地址寄存器低字節(jié)
sfr IAP_CMD     =   0xC5;               //IAP命令寄存器
sfr IAP_TRIG    =   0xC6;               //IAP命令觸發(fā)寄存器
sfr IAP_CONTR   =   0xC7;               //IAP控制寄存器

sfr WDT_CONTR   =   0xC1;               //0000,0000 看門狗控制寄存器

sfr P3M0        =   0xB2;   //0000,0000 端口3模式寄存器0
sfr P3M1        =   0xB1;   //0000,0000 端口3模式寄存器1

#define CMD_IDLE    0                   //空閑模式
#define CMD_READ    1                   //IAP字節(jié)讀命令
#define CMD_PROGRAM 2                   //IAP字節(jié)編程命令
#define CMD_ERASE   3                   //IAP扇區(qū)擦除命令
#define ENABLE_IAP 0x83                 //if SYSCLK<12MHz

#define IAP_ADDRESS  0x0100		        //測試地址
#define OFF_TIME_ADD 0x0300		        //測試地址
/*----------------------------
關閉IAP
----------------------------*/
void IapIdle()
{
    IAP_CONTR = 0;                  //關閉IAP功能
    IAP_CMD = 0;                    //清除命令寄存器
    IAP_TRIG = 0;                   //清除觸發(fā)寄存器
    IAP_ADDRH = 0x80;               //將地址設置到非IAP區(qū)域
    IAP_ADDRL = 0;
}

/*----------------------------
從ISP/IAP/EEPROM區(qū)域讀取一字節(jié)
----------------------------*/
BYTE IapReadByte(WORD addr)
{
    BYTE dat;                       //數(shù)據(jù)緩沖區(qū)
    IAP_CONTR = ENABLE_IAP;         //使能IAP
    IAP_CMD = CMD_READ;             //設置IAP命令
    IAP_ADDRL = addr;               //設置IAP低地址
    IAP_ADDRH = addr >> 8;          //設置IAP高地址
    IAP_TRIG = 0x5a;                //寫觸發(fā)命令(0x5a)
    IAP_TRIG = 0xa5;                //寫觸發(fā)命令(0xa5)
    _nop_();                        //等待ISP/IAP/EEPROM操作完成
    dat = IAP_DATA;                 //讀ISP/IAP/EEPROM數(shù)據(jù)
    IapIdle();                      //關閉IAP功能
    return dat;                     //返回
}

/*----------------------------
寫一字節(jié)數(shù)據(jù)到ISP/IAP/EEPROM區(qū)域
----------------------------*/
void IapProgramByte(WORD addr, BYTE dat)
{
    IAP_CONTR = ENABLE_IAP;         //使能IAP
    IAP_CMD = CMD_PROGRAM;          //設置IAP命令
    IAP_ADDRL = addr;               //設置IAP低地址
    IAP_ADDRH = addr >> 8;          //設置IAP高地址
    IAP_DATA = dat;                 //寫ISP/IAP/EEPROM數(shù)據(jù)
    IAP_TRIG = 0x5a;                //寫觸發(fā)命令(0x5a)
    IAP_TRIG = 0xa5;                //寫觸發(fā)命令(0xa5)
    _nop_();                        //等待ISP/IAP/EEPROM操作完成
    IapIdle();
}

/*----------------------------
扇區(qū)擦除
----------------------------*/
void IapEraseSector(WORD addr)
{
    IAP_CONTR = ENABLE_IAP;         //使能IAP
    IAP_CMD = CMD_ERASE;            //設置IAP命令
    IAP_ADDRL = addr;               //設置IAP低地址
    IAP_ADDRH = addr >> 8;          //設置IAP高地址
    IAP_TRIG = 0x5a;                //寫觸發(fā)命令(0x5a)
    IAP_TRIG = 0xa5;                //寫觸發(fā)命令(0xa5)
    _nop_();                        //等待ISP/IAP/EEPROM操作完成
    IapIdle();
}

/*---------------------------------------------------------------------*/
/*--   延時子程序               ---------------------------------------*/
/*---------------------------------------------------------------------*/
void DELAY_1MS(unsigned int z)
{
	unsigned int x,y;
	for(x=z;x>0;x--)
		for(y=123;y>0;y--); 
}
/*---------------------------------------------------------------------*/
/*--   主程序                   ---------------------------------------*/
/*---------------------------------------------------------------------*/

void main()
{
	PORT_3=0X00;
	P3M0=0xFF;
	P3M1=0x00;
	ON_OFF_Flag=0;
	POWER_ON_TIME=0;
	READ_POWER_ON_TIME=0;

    AUXR |= 0x80;                   //定時器0為1T模式
//    AUXR &= 0x7f;                   //定時器0為12T模式
    TMOD = 0x00;                    //設置定時器為模式0(16位自動重裝載)
    TL0 = T1MS;                     //初始化計時值
    TH0 = T1MS >> 8;
    TR0 = 1;                        //定時器0開始計時
    ET0 = 1;                        //使能定時器0中斷
    EA = 0;
	POWER_ON_TEMP=0;
	POWER_ON_TEMP_f=0;
	j=0;
	i=100;

	DELAY_1MS(100);

	WDT_CONTR = 0x35;	   //啟動看門狗
	while (1)
	{
		WDT_CONTR = 0x35;	   //啟動看門狗	    
		if(ON_OFF_Flag==0)	   //上電標志,上電只執(zhí)行一次
		{
			ON_OFF_Flag=1;
			READ_POWER_ON_TIME=IapReadByte(OFF_TIME_ADD);	  //////////////////////////////

			if(READ_POWER_ON_TIME!=4)   //上電時間監(jiān)測,小于4切換模式
			{
				test_num=IapReadByte(IAP_ADDRESS);			  //////////////////////////////
				if(test_num<3)		 //	LED_RED	 LED_GREEN
				{
				   	test_num++;
					IapEraseSector(IAP_ADDRESS);
					IapProgramByte(IAP_ADDRESS,test_num);					
				}
				else 
				{
					test_num=0;
					IapEraseSector(IAP_ADDRESS);
					IapProgramByte(IAP_ADDRESS,test_num);
				}
			}

			else					  //上電時間監(jiān)測,大于4模式記憶
			{
				test_num=IapReadByte(IAP_ADDRESS);		  /////////////////////////////////
				if(test_num>3)		 //	LED_RED	 LED_GREEN 
				{
				   	test_num=0;
					IapEraseSector(IAP_ADDRESS);
					IapProgramByte(IAP_ADDRESS,test_num);
				}	
			}
			IapEraseSector(OFF_TIME_ADD);
		}
		/*---------------------------------------------------------------------*/
		EA = 1;
		if(test_num==0)
		{
			j=4;
		}
		else if(test_num==1)
		{
			j=20;			
		}
		else if(test_num==2)
		{
			j=50;			
		}
		else if(test_num==3)
		{
			j=99;			
		}	
	}
}

//-----------------------------------------------

/* Timer0 interrupt routine */
void tm0_isr() interrupt 1 using 1
{
	if(i>0)
	{
		i--;
		if(j
0
回復
2014-05-29 15:07
@yueyunno1
#include"reg51.h"#include"intrins.h"typedefbitBOOL;typedefunsignedcharBYTE;typedefunsignedintWORD;#defineT1MS(65536-500)//12T模式sfrAUXR=0x8e;//Auxiliaryregister/*---------------------------------------------------------------------*//*--端口定義---------------------------------------*//*---------------------------------------------------------------------*/#definePORT_3P3#defineHIGH1#defineLOW0sbitPWM_OUT_PORT=P3^2;//LED_REDLED_GREENsbitLED=P3^3;/*---------------------------------------------------------------------*//*--變量定義---------------------------------------*//*---------------------------------------------------------------------*/BYTEi,j;BYTEtest_num;BYTEPOWER_ON_TEMP_f;BYTEPOWER_ON_TIME;BYTEREAD_POWER_ON_TIME;BOOLON_OFF_Flag;unsignedlongPOWER_ON_TEMP;//-----------------------------------------------sfrIAP_DATA=0xC2;//IAP數(shù)據(jù)寄存器sfrIAP_ADDRH=0xC3;//IAP地址寄存器高字節(jié)sfrIAP_ADDRL=0xC4;//IAP地址寄存器低字節(jié)sfrIAP_CMD=0xC5;//IAP命令寄存器sfrIAP_TRIG=0xC6;//IAP命令觸發(fā)寄存器sfrIAP_CONTR=0xC7;//IAP控制寄存器sfrWDT_CONTR=0xC1;//0000,0000看門狗控制寄存器sfrP3M0=0xB2;//0000,0000端口3模式寄存器0sfrP3M1=0xB1;//0000,0000端口3模式寄存器1#defineCMD_IDLE0//空閑模式#defineCMD_READ1//IAP字節(jié)讀命令#defineCMD_PROGRAM2//IAP字節(jié)編程命令#defineCMD_ERASE3//IAP扇區(qū)擦除命令#defineENABLE_IAP0x83//ifSYSCLK>8;//設置IAP高地址IAP_TRIG=0x5a;//寫觸發(fā)命令(0x5a)IAP_TRIG=0xa5;//寫觸發(fā)命令(0xa5)_nop_();//等待ISP/IAP/EEPROM操作完成dat=IAP_DATA;//讀ISP/IAP/EEPROM數(shù)據(jù)IapIdle();//關閉IAP功能returndat;//返回}/*----------------------------寫一字節(jié)數(shù)據(jù)到ISP/IAP/EEPROM區(qū)域----------------------------*/voidIapProgramByte(WORDaddr,BYTEdat){IAP_CONTR=ENABLE_IAP;//使能IAPIAP_CMD=CMD_PROGRAM;//設置IAP命令IAP_ADDRL=addr;//設置IAP低地址IAP_ADDRH=addr>>8;//設置IAP高地址IAP_DATA=dat;//寫ISP/IAP/EEPROM數(shù)據(jù)IAP_TRIG=0x5a;//寫觸發(fā)命令(0x5a)IAP_TRIG=0xa5;//寫觸發(fā)命令(0xa5)_nop_();//等待ISP/IAP/EEPROM操作完成IapIdle();}/*----------------------------扇區(qū)擦除----------------------------*/voidIapEraseSector(WORDaddr){IAP_CONTR=ENABLE_IAP;//使能IAPIAP_CMD=CMD_ERASE;//設置IAP命令IAP_ADDRL=addr;//設置IAP低地址IAP_ADDRH=addr>>8;//設置IAP高地址IAP_TRIG=0x5a;//寫觸發(fā)命令(0x5a)IAP_TRIG=0xa5;//寫觸發(fā)命令(0xa5)_nop_();//等待ISP/IAP/EEPROM操作完成IapIdle();}/*---------------------------------------------------------------------*//*--延時子程序---------------------------------------*//*---------------------------------------------------------------------*/voidDELAY_1MS(unsignedintz){unsignedintx,y;for(x=z;x>0;x--)for(y=123;y>0;y--);}/*---------------------------------------------------------------------*//*--主程序---------------------------------------*//*---------------------------------------------------------------------*/voidmain(){PORT_3=0X00;P3M0=0xFF;P3M1=0x00;ON_OFF_Flag=0;POWER_ON_TIME=0;READ_POWER_ON_TIME=0;AUXR|=0x80;//定時器0為1T模式//AUXR&=0x7f;//定時器0為12T模式TMOD=0x00;//設置定時器為模式0(16位自動重裝載)TL0=T1MS;//初始化計時值TH0=T1MS>>8;TR0=1;//定時器0開始計時ET0=1;//使能定時器0中斷EA=0;POWER_ON_TEMP=0;POWER_ON_TEMP_f=0;j=0;i=100;DELAY_1MS(100);WDT_CONTR=0x35;//啟動看門狗while(1){WDT_CONTR=0x35;//啟動看門狗if(ON_OFF_Flag==0)//上電標志,上電只執(zhí)行一次{ON_OFF_Flag=1;READ_POWER_ON_TIME=IapReadByte(OFF_TIME_ADD);//////////////////////////////if(READ_POWER_ON_TIME!=4)//上電時間監(jiān)測,小于4切換模式{test_num=IapReadByte(IAP_ADDRESS);//////////////////////////////if(test_num3)//LED_REDLED_GREEN{test_num=0;IapEraseSector(IAP_ADDRESS);IapProgramByte(IAP_ADDRESS,test_num);}}IapEraseSector(OFF_TIME_ADD);}/*---------------------------------------------------------------------*/EA=1;if(test_num==0){j=4;}elseif(test_num==1){j=20;}elseif(test_num==2){j=50;}elseif(test_num==3){j=99;}}}//-----------------------------------------------/*Timer0interruptroutine*/voidtm0_isr()interrupt1using1{if(i>0){i--;if(j
以上是程序代碼!C程序調(diào)試OK
0
回復
2014-05-29 15:47
@yueyunno1
臺燈適配器圖片:[圖片]臺燈開關,增加的電路會裝在這個開關中[圖片]最暗時候的燈珠亮度[圖片]最暗時候的PWM波形[圖片]實際調(diào)試的電路[圖片]一下是原理圖,方塊內(nèi)部的部分電路最后全部裝到適配器上的開關里[圖片]
樂工新帖 支持!~~~
0
回復
2014-05-29 16:21
@電源網(wǎng)-娜娜姐
樂工新帖支持!~~~
感謝師長支持
0
回復
daihui713
LV.6
7
2014-05-29 16:38
@yueyunno1
以上是程序代碼!C程序調(diào)試OK

通電時間大于6S,斷電再開電時EEP數(shù)據(jù)不加1,保持當前亮度,小于6S內(nèi)切換,斷電開電EEP數(shù)據(jù)加1,亮度遞增。樂云兄是這樣不

0
回復
2014-05-29 17:13
@daihui713
通電時間大于6S,斷電再開電時EEP數(shù)據(jù)不加1,保持當前亮度,小于6S內(nèi)切換,斷電開電EEP數(shù)據(jù)加1,亮度遞增。樂云兄是這樣不
對就是這個思路!
0
回復
cltwolf
LV.5
9
2014-05-30 11:46
@yueyunno1
感謝師長支持

繼續(xù)支持

0
回復
2014-05-30 11:56
@cltwolf
繼續(xù)支持
0
回復
mingquan23
LV.2
11
2014-06-24 09:37
你好,現(xiàn)在的LED有開關調(diào)光的IC,這樣就能滿足你說的這種調(diào)光方式。還有你這樣會導致電源不停的工作在空載跟滿載之間,有的電源的開路保護電壓(OVP)設置過高很容易導致燒壞負載燈珠。你這個PWM的頻率好像不高吧用手機會不會看到頻閃啊?
0
回復
2014-06-25 15:26
@mingquan23
你好,現(xiàn)在的LED有開關調(diào)光的IC,這樣就能滿足你說的這種調(diào)光方式。還有你這樣會導致電源不停的工作在空載跟滿載之間,有的電源的開路保護電壓(OVP)設置過高很容易導致燒壞負載燈珠。你這個PWM的頻率好像不高吧用手機會不會看到頻閃???
我這個是在原有的電源適配器上改進,你說的這個問題我也有想過,由于適配器是恒流源,對我影響也不會太大。單片機部分的功耗也很低,再加上MOS的導通方式為PWM方式,不是一瞬間接通也對LED燈珠起到了緩沖作用,PWM的頻率不是太高。
0
回復
2014-06-25 15:26
@yueyunno1
我這個是在原有的電源適配器上改進,你說的這個問題我也有想過,由于適配器是恒流源,對我影響也不會太大。單片機部分的功耗也很低,再加上MOS的導通方式為PWM方式,不是一瞬間接通也對LED燈珠起到了緩沖作用,PWM的頻率不是太高。

用手機會有閃爍的感覺

0
回復
xiao245896
LV.1
14
2014-06-28 08:36
@yueyunno1
用手機會有閃爍的感覺
這個很有用,呵呵空了我也回去照著改一個。
0
回復
book11
LV.3
15
2014-07-03 10:11
@yueyunno1
臺燈適配器圖片:[圖片]臺燈開關,增加的電路會裝在這個開關中[圖片]最暗時候的燈珠亮度[圖片]最暗時候的PWM波形[圖片]實際調(diào)試的電路[圖片]一下是原理圖,方塊內(nèi)部的部分電路最后全部裝到適配器上的開關里[圖片]
內(nèi)部的EEPROM功能,資料上寫10萬次,是不是開個10萬次就不能用了。多謝回復!
0
回復
2014-07-04 17:24
@yueyunno1
用手機會有閃爍的感覺
IAP_ADDRH = 0x80;               //將地址設置到非IAP區(qū)域
IAP_ADDRL = 0;
樂大師,這一句我一直在用,但一直不明白,為什么“IAP_ADDRH = 0x80”是“將地址設置到非IAP區(qū)域”?好像這樣設置,還是在IAP區(qū)域內(nèi)。
0
回復
2014-07-04 19:33
@挑戰(zhàn)者
IAP_ADDRH=0x80;//將地址設置到非IAP區(qū)域IAP_ADDRL=0;樂大師,這一句我一直在用,但一直不明白,為什么“IAP_ADDRH=0x80”是“將地址設置到非IAP區(qū)域”?好像這樣設置,還是在IAP區(qū)域內(nèi)。
這個具體的內(nèi)容你要去參考STC單片機官方的數(shù)據(jù)手冊,這個我也沒有太多的去關注??樟宋胰タ纯词莻€什么意思。
0
回復
2014-07-05 10:09
@yueyunno1
這個具體的內(nèi)容你要去參考STC單片機官方的數(shù)據(jù)手冊,這個我也沒有太多的去關注??樟宋胰タ纯词莻€什么意思。

有已經(jīng)深究過這一問題的高手嗎?請賜教。

其實這一語句在官方文檔中引用,偶從開始使用EEPROM時就照抄,但一直沒搞明白為什么“IAP_ADDRH=0x80;  IAP_ADDRL=0;"是將地址設置到非IAP區(qū)域。如果從官方文檔上看扇區(qū)地址,這樣設置后還是在IAP區(qū)域內(nèi)呀。

0
回復
科長2008
LV.3
19
2014-07-05 12:08
@挑戰(zhàn)者
有已經(jīng)深究過這一問題的高手嗎?請賜教。其實這一語句在官方文檔中引用,偶從開始使用EEPROM時就照抄,但一直沒搞明白為什么“IAP_ADDRH=0x80; IAP_ADDRL=0;"是將地址設置到非IAP區(qū)域。如果從官方文檔上看扇區(qū)地址,這樣設置后還是在IAP區(qū)域內(nèi)呀。
直接在MCU那做一個恒流源。這樣更合實際。電壓的波動對光線有影響的。
0
回復
2014-07-06 22:35
@科長2008
直接在MCU那做一個恒流源。這樣更合實際。電壓的波動對光線有影響的。
這個帖子是在現(xiàn)有的無調(diào)光臺燈上進行改進,如果是自己單獨設計肯定還是傾向于在電源上去處理,這個電源本身是一個固定恒流源輸出,最亮的時候就是固定橫流輸出。其實主要還是考慮外觀問題,適配器的電源開關內(nèi)部的空間太小了,只能裝下幾個小元器件,如果做恒流源勢必會有一個電感,這個電感是沒有地方放的。
0
回復
zsl12570
LV.2
21
2014-07-14 16:03
@yueyunno1
#include"reg51.h"#include"intrins.h"typedefbitBOOL;typedefunsignedcharBYTE;typedefunsignedintWORD;#defineT1MS(65536-500)//12T模式sfrAUXR=0x8e;//Auxiliaryregister/*---------------------------------------------------------------------*//*--端口定義---------------------------------------*//*---------------------------------------------------------------------*/#definePORT_3P3#defineHIGH1#defineLOW0sbitPWM_OUT_PORT=P3^2;//LED_REDLED_GREENsbitLED=P3^3;/*---------------------------------------------------------------------*//*--變量定義---------------------------------------*//*---------------------------------------------------------------------*/BYTEi,j;BYTEtest_num;BYTEPOWER_ON_TEMP_f;BYTEPOWER_ON_TIME;BYTEREAD_POWER_ON_TIME;BOOLON_OFF_Flag;unsignedlongPOWER_ON_TEMP;//-----------------------------------------------sfrIAP_DATA=0xC2;//IAP數(shù)據(jù)寄存器sfrIAP_ADDRH=0xC3;//IAP地址寄存器高字節(jié)sfrIAP_ADDRL=0xC4;//IAP地址寄存器低字節(jié)sfrIAP_CMD=0xC5;//IAP命令寄存器sfrIAP_TRIG=0xC6;//IAP命令觸發(fā)寄存器sfrIAP_CONTR=0xC7;//IAP控制寄存器sfrWDT_CONTR=0xC1;//0000,0000看門狗控制寄存器sfrP3M0=0xB2;//0000,0000端口3模式寄存器0sfrP3M1=0xB1;//0000,0000端口3模式寄存器1#defineCMD_IDLE0//空閑模式#defineCMD_READ1//IAP字節(jié)讀命令#defineCMD_PROGRAM2//IAP字節(jié)編程命令#defineCMD_ERASE3//IAP扇區(qū)擦除命令#defineENABLE_IAP0x83//ifSYSCLK>8;//設置IAP高地址IAP_TRIG=0x5a;//寫觸發(fā)命令(0x5a)IAP_TRIG=0xa5;//寫觸發(fā)命令(0xa5)_nop_();//等待ISP/IAP/EEPROM操作完成dat=IAP_DATA;//讀ISP/IAP/EEPROM數(shù)據(jù)IapIdle();//關閉IAP功能returndat;//返回}/*----------------------------寫一字節(jié)數(shù)據(jù)到ISP/IAP/EEPROM區(qū)域----------------------------*/voidIapProgramByte(WORDaddr,BYTEdat){IAP_CONTR=ENABLE_IAP;//使能IAPIAP_CMD=CMD_PROGRAM;//設置IAP命令IAP_ADDRL=addr;//設置IAP低地址IAP_ADDRH=addr>>8;//設置IAP高地址IAP_DATA=dat;//寫ISP/IAP/EEPROM數(shù)據(jù)IAP_TRIG=0x5a;//寫觸發(fā)命令(0x5a)IAP_TRIG=0xa5;//寫觸發(fā)命令(0xa5)_nop_();//等待ISP/IAP/EEPROM操作完成IapIdle();}/*----------------------------扇區(qū)擦除----------------------------*/voidIapEraseSector(WORDaddr){IAP_CONTR=ENABLE_IAP;//使能IAPIAP_CMD=CMD_ERASE;//設置IAP命令IAP_ADDRL=addr;//設置IAP低地址IAP_ADDRH=addr>>8;//設置IAP高地址IAP_TRIG=0x5a;//寫觸發(fā)命令(0x5a)IAP_TRIG=0xa5;//寫觸發(fā)命令(0xa5)_nop_();//等待ISP/IAP/EEPROM操作完成IapIdle();}/*---------------------------------------------------------------------*//*--延時子程序---------------------------------------*//*---------------------------------------------------------------------*/voidDELAY_1MS(unsignedintz){unsignedintx,y;for(x=z;x>0;x--)for(y=123;y>0;y--);}/*---------------------------------------------------------------------*//*--主程序---------------------------------------*//*---------------------------------------------------------------------*/voidmain(){PORT_3=0X00;P3M0=0xFF;P3M1=0x00;ON_OFF_Flag=0;POWER_ON_TIME=0;READ_POWER_ON_TIME=0;AUXR|=0x80;//定時器0為1T模式//AUXR&=0x7f;//定時器0為12T模式TMOD=0x00;//設置定時器為模式0(16位自動重裝載)TL0=T1MS;//初始化計時值TH0=T1MS>>8;TR0=1;//定時器0開始計時ET0=1;//使能定時器0中斷EA=0;POWER_ON_TEMP=0;POWER_ON_TEMP_f=0;j=0;i=100;DELAY_1MS(100);WDT_CONTR=0x35;//啟動看門狗while(1){WDT_CONTR=0x35;//啟動看門狗if(ON_OFF_Flag==0)//上電標志,上電只執(zhí)行一次{ON_OFF_Flag=1;READ_POWER_ON_TIME=IapReadByte(OFF_TIME_ADD);//////////////////////////////if(READ_POWER_ON_TIME!=4)//上電時間監(jiān)測,小于4切換模式{test_num=IapReadByte(IAP_ADDRESS);//////////////////////////////if(test_num3)//LED_REDLED_GREEN{test_num=0;IapEraseSector(IAP_ADDRESS);IapProgramByte(IAP_ADDRESS,test_num);}}IapEraseSector(OFF_TIME_ADD);}/*---------------------------------------------------------------------*/EA=1;if(test_num==0){j=4;}elseif(test_num==1){j=20;}elseif(test_num==2){j=50;}elseif(test_num==3){j=99;}}}//-----------------------------------------------/*Timer0interruptroutine*/voidtm0_isr()interrupt1using1{if(i>0){i--;if(j
來看看!
0
回復
0565pan
LV.8
22
2014-07-27 13:55
@yueyunno1
這個帖子是在現(xiàn)有的無調(diào)光臺燈上進行改進,如果是自己單獨設計肯定還是傾向于在電源上去處理,這個電源本身是一個固定恒流源輸出,最亮的時候就是固定橫流輸出。其實主要還是考慮外觀問題,適配器的電源開關內(nèi)部的空間太小了,只能裝下幾個小元器件,如果做恒流源勢必會有一個電感,這個電感是沒有地方放的。
加個點留個記號!學習!
0
回復
rocky.lgz
LV.1
23
2014-08-06 11:04
@yueyunno1
#include"reg51.h"#include"intrins.h"typedefbitBOOL;typedefunsignedcharBYTE;typedefunsignedintWORD;#defineT1MS(65536-500)//12T模式sfrAUXR=0x8e;//Auxiliaryregister/*---------------------------------------------------------------------*//*--端口定義---------------------------------------*//*---------------------------------------------------------------------*/#definePORT_3P3#defineHIGH1#defineLOW0sbitPWM_OUT_PORT=P3^2;//LED_REDLED_GREENsbitLED=P3^3;/*---------------------------------------------------------------------*//*--變量定義---------------------------------------*//*---------------------------------------------------------------------*/BYTEi,j;BYTEtest_num;BYTEPOWER_ON_TEMP_f;BYTEPOWER_ON_TIME;BYTEREAD_POWER_ON_TIME;BOOLON_OFF_Flag;unsignedlongPOWER_ON_TEMP;//-----------------------------------------------sfrIAP_DATA=0xC2;//IAP數(shù)據(jù)寄存器sfrIAP_ADDRH=0xC3;//IAP地址寄存器高字節(jié)sfrIAP_ADDRL=0xC4;//IAP地址寄存器低字節(jié)sfrIAP_CMD=0xC5;//IAP命令寄存器sfrIAP_TRIG=0xC6;//IAP命令觸發(fā)寄存器sfrIAP_CONTR=0xC7;//IAP控制寄存器sfrWDT_CONTR=0xC1;//0000,0000看門狗控制寄存器sfrP3M0=0xB2;//0000,0000端口3模式寄存器0sfrP3M1=0xB1;//0000,0000端口3模式寄存器1#defineCMD_IDLE0//空閑模式#defineCMD_READ1//IAP字節(jié)讀命令#defineCMD_PROGRAM2//IAP字節(jié)編程命令#defineCMD_ERASE3//IAP扇區(qū)擦除命令#defineENABLE_IAP0x83//ifSYSCLK>8;//設置IAP高地址IAP_TRIG=0x5a;//寫觸發(fā)命令(0x5a)IAP_TRIG=0xa5;//寫觸發(fā)命令(0xa5)_nop_();//等待ISP/IAP/EEPROM操作完成dat=IAP_DATA;//讀ISP/IAP/EEPROM數(shù)據(jù)IapIdle();//關閉IAP功能returndat;//返回}/*----------------------------寫一字節(jié)數(shù)據(jù)到ISP/IAP/EEPROM區(qū)域----------------------------*/voidIapProgramByte(WORDaddr,BYTEdat){IAP_CONTR=ENABLE_IAP;//使能IAPIAP_CMD=CMD_PROGRAM;//設置IAP命令IAP_ADDRL=addr;//設置IAP低地址IAP_ADDRH=addr>>8;//設置IAP高地址IAP_DATA=dat;//寫ISP/IAP/EEPROM數(shù)據(jù)IAP_TRIG=0x5a;//寫觸發(fā)命令(0x5a)IAP_TRIG=0xa5;//寫觸發(fā)命令(0xa5)_nop_();//等待ISP/IAP/EEPROM操作完成IapIdle();}/*----------------------------扇區(qū)擦除----------------------------*/voidIapEraseSector(WORDaddr){IAP_CONTR=ENABLE_IAP;//使能IAPIAP_CMD=CMD_ERASE;//設置IAP命令IAP_ADDRL=addr;//設置IAP低地址IAP_ADDRH=addr>>8;//設置IAP高地址IAP_TRIG=0x5a;//寫觸發(fā)命令(0x5a)IAP_TRIG=0xa5;//寫觸發(fā)命令(0xa5)_nop_();//等待ISP/IAP/EEPROM操作完成IapIdle();}/*---------------------------------------------------------------------*//*--延時子程序---------------------------------------*//*---------------------------------------------------------------------*/voidDELAY_1MS(unsignedintz){unsignedintx,y;for(x=z;x>0;x--)for(y=123;y>0;y--);}/*---------------------------------------------------------------------*//*--主程序---------------------------------------*//*---------------------------------------------------------------------*/voidmain(){PORT_3=0X00;P3M0=0xFF;P3M1=0x00;ON_OFF_Flag=0;POWER_ON_TIME=0;READ_POWER_ON_TIME=0;AUXR|=0x80;//定時器0為1T模式//AUXR&=0x7f;//定時器0為12T模式TMOD=0x00;//設置定時器為模式0(16位自動重裝載)TL0=T1MS;//初始化計時值TH0=T1MS>>8;TR0=1;//定時器0開始計時ET0=1;//使能定時器0中斷EA=0;POWER_ON_TEMP=0;POWER_ON_TEMP_f=0;j=0;i=100;DELAY_1MS(100);WDT_CONTR=0x35;//啟動看門狗while(1){WDT_CONTR=0x35;//啟動看門狗if(ON_OFF_Flag==0)//上電標志,上電只執(zhí)行一次{ON_OFF_Flag=1;READ_POWER_ON_TIME=IapReadByte(OFF_TIME_ADD);//////////////////////////////if(READ_POWER_ON_TIME!=4)//上電時間監(jiān)測,小于4切換模式{test_num=IapReadByte(IAP_ADDRESS);//////////////////////////////if(test_num3)//LED_REDLED_GREEN{test_num=0;IapEraseSector(IAP_ADDRESS);IapProgramByte(IAP_ADDRESS,test_num);}}IapEraseSector(OFF_TIME_ADD);}/*---------------------------------------------------------------------*/EA=1;if(test_num==0){j=4;}elseif(test_num==1){j=20;}elseif(test_num==2){j=50;}elseif(test_num==3){j=99;}}}//-----------------------------------------------/*Timer0interruptroutine*/voidtm0_isr()interrupt1using1{if(i>0){i--;if(j
學習了,
0
回復
rocky.lgz
LV.1
24
2014-08-06 11:14
@yueyunno1
這個帖子是在現(xiàn)有的無調(diào)光臺燈上進行改進,如果是自己單獨設計肯定還是傾向于在電源上去處理,這個電源本身是一個固定恒流源輸出,最亮的時候就是固定橫流輸出。其實主要還是考慮外觀問題,適配器的電源開關內(nèi)部的空間太小了,只能裝下幾個小元器件,如果做恒流源勢必會有一個電感,這個電感是沒有地方放的。

用低壓線性IC  沒有電感,一個sop8的IC就可以了。

0
回復
book11
LV.3
25
2014-08-13 17:27
@yueyunno1
#include"reg51.h"#include"intrins.h"typedefbitBOOL;typedefunsignedcharBYTE;typedefunsignedintWORD;#defineT1MS(65536-500)//12T模式sfrAUXR=0x8e;//Auxiliaryregister/*---------------------------------------------------------------------*//*--端口定義---------------------------------------*//*---------------------------------------------------------------------*/#definePORT_3P3#defineHIGH1#defineLOW0sbitPWM_OUT_PORT=P3^2;//LED_REDLED_GREENsbitLED=P3^3;/*---------------------------------------------------------------------*//*--變量定義---------------------------------------*//*---------------------------------------------------------------------*/BYTEi,j;BYTEtest_num;BYTEPOWER_ON_TEMP_f;BYTEPOWER_ON_TIME;BYTEREAD_POWER_ON_TIME;BOOLON_OFF_Flag;unsignedlongPOWER_ON_TEMP;//-----------------------------------------------sfrIAP_DATA=0xC2;//IAP數(shù)據(jù)寄存器sfrIAP_ADDRH=0xC3;//IAP地址寄存器高字節(jié)sfrIAP_ADDRL=0xC4;//IAP地址寄存器低字節(jié)sfrIAP_CMD=0xC5;//IAP命令寄存器sfrIAP_TRIG=0xC6;//IAP命令觸發(fā)寄存器sfrIAP_CONTR=0xC7;//IAP控制寄存器sfrWDT_CONTR=0xC1;//0000,0000看門狗控制寄存器sfrP3M0=0xB2;//0000,0000端口3模式寄存器0sfrP3M1=0xB1;//0000,0000端口3模式寄存器1#defineCMD_IDLE0//空閑模式#defineCMD_READ1//IAP字節(jié)讀命令#defineCMD_PROGRAM2//IAP字節(jié)編程命令#defineCMD_ERASE3//IAP扇區(qū)擦除命令#defineENABLE_IAP0x83//ifSYSCLK>8;//設置IAP高地址IAP_TRIG=0x5a;//寫觸發(fā)命令(0x5a)IAP_TRIG=0xa5;//寫觸發(fā)命令(0xa5)_nop_();//等待ISP/IAP/EEPROM操作完成dat=IAP_DATA;//讀ISP/IAP/EEPROM數(shù)據(jù)IapIdle();//關閉IAP功能returndat;//返回}/*----------------------------寫一字節(jié)數(shù)據(jù)到ISP/IAP/EEPROM區(qū)域----------------------------*/voidIapProgramByte(WORDaddr,BYTEdat){IAP_CONTR=ENABLE_IAP;//使能IAPIAP_CMD=CMD_PROGRAM;//設置IAP命令IAP_ADDRL=addr;//設置IAP低地址IAP_ADDRH=addr>>8;//設置IAP高地址IAP_DATA=dat;//寫ISP/IAP/EEPROM數(shù)據(jù)IAP_TRIG=0x5a;//寫觸發(fā)命令(0x5a)IAP_TRIG=0xa5;//寫觸發(fā)命令(0xa5)_nop_();//等待ISP/IAP/EEPROM操作完成IapIdle();}/*----------------------------扇區(qū)擦除----------------------------*/voidIapEraseSector(WORDaddr){IAP_CONTR=ENABLE_IAP;//使能IAPIAP_CMD=CMD_ERASE;//設置IAP命令IAP_ADDRL=addr;//設置IAP低地址IAP_ADDRH=addr>>8;//設置IAP高地址IAP_TRIG=0x5a;//寫觸發(fā)命令(0x5a)IAP_TRIG=0xa5;//寫觸發(fā)命令(0xa5)_nop_();//等待ISP/IAP/EEPROM操作完成IapIdle();}/*---------------------------------------------------------------------*//*--延時子程序---------------------------------------*//*---------------------------------------------------------------------*/voidDELAY_1MS(unsignedintz){unsignedintx,y;for(x=z;x>0;x--)for(y=123;y>0;y--);}/*---------------------------------------------------------------------*//*--主程序---------------------------------------*//*---------------------------------------------------------------------*/voidmain(){PORT_3=0X00;P3M0=0xFF;P3M1=0x00;ON_OFF_Flag=0;POWER_ON_TIME=0;READ_POWER_ON_TIME=0;AUXR|=0x80;//定時器0為1T模式//AUXR&=0x7f;//定時器0為12T模式TMOD=0x00;//設置定時器為模式0(16位自動重裝載)TL0=T1MS;//初始化計時值TH0=T1MS>>8;TR0=1;//定時器0開始計時ET0=1;//使能定時器0中斷EA=0;POWER_ON_TEMP=0;POWER_ON_TEMP_f=0;j=0;i=100;DELAY_1MS(100);WDT_CONTR=0x35;//啟動看門狗while(1){WDT_CONTR=0x35;//啟動看門狗if(ON_OFF_Flag==0)//上電標志,上電只執(zhí)行一次{ON_OFF_Flag=1;READ_POWER_ON_TIME=IapReadByte(OFF_TIME_ADD);//////////////////////////////if(READ_POWER_ON_TIME!=4)//上電時間監(jiān)測,小于4切換模式{test_num=IapReadByte(IAP_ADDRESS);//////////////////////////////if(test_num3)//LED_REDLED_GREEN{test_num=0;IapEraseSector(IAP_ADDRESS);IapProgramByte(IAP_ADDRESS,test_num);}}IapEraseSector(OFF_TIME_ADD);}/*---------------------------------------------------------------------*/EA=1;if(test_num==0){j=4;}elseif(test_num==1){j=20;}elseif(test_num==2){j=50;}elseif(test_num==3){j=99;}}}//-----------------------------------------------/*Timer0interruptroutine*/voidtm0_isr()interrupt1using1{if(i>0){i--;if(j

#define T1MS (65536-500) 

TL0 = T1MS;                     //初始化計時值  

TH0 = T1MS >> 8; 

這個》8是什么意思?

我見到的寫法是:

TL0 =(65536-500)/256;                 

TH0 = (65536-500)%256 ;

這有什么區(qū)別嗎?

0
回復
2014-08-14 08:42
@book11
#defineT1MS(65536-500) TL0=T1MS;          //初始化計時值  TH0=T1MS>>8; 這個》8是什么意思?我見到的寫法是:TL0=(65536-500)/256;         TH0=(65536-500)%256 ;這有什么區(qū)別嗎?

最后的輸出結果是一樣的,做了右移6處理,例如:11110000   右移2位  x x111100   在C中右移后最左邊以前的位置會補0,即XX=00.

0
回復
book11
LV.3
27
2014-08-14 16:47
@yueyunno1
最后的輸出結果是一樣的,做了右移6處理,例如:11110000 右移2位 xx111100 在C中右移后最左邊以前的位置會補0,即XX=00.
這個定時器模式為什么用1T模式,  
 AUXR |= 0x80;        //定時器0為1T模式
如果不寫上面的語句是默認12T模式嗎,如果是12T模式,會是什么效果?
0
回復
2014-08-18 11:43
@book11
這個定時器模式為什么用1T模式,   AUXR|=0x80;//定時器0為1T模式如果不寫上面的語句是默認12T模式嗎,如果是12T模式,會是什么效果?
同樣的初值,12T模式會比1T模式慢,就相當于1T在超頻,你這樣去理解。
0
回復
book11
LV.3
29
2014-08-18 12:42
@yueyunno1
同樣的初值,12T模式會比1T模式慢,就相當于1T在超頻,你這樣去理解。
stc89c52  好像沒有1T模式,我想把這個程序的PWM用在stc89c52上,試了不行,還得學習呀。
0
回復
2014-08-18 15:10
@book11
stc89c52 好像沒有1T模式,我想把這個程序的PWM用在stc89c52上,試了不行,還得學習呀。
STC89c52是不行的,你直接買個STC15F2K61的芯片,但是要注意電源腳,引腳不兼容
0
回復
book11
LV.3
31
2014-08-18 15:15
@yueyunno1
STC89c52是不行的,你直接買個STC15F2K61的芯片,但是要注意電源腳,引腳不兼容
知道了,謝謝!
0
回復
發(fā)