STC89C52RC是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有 8K字节系统可编程Flash存储器。STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
中文名
STC89C52
本    质
一种低耗高性能的微控制器
公    司
STC公司
特    性
低功耗、高性能CMOS8位微控制器
Flash存储器
8K
内    核
MCS-51

标准功能

编辑

具有以下标准功能: 8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,3个16 位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。另外 STC89C52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35MHz,6T/12T可选。

主要特性

编辑

8K字节程序存储空间;
512字节数据存储空间;
内带4K字节EEPROM存储空间;
可直接使用串口下载;

器件参数

编辑

1. 增强型8051单片机,6 时钟/机器周期和12 时钟/机器周期可以任意 选择,指令代码完全兼容传统8051.[1]
2. 工作电压:5.5V~3.3V(5V单片机)/3.8V~2.0V(3V 单片机)
3.工作频率范围:0~40MHz,相当于普通8051 的0~80MHz,实际工作 频率可达48MHz
4. 用户应用程序空间为8K字节
5. 片上集成512 字节RAM
6. 通用I/O 口(32 个),复位后为:P0/P1/P2/P3 是准双向口/弱上拉, P0 口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为 I/O 口用时,需加上拉电阻。
7. ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无 需专用仿真器,可通过串口(RxD/P3.0,TxD/P3.1)直接下载用户程 序,数秒即可完成一片
8. 具有EEPROM 功能
9. 共3 个16 位定时器/计数器。即定时器T0、T1、T2
10.外部中断4 路,下降沿中断或低电平触发电路,Power Down 模式可 由外部中断低电平触发中断方式唤醒
11. 通用异步串行口(UART),还可用定时器软件实现多个UART
12. 工作温度范围:-40~+85℃(工业级)/0~75℃(商业级)

13. PDIP封装

#include <reg52.h>
//串口assic控制led灯
void delay02s(void)		//延时1ms子程序
{
  unsigned char i,j,k;
  for(i=18;i>0;i--)	   //20	   //18  2.5K
  for(j=1;j>0;j--)	//10  //20
  for(k=1;k>0;k--);	 //248
}

void delay200ms(void)		//延时200ms子程序
{
  unsigned char i,j,k;
  for(i=20;i>0;i--)
  for(j=20;j>0;j--)	//10  //20
  for(k=248;k>0;k--);	 //248
}

sbit led0=P2^0;
sbit led1=P2^1;
sbit led2=P2^2;
sbit led3=P2^3;
sbit led4=P2^4;
sbit led5=P2^5;

sbit led6=P2^6;
sbit led7=P2^7;

void start_led(char n)
{
    led0 = n&0x01;	 n=n>>1;
	 led1 = n&0x01;    n=n>>1;
	 led2 = n&0x01;    n=n>>1;
	 led3 = n&0x01;    n=n>>1;
	 led4 = n&0x01;    n=n>>1;
	 led5 = n&0x01;    n=n>>1;
}
unsigned char flag;
void main(void)
{
  int i=30;

        //设置参数
        TMOD = 0x20; //设定定时器1的工作方式为方式2
        TH1 = 0xfd;
        TL1 = 0xfd;  //装载TH1、TL1
        TR1 = 1; //启动定时器1  

        SM0 = 0;
        SM1 = 1; //设定串口工作方式为方式1
        REN = 1; //允许串行接收位  

        EA = 1; //全局中断允许位
        ES = 1; //串口中断允许位  

     //  start_led(0);
      // delay200ms();delay200ms();delay200ms();delay200ms();delay200ms();
     //  start_led(0xff);

    while(1)
    {
        /* 刚开始单片机缓冲寄存器为空,无数据可以显示
         * 先从串口接收数据,再返回该数据
         * 在中断中接收数据,同时将flag标志位置为1.说明接收到了数据
         * 若接收到数据(flag == 1),说明接收到了;否则说明未接收到数据,不显示。继续判断flag数值
         */
        led6  = ~led6;
        led7  = ~led7;

        delay200ms();

        if(flag == 1)
        {
            start_led(P1);
            //发送数据
            ES = 0; //关闭串口中断,发送数据
            SBUF = P1; //数据写入SBUF寄存器
            while(!TI); //等待
            TI = 0;
            ES = 1;
            flag = 0;  

        }
    }  

}  

void ser() interrupt 4
{
    //接收数据
    P1 = SBUF;
    flag = 1;
    RI = 0;
} 

#include <reg52.h>//CPCI系统控制电源程序

void delay02s(void)		//延时1ms子程序
{
  unsigned char i,j,k;
  for(i=18;i>0;i--)	   //20	   //18  2.5K
  for(j=1;j>0;j--)	//10  //20
  for(k=1;k>0;k--);	 //248
}

void delay200ms(void)		//延时200ms子程序
{
  unsigned char i,j,k;
  for(i=20;i>0;i--)
  for(j=20;j>0;j--)	//10  //20
  for(k=248;k>0;k--);	 //248
}

void delay_ms()
{
int i,j;
         for(j=110;j>0;j--);
}
sbit led0=P2^0;
sbit led1=P2^1;
sbit led2=P2^2;
sbit led3=P2^3;
sbit led4=P2^4;
sbit led5=P2^5;

sbit ps_switch = P3^2;
sbit pci_rst = P2^6;
sbit ps_on = P2^7;

void start_led(char n)
{
    led0 = n&0x01;	 n=n>>1;
	 led1 = n&0x01;    n=n>>1;
	 led2 = n&0x01;    n=n>>1;
	 led3 = n&0x01;    n=n>>1;
	 led4 = n&0x01;    n=n>>1;
	 led5 = n&0x01;    n=n>>1;
}
unsigned char flag_switchon=0;
unsigned char flag_switchFF=0;
unsigned char flag_switchOSoff=0;
unsigned char flag_switchOSen=0;
unsigned char int_cnt=0;  

unsigned char flag;  

void checkOSoff()
{
    unsigned  int i=0,k=0;
	 flag_switchOSoff=0;

	 while(1)
	 {

		  if(pci_rst==0)
		  {
		      k++;
			}
		  else
		  {
		       break;
			}

		   if(k>3000)
			{
			    flag_switchOSoff=1;
		       break;
			}
			delay_ms();
	 }
}

void checkOSen()
{
    unsigned  int i=0,k=0;

	 if(flag_switchOSen==1)return ;

	 while(1)
	 {

		  if(pci_rst==1)
		  {
		      k++;
			}
		  else
		  {
		       break;
			}

		   if(k>3000)
			{
			    flag_switchOSen=1;
		       break;
			}
			delay_ms();
	 }
}

void checkSwitch()
{
   unsigned  int i=0,k=0;
	 while(1)
	 {

		  if(ps_switch==0)
		  {
		  		    k++;
			}
		  else
		  {
		   	    break;
			}

		   if(k>3000)
			{
		   	    break;
			}
			delay_ms();

	 }

	 if(k>3000)
       flag_switchFF = 1;
	 else
       flag_switchFF = 0;
		 //
	 if(k>3)
       flag_switchon = 1;
	 else
       flag_switchon = 0;

}

void send(int t)
{
 ES = 0; //关闭串口中断,发送数据
            SBUF = t+0x30; //P1//数据写入SBUF寄存器
            while(!TI); //等待
            TI = 0;
            ES = 1;
}
int status=0;
void main(void)
{
  int i=0;

        //设置参数
        TMOD = 0x20; //设定定时器1的工作方式为方式2
        TH1 = 0xfd;
        TL1 = 0xfd;  //装载TH1、TL1
        TR1 = 1; //启动定时器1  

        SM0 = 0;
        SM1 = 1; //设定串口工作方式为方式1
        REN = 1; //允许串行接收位  

        ES = 1; //串口中断允许位  

        EA = 1; //全局中断允许位
	//	  EX0 = 1; //开外部中断0
	//	  IT0=1;    //中断触发为跳沿触发
     //  start_led(0);
      // delay200ms();delay200ms();delay200ms();delay200ms();delay200ms();
     //  start_led(0xff);
     while(1)
    {
        /* 刚开始单片机缓冲寄存器为空,无数据可以显示
         * 先从串口接收数据,再返回该数据
         * 在中断中接收数据,同时将flag标志位置为1.说明接收到了数据
         * 若接收到数据(flag == 1),说明接收到了;否则说明未接收到数据,不显示。继续判断flag数值
         */  

        checkSwitch();     //开机检测

		   if(flag_switchFF == 1)//3秒关机
		  {
		      i++;
		      flag_switchFF=0;
				flag_switchon = 0;

           delay200ms();delay200ms();delay200ms();delay200ms();delay200ms();
			  delay200ms();delay200ms();delay200ms();delay200ms();delay200ms();

			  flag_switchOSen = 0;
			  send(0);
		  }
         if(flag_switchon == 1)//开机
		  {
		      i++;
		      flag_switchon=0;
            ps_on = 0;
				flag_switchOSoff = 0;
				flag_switchOSen = 0;
				send(1);
		  }

		  checkOSen();
		  if(flag_switchOSen==1)            //系统运行中。。。
		  {
 	         checkOSoff();
				send(2);
			}
        if(flag_switchOSoff==1)//操作系统已经关闭
		  {
		       ps_on = 1;
				 flag_switchon = 0;
				 flag_switchFF=0;
				 flag_switchOSen = 0;
				 send(3);
		  }
        if(flag == 1)//发送232数据
        {
          //  start_led(P1);
            //发送数据
            ES = 0; //关闭串口中断,发送数据
            SBUF = P1; //P1//数据写入SBUF寄存器
            while(!TI); //等待
            TI = 0;
            ES = 1;
            flag = 0;
        }
    }  

}  

void ser() interrupt 4
{
    //接收数据
    P1 = SBUF;
    flag = 1;
    RI = 0;
} 

void INT0_ISR(void) interrupt 0
{

		    EX0=0;

          start_led(int_cnt++%10);

          P1 = int_cnt%10+0x30;
		//	 delay200ms();
          flag = 1;

			//  ET0=1;
		//	  TR0=1;
			  EA=1;
			  EX0=1;
}

单片机:STC89C52的最小单元的更多相关文章

  1. CQRS学习——最小单元的Cqrs(CommandEvent)[其一]

    [说明:博主采用边写边思考的方式完成这一系列的博客,所以代码以附件为准,文中代码仅为了说明.] 结构 在学习和实现CQRS的过程中,首要参考的项目是这个[http://www.cnblogs.com/ ...

  2. 自制单片机之一------AT89S51最小系统制做

    C51最小系统电路在网上一搜一大把,大同小异.我略做改动后如图: 加一个11.0592MHZ的晶振是为了以后做串口通信时和PC有相同的波特率.可用短路帽切换.说说板子的布局:网上卖的最小系统都是把板子 ...

  3. 嵌入式单片机之STM32F103C8T6最小系统板电路设计参考

    STM32F103C8T6最小系统板电路设计 一.电源部分 设计了一个XH插座,以便使用3.7V锂电池供电,接入电压不允许超过6V. 二.指示灯部分 电源指示灯可以通过一个短路帽控制亮灭,以达到节电的 ...

  4. AJAX的最小单元

    $(function(){ $('#send').click(function(){ $.ajax({ type: "GET", url: "test.json" ...

  5. 掀起你的盖头来:Unit Of Work-工作单元

    写在前面 阅读目录: 概念中的理解 代码中的实现 后记 掀起了你的盖头来,让我看你的眼睛,你的眼睛明又亮呀,好像那水波一模样:掀起了你的盖头来,让我看你的脸儿,看看你的脸儿红又圆呀,好像那苹果到秋天. ...

  6. Unit Of Work-工作单元

    Unit Of Work-工作单元 阅读目录: 概念中的理解 代码中的实现 后记 掀起了你的盖头来,让我看你的眼睛,你的眼睛明又亮呀,好像那水波一模样:掀起了你的盖头来,让我看你的脸儿,看看你的脸儿红 ...

  7. 【记录】解析具有合并单元格的Excel

    最近公司让做各种数据表格的导入导出,就涉及到电子表格的解析,做了这么多天总结一下心得. 工具:NOPI 语言:C# 目的:因为涉及到导入到数据库,具有合并单元格的多行必然要拆分,而NPOI自动解析的时 ...

  8. 补习系列(8)-springboot 单元测试之道

    目录 目标 一.About 单元测试 二.About Junit 三.SpringBoot-单元测试 项目依赖 测试样例 四.Mock测试 五.最后 目标 了解 单元测试的背景 了解如何 利用 spr ...

  9. MMU内存管理单元

    arm-linux学习-(MMU内存管理单元) 什么是MMU MMU(Memory Management Unit)主要用来管理虚拟存储器.物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及 ...

随机推荐

  1. 最全 Linux 磁盘管理基础知识全汇总

    一.存储设备的挂载和卸载 存储设备的挂载和卸载常用操作命令:fdisk  -l.df.du.mount.umount. fdisk  -l 命令 1.作用 查看所有硬盘的分区信息,包括没有挂上的分区和 ...

  2. java对象引用-要掌握的细节2

    目的:加深对java引用变量的理解,避免数据的处理的偏差. 问题: 1.一个集合List ,将新建Student对象stu放入List之后,再给stu的成员变量例如id,name赋值.此时List中的 ...

  3. 《.NET 设计规范》第 3 章 命名规范

    <.NET 规范>第 3 章 命名规范 3.1 大小写约定 要把 PascalCasing 用于由多个单词构成的命名空间.类型以及成员的名字. 要把 camelCasing 用于参数的名字 ...

  4. C程序结构

    从程序流程的角度来看,C语言中的语句可以分为3种基本结构:顺序结构.分支结构和循环结构. ① 顺序结构的执行过程如图5-1所示.在这种结构中,程序会顺序执行各条语句. ② 分支结构的执行过程如图5-2 ...

  5. 【原创】源码角度分析Android的消息机制系列(四)——MessageQueue的工作原理

    ι 版权声明:本文为博主原创文章,未经博主允许不得转载. MessageQueue,主要包含2个操作:插入和读取.读取操作会伴随着删除操作,插入和读取对应的方法分别为enqueueMessage和ne ...

  6. iOS-Xcode编码自动补全失效

    1. 退出 Xcode 2. 重启电脑 3. 找到 这个 DerivedData 文件夹 删除 (路径: ~/Library/Developer/Xcode/DerivedData) 4. 删除这个 ...

  7. 洛谷 [P1314] 聪明的质检员(NOIP2011 D2T2)

    ###一道二分答案加前缀和### 题目中已经暗示的很明显了 "尽可能靠近" " 最小值" 本题的主要坑点在于 long long 的使用 ##abs函数不支持l ...

  8. getHibernateTemplate() VS getSession()

    如题所示,对于这个问题,官网文档已给出答案,详见: /** * Obtain a Hibernate Session, either from the current transaction or * ...

  9. Hibernate之HelloWorld

    1. 步骤 0. 导入相关Jar包. 1. 编写Hibernate的持久化文件 (默认为hibernate.cfg.xml). 2. 编写持久化类. 3. 创建对象 - 关系文件(.htm.xml文件 ...

  10. pycharm导入模块的时候遇到的两个错误

    1.from 包 import AES import后面一定是一个空格!!!!! 2.包的导入 上面多了一层报错 错误的原因是最外层多了一个pythonProject目录.改成下面的ok. 原因大佬这 ...