找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 30510|回复: 0
打印 上一主题 下一主题
收起左侧

STC89C52RC单片机的特点

[复制链接]
跳转到指定楼层
楼主
ID:198176 发表于 2017-5-8 15:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STC89C52RC 单片机介绍
      STC89C52RC 单片机是宏晶科技推出的新一代高速/低功耗/超强抗干扰的单 片机,指令代码完全兼容传统 8051 单片机,12 时钟/机器周期和 6 时钟/机器周 期可以任意选择。
     主要特性如下:
         1. 增强型 8051 单片机,6 时钟/机器周期和 12 时钟/机器周期可以任 意选择,指令代码完全兼容传统 8051.
         2. 工作电压:5.5V3.3V5V 单片机)/3.8V2.0V3V 单片机)
         3. 工作频率范围:040MHz,相当于普通 8051 080MHz,实际工 作频率可达 48MHz
         4. 用户应用程序空间为 8K 字节
         5. 片上集成 512 字节 RAM
         6. 通用 I/O 口 (32 个) 复位后为: , P1/P2/P3/P4 是准双向口/弱上拉, P0 口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为 I/O 口用时,需加上拉电阻。
         7. ISP(在系统可编程)/IAP(在应用可编程) ,无需专用编程器,无 需专用仿真器,可通过串口(RxD/P3.0,TxD/P3.1)直接下载用户程 序,数秒即可完成一片
         8. 具有 EEPROM 功能
         9. 具有看门狗功能
         10. 3 16 位定时器/计数器。即定时器 T0T1T2
         11. 外部中断 4 路,下降沿中断或低电平触发电路,Power Down 模式可 由外部中断低电平触发中断方式唤醒
         12. 通用异步串行口(UART) ,还可用定时器软件实现多个 UART
         13. 工作温度范围:-40+85℃(工业级)/075℃(商业级)
         14. PDIP 封装
STC89C52RC 单片机的工作模式
   掉电模式:典型功耗<0.1μA,可由外部中断唤醒,中断返回后,继续执行原 程序
       空闲模式:典型功耗 2mA 典型功耗
   正常工作模式:典型功耗 4Ma7mA 典型功耗
   掉电模式可由外部中断唤醒,适用于水表、气表等电池供电系统及便携设备
    STC89C52RC 引脚功能说明
   VCC40 引脚):电源电压
   VS S20 引脚):接地
   P0 端口(P0.0P0.7 P0.73932 引脚) :P0 口是一个漏极开路的 8 位双向 I/O 口。作为输出端口,每个引脚能驱动 8 TTL 负载,对端口 P0 写入 每个引脚能驱动 写入“1”时,可 以作为高阻抗输入。在访问外部程序和数据存储器时 在访问外部程序和数据存储器时,P0 口也可以提供低 8 位 地址和 8 位数据的复用总线 位数据的复用总线。此时,P0 口内部上拉电阻有效。在 Flash ROM 编 在 程时,P0 端口接收指令字节 端口接收指令字节;而在校验程序时,则输出指令字节 则输出指令字节。验证时,要求外接上拉电阻。
   P1 端口(P1.0P1.718 引脚) :P1 口是一个带内部上拉电阻的 8 位双向 I/O 口。P1 的输出缓冲器可驱动(吸收或者输出电流方式)4 TTL 输入。对端 口写入 1 时,通过内部的上拉电阻把端口拉到高电位,这是可用作输入口。P1 口作输入口使用时,因为有内部上拉电阻,那些被外部拉低的引脚会输出一个电 流( ) 。
       此外,P1.0 P1.1 还可以作为定时器/计数器 2 的外部技术输入(P1.0/T2) 和定时器/计数器 2 的触发输入(P1.1/T2EX) ,具体参见下表:
       在对 Flash ROM 编程和程序校验时,P1 接收低 8 位地址。
       XX  P1.0 P1.1 引脚复用功能
       P2 端口(P2.0P2.72128 引脚) :P2 口是一个带内部上拉电阻的 8 位双 向 I/O 端口。P2 的输出缓冲器可以驱动(吸收或输出电流方式)4 TTL 输入。 对端口写入 1 时,通过内部的上拉电阻把端口拉到高电平,这时可用作输入口。 P2 作为输入口使用时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会 输出一个电流(I
           在访问外部程序存储器和 16 位地址的外部数据存储器(如执行“MOVX @DPTR”指令)时,P2 送出高 8 位地址。在访问 8 位地址的外部数据存储器(如 执行“MOVX @R1”指令)时,P2 口引脚上的内容(就是专用寄存器(SFR)区 中的 P2 寄存器的内容) ,在整个访问期间不会改变。
            在对 Flash ROM 编程和程序校验期间, P2也接收高位地址和一些控制信号。
             P3 端口(P3.0P3.71017 引脚) :P3 是一个带内部上拉电阻的 8 位双向 I/O 端口。P3 的输出缓冲器可驱动(吸收或输出电流方式)4 TTL 输入。对端 口写入 1 时,通过内部的上拉电阻把端口拉到高电位,这时可用作输入口。P3 做输入口使用时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会输入一 个电流( ) 。
           在对 Flash ROM 编程或程序校验时,P3 还接收一些控制信号。
           P3 口除作为一般 I/O 口外,还有其他一些复用功能,如下表所示:
XX  P3 口引脚复用功能 复用功能
           RST9 引脚) :复位输入。当输入连续两个机器周期以上高电平时为有效, 用来完成单片机单片机的复位初始化操作。看门狗计时完成后,RST 引脚输出 96 个晶振周期的高电平。特殊寄存器 AUXR(地址 8EH)上的 DISRTO 位可以使此功 能无效。DISRTO 默认状态下,复位高电平有效。
           ALE/ ROG 30 引脚) 地址锁存控制信号 : (ALE) 是访问外部程序存储器时, 锁存低 8 位地址的输出脉冲。在 Flash 编程时,此引脚( ROG)也用作编程输入 脉冲。
          在一般情况下,ALE 以晶振六分之一的固定频率输出脉冲,可用来作为外部 定时器或时钟使用。然而,特别强调,在每次访问外部数据存储器时,ALE 脉冲 将会跳过。
          如果需要,通过将地址位 8EH SFR 的第 0 位置“1” ALE 操作将无效。这 一位置“1” ALE 仅在执行 MOVX MOV 指令时有效。否则,ALE 将被微弱拉 高。这个 ALE 使能标志位(地址位 8EH SFR 的第 0 位)的设置对微控制器处于 外部执行模式下无效。
:外部程序存储器选通信号( SEN)是外部程序存储器选 SEN29 引脚)
通信号。当 AT89C51RC 从外部程序存储器执行外部代码时, SEN在每个机器周 期被激活两次,而访问外部数据存储器时, SEN将不被激活。 A/VPP 31 引脚) 访问外部程序存储器控制信号。 : 为使能从 0000H FFFFH 的外部程序存储器读取指令, A必须接 GND。注意加密方式 1 时, A将内部锁 定位 RESET。为了执行内部程序指令, A应该接 VCC。在 Flash 编程期间, A也 接收 12 VPP 电压。 XTAL119 引脚) :振荡器反相放大器和内部时钟发生电路的输入端。 XTAL218 引脚) :振荡器反相放大器的输入端。
#include <reg51.h>
#include <stc89c52_eeprom.h>                     //_nop_();延时函数用
#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;//设定温度的变量
uchar set_temp_L,set_temp_L_shi,set_temp_L_ge;//设定温度的变量
uchar set_humi_H,set_humi_H_ge,set_humi_H_shi;//设置湿度的变量
uchar set_humi_L,set_humi_L_ge,set_humi_L_shi;//设置湿度的变量
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;
}
/****************主函数************************/
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();
      
  }                  
}
//
//***********************结束**************************//

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表