|
STC89C52RC 單片機(jī)介紹 STC89C52RC 單片機(jī)是宏晶科技推出的新一代高速/低功耗/超強(qiáng)抗干擾的單 片機(jī),指令代碼完全兼容傳統(tǒng) 8051 單片機(jī),12 時(shí)鐘/機(jī)器周期和 6 時(shí)鐘/機(jī)器周 期可以任意選擇。 主要特性如下: 1. 增強(qiáng)型 8051 單片機(jī),6 時(shí)鐘/機(jī)器周期和 12 時(shí)鐘/機(jī)器周期可以任 意選擇,指令代碼完全兼容傳統(tǒng) 8051. 2. 工作電壓:5.5V~3.3V(5V 單片機(jī))/3.8V~2.0V(3V 單片機(jī)) 3. 工作頻率范圍:0~40MHz,相當(dāng)于普通 8051 的 0~80MHz,實(shí)際工 作頻率可達(dá) 48MHz 4. 用戶應(yīng)用程序空間為 8K 字節(jié) 5. 片上集成 512 字節(jié) RAM 6. 通用 I/O 口 (32 個(gè)) 復(fù)位后為: , P1/P2/P3/P4 是準(zhǔn)雙向口/弱上拉, P0 口是漏極開(kāi)路輸出,作為總線擴(kuò)展用時(shí),不用加上拉電阻,作為 I/O 口用時(shí),需加上拉電阻。 7. ISP(在系統(tǒng)可編程)/IAP(在應(yīng)用可編程) ,無(wú)需專用編程器,無(wú) 需專用仿真器,可通過(guò)串口(RxD/P3.0,TxD/P3.1)直接下載用戶程 序,數(shù)秒即可完成一片 8. 具有 EEPROM 功能 9. 具有看門狗功能 10. 共 3 個(gè) 16 位定時(shí)器/計(jì)數(shù)器。即定時(shí)器 T0、T1、T2 11. 外部中斷 4 路,下降沿中斷或低電平觸發(fā)電路,Power Down 模式可 由外部中斷低電平觸發(fā)中斷方式喚醒 12. 通用異步串行口(UART) ,還可用定時(shí)器軟件實(shí)現(xiàn)多個(gè) UART 13. 工作溫度范圍:-40~+85℃(工業(yè)級(jí))/0~75℃(商業(yè)級(jí)) 14. PDIP 封裝 STC89C52RC 單片機(jī)的工作模式 掉電模式:典型功耗<0.1μA,可由外部中斷喚醒,中斷返回后,繼續(xù)執(zhí)行原 程序
空閑模式:典型功耗 2mA 典型功耗 正常工作模式:典型功耗 4Ma~7mA 典型功耗 掉電模式可由外部中斷喚醒,適用于水表、氣表等電池供電系統(tǒng)及便攜設(shè)備
STC89C52RC 引腳功能說(shuō)明 VCC(40 引腳):電源電壓 VS S(20 引腳):接地 P0 端口(P0.0~P0.7 P0.7,39~32 引腳) :P0 口是一個(gè)漏極開(kāi)路的 8 位雙向 I/O 口。作為輸出端口,每個(gè)引腳能驅(qū)動(dòng) 8 個(gè) TTL 負(fù)載,對(duì)端口 P0 寫入 每個(gè)引腳能驅(qū)動(dòng) 寫入“1”時(shí),可 以作為高阻抗輸入。在訪問(wèn)外部程序和數(shù)據(jù)存儲(chǔ)器時(shí) 在訪問(wèn)外部程序和數(shù)據(jù)存儲(chǔ)器時(shí),P0 口也可以提供低 8 位 地址和 8 位數(shù)據(jù)的復(fù)用總線 位數(shù)據(jù)的復(fù)用總線。此時(shí),P0 口內(nèi)部上拉電阻有效。在 Flash ROM 編 在 程時(shí),P0 端口接收指令字節(jié) 端口接收指令字節(jié);而在校驗(yàn)程序時(shí),則輸出指令字節(jié) 則輸出指令字節(jié)。驗(yàn)證時(shí),要求外接上拉電阻。 P1 端口(P1.0~P1.7,1~8 引腳) :P1 口是一個(gè)帶內(nèi)部上拉電阻的 8 位雙向 I/O 口。P1 的輸出緩沖器可驅(qū)動(dòng)(吸收或者輸出電流方式)4 個(gè) TTL 輸入。對(duì)端 口寫入 1 時(shí),通過(guò)內(nèi)部的上拉電阻把端口拉到高電位,這是可用作輸入口。P1 口作輸入口使用時(shí),因?yàn)橛袃?nèi)部上拉電阻,那些被外部拉低的引腳會(huì)輸出一個(gè)電 流( ) 。 此外,P1.0 和 P1.1 還可以作為定時(shí)器/計(jì)數(shù)器 2 的外部技術(shù)輸入(P1.0/T2) 和定時(shí)器/計(jì)數(shù)器 2 的觸發(fā)輸入(P1.1/T2EX) ,具體參見(jiàn)下表: 在對(duì) Flash ROM 編程和程序校驗(yàn)時(shí),P1 接收低 8 位地址。 表 XX P1.0 和 P1.1 引腳復(fù)用功能 P2 端口(P2.0~P2.7,21~28 引腳) :P2 口是一個(gè)帶內(nèi)部上拉電阻的 8 位雙 向 I/O 端口。P2 的輸出緩沖器可以驅(qū)動(dòng)(吸收或輸出電流方式)4 個(gè) TTL 輸入。 對(duì)端口寫入 1 時(shí),通過(guò)內(nèi)部的上拉電阻把端口拉到高電平,這時(shí)可用作輸入口。 P2 作為輸入口使用時(shí),因?yàn)橛袃?nèi)部的上拉電阻,那些被外部信號(hào)拉低的引腳會(huì) 輸出一個(gè)電流(I) 。 在訪問(wèn)外部程序存儲(chǔ)器和 16 位地址的外部數(shù)據(jù)存儲(chǔ)器(如執(zhí)行“MOVX @DPTR”指令)時(shí),P2 送出高 8 位地址。在訪問(wèn) 8 位地址的外部數(shù)據(jù)存儲(chǔ)器(如 執(zhí)行“MOVX @R1”指令)時(shí),P2 口引腳上的內(nèi)容(就是專用寄存器(SFR)區(qū) 中的 P2 寄存器的內(nèi)容) ,在整個(gè)訪問(wèn)期間不會(huì)改變。 在對(duì) Flash ROM 編程和程序校驗(yàn)期間, P2也接收高位地址和一些控制信號(hào)。 P3 端口(P3.0~P3.7,10~17 引腳) :P3 是一個(gè)帶內(nèi)部上拉電阻的 8 位雙向 I/O 端口。P3 的輸出緩沖器可驅(qū)動(dòng)(吸收或輸出電流方式)4 個(gè) TTL 輸入。對(duì)端 口寫入 1 時(shí),通過(guò)內(nèi)部的上拉電阻把端口拉到高電位,這時(shí)可用作輸入口。P3 做輸入口使用時(shí),因?yàn)橛袃?nèi)部的上拉電阻,那些被外部信號(hào)拉低的引腳會(huì)輸入一 個(gè)電流( ) 。
在對(duì) Flash ROM 編程或程序校驗(yàn)時(shí),P3 還接收一些控制信號(hào)。
P3 口除作為一般 I/O 口外,還有其他一些復(fù)用功能,如下表所示: 表 XX P3 口引腳復(fù)用功能 復(fù)用功能 RST(9 引腳) :復(fù)位輸入。當(dāng)輸入連續(xù)兩個(gè)機(jī)器周期以上高電平時(shí)為有效, 用來(lái)完成單片機(jī)單片機(jī)的復(fù)位初始化操作。看門狗計(jì)時(shí)完成后,RST 引腳輸出 96 個(gè)晶振周期的高電平。特殊寄存器 AUXR(地址 8EH)上的 DISRTO 位可以使此功 能無(wú)效。DISRTO 默認(rèn)狀態(tài)下,復(fù)位高電平有效。 ALE/ ROG (30 引腳) 地址鎖存控制信號(hào) : (ALE) 是訪問(wèn)外部程序存儲(chǔ)器時(shí), 鎖存低 8 位地址的輸出脈沖。在 Flash 編程時(shí),此引腳( ROG)也用作編程輸入 脈沖。 在一般情況下,ALE 以晶振六分之一的固定頻率輸出脈沖,可用來(lái)作為外部 定時(shí)器或時(shí)鐘使用。然而,特別強(qiáng)調(diào),在每次訪問(wèn)外部數(shù)據(jù)存儲(chǔ)器時(shí),ALE 脈沖 將會(huì)跳過(guò)。 如果需要,通過(guò)將地址位 8EH 的 SFR 的第 0 位置“1” ,ALE 操作將無(wú)效。這 一位置“1” ,ALE 僅在執(zhí)行 MOVX 或 MOV 指令時(shí)有效。否則,ALE 將被微弱拉 高。這個(gè) ALE 使能標(biāo)志位(地址位 8EH 的 SFR 的第 0 位)的設(shè)置對(duì)微控制器處于 外部執(zhí)行模式下無(wú)效。
:外部程序存儲(chǔ)器選通信號(hào)( SEN)是外部程序存儲(chǔ)器選 SEN(29 引腳)
通信號(hào)。當(dāng) AT89C51RC 從外部程序存儲(chǔ)器執(zhí)行外部代碼時(shí), SEN在每個(gè)機(jī)器周 期被激活兩次,而訪問(wèn)外部數(shù)據(jù)存儲(chǔ)器時(shí), SEN將不被激活。 A/VPP (31 引腳) 訪問(wèn)外部程序存儲(chǔ)器控制信號(hào)。 : 為使能從 0000H 到 FFFFH 的外部程序存儲(chǔ)器讀取指令, A必須接 GND。注意加密方式 1 時(shí), A將內(nèi)部鎖 定位 RESET。為了執(zhí)行內(nèi)部程序指令, A應(yīng)該接 VCC。在 Flash 編程期間, A也 接收 12 伏 VPP 電壓。 XTAL1(19 引腳) :振蕩器反相放大器和內(nèi)部時(shí)鐘發(fā)生電路的輸入端。 XTAL2(18 引腳) :振蕩器反相放大器的輸入端。 #include <reg51.h> #include <stc89c52_eeprom.h> //_nop_();延時(shí)函數(shù)用 #define uchar unsigned char #define uint unsigned int sbit k1=P1^0; sbit k2=P1^1; sbit k3=P1^2; sbit temp_out=P1^5; sbit humi_out=P1^6; sbit IO= P3^2 ; uint count; uchar ds1,ds2,ds3,ds4; uchar set_temp_H,set_temp_H_shi,set_temp_H_ge;//設(shè)定溫度的變量 uchar set_temp_L,set_temp_L_shi,set_temp_L_ge;//設(shè)定溫度的變量 uchar set_humi_H,set_humi_H_ge,set_humi_H_shi;//設(shè)置濕度的變量 uchar set_humi_L,set_humi_L_ge,set_humi_L_shi;//設(shè)置濕度的變量 uchar U8FLAG,k,flag; uchar U8count,U8temp; uchar U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata; uchar U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp; uchar U8comdata; uint U16temp1,U16temp2; uchar ser[]={0,0}; uchar i; uchar code dis_7[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共陽(yáng)LED段碼表 "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" void Delay1(uint j) { uchar i; for(;j>0;j--) { for(i=0;i<35;i++); } } void Delay_10us(void) { uchar i=6; for(;i>0;i--); } void COM(void) { uchar i; for(i=0;i<8;i++) { U8FLAG=2; //--------------------- while((!IO)&&U8FLAG++); Delay_10us(); Delay_10us(); // Delay_10us(); U8temp=0; if(IO)U8temp=1; U8FLAG=2; while((IO)&&U8FLAG++); //---------------------- if(U8FLAG==1)break; U8comdata<<=1; U8comdata|=U8temp; } } //-------------------------------- void RH(void) { IO=0; Delay1(50); IO=1; Delay_10us(); Delay_10us(); Delay_10us(); Delay_10us(); IO=1; if(!IO) { U8FLAG=2; while((!IO)&&U8FLAG++); U8FLAG=2; while((IO)&&U8FLAG++); COM(); U8RH_data_H_temp=U8comdata; COM(); U8RH_data_L_temp=U8comdata; COM(); U8T_data_H_temp=U8comdata; COM(); U8T_data_L_temp=U8comdata; COM(); U8checkdata_temp=U8comdata; IO=1; U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp); if(U8temp==U8checkdata_temp) { U8RH_data_H=U8RH_data_H_temp; U8RH_data_L=U8RH_data_L_temp; U8T_data_H=U8T_data_H_temp; U8T_data_L=U8T_data_L_temp; U8checkdata=U8checkdata_temp; } } } void xiaoyin() {P2=0XFF; P0=0XFF; Delay_10us(); } void disp() { P2=0xfe; P0=dis_7[ds1]; Delay1(5); xiaoyin(); P2=0xfd; P0=dis_7[ds2]; Delay1(5); xiaoyin(); P2=0xfb; P0=dis_7[ds3]; Delay1(5); xiaoyin(); P2=0xf7; P0=dis_7[ds4]; Delay1(5); xiaoyin(); } void disp_settemp_H() { P2=0xfe; P0=0x87; Delay1(1); xiaoyin(); P2=0xfd; P0=0x89; Delay1(1); xiaoyin(); P2=0xf7; P0=dis_7[set_temp_H_ge]; Delay1(1); xiaoyin(); P2=0xfb; P0=dis_7[set_temp_H_shi]; Delay1(1); xiaoyin(); } void disp_settemp_L() { P2=0xfe; P0=0x87; Delay1(1); xiaoyin(); P2=0xfd; P0=0xc7; Delay1(1); xiaoyin(); P2=0xf7; P0=dis_7[set_temp_L_ge]; Delay1(1); xiaoyin(); P2=0xfb; P0=dis_7[set_temp_L_shi]; Delay1(1); xiaoyin(); } void disp_sethumi_H() { P2=0xfe; P0=0x89; Delay1(1); xiaoyin(); P2=0xfd; P0=0x89; Delay1(1); xiaoyin(); P2=0xf7; P0=dis_7[set_humi_H_ge]; Delay1(1); xiaoyin(); P2=0xfb; P0=dis_7[set_humi_H_shi]; Delay1(1); xiaoyin(); } void disp_sethumi_L() {P2=0xfe; P0=0x89; Delay1(1); xiaoyin(); P2=0xfd; P0=0xc7; Delay1(1); xiaoyin(); P2=0xf7; P0=dis_7[set_humi_L_ge]; Delay1(1); xiaoyin(); P2=0xfb; P0=dis_7[set_humi_L_shi]; Delay1(1); xiaoyin(); } void key_scan() { if(k1==0) { while(k1==0); flag++; if(flag==5) flag=0; } if(flag==1) { while(k1==1) { if(k2==0) {while(k2==0); set_temp_H++; if(set_temp_H==100) set_temp_H=0;} if(k3==0) {while(k3 ==0); set_temp_H--; if(set_temp_H==-1) set_temp_H=100;} set_temp_H_ge=set_temp_H%10; set_temp_H_shi=set_temp_H/10; disp_settemp_H(); } iapEraseSector(0x02000); iapProgramByte(0x02008,set_temp_H); delay(20); } if(flag==2) { while(k1==1) { if(k2==0) {while(k2==0); set_temp_L++; if(set_temp_L==100) set_temp_L=0;} if(k3==0) {while(k3==0); set_temp_L--; if(set_temp_L==-1) set_temp_L=100;} set_temp_L_ge=set_temp_L%10; set_temp_L_shi=set_temp_L/10; disp_settemp_L(); } iapEraseSector(0x02200); iapProgramByte(0x02208,set_temp_L); delay(20); } // if(flag==3) { while(k1==1) { if(k2==0) {while(k2==0); set_humi_H++; if(set_humi_H==100) set_humi_H=0;} if(k3==0) {while(k3==0); set_humi_H--; if(set_humi_H==-1) set_humi_H=100;} set_humi_H_ge=set_humi_H%10; set_humi_H_shi=set_humi_H/10; disp_sethumi_H(); } iapEraseSector(0x02400); iapProgramByte(0x02408,set_humi_H); delay(20); } // if(flag==4) { while(k1==1) { if(k2==0) { while(k2==0); set_humi_L++; if(set_humi_L==100) set_humi_L=0;} if(k3==0) {while(k3==0); set_humi_L--; if(set_humi_L==-1) set_humi_L=100;} set_humi_L_ge=set_humi_L%10; set_humi_L_shi=set_humi_L/10; disp_sethumi_L(); } iapEraseSector(0x02600); iapProgramByte(0x02608,set_humi_L); delay(20); } } void convdat() { ds1=U8RH_data_H/10; ds2=U8RH_data_H%10; ds3=U8T_data_H/10; ds4=U8T_data_H%10; } void bijiao() { if(U8RH_data_H<set_humi_L) humi_out=0; if(U8RH_data_H>set_humi_H) humi_out=1; if(U8T_data_H<set_temp_L) temp_out=0; if(U8T_data_H>set_temp_H) temp_out=1; } /****************主函數(shù)************************/ void main() { set_temp_H=iapReadByte(0x02008); set_temp_L=iapReadByte(0x02208); set_humi_H=iapReadByte(0x02408); set_humi_L=iapReadByte(0x02608); while(1) { key_scan(); RH(); convdat(); disp(); bijiao(); } } // //***********************結(jié)束**************************//
|