標(biāo)題: STC89C52RC單片機(jī)的特點(diǎn) [打印本頁]
作者: anxinbin 時(shí)間: 2017-5-8 15:51
標(biāo)題: STC89C52RC單片機(jī)的特點(diǎn)
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 個) 復(fù)位后為: , P1/P2/P3/P4 是準(zhǔn)雙向口/弱上拉, P0 口是漏極開路輸出,作為總線擴(kuò)展用時(shí),不用加上拉電阻,作為 I/O 口用時(shí),需加上拉電阻。
7. ISP(在系統(tǒng)可編程)/IAP(在應(yīng)用可編程) ,無需專用編程器,無 需專用仿真器,可通過串口(RxD/P3.0,TxD/P3.1)直接下載用戶程 序,數(shù)秒即可完成一片
8. 具有 EEPROM 功能
9. 具有看門狗功能
10. 共 3 個 16 位定時(shí)器/計(jì)數(shù)器。即定時(shí)器 T0、T1、T2
11. 外部中斷 4 路,下降沿中斷或低電平觸發(fā)電路,Power Down 模式可 由外部中斷低電平觸發(fā)中斷方式喚醒
12. 通用異步串行口(UART) ,還可用定時(shí)器軟件實(shí)現(xiàn)多個 UART
13. 工作溫度范圍:-40~+85℃(工業(yè)級)/0~75℃(商業(yè)級)
14. PDIP 封裝
STC89C52RC 單片機(jī)的工作模式
掉電模式:典型功耗<0.1μA,可由外部中斷喚醒,中斷返回后,繼續(xù)執(zhí)行原 程序
空閑模式:典型功耗 2mA 典型功耗
正常工作模式:典型功耗 4Ma~7mA 典型功耗
掉電模式可由外部中斷喚醒,適用于水表、氣表等電池供電系統(tǒng)及便攜設(shè)備
STC89C52RC 引腳功能說明
VCC(40 引腳):電源電壓
VS S(20 引腳):接地
P0 端口(P0.0~P0.7 P0.7,39~32 引腳) :P0 口是一個漏極開路的 8 位雙向 I/O 口。作為輸出端口,每個引腳能驅(qū)動 8 個 TTL 負(fù)載,對端口 P0 寫入 每個引腳能驅(qū)動 寫入“1”時(shí),可 以作為高阻抗輸入。在訪問外部程序和數(shù)據(jù)存儲器時(shí) 在訪問外部程序和數(shù)據(jù)存儲器時(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 口是一個帶內(nèi)部上拉電阻的 8 位雙向 I/O 口。P1 的輸出緩沖器可驅(qū)動(吸收或者輸出電流方式)4 個 TTL 輸入。對端 口寫入 1 時(shí),通過內(nèi)部的上拉電阻把端口拉到高電位,這是可用作輸入口。P1 口作輸入口使用時(shí),因?yàn)橛袃?nèi)部上拉電阻,那些被外部拉低的引腳會輸出一個電 流( ) 。
此外,P1.0 和 P1.1 還可以作為定時(shí)器/計(jì)數(shù)器 2 的外部技術(shù)輸入(P1.0/T2) 和定時(shí)器/計(jì)數(shù)器 2 的觸發(fā)輸入(P1.1/T2EX) ,具體參見下表:
在對 Flash ROM 編程和程序校驗(yàn)時(shí),P1 接收低 8 位地址。
表 XX P1.0 和 P1.1 引腳復(fù)用功能
P2 端口(P2.0~P2.7,21~28 引腳) :P2 口是一個帶內(nèi)部上拉電阻的 8 位雙 向 I/O 端口。P2 的輸出緩沖器可以驅(qū)動(吸收或輸出電流方式)4 個 TTL 輸入。 對端口寫入 1 時(shí),通過內(nèi)部的上拉電阻把端口拉到高電平,這時(shí)可用作輸入口。 P2 作為輸入口使用時(shí),因?yàn)橛袃?nèi)部的上拉電阻,那些被外部信號拉低的引腳會 輸出一個電流(I) 。
在訪問外部程序存儲器和 16 位地址的外部數(shù)據(jù)存儲器(如執(zhí)行“MOVX @DPTR”指令)時(shí),P2 送出高 8 位地址。在訪問 8 位地址的外部數(shù)據(jù)存儲器(如 執(zhí)行“MOVX @R1”指令)時(shí),P2 口引腳上的內(nèi)容(就是專用寄存器(SFR)區(qū) 中的 P2 寄存器的內(nèi)容) ,在整個訪問期間不會改變。
在對 Flash ROM 編程和程序校驗(yàn)期間, P2也接收高位地址和一些控制信號。
P3 端口(P3.0~P3.7,10~17 引腳) :P3 是一個帶內(nèi)部上拉電阻的 8 位雙向 I/O 端口。P3 的輸出緩沖器可驅(qū)動(吸收或輸出電流方式)4 個 TTL 輸入。對端 口寫入 1 時(shí),通過內(nèi)部的上拉電阻把端口拉到高電位,這時(shí)可用作輸入口。P3 做輸入口使用時(shí),因?yàn)橛袃?nèi)部的上拉電阻,那些被外部信號拉低的引腳會輸入一 個電流( ) 。
在對 Flash ROM 編程或程序校驗(yàn)時(shí),P3 還接收一些控制信號。
P3 口除作為一般 I/O 口外,還有其他一些復(fù)用功能,如下表所示:
表 XX P3 口引腳復(fù)用功能 復(fù)用功能
RST(9 引腳) :復(fù)位輸入。當(dāng)輸入連續(xù)兩個機(jī)器周期以上高電平時(shí)為有效, 用來完成單片機(jī)單片機(jī)的復(fù)位初始化操作。看門狗計(jì)時(shí)完成后,RST 引腳輸出 96 個晶振周期的高電平。特殊寄存器 AUXR(地址 8EH)上的 DISRTO 位可以使此功 能無效。DISRTO 默認(rèn)狀態(tài)下,復(fù)位高電平有效。
ALE/ ROG (30 引腳) 地址鎖存控制信號 : (ALE) 是訪問外部程序存儲器時(shí), 鎖存低 8 位地址的輸出脈沖。在 Flash 編程時(shí),此引腳( ROG)也用作編程輸入 脈沖。
在一般情況下,ALE 以晶振六分之一的固定頻率輸出脈沖,可用來作為外部 定時(shí)器或時(shí)鐘使用。然而,特別強(qiáng)調(diào),在每次訪問外部數(shù)據(jù)存儲器時(shí),ALE 脈沖 將會跳過。
如果需要,通過將地址位 8EH 的 SFR 的第 0 位置“1” ,ALE 操作將無效。這 一位置“1” ,ALE 僅在執(zhí)行 MOVX 或 MOV 指令時(shí)有效。否則,ALE 將被微弱拉 高。這個 ALE 使能標(biāo)志位(地址位 8EH 的 SFR 的第 0 位)的設(shè)置對微控制器處于 外部執(zhí)行模式下無效。
:外部程序存儲器選通信號( SEN)是外部程序存儲器選 SEN(29 引腳)
通信號。當(dāng) AT89C51RC 從外部程序存儲器執(zhí)行外部代碼時(shí), SEN在每個機(jī)器周 期被激活兩次,而訪問外部數(shù)據(jù)存儲器時(shí), SEN將不被激活。 A/VPP (31 引腳) 訪問外部程序存儲器控制信號。 : 為使能從 0000H 到 FFFFH 的外部程序存儲器讀取指令, 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};
//共陽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é)束**************************//
| 歡迎光臨 (http://www.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |