




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、/*/STC12C5A60S2可編程時鐘模塊說明:STC12C5A60S印片機有三路可編程時鐘輸出CLKOUT0/T0/P3.4CLKOUT1/T1/P3.5、CLKOUT2/P1.0涉及寄存器:AUXR輔助寄存器)、WAKE_CLKO(鐘與系統掉電喚醒控制寄存器)BRT(獨立波特率發生器定時器寄存器)程序說明:本程序可選實現P3.4輸出CLKOUT時鐘、P3.5輸出CLKOUT1寸鐘P1.0輸出CLKOUT2寸鐘/*/#include#include/#definePort_BRT/如果想測試獨立波特率發生器時鐘輸出請打開此句若想測試CLKOUT偉口CLKOUT0t注釋此句#ifdefPor
2、tBRT/*條件編譯獨立波特率發生器時鐘輸出*/*/CLKOUT2時鐘初始化/*/voidCLKOUT_init(void)WAKE_CLKO=0x04;/Bit2-BRTCLKO允許P1.0配置為獨立波特率發生器的時鐘輸出/BRT工作在1T模式下時的輸出頻率=Sysclk/(256-BRT)/2/BRT工作在12T模式下時輸出頻率=Sysclk/12/(256-BRT)/2AUXR=0x14;/Bit4-BRTR允許獨立波特率發生器運行/Bit2-BRTx12BRT工作在1T模式下BRT=0xff;/更改該寄存器的值可實現對輸出的時鐘頻率進行分頻#else/*條件編譯CLKOUT酎鐘本出*/
3、*/CLKOUT0時鐘和CLKOUT1U始化/*/voidCLKOUT_init(void)WAKE_CLKO=0x03;/允許將P3.4/T0腳配置為定時器0的時鐘輸出CLKOUT0/T0/T0/1T/12T/工作在定時器模式2下/T1/T1/1T/12T工作在1T模式時的輸出頻率=SYSclk/(256-TH0)/2工作在12T模式時的輸出頻率=SYSclk/12/(256-TH0)/2指的是每1個時鐘加1,是普通C51的12倍指的是每12個時鐘加1與普通C51一樣允許將P3.5/T1腳配置為定時器1的時鐘輸出CLKOUT1只能工作在1T模式時的輸出頻率=SYSclk/(256-TH0)/
4、2工作在12T模式時的輸出頻率=SYSclk/12/(256-TH0)/2指的是每1個時鐘加1,是普通C51的12倍指的是每12個時鐘加1與普通C51一樣AUXR=0xc0;/T0定時器速度是普通8051的12倍,即工作在1T模式下/T1定時器速度是普通8051的12倍,即工作在1T模式下TMOD=0x22;/定時器0工作模式為方式2,自動裝載時間常數/定時器1工作模式為方式2,自動裝載時間常數TH0=0xff;/更改該寄存器的值可實現對輸出的時鐘頻率進行分頻TL0=0xff;TH1=0xff;/更改該寄存器的值可實現對輸出的時鐘頻率進行分頻TL1=0xff;TR1=1;TR0=1;#endi
5、f*/*/主程序/voidmain()CLKOUT_init();while(1);/*/STC12C5A60S2系統時鐘模塊/說明:STC12C5A60S2單片機有兩個時鐘源,內部R/C振蕩時鐘和外部晶體時鐘/出廠標準配置是使用外部晶體或時鐘/涉及寄存器:CLK_DIV(時鐘分頻寄存器)/由該寄存器的Bit0-2組合可實現對時鐘源進行0、2、4、8、16/32、64、128分頻/程序說明:/對外部時鐘進彳T分頻得到Sysclk,然后經過P1.0的獨立波特率/時鐘輸出功能Sysclk/2輸出時鐘頻率*/#include#include#defineBus_clk12/若要修改系統時鐘直接在此處
6、修改/系統時鐘初始化/*/voidSysclk_init(void)WAKE_CLKO=0x04;/AUXR=0x14;/配置P1.0口為頻率輸出允許波特率時鐘工作/工作模式為1T/12為12M的sysclk/6為6M的sysclk/3為3M的sysclk/1500為1.5M的sysclk/750為750kHz的sysclk/375為375kHz的sysclk/187500為187.5kHz的sysclk/93750為93.75kHz的sysclk/*/BRT=0xff;# if(Bus_clk=12)CLK_DIV=0x00;# elif(Bus_clk=6)CLK_DIV=0x01;# e
7、lif(Bus_clk=3)CLK_DIV=0x02;# elif(Bus_clk=1500)CLK_DIV=0x03;# elif(Bus_clk=750)CLK_DIV=0x04;# elif(Bus_clk=375)CLK_DIV=0x05;# elif(Bus_clk=187500)CLK_DIV=0x06;#elif(Bus_clk=93750)CLK_DIV=0x07;#endif/*/主程序/*/voidmain()(Sysclk_init();while(1);)/*/STC12C5A60S2系統省電模塊/說明:STC12C5A60S2單片機有三種省電模式以降低功耗.空閑模式,
8、低速模式/掉電模式/涉及寄存器:PCON電源控制寄存器)/Bit0-IDL控制單片機進入IDLE空閑模式/Bit1-PD控制單片機進入掉電模式/程序說明:/程序實現讓單片機先工作一陣子(通過P0A3指示燈顯示)然后進入掉電狀態,利用外部中斷0口來喚醒單片機工作喚醒后單片機將通過P0A0-3的燈閃爍顯示開始工作/*/進入掉電狀態標志單片機開始工作指示燈/INTO掉電喚醒指示燈/INTO沒有喚醒指示燈/正常工作指示燈/外中斷喚醒輸入口*/#include#include#defineucharunsignedchar#defineuintunsignedintucharPower_Down_Fla
9、g=0;sbitChip_Start_LED=P0A0;/sbitPower_Down_LED_INT0=P0A1;sbitN_Power_Down_LED_INT0=P0A2;sbitNormal_Work_LED=P0A3;sbitPower_Down_Wakeup_INT0=P3A2;voidDelay_ms(uinttime);voidNormal_work(void);voidIntp_init(void);voidAfter_Powr_Down(void);*/軟件延時/*voidDelay_ms(uinttime)/延時時間=(time*1003+16)usuintt;while
10、(time-)for(t=0;t82;t+);/*/正常工作指示*voidNormal_work(void)Normal_Work_LED=1;Delay_ms(500);Normal_Work_LED=0;Delay_ms(500);voidAfter_Power_Down(void)uchari;for(i=0;i100;i+)P0=0x0f;Delay_ms(500);P0=0x00;Delay_ms(500);/*/中斷初始化/*/voidIntp_init(void)IT0=0;EX0=1;EA=1;/外部中斷源0為低電平觸發允許外部中斷開總中斷/*/主程序/*/voidmain()
11、(ucharj=0;記錄掉電次數單片機開始工作外中斷0初始化ucharwakeup_counter=0;/P0=0x00;Chip_Start_LED=1;/Intp_init();/while(1)(P2=wakeup_counter;wakeup_counter+;for(j=0;j250;j+)(系統正常工作指示系統開始進入掉電狀態掉電喚醒后Normal_work();/Power_Down_Flag=1;/PCON=0x02;_nop_();_nop_();_nop_();_nop_();After_Power_Down();/*/中斷服務/*/voidINT0_Service(voi
12、d)interrupt0掉電喚醒狀態指示(if(Power_Down_Flag)/(Power_Down_Flag=0;Power_Down_LED_INT0=1;while(Power_Down_Wakeup_INT0=0)(_nop_();/等待高電平Power_Down_LED_INT0=0;else/未掉電狀態N_Power_Down_LED_INT0=1;/while(Power_Down_Wakeup_INT0=0)(_nop_();N_Power_Down_LED_INT0=0;不是掉電喚醒指示/*/STC12C5A60S2A/D轉換模塊/說明:STC12C5A60S2單片機有8
13、路10位高速AD轉換器,PIP-PI”/涉及寄存器:P1ASF模擬功能控制寄存器)、ADC_CONTR(ADC制寄存器)/ADC_RES、ADC_RES匿t換結果寄存器)/注意:1、初次打開內部A/D模擬電源需適當延時等內部模擬電源穩定后,再啟動A/D轉換/啟動A/D后,在轉換結束前不改變任何I/O口的狀態,有利于高精度A/D轉換/若能將定時器/串行/中斷系統關閉更好。/2、A/D轉換模塊使用的時鐘為內部R/C振蕩器所產生的系統時鐘/3、由于使用兩套時鐘,設置好ADC_CONT廟要加4個空延時操作才可以正確/讀到ADC_CONTR存器的值/程序說明:/本程序實現P1A0口作為A/D采集輸入口,
14、對外部電壓的測量并將測量結果通過/12864和串口顯示出來/*/#include#include#includeIcd.h#defineADC_POWER0x80/AD電源控制#defineADC_START0x08/AD轉換控制0x01/P1.10x02/P1.20x03/P1.30x04/P1.40x05/P1.50x06/P1.60x07/P1.7#defineADC_FLAG0x10/AD轉換完成#defineSpeed_00x00/540clk#defineSpeed_10x20/360clk#defineSpeed_20x40/180clk#defineSpeed_30x60/90
15、clk#defineADC00x00/P1.0#defineADC1#defineADC2#defineADC3#defineADC4#defineADC5#defineADC6#defineADC7voidAD_init(void);doubleResult_Calculate(void);voidSendData(ucharbyte);/*/A/D初始化/*/P1.0/轉換結果高2位放在ADC_RES(勺低2位中,口作為模擬功能A/D使用結果清零voidAD_init(void)AUXR1=0x04;低8位放在ADC_RES由P1ASF=0x01;ADC_RES=0x00;ADC_RESL
16、=0x00;ADC_CONTR=ADC選才iP1.0作輸入_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();EADC=1;EA=1;;_POWER|Speed_2|ADC0|ADC_START;/打開電源,180CLK周期轉換,/允許A/D轉換中斷開總中斷/*/*/voidUART_init(void)SM0=0;/SM1=1;/8REN=1;BRT=0xDC;AUXR=0x15;/選擇串口為方式1工作位數據波特率可變選擇獨立波特率發生器為串行/口的波特率發生器,模式為1T/*/轉換結果計算/*doubleResul
17、t_Calculate(void)(uinttemp;doubleresult;temp=ADC_RES*256+ADC_RESL;result=temp*4.94/1024;returnresult;/*/串口發送數據/*voidSendData(ucharbyte)(SBUF=byte;while(!TI);TI=0;/*/主程序/*voidmain()(Init_LCD();AD_init();UART_init();while(1);/*/A/D中斷服務/*voidAD_Service(void)interrupt5(ADC_CONTR&=!ADC_FLAG;清標志Printf_Dec
18、imal(Result_Calculate();ADC_RES=0x00;ADC_RESL=0x00;ADC_CONTR=ADC_POWER|Speed_2|ADC_START;開始下一次轉換_nop_();_nop_();_nop_();_nop_();#include#include#defineucharunsignedcharsbitPSB=P0A4;/sbitRS=P0A7;/sbitRW=P0A6;/sbitE=P0A5;/#defineuintunsignedint串/并行接口選擇1-并行0-串行并行數據/命令選擇,串行片選0-指令1-數據并行讀寫選擇0-寫1-讀串行數據口并行使
19、能,串行同步時鐘voidDelay_ms(uinttime);/延時ucharBusy(void);/讀忙ucharRead_Status(void);/讀狀態ucharRead_Date(void);/讀數據voidWrite_Cmd(ucharcmd);/寫命令voidWrite_Date(uchardate);/寫數據voidInit_LCD(void);/初始化LCDvoidLocation(ucharx,uchary);/設定顯示位置voidClear_Screen(void);/清屏voidWrite_str(uchar*p);voidPrintf_Decimal(doubleNu
20、m);#includeIcd.hexternvoidSendData(ucharbyte);/*以下部分為LCD的驅動程序*/*/*名稱:Delay_ms()/*功能:實現軟件延時/*輸入:time-時間參數/*輸出:無/*/延時時間=(time*1003+16)us延時時間=(time*499+16)usvoidDelay_ms(uinttime)(uintt;/82,while(time-)/41,(for(t=0;t41;t+);)/*/*/*/名稱:Busy()/*/*/*,功能:讀取忙狀態,輸入:無,輸出:1-忙0-空閑*/ucharBusy(void)(ucharbusy,flag
21、;Delay_ms;busy=Read_Status();if(busy&0x80)flag=1;elseflag=0;Delay_ms(1);returnflag;)/*/*/*/*/*名稱:Read_Status()功能:讀12864狀態輸入:無輸出:status-當前狀態/*/ucharRead_Status(void)(ucharstatus;RS=0;RW=1;E=0;_nop_();_nop_();_nop_();E=1;Delay_ms(1);status=P2;Delay_ms(1);E=0;_nop_();_nop_();returnstatus;/*/*/*/*/*名稱功能
22、輸入輸出Write_Cmd()向12864寫命令cmd-命令參數無*/voidWrite_Cmd(ucharcmd)RS=0;RW=0;E=0;Delay_ms(1);P2=cmd;Delay_ms(1);/等待數據穩定E=1;Delay_ms(1);E=0;/*/*/*/*/*名稱功能輸入輸出Write_Date()向12864寫數據date-待寫入的數據無*/voidWrite_Date(uchardate)while(Busy();RS=1;RW=0;E=0;_nop_();_nop_();P2=date;Delay_ms(1);/待數據穩定E=1;Delay_ms(1);E=0;_no
23、p_();_nop_();/*/*名稱:Read_Date()/*功能:向12864讀數據/*輸入:無/*輸出:date-返回的數據/*/ucharRead_Date(void)(uchardate;while(Busy();RS=1;RW=1;E=0;_nop_();_nop_();_nop_();E=1;Delay_ms(1);date=P2;Delay_ms(1);E=0;_nop_();returndate;*/*名稱:Init_LCD()/*功能:初始化LCD/*輸入:無/*輸出:無/*/voidInit_LCD(void)(Delay_ms(4);PSB=1;/并行方式Delay_
24、ms(4);Write_Cmd(0x0c);/開顯示關游標Delay_ms(4);Clear_Screen();/清屏/*/*名稱:Location()/*功能:設定顯示位置/*輸入:x,y-X軸點-Y軸點/*x只能是1-4中的一個數/*Y只能是0-7中的一個數/*輸出:無/*/voidLocation(ucharx,uchary)(ucharposition;if(x=1)x=0x80;elseif(x=2)x=0x90;elseif(x=3)x=0x88;elseif(x=4)x=0x98;position=x+y;Write_Cmd(position);Delay_ms(2);)/*/*
25、名稱:Clear_Screen()/*功能:清屏/*輸入:無/*輸出:無/*/voidClear_Screen(void)(Write_Cmd(0x34);/擴充指令Delay_ms(11);/10msWrite_Cmd(0x30);/基本指令Delay_ms(1);Write_Cmd(0x01);/清屏Delay_ms(10);)/*/*名稱:Write_str()/*功能:向12864里寫字符串/*輸入:*p-字符串地址/*輸出:無/*/voidWrite_str(uchar*p)(while(*p!=0)(Write_Date(*p);p+;)*/*名稱:Printf_Decimal()
26、/*功能:打印浮點類型數據/*輸入:doubleNum-要打印的數據/*輸出:無/*/voidPrintf_Decimal(doubleNum)(uchars6=0,0,46,0,0;uintt;t=(uint)(Num*1000);s0=t/10000+48;s1=t%10000/1000+48;s3=t%1000/100+48;s4=t%100/10+48;s5=t%10+48;Location(1,2);Write_str(s);SendData(s0);SendData(s1);SendData(s2);SendData(s3);SendData(s4);SendData(s5);Se
27、ndData(t);/*/STC12C5A60S2PCA/PWM模塊/說明:STC12C5A60S2單片機有兩路可編程計數器陣列(PCA)模塊,可用于軟件/定時器,外部脈沖的捕捉、高速輸出以及脈寬調制(PWM)俞出/涉及寄存器:CMOD(PCA:作模式寄存器)CCON(PCA控制寄存器)/CCAPM0,CCAPM1(PCA比較/捕獲寄存器)/CH,CL(PCA的16位計數器)、CCAPnLCCAPnH(PCAt捉/比較寄存器)/PCA_PWM0,PCA_PWM1(PCA模塊PWM?存器)/AUXR1(輔助寄存器1)/程序說明:本程序實現對PCA/PWMI塊的四種工作模式的測試。/注意:當選擇相
28、應的模式時,需在主函數內和中斷服務內更改相應模式的初始化/和相應的中斷服務程序。去掉注釋即可,若要更改相應模式的功能,需在相應/的初始化函數里更改相應的參數,脈寬調制(PWM默認設置為無中斷方式/*/#include#include#defineucharunsignedchar#defineuintunsignedint/*高速模式變量更改*/#defineFOSC12000000#defineT100KHz(FOSC/2/100000)/(2*CCAP0L)/CCAP0L=PCA/*定時模式變量更改*/#defineT5ms(0.005*FOSC)/高速脈沖輸出頻率計算:f=PCA模塊的時
29、鐘源時鐘源/2/f定時計數值=T/(1/PCA的時鐘源)/*PWM模式變量更改*/#defineDR500x7f/50%占空比#defineDR100x19/10%占空比/*時鐘源選擇*/#defineCLK_00x00/Sysclk/12#defineCLK_10x02/Sysclk/2#defineCLK_20x04/定時器0的溢出脈沖#defineCLK_30x06/ECI/P1.2(P4.1)輸入的外部時鐘#defineCLK_40x08/Sysclk#defineCLK_50x0a/Sysclk/4#defineCLK_60x0d/Sysclk/6#defineCLK_80x0e/S
30、ysclk/8/*模式選擇*/#defineHmodel0x4d/#defineT_model0x49/#defineP_model0x42/#definePLmodel0x63/#definePH_model0x53/#definePHLmodel0x73/#defineCU_model0x61/16#defineCD_model0x51/16#defineCUD_model0x71/16高速輸出模式,中斷模式定時模式無中斷PWMII式由低變高可中斷PWMI式由高變低可中斷pwMI式高低都可中斷PWMM式位捕獲,上升觸發中斷模式位捕獲,下降觸發中斷模式位捕獲,跳變觸發中斷模式uintvalu
31、e=T100KHz;/100kHz時的CCAP0Kuinttime=T5ms;uinttest=0;sbitLED=P1A7;/*函數聲明/5ms/*/voidHP_init(void);/voidPP_init(void);PWMvoidTP_init(void);/voidCD_init(void);/*時的CCAP0次口CCAP0Hl測試用,要刪除用來觀測定時模式和捕獲模式的現象定時模式時500Ms閃爍,捕獲模式時捕獲一次時取反高速模式初始化模式初始化定時器模式初始化捕獲模式初始化*/H_model初始化/*/voidHP_init(void)(CMOD=CLK_4;/PCACCAPM0
32、=H_model;/CCAP0L=value;CCAP0H=value8;value+=T100KHz;CR=1;/EA=1;/)/*/P_model初始化時鐘源為Sysclk高速輸出模式開啟PCA計數器開總中斷/*/voidPP_init(void)CMOD=CLK_4;/時鐘源為SysclkCCAPM0=P_model;/無中斷PWMHI式CCAP0L=DR_50;/%50占空比CCAP0H=DR_50;/當CL值大于CCAP0咐輸出為高,反之輸出為低當CL溢出時CCAP0幽值裝載至ijCCAP0L中CR=1;/256/改變/開啟PCA計數器當不使用定時0溢出為時鐘源時,PWM俞出的頻率=
33、PCA的時鐘源使用定時器溢出的時鐘源時,可設定定時器的值對輸出頻率的分頻為0-256分頻/*/T_model初始化/*/voidTP_init(void)CMOD=CLK_4;/時鐘源為SysclkCCAPM0=T_model;/定時模式CCAP0L=time;/CCAP0H=time8;/定時5mstime+=T5ms;CR=1;EA=1;/*/CD_model初始化/*/voidCD_init(void)(CMOD=CLK_4;CCAPM0=CD_model;CR=1;EA=1;/*/主程序/*/voidmain()(CD_init();PP_init();HP_init();/TP_in
34、it();while(1)(/*/中斷服務/*/voidCD_Service(void)interrupt7(CCF0=0;LED=LED;/*voidTP_Service(void)interrupt7(CCF0=0;/清除PCA計數器溢出中斷標志test+;if(test=100)(test=0;LED=LED;)CCAP0L=time;CCAP0H=time8;time+=T5ms;*/*voidHP_Service(void)interrupt7(CCF0=0;/清除PCA計數器溢出中斷標志CCAP0L=value;CCAP0H=value8;value+=T100KHz;*/*/ST
35、C12C5A60S2串行通信模塊/說明:STC12C5A60S2單片機有2個采用UARTT作方式的全雙工串行通信接口/兩個串口都有4種工作方式,兩種波特率可變,兩種波特率固定的/串口1為TxD-P3.1弓I腳RxD-P3.0弓I腳/串口2為當在P1時TxD2-P1.3弓唧RxD2-P1.2弓|腳/當在P4時TxD2-P4.3弓I腳RxD2-P4.2弓唧/涉及寄存器:BRT(獨立波特率發生器)AUXR(輔助寄存器)SCON(串行控制寄存器)/SBUF(數據緩沖寄存器)PCON(電源控制寄存器)IE(中斷控制寄存器)/IP(中斷優先級寄存器)IPH()SADEN()SADDR()WAKE_CLKO
36、時鐘喚醒寄存器)/Bit1-PD控制單片機進入掉電模式/程序說明:程序實現從PC端發送數據到單片機,單片機將接收到的數據通過12864/顯不出來/*/#include#include#includeLCD.h#defineucharunsignedchar#defineuintunsignedint#defineBTL9600/若要更改波特率直接更改此處,當波特率大于9600時需修改相應的接收程序,/可選波特率有以下:/波特率為2400/波特率為4800/波特率為9600/波特率為14400/否則有可能出現亂碼波特率為28800波特率為38400波特率為57600波特率為115200/波特率為19200正在發送標志正在接送標志ucharSend_Bflag=0;/ucharReceive_Bflag
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 技術服務企業風險管理與內部控制考核試卷
- 4-5負邊沿JKFF電子課件教學版
- 生態保護與海洋資源可持續利用考核試卷
- 納米技術在儀器制造中的應用前景考核試卷
- 親情600字初三語文作文
- 紡織品批發商國際市場拓展考核試卷
- 線上線下融合的文具用品零售模式考核試卷
- 機床裝備智能制造裝備產業鏈構建與優化考核試卷
- 礦山機械加工工藝參數優化考核試卷
- 硅冶煉廢渣、廢水的處理與利用考核試卷
- 課程思政教學展示-空巢老人學與思
- 專職消防員及消防文員報名登記表
- 染料甲基橙的制備
- 熱烈歡迎領導蒞臨指導ppt模板
- 新版母嬰保健法律制度
- 幸福比優秀更重要
- 磨床設備點檢表
- TWSJD 002-2019 醫用清洗劑衛生要求
- 畢業設計渡槽設計說明
- 初中數學北師大七年級下冊綜合與實踐-設計自己的運算程序PPT
- 高級貨檢員3選擇題試題
評論
0/150
提交評論