在本課中,我們要用一個按鍵來實現跑馬燈的 10 級調速。這又會涉及到鍵的去抖的問 題。 本課的試驗結果是,每按一次按鍵,跑馬速度就降低一級,共 10 級。 這里我們又增加了一個變量 speedlever,來保存當前的速度檔次。 在按鍵里的處理中,多了當前檔次的延時值的設置。 請看程序: ―――――――――――――――― #define uchar unsigned char //定義一下方便使用 #define uint unsigned int #define ulong unsigned long #include <reg52.h> //包括一個 52 標準內核的頭文件 sbit P10 = P1^0; //頭文件中沒有定義的 IO 就要自己來定義了 sbit P11 = P1^1; sbit P12 = P1^2; sbit P13 = P1^3; sbit K1= P3^2; bit ldelay=0; //長定時溢出標記,預置是 0 uchar speed=10; //設置一個變量保存默認的跑馬燈的移動速度 uchar speedlever=0; //保存當前的速度檔次 char code dx516[3] _at_ 0x003b;//這是為了仿真設置的 //一個按鍵控制的 10 級變速跑馬燈試驗 void main(void) // 主程序 { uchar code ledp[4]={0xfe,0xfd,0xfb,0xf7};//預定的寫入 P1 的值 uchar ledi; //用來指示顯示順序 uint n; RCAP2H =0x10; //賦 T2 的預置值 0x1000,溢出 30 次就是 1 秒鐘 RCAP2L =0x00; TR2=1; //啟動定時器 ET2=1; //打開定時器 2 中斷 EA=1; //打開總中斷 while(1) //主程序循環 { if(ldelay) //發現有時間溢出標記,進入處理 { ldelay=0; //清除標記 P1=ledp[ledi]; //讀出一個值送到 P1 口 ledi++; //指向下一個 if(ledi==4) { ledi=0; //到了最后一個燈就換到第一個 } } if(!K1) //如果讀到 K1 為 0 { for(n=0;n<1000;n++); //等待按鍵穩定 while(!K1); //等待按鍵松開 for(n=0;n<1000;n++); //等待按鍵穩定松開 speedlever++; if(speedlever==10)speedlever=0; speed=speedlever*3; //檔次和延時之間的預算法則,也可以用查表方法,做出 不規則的法則 } } } //定時器 2 中斷 timer2() interrupt 5 { static uchar t; TF2=0; t++; if((t==speed)||(t>30)) //比較一個變化的數值,以實現變化的時間溢出,同時限制了最慢速 度為 1 秒 { t=0; ldelay=1;//每次長時間的溢出,就置一個標記,以便主程序處理 } } ―――――――――――――――――――――― 請打開 lesson11 目錄的工程,編譯,運行,看結果: 按 K1,速度則降低一次,總共 10 個檔次。
上傳時間: 2017-11-06
上傳用戶:szcyclone
LED 一般是恒流操作的,如何改變 LED 的亮度呢?答案就是 PWM 控制。在一定的 頻率的方波中,調整高電平和低電平的占空比,即可實現。比如我們用低電平點亮一個 LED 燈,我們假設把一個頻率周期分為 10 個時間等份,如果方波中的高低電平占空比是 9:1, 這是就是一個比較暗的亮度,如果方波中高低電平占空比是 10:0,這時,全部是高電平, 燈是滅的。如果占空比是 5:5,就是一個中間亮度,如果高低比是 1:9,是一個比較亮的 亮度,如果高低是 0:10,這時全部是低電平,就是最亮的。 實際上應用中,電視屏幕墻中的幾十百萬 LED 象素都是這樣控制的,而且每一個象素 都有紅綠藍 3 個 LED,每個 LED 可以變化的亮度是幾百到幾萬或者更多的級別,以實現真 彩色的顯示。還有在您的手機中,背光燈的亮度如果是可以變化的,也應該是這種工作方式。 目前的城市彩燈也有很多都使用了 LED,需要控制亮度是也是 PWM 控制。 下面來分析我們的例程,在這個例程中,我們將定時器 2 溢出定為 1/1200 秒。每 10 次脈沖輸出一個 120HZ 頻率。這每 10 次脈沖再用來控制高低電平的 10 個比值。這樣,在 每個 1/120 秒的方波周期中,我們都可以改變方波的輸出占空比,從而控制 LED 燈的 10 個 級別的亮度。 為什么輸出方波的頻率要 120HZ 這么高?因為如果頻率太低,人眼就會看到閃爍感 覺。一般起碼要在 60HZ 以上才感覺好點,120HZ 就基本上看不到閃爍,只能看到亮度的變 化了。 下面請看程序,程序中有比較多的注釋: ――――――――――――――――――――――― #define uchar unsigned char //定義一下方便使用 #define uint unsigned int #define ulong unsigned long #include <reg52.h> //包括一個 52 標準內核的頭文件 sbit P10 = P1^0; //要控制的 LED 燈 sbit K1= P3^2; //按鍵 K1 uchar scale;//用于保存占空比的輸出 0 的時間份額,總共 10 份 char code dx516[3] _at_ 0x003b;//這是為了仿真設置的 //模擬 PWM 輸出控制燈的 10 個亮度級別 void main(void) // 主程序 { uint n; RCAP2H =0xF3; //賦 T2 的預置值,溢出 1 次是 1/1200 秒鐘 RCAP2L =0x98; TR2=1; //啟動定時器 ET2=1; //打開定時器 2 中斷 EA=1; //打開總中斷 while(1) //程序循環 { ;//主程序在這里就不斷自循環,實際應用中,這里是做主要工作 for(n=0;n<50000;n++); //每過一會兒就自動加一個檔次的亮度 scale++; if(scale==10)scale=0; } } //1/1200 秒定時器 2 中斷 timer2() interrupt 5 { static uchar tt; //tt 用來保存當前時間在一秒中的比例位置 TF2=0; tt++; if(tt==10) //每 1/120 秒整開始輸出低電平 { tt=0; if(scale!=0) //這里加這一句是為了消除滅燈狀態產生的鬼影 P10=0; } if(scale==tt) //按照當前占空比切換輸出高電平 P10=1; } ―――――――――――――――――― 在主程序中,每延時一段時間,就自動換一個占空比,以使亮度自動變化,方便觀察。 編譯,運行,看結果。 可以看到,LED 的亮度以每種亮度 1 秒左右不斷變化,共有 10 個級別。
上傳時間: 2017-11-06
上傳用戶:szcyclone
電子書-電磁兼容導論 第2版 中文 美.克雷通 646頁 33.7M 清晰書簽版
標簽: 電磁兼容
上傳時間: 2021-11-06
上傳用戶:
5V USB扁口接口TP4055鋰離子電池充電接口板ALTIUM設計硬件原理圖+PCB文件,2層B板手設計,大小為33*18mm,,可以做為你的學習設計參考。TP4055 是一款完整的單節鋰離子電池充電器,帶電池正負極反接保護,采用恒定 電流/恒定電壓線性控制。其 SOT 封裝與較少的外部元件數目使得 TP4055 成為便攜式應 用的理想選擇。TP4055 可以適合 USB 電源和適配器電源工作。 由于采用了內部 PMOSFET 架構,加上防倒充電路,所以不需要外部檢測電阻器和 隔離二極管。熱反饋可對充電電流進行自動調節,以便在大功率操作或高環境溫度條件 下對芯片溫度加以限制。充滿電壓固定于 4.2V,而充電電流可通過一個電阻器進行外部 設置。當電池達到 4.2V 之后,充電電流降至設定值 1/10,TP4055 將自動終止充電。 當輸入電壓(交流適配器或 USB 電源)被拿掉時,TP4055 自動進入一個低電流狀 態,電池漏電流在 2uA 以下。TP4055 的其他特點包括充電電流監控器、欠壓閉鎖、自 動再充電和一個用于指示充電結束和輸入電壓接入的狀態引腳。
上傳時間: 2021-11-22
上傳用戶:trh505
include<reg52.h> #define uint unsigned int #define uchar unsigned char uint temp,aa,wang,qian,bai,shi,ge; sbit dula=P2^6; sbit wela=P2^7; uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; void display( uint wang,uint qian,uint bai,uint shi,uint ge); void delay(uint z); void init(); void main() { init();//初始化子程序 while(1) { if(aa==20) { aa=0; temp++; if(temp==99999) { temp=0; } wang=temp/10000; qian=(temp-wang*10000)/1000; bai=(temp-wang*10000-qian*1000)/100; shi=(temp-wang*10000-qian*1000-bai*100)/10; ge=temp%10; } display(wang,qian, bai,shi,ge); } } void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void display(uint wang,uint qian,uint bai,uint shi,uint ge) { dula=1; P0=table[wang]; dula=0; P0=0xff; wela=1; P0=0xfe; wela=0; delay(1); dula=1; P0=table[qian]; dula=0; P0=0xff; wela=1; P0=0xfd; wela=0; delay(1); dula=1; P0=table[bai]; dula=0; P0=0xff; wela=1; P0=0xfb; wela=0; delay(1); dula=1; P0=table[shi]; dula=0; P0=0xff; wela=1; P0=0xf7; wela=0; delay(1); dula=1; P0=table[ge]; dula=0; P0=0xff; wela=1; P0=0xef; wela=0; delay(1); } void init() { wela=0; dula=0; temp=0; TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; } void timer0() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; aa++; } include<reg52.h> #define uint unsigned int #define uchar unsigned char uint temp,aa,wang,qian,bai,shi,ge; sbit dula=P2^6; sbit wela=P2^7; uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; void display( uint wang,uint qian,uint bai,uint shi,uint ge); void delay(uint z); void init(); void main() { init();//初始化子程序 while(1) { if(aa==20) { aa=0; temp++; if(temp==99999) { temp=0; } wang=temp/10000; qian=(temp-wang*10000)/1000; bai=(temp-wang*10000-qian*1000)/100; shi=(temp-wang*10000-qian*1000-bai*100)/10; ge=temp%10; } display(wang,qian, bai,shi,ge); } } void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void display(uint wang,uint qian,uint bai,uint shi,uint ge) { dula=1; P0=table[wang]; dula=0; P0=0xff; wela=1; P0=0xfe; wela=0; delay(1); dula=1; P0=table[qian]; dula=0; P0=0xff; wela=1; P0=0xfd; wela=0; delay(1); dula=1; P0=table[bai]; dula=0; P0=0xff; wela=1; P0=0xfb; wela=0; delay(1); dula=1; P0=table[shi]; dula=0; P0=0xff; wela=1; P0=0xf7; wela=0; delay(1); dula=1; P0=table[ge]; dula=0; P0=0xff; wela=1; P0=0xef; wela=0; delay(1); } void init() { wela=0; dula=0; temp=0; TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; } void timer0() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; aa++; } include<reg52.h> #define uint unsigned int #define uchar unsigned char uint temp,aa,wang,qian,bai,shi,ge; sbit dula=P2^6; sbit wela=P2^7; uchar code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; void display( uint wang,uint qian,uint bai,uint shi,uint ge); void delay(uint z); void init(); void main() { init();//初始化子程序 while(1) { if(aa==20) { aa=0; temp++; if(temp==99999) { temp=0; } wang=temp/10000; qian=(temp-wang*10000)/1000; bai=(temp-wang*10000-qian*1000)/100; shi=(temp-wang*10000-qian*1000-bai*100)/10; ge=temp%10; } display(wang,qian, bai,shi,ge); } } void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void display(uint wang,uint qian,uint bai,uint shi,uint ge) { dula=1; P0=table[wang]; dula=0; P0=0xff; wela=1; P0=0xfe; wela=0; delay(1); dula=1; P0=table[qian]; dula=0; P0=0xff; wela=1; P0=0xfd; wela=0; delay(1); dula=1; P0=table[bai]; dula=0; P0=0xff; wela=1; P0=0xfb; wela=0; delay(1); dula=1; P0=table[shi]; dula=0; P0=0xff; wela=1; P0=0xf7; wela=0; delay(1); dula=1; P0=table[ge]; dula=0; P0=0xff; wela=1; P0=0xef; wela=0; delay(1); } void init() { wela=0; dula=0; temp=0; TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; } void timer0() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; aa++; }
標簽: 矩陣式鍵盤
上傳時間: 2021-12-18
上傳用戶:2590813506
stm32f103zet,處理器,中英文資料
標簽: stm32f103zet 處理器
上傳時間: 2021-12-18
上傳用戶:
20個天線pcb封裝庫2.4G天線封裝WIFI 藍牙 GPS GMS天線封裝庫ALTIUM AD庫,增益高,方向性好,穩定可靠,可以直接應用到你的項目設計。
上傳時間: 2022-01-25
上傳用戶:fliang
移動機器人系統培訓資料移動機器人系統培訓資料
標簽: 移動機器人
上傳時間: 2022-03-15
上傳用戶:
IC-Ucc28950改進的相移全橋控制設計UcC28950是T公司進一步改進的相移全橋控制C,它比原有標準型UCC2895主要改進為Zvs能力范圍加寬,對二次側同步整流直接控制,提高了輕載空載轉換效率,而且此時可以ON/OFF控制同步整流成為綠色產品。既可以作電流型控制,也可以作電壓型控制。增加了閉環軟啟動及使能功能。低啟動電流,逐個周期式限流過流保護,開關頻率可達1MHz UCC28950基本應用電路如圖1所示,內部等效方框電路如圖2所示。*啟動中的保護邏輯UCC28950啟動前應該首先滿足下列條件:*VDD電壓要超過UvLo閾值,73V*5V基準電壓已經實現*芯片結溫低于140℃。*軟啟動電容上的電壓不低于0.55V。如果滿足上述條件,一個內部使能信號EN將產生出來,開始軟啟動過程。軟啟動期間的占空比,由Ss端電壓定義,且不會低于由Twm設置的占空比,或由逐個周期電流限制電路決定的負載條件電壓基準精確的(±1.5%5V基準電壓,具有短路保護,支持內部電路,并能提供20mA外部輸出電流,其用于設置DCDC變換器參數,放置一個低ESR,ESL瓷介電容(1uF-2.2uF旁路去耦,從此端接到GND,并緊靠端子,以獲得最佳性能。唯一的關斷特性發生在C的VDD進入UVLo狀態。*誤差放大器(EA+EA,COMP)誤差放大器有兩個未提交的輸入端,EA+和EA-。它具有3MHz帶寬具有柔性的閉環反饋環。EA+為同相端,EA-為反向端。COMP為輸出端輸入電壓共模范圍保證在0.5V-3.6V。誤差放大器的輸出在內部接到pWM比較器的同相輸入端,誤差放大器的輸出范圍為0.25V4.25V,遠超出PwM比較器輸入上斜信號范圍,其從0.8v-2.8V。軟啟動信號作為附加的放大器的同相輸入,當誤差放大器的兩個同相輸入為低,是支配性的輸入,而且設置的占空比是誤差放大器輸出信號與內部斜波相比較后放在PWM比較器的輸入處。
標簽: ucc2895
上傳時間: 2022-03-31
上傳用戶:
用的是沁恒CH552e淘寶買的評估板,USB中斷上傳程序用的是沁恒提供的做了些修改。程序使用2個端點一個,端點1作為普通鍵盤,端點2作為多媒體按鍵,有詳細注釋多媒體按鍵報告,以下是主函數內容。/****主函數****/main(){ CfgFsys( ); //CH552時鐘選擇配置 mDelaymS(5); //修改主頻等待內部晶振穩定,必加 ConfigT0(2); //配置2ms T0中斷 USBDeviceInit(); //USB設備模式初始化 EA = 1; //允許單片機中斷 UEP1_T_LEN = 0; //預使用發送長度一定要清空 UEP2_T_LEN = 0; //清空端點2發送長度 FLAG = 0; //清空USB中斷傳輸完成標志 Ready = 0; LED_VALID = 1; //給一個默認值 P1_DIR_PU &= 0xE0; //在MOD_OC為0時 p1.5 p1.6 P1.7為推挽輸出 P1_MOD_OC = P1_MOD_OC & ~0xE0; //3個口的bit4 = 0 p1.5 p1.6 P1.7設置為推挽輸出 P1_DIR_PU = P1_DIR_PU | 0xE0; //3個口的bit4 = 1 p1.5 p1.6 P1.7設置為輸出 key1 = 1; key2 = 1; key3 = 1; while(1) { KeyDrive(); //按鍵驅動 }}
上傳時間: 2022-05-15
上傳用戶: