大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有 8K字节系统可编程Flash存储器。STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
-
中文名
- STC89C52
- 一种低耗高性能的微控制器
- STC公司
本 质
公 司
-
特 性
- 低功耗、高性能CMOS8位微控制器
- 8K
- MCS-51
Flash存储器
内 核
目录
具有以下标准功能: 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可选。
工作频率范围:0~40MHz,相当于普通8051 的0~80MHz,实际工作 频率可达48MHz
准双向口/弱上拉, P0 口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为 I/O 口用时,需加上拉电阻。
定时器/计数器。即定时器T0、T1、T2
串行口(UART),还可用定时器软件实现多个UART
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;
}
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/178386.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...