51STC單片機(jī)C語言通用萬能編程模板_第1頁
51STC單片機(jī)C語言通用萬能編程模板_第2頁
51STC單片機(jī)C語言通用萬能編程模板_第3頁
51STC單片機(jī)C語言通用萬能編程模板_第4頁
51STC單片機(jī)C語言通用萬能編程模板_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、8051單片機(jī)C語言編程模板 1.函數(shù)頭文件22.毫秒級CPU延時(shí)函數(shù)43.定時(shí)/計(jì)數(shù)器初始化函數(shù)54.定時(shí)/計(jì)數(shù)器1中斷處理函數(shù)65.定時(shí)/計(jì)數(shù)器0中斷處理函數(shù)76.PWM初始化函數(shù)87.PWM0占空比設(shè)置函數(shù)98.UART串口初始化函數(shù)109.UART串口接收中斷處理函數(shù)1110.UART串口發(fā)送函數(shù)1211.UART串口發(fā)送字符串函數(shù)1312.外部中斷INT初始化函數(shù)1413.外部中斷INT1中斷處理程序1514.外部中斷INT0中斷處理程序1515.普通I/O口模擬PWM生成程序1616.LCD驅(qū)動(dòng)1617.DS18B20溫度傳感器驅(qū)動(dòng)1918.LCM2402(1602也適用)驅(qū)動(dòng)程序

2、2119.主函數(shù)2520. 8個(gè)獨(dú)立式鍵盤驅(qū)動(dòng)程序2721. 16個(gè)陣列式鍵盤驅(qū)動(dòng)程序281.函數(shù)頭文件/*程序名: 編寫人: 編寫時(shí)間:20 年 月 日硬件支持:接口說明:修改日志:NO.1-/*說明:/*/#include <REG51.h REG52.h STC11Fxx.H STC12C2052AD.H STC12C5A60S2.H> /通用89C51頭文件(只留下實(shí)際使用的單片機(jī)所對應(yīng)的頭文件)#include <assert.h> /設(shè)定插入點(diǎn)#include <ctype.h> /字符處理#include <errno.h> /定義

3、錯(cuò)誤碼#include <float.h> /浮點(diǎn)數(shù)處理#include <fstream.h> /文件輸入輸出#include <iomanip.h> /參數(shù)化輸入輸出#include <iostream.h> /數(shù)據(jù)流輸入輸出#include <limits.h> /定義各種數(shù)據(jù)類型最值常量#include <locale.h> /定義本地化函數(shù)#include <math.h> /定義數(shù)學(xué)函數(shù)#include <stdio.h> /定義輸入輸出函數(shù)#include <stdlib.h&g

4、t; /定義雜項(xiàng)函數(shù)及內(nèi)存分配函數(shù)#include <string.h> /字符串處理#include <strstrea.h> /基于數(shù)組的輸入輸出#include <time.h> /定義關(guān)于時(shí)間的函數(shù)#include <wchar.h> /寬字符處理及輸入輸出#include <wctype.h> /寬字符分類#include <intrins.h> /51基本運(yùn)算(包括_nop_空函數(shù))sfr 自定義名 = SFR地址 ; /按字節(jié)定義SFR中的存儲(chǔ)器名。例:sfr P1 = 0x90;sbit 自定義名 = 系統(tǒng)

5、位名 ; /按位定義SFR中的存儲(chǔ)器名。例:sbit Add_Key = P3 1;bit 自定義名 ; /定義一個(gè)位(位的值只能是0或1)例:bit LED;#define 代替名 原名 /用代替名代替原名。例:#define LED P1 / #define TA 0x25#define KEY P1 /鍵盤所連接的I/O接口組定義sbit SPEAKER = P37; /揚(yáng)聲器連接定義sbit DQ = P2 5; /ds18B20sbit RS = P10; /模式位,為0輸入指令,為1輸入數(shù)據(jù)sbit RW = P11; /讀寫位,為0讀,為1寫sbit E = P12; /使能位#

6、define Lcd_Bus P0 /數(shù)據(jù)總線unsigned char 自定義名 ; /定義一個(gè)0255的整數(shù)變量。unsigned int 自定義名 ; /定義一個(gè)065535的整數(shù)變量。data 字節(jié)尋址片內(nèi)RAM,片內(nèi)RAM的128字節(jié) (例:data unsigned char a;)bdata可位尋址片內(nèi)RAM,16字節(jié),從0x20到0x2F (例:bdata unsigned char a;)idata 所有片內(nèi)RAM,256字節(jié),從0x00到0xFF (例:idata unsigned char a;)pdata片外RAM,256字節(jié),從0x00到0xFF (例:pdata u

7、nsigned char a;)xdata片外RAM,64K字節(jié),從0x00到0xFFFF (例:xdata unsigned char a;)code ROM存儲(chǔ)器,64K字節(jié),從0x00到0xFFFF (例:code unsigned char a;)2.毫秒級CPU延時(shí)函數(shù)/*函數(shù)名:毫秒級CPU延時(shí)函數(shù)調(diào) 用:DELAY_MS (?);參 數(shù):165535(參數(shù)不可為0)返回值:無結(jié) 果:占用CPU方式延時(shí)與參數(shù)數(shù)值相同的毫秒時(shí)間備 注:應(yīng)用于1T單片機(jī)時(shí)i<600,應(yīng)用于12T單片機(jī)時(shí)i<125(在此預(yù)為1T單片機(jī)數(shù)值)/*/void DELAY_MS ( unsigne

8、d int a )unsigned int i;while ( -a != 0)for(i = 0; i < 600; i+);/*/-M1M0方式說明00013位T/C,由TL低5位和TH的8位組成13位計(jì)數(shù)器01116位T/C,TL和TH共16位計(jì)數(shù)器1028位T/C,TL用于計(jì)數(shù),當(dāng)TL溢出時(shí)將TH中的值自動(dòng)寫入TL113兩組8位T/C-3.定時(shí)/計(jì)數(shù)器初始化函數(shù)/*函數(shù)名:定時(shí)/計(jì)數(shù)器初始化函數(shù)調(diào) 用:T_C_init();參 數(shù):無返回值:無結(jié) 果:設(shè)置SFR中T/C1和(或)T/C0相關(guān)參數(shù)備 注:本函數(shù)控制T/C1和T/C0,不需要使用的部分可用/屏蔽/*/void T_C

9、_init (void)TMOD = 0x11; /高4位控制T/C1 GATE,C/T,M1,M0,GATE,C/T,M1,M0 EA = 1; /中斷總開關(guān)TH1 = 0xFF; /16位計(jì)數(shù)寄存器T1高8位(寫入初值)TL1 = 0xFF; /16位計(jì)數(shù)寄存器T1低8位ET1 = 1; /T/C1中斷開關(guān)TR1 = 1; /T/C1啟動(dòng)開關(guān)/TH0 = 0x3C; /16位計(jì)數(shù)寄存器T0高8位/TL0 = 0xB0; /16位計(jì)數(shù)寄存器T0低8位(0x3CB0 = 50mS延時(shí))/ET0 = 1; /T/C0中斷開關(guān)/TR0 = 1; /T/C0啟動(dòng)開關(guān)/*/4.定時(shí)/計(jì)數(shù)器1中斷處理函

10、數(shù)/*函數(shù)名:定時(shí)/計(jì)數(shù)器1中斷處理函數(shù)調(diào) 用:T/C1溢出后中斷處理參 數(shù):無返回值:無結(jié) 果:重新寫入16位計(jì)數(shù)寄存器初始值,處理用戶程序備 注:必須允許中斷并啟動(dòng)T/C本函數(shù)方可有效,重新寫入初值需和T_C_init函數(shù)一致/*/void T_C1 (void) interrupt 3 using 3 /切換寄存器組到3 TH1 = 0x3C; /16位計(jì)數(shù)寄存器T1高8位(重新寫入初值)TL1 = 0xB0; /16位計(jì)數(shù)寄存器T1低8位(0x3CB0 = 50mS延時(shí)) /函數(shù)內(nèi)容/*/5.定時(shí)/計(jì)數(shù)器0中斷處理函數(shù)/*函數(shù)名:定時(shí)/計(jì)數(shù)器0中斷處理函數(shù)調(diào) 用:T/C0溢出后中斷處理

11、參 數(shù):無返回值:無結(jié) 果:重新寫入16位計(jì)數(shù)寄存器初始值,處理用戶程序備 注:必須允許中斷并啟動(dòng)T/C本函數(shù)方可有效,重新寫入初值需和T_C_init函數(shù)一致/*/void T_C0 (void) interrupt 1 using 1 /切換寄存器組到1 TH0 = 0x3C; /16位計(jì)數(shù)寄存器T0高8位(重新寫入初值)TL0 = 0xB0; /16位計(jì)數(shù)寄存器T0低8位(0x3CB0 = 50mS延時(shí)) /函數(shù)內(nèi)容/*/6.PWM初始化函數(shù)/*函數(shù)名:PWM初始化函數(shù)調(diào) 用:PWM_init();參 數(shù):無返回值:無結(jié) 果:將PCA初始化為PWM模式,初始占空比為0備 注:需要更多路P

12、WM輸出直接插入CCAPnH和CCAPnL即可/*/void PWM_init (void)CMOD=0x02; /設(shè)置PCA定時(shí)器 CL=0x00; CH=0x00;CCAPM0=0x42; /PWM0設(shè)置PCA工作方式為PWM方式(0100 0010) CCAP0L=0x00; /設(shè)置PWM0初始值與CCAP0H相同 CCAP0H=0x00; / PWM0初始時(shí)為0/CCAPM1=0x42; /PWM1設(shè)置PCA工作方式為PWM方式(使用時(shí)刪除/)/CCAP1L=0x00; /設(shè)置PWM1初始值與CCAP0H相同 /CCAP1H=0x00; / PWM1初始時(shí)為0/CCAPM2=0x42;

13、 /PWM2設(shè)置PCA工作方式為PWM方式/CCAP2L=0x00; /設(shè)置PWM2初始值與CCAP0H相同 /CCAP2H=0x00; / PWM2初始時(shí)為0/CCAPM3=0x42; /PWM3設(shè)置PCA工作方式為PWM方式/CCAP3L=0x00; /設(shè)置PWM3初始值與CCAP0H相同 /CCAP3H=0x00; / PWM3初始時(shí)為0 CR=1; /啟動(dòng)PCA定時(shí)器/*/7.PWM0占空比設(shè)置函數(shù)/*函數(shù)名:PWM0占空比設(shè)置函數(shù)調(diào) 用:PWM0_set();參 數(shù):0x000xFF(亦可用0255)返回值:無結(jié) 果:設(shè)置PWM模式占空比,為0時(shí)全部高電平,為1時(shí)全部低電平備 注:如

14、果需要PWM1的設(shè)置函數(shù),只要把CCAP0L和CCAP0H中的0改為1即可/*/void PWM0_set (unsigned char a)CCAP0L= a; /設(shè)置值直接寫入CCAP0L CCAP0H= a; /設(shè)置值直接寫入CCAP0H/*/8.UART串口初始化函數(shù)/*函數(shù)名:UART串口初始化函數(shù)調(diào) 用:UART_init();參 數(shù):無返回值:無結(jié) 果:啟動(dòng)UART串口接收中斷,允許串口接收,啟動(dòng)T/C1產(chǎn)生波特率(占用)備 注:振蕩晶體為12MHz,PC串口端設(shè)置 4800,8,無,1,無 /*/void UART_init (void)EA = 1; /允許總中斷(如不使用中

15、斷,可用/屏蔽)ES = 1; /允許UART串口的中斷/TMOD = 0x20; /定時(shí)器T/C1工作方式2SCON = 0x50; /串口工作方式1,允許串口接收(SCON = 0x40 時(shí)禁止串口接收)/TH1 = 0xF3; /定時(shí)器初值高8位設(shè)置/TL1 = 0xF3; /定時(shí)器初值低8位設(shè)置PCON = 0x80; /波特率倍頻(屏蔽本句波特率為2400)/TR1 = 1; /定時(shí)器啟動(dòng) /*/9.UART串口接收中斷處理函數(shù)/*函數(shù)名:UART串口接收中斷處理函數(shù)調(diào) 用:SBUF收到數(shù)據(jù)后中斷處理參 數(shù):無返回值:無結(jié) 果:UART串口接收到數(shù)據(jù)時(shí)產(chǎn)生中斷,用戶對數(shù)據(jù)進(jìn)行處理(并

16、發(fā)送回去)備 注:過長的處理程序會(huì)影響后面數(shù)據(jù)的接收/*/void UART_R (void) interrupt 4 using 1 /切換寄存器組到1unsigned char UART_data; /定義串口接收數(shù)據(jù)變量(需要對接受到的數(shù)據(jù)進(jìn)行處理時(shí),可將其定義為全局變量)RI = 0; /令接收中斷標(biāo)志位為0(軟件清零)UART_data = SBUF; /將接收到的數(shù)據(jù)送入變量 UART_data /用戶函數(shù)內(nèi)容(用戶可使用UART_data做數(shù)據(jù)處理)/SBUF = UART_data; /將接收的數(shù)據(jù)發(fā)送回去(刪除/即生效)/while(TI = 0); /檢查發(fā)送中斷標(biāo)志位/T

17、I = 0; /令發(fā)送中斷標(biāo)志位為0(軟件清零)/*/10.UART串口發(fā)送函數(shù)/*函數(shù)名:UART串口發(fā)送函數(shù)調(diào) 用:UART_T (?);參 數(shù):需要UART串口發(fā)送的數(shù)據(jù)(8位/1字節(jié))返回值:無 結(jié) 果:將參數(shù)中的數(shù)據(jù)發(fā)送給UART串口,確認(rèn)發(fā)送完成后退出備 注:/*/void UART_T (unsigned char UART_data) /定義串口發(fā)送數(shù)據(jù)變量 SBUF = UART_data; /將接收的數(shù)據(jù)發(fā)送回去while(TI = 0); /檢查發(fā)送中斷標(biāo)志位TI = 0; /令發(fā)送中斷標(biāo)志位為0(軟件清零)/*/11.UART串口發(fā)送字符串函數(shù)/*函數(shù)名:UART串口發(fā)

18、送字符串函數(shù)調(diào) 用:UART_TC (?);參 數(shù):需要UART串口發(fā)送的數(shù)據(jù)(8位/1字節(jié))返回值:無 結(jié) 果:向串口發(fā)送一個(gè)字符串,長度不限。備 注:例:UART_TC("d9887321"); 此函數(shù)需要#include <string.h>頭文件支持。/*/void UART_TC (unsigned char *str)while(*str != '0')UART_T(*str);*str+;*str = 0;/*/中斷入口說明中斷入口說明interrupt 0 外部中斷0(ROM入口地址:0x03)interrupt 1 定時(shí)/計(jì)數(shù)器

19、中斷0(ROM入口地址:0x0B)interrupt 2 外部中斷1(ROM入口地址:0x13)interrupt 3 定時(shí)/計(jì)數(shù)器中斷1(ROM入口地址:0x1B)interrupt 4 UART串口中斷(ROM入口地址:0x23)(更多的中斷依單片機(jī)型號(hào)而定,ROM中斷入口均相差8個(gè)字節(jié))using 0 使用寄存器組0using 1 使用寄存器組1using 2 使用寄存器組2using 3 使用寄存器組312.外部中斷INT初始化函數(shù)/*函數(shù)名:外部中斷INT初始化函數(shù)調(diào) 用:INT_init();參 數(shù):無返回值:無結(jié) 果:啟動(dòng)外部中斷INT1、INT0中斷,設(shè)置中斷方式備 注:/*/

20、void INT_init (void)EA = 1; /中斷總開關(guān)EX1 = 1; /允許外部中斷1中斷 EX0 = 1; /允許外部中斷0中斷IT1 = 1; /1:下沿觸發(fā) 0:低電平觸發(fā)IT0 = 1; /1:下沿觸發(fā) 0:低電平觸發(fā)/*/13.外部中斷INT1中斷處理程序/*函數(shù)名:外部中斷INT1中斷處理程序調(diào) 用:外部引腳INT1中斷處理參 數(shù):無返回值:無結(jié) 果:用戶處理外部中斷信號(hào)備 注:/*/void INT_1 (void) interrupt 2 using 2 /切換寄存器組到2 /用戶函數(shù)內(nèi)容/*/14.外部中斷INT0中斷處理程序/*函數(shù)名:外部中斷INT0中斷處

21、理程序調(diào) 用:外部引腳INT0中斷處理參 數(shù):無返回值:無結(jié) 果:用戶處理外部中斷信號(hào)備 注:/*/void INT_0 (void) interrupt 0 using 2 /切換寄存器組到2 /用戶函數(shù)內(nèi)容/*/15.普通I/O口模擬PWM生成程序/*函數(shù)名:普通I/O口模擬PWM生成程序調(diào) 用:display (?)備 注:/*/void display (unsigned int a) /顯示程序(50ms的PWM寬度) DY_PORT = 0x00; /LED小燈亮delay (a); /延時(shí)a的長度DY_PORT = 0xff; /LED小燈滅delay (DY_PWM-a); /

22、延時(shí)總PWM長度減a/*/16.LCD驅(qū)動(dòng)/*/LCD驅(qū)動(dòng)(DY12864CBL液晶顯示屏并口驅(qū)動(dòng)程序)/*/void chk_busy() /檢查忙位(底層) RS=0; RW=1; E=1; Lcd_Bus=0xff; while(Lcd_Bus&0x80)=0x80); E=0;/*/void write_com(unsigned char cmdcode) /寫命令到LCD(底層)chk_busy();RS=0;RW=0;E=1;Lcd_Bus=cmdcode;E=0;/*/void write_data(unsigned char Dispdata) /寫數(shù)據(jù)到LCD(底層)

23、 chk_busy();RS=1;RW=0;E=1;Lcd_Bus=Dispdata;E=0;/*/void lcm_init() /初始化LCD屏(被調(diào)用層) write_com(0x30); /選擇8bit數(shù)據(jù)流 write_com(0x0c); /開顯示(無游標(biāo)、不反白) write_com(0x01); /清除顯示,并且設(shè)定地址指針為00H/*/void lcm_w_word(unsigned char *s) /向LCM發(fā)送一個(gè)字符串,長度64字符之內(nèi)。(被調(diào)用層)while(*s>0) /應(yīng)用:lcm_w_word("您好!");write_data(*s); s+; /*/void lcm_

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論