单片机: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可选。
主要特性

器件参数
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的最小单元的更多相关文章
- CQRS学习——最小单元的Cqrs(CommandEvent)[其一]
[说明:博主采用边写边思考的方式完成这一系列的博客,所以代码以附件为准,文中代码仅为了说明.] 结构 在学习和实现CQRS的过程中,首要参考的项目是这个[http://www.cnblogs.com/ ...
- 自制单片机之一------AT89S51最小系统制做
C51最小系统电路在网上一搜一大把,大同小异.我略做改动后如图: 加一个11.0592MHZ的晶振是为了以后做串口通信时和PC有相同的波特率.可用短路帽切换.说说板子的布局:网上卖的最小系统都是把板子 ...
- 嵌入式单片机之STM32F103C8T6最小系统板电路设计参考
STM32F103C8T6最小系统板电路设计 一.电源部分 设计了一个XH插座,以便使用3.7V锂电池供电,接入电压不允许超过6V. 二.指示灯部分 电源指示灯可以通过一个短路帽控制亮灭,以达到节电的 ...
- AJAX的最小单元
$(function(){ $('#send').click(function(){ $.ajax({ type: "GET", url: "test.json" ...
- 掀起你的盖头来:Unit Of Work-工作单元
写在前面 阅读目录: 概念中的理解 代码中的实现 后记 掀起了你的盖头来,让我看你的眼睛,你的眼睛明又亮呀,好像那水波一模样:掀起了你的盖头来,让我看你的脸儿,看看你的脸儿红又圆呀,好像那苹果到秋天. ...
- Unit Of Work-工作单元
Unit Of Work-工作单元 阅读目录: 概念中的理解 代码中的实现 后记 掀起了你的盖头来,让我看你的眼睛,你的眼睛明又亮呀,好像那水波一模样:掀起了你的盖头来,让我看你的脸儿,看看你的脸儿红 ...
- 【记录】解析具有合并单元格的Excel
最近公司让做各种数据表格的导入导出,就涉及到电子表格的解析,做了这么多天总结一下心得. 工具:NOPI 语言:C# 目的:因为涉及到导入到数据库,具有合并单元格的多行必然要拆分,而NPOI自动解析的时 ...
- 补习系列(8)-springboot 单元测试之道
目录 目标 一.About 单元测试 二.About Junit 三.SpringBoot-单元测试 项目依赖 测试样例 四.Mock测试 五.最后 目标 了解 单元测试的背景 了解如何 利用 spr ...
- MMU内存管理单元
arm-linux学习-(MMU内存管理单元) 什么是MMU MMU(Memory Management Unit)主要用来管理虚拟存储器.物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及 ...
随机推荐
- 自己做的notepad++ FTP同步插件
平时修改FTP上的文件的时候,想先备份一下,没有合适的方法,尝试做了一个小插件. 差点忘了,下载地址 https://pan.baidu.com/s/1htdtT9E 下面是 具体的说明 Fa ...
- TensorflowTutorial_一维数据构造简单CNN
使用一维数据构造简单卷积神经网络 觉得有用的话,欢迎一起讨论相互学习~Follow Me 神经网络对于一维数据非常重要,时序数据集.信号处理数据集和一些文本嵌入数据集都是一维数据,会频繁的使用到神经网 ...
- Effective Java 之-----谨慎的覆盖clone方法
1.概述 如果clone方法返回一个由构造器创建的对象,它就得到有错误的类.因此,如果覆盖了非final类中的clone方法,则应该返回一个通过调用super.clone得到的对象.如果类的所有超类都 ...
- Spring的事务管理(理论篇,下篇提供代码实现)
事务:逻辑上的一组操作,这组操作要么全部成功,要么全部失败(事务十大特性:原子性,一致性,隔离性,持久性) 原子性:事务是不可分割的工作单位,事务中的操作要么都发生了,要么都不发生.(也就是说不能单独 ...
- Linux下查看CPU、内存和硬盘信息命令
一.查看cpu信息 cat /proc/cpuinfo 相同physical id 的记录是属于同一个CPU的,对应于多核的信息. 二.查看内存的信息 cat /proc/meminfo 三.查看硬盘 ...
- elasticsearch的percolator操作
es的普通查询是通过某些条件来查询满足的文档,percolator则不同,先是注册一些条件,然后查询一条文档是否满足其中的某些条件. es的percolator特性在数据分类.数据路由.事件监控和预警 ...
- Java程序只运行一个实例[转]
如果希望你的Java程序只能存在一个实例,可以参考下面的用法. 原文链接:http://blog.csdn.net/yaerfeng/article/details/7264729 Java没有提供这 ...
- HDU 4333 Revolving Digits
扩展KMP的应用 我们发现本题的关键在于如何高效的判断两个同构字符串的大小关系,想到如果能够预处理出每一个同构字符串与原字符串的最长公共前缀,那么直接比较它们不一样的部分就好,扩展KMP正好是用来处理 ...
- 夏令营讲课内容整理 Day 2.
本日主要内容是并查集和堆. 并查集 并查集是一种树型的数据结构,通常用来处理不同集合间的元素之间的合并与查找问题.一个并查集支持三个基本功能:合并.查找和判断.举一个通俗的例子,我和lhz认识,lhz ...
- BZOJ 2734: [HNOI2012]集合选数 [DP 状压 转化]
传送门 题意:对于任意一个正整数 n≤100000,如何求出{1, 2,..., n} 的满足若 x 在该子集中,则 2x 和 3x 不能在该子集中的子集的个数(只需输出对 1,000,000,001 ...