单片机:STC89C52的最小单元「建议收藏」

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

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

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

STC89C52

本    质

一种低耗高性能的微控制器

公    司

STC公司
特    性

低功耗、高性能CMOS8位微控制器

Flash存储器

8K

内    核

MCS-51


标准功能

编辑

单片机:STC89C52的最小单元「建议收藏」

具有以下标准功能: 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可选。



主要特性

编辑

单片机:STC89C52的最小单元「建议收藏」
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封装

单片机:STC89C52的最小单元「建议收藏」

单片机:STC89C52的最小单元「建议收藏」

单片机:STC89C52的最小单元「建议收藏」

单片机:STC89C52的最小单元「建议收藏」单片机:STC89C52的最小单元「建议收藏」

#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;  } 

单片机:STC89C52的最小单元「建议收藏」单片机:STC89C52的最小单元「建议收藏」

#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;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/178386.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • substance painter anchor point快速教程

    substance painter anchor point快速教程这个功能方便在substancepainter里通过normal和height实时影响污迹图来做细节但是步骤有些略麻烦,下面作为笔记也作为一个小教程首先需要实时绘制的图层必须在污迹图的下面可以在图层上直接绘制右击加上anchorpoint然后需要被影响的图层或是mask里面的generation,必须开启microDetails如果你需要绘制的高度图影响细…

    2022年10月8日
    2
  • elk面试题_百家公司运维面试题汇总

    elk面试题_百家公司运维面试题汇总备注:这一我在去年国庆节期间,整理的整个19年,学员的面试遇到的问题,整理出来之后发给后期的学员,让他们做参考和学习,看看公司会面试哪些问题。前言小的时候,哭着哭着就笑了;长大后笑着笑着就哭了,这是一种人生经历,当你经历的越多,你越发现世界不像童话里那么美好。真正值得在乎的东西,不会越来越多,只会越来越少,所以珍惜你当下的每一寸时光。现在的每一份努力,都会变成倍增的回收,在公众面前表现出来。距…

    2022年6月3日
    114
  • 键盘win键无法使用,win+r不生效、win键没反应、Windows键失灵万能解决方案

    键盘win键无法使用,win+r不生效、win键没反应、Windows键失灵万能解决方案Windows键失灵的几种解决方案今早用抹布擦洗键盘,不断拍打键盘,清理完成后发现键盘win键无法使用1、请先按住键盘上的FN键不放,然后按一下win键,即可恢复正常2、有些笔记本是fn+f2,或者是fn+f6锁了win键,导致win键按了没反应,再按一次即可正常3、有些机械键盘的游戏模式会屏蔽win键可以使用fn+有游戏图标的那个键即可恢复正常4、根据不同的键盘和电脑,可能有一些别的特殊按键也会锁定win键,造成无法使用,可以依次尝试fn+某些功能键来解锁5、万能终…

    2022年5月4日
    2.2K
  • Git基础使用教程[通俗易懂]

    Git基础使用教程[通俗易懂]Git是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理,是目前使用范围最广的版本管理工具。之前的博客中介绍了linux下安装Git的内容,这篇博客,简单介绍下使用Git进行本地文件管理和连接上传远程仓库的方法。。。一、Windows上安装Git一般我们工作的电脑都是Windows系统,要使用git首先要进行安装。从软件管家或者其他平台找到…

    2022年6月6日
    34
  • 获取股票历史数据和当前数据的API

    获取股票历史数据和当前数据的API关键字:股票,stock,API,接口1.获取股票当前数据新浪数据接口:http://hq.sinajs.cn/list={code}。{code}替换为股票代码,沪市股票代码加前缀sh,深市股票代码加前缀sz。例如:在浏览器地址栏输入:http://hq.sinajs.cn/list=sh601766,sz000002,得到如下结果:varhq_str_sh601766=”中国中车,10.280,10.210,10.310,10.380,10.160,10.300,10.310,.

    2022年6月24日
    46
  • ConcurrentHashMap是如何实现线程安全的

    ConcurrentHashMap是如何实现线程安全的ConcurrentHashMap是如何实现线程安全的文章目录ConcurrentHashMap是如何实现线程安全的前言相关概念Amdahl定律初始化数据结构时的线程安全总结put操作的线程安全总结扩容操作的线程安全扩容时的get操作多线程协助扩容在什么情况下会进行扩容操作?总结统计容器大小的线程安全假设当前线程为第一个put的线程出现了线程竞争导致CAS失败计数桶扩容总结get操作的线程安全总…

    2022年6月24日
    31

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号