STC15F2K60S2单片机特性与应用介绍

     iap15f2k60s2是我们蓝桥杯8051d单片机开发板上的芯片,但是我们在keil4仿真软件里所引用的头文件是stc15f2k60s2。因为在单片机中,IAP和STC是同一系列产品。IAP和STC的最大区别在于:IAP可以将用户程序中的FLASH当做EEPROM使用,虽然STC不可以当做EEPROM,但是它有独立的EEPROM可以使用(EEPROM是指带电可擦可编程只读存储器。是一种掉电后数据不丢失的存储芯片。 EEPROM 可以在电脑上或专用设备上擦除已有信息,重新编程)

   蓝桥杯开发版内部结构

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LiA5Y-q5pGG54OC5bS9,size_20,color_FFFFFF,t_70,g_se,x_16

   内部资源

  1. 中央处理器(CPU)
  2. 程序存储器(Flash)
  3. 数据存储器(RAM)
  4. 数据Flash存储器
  5. 定时器/计数器
  6. I/O口
  7. 串口通信接口(UART)
  8. 中断系统
  9. SPI接口
  10. 高速A/D转换模块
  11. PWM
  12. 看门狗
  13. 电源监控
  14. 片内RC振荡器  

我们现阶段所学的主要内容就是定时器和中断系统的使用那么什么是中断系统

中断系统是为了让CPU具有对外界紧急事件的实时处理能力而设置的。当CPU正在处理某件事时,外界来了一个紧急请求,需要CPU停下当前进程,去处理紧急请求,处理玩紧急请求之后,再返回原进程继续工作。同时在中断之中还有一个重要的东西就是中断的优先级,CPU每次处理事件都是通过优先级来进行。每一个高级别的中断都可以打断低级别的程序进程。

void  InterruptTimer0() interrupt 1//选择定时器0
{
TH0 = 0xfc;
TL0 = 0x67;//定义定时器初值
cnt++;//定义一个变量索引,此时cnt是一个计数器,用于记录中断次数
if(cnt >=1000)//
{
cnt = 0;
flag = 1;
}

上述代码就是一个简单的中断服务代码,通过设置一个周期,通过中断次数来判断是否达到一个周期,从而实现数码管的动态显示。

下面一段是实现数码管计时同时只显示有效位数的代码

#include <STC15F2K60S2.H>
unsigned char code LEDchar[] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//定义数码管数值
unsigned char LEDBuff[6] = {0xff,0xff,0xff,0xff,0xff,0xff};//为数码管添加一个缓冲区
unsigned int cnt = 0;
unsigned char flag = 0;
unsigned char i = 0;
unsigned char digits = 1; // 定义有效位数


void main()
{
unsigned long sec = 0;
EA = 1;//使能总中断
TMOD = 0x01;//决定定时器工作模式1
TH0 = 0xfc;
TL0 = 0x67;//为定时器赋初值
ET0 = 1;//使定时器0中断
TR0 = 1;//启用定时器0
while(1)
{
if(flag == 1)
{
flag = 0;
sec++;
// 判断有效位数
if(sec >= 10) digits = 2;
if(sec >= 100) digits = 3;
if(sec >= 1000) digits = 4;


        // 根据有效位数控制LED显示
        if(digits == 1) {
            LEDBuff[0] = LEDchar[sec%10];
            LEDBuff[1] = 0xff;
            LEDBuff[2] = 0xff;
            LEDBuff[3] = 0xff;
        }
        if(digits == 2) {
            LEDBuff[0] = LEDchar[sec%10];
            LEDBuff[1] = LEDchar[sec/10%10];
            LEDBuff[2] = 0xff;
            LEDBuff[3] = 0xff;
        }
        if(digits == 3) {
            LEDBuff[0] = LEDchar[sec%10];
            LEDBuff[1] = LEDchar[sec/10%10];
            LEDBuff[2] = LEDchar[sec/100%10];
            LEDBuff[3] = 0xff;
        }
        if(digits == 4) {
            LEDBuff[0] = LEDchar[sec%10];
            LEDBuff[1] = LEDchar[sec/10%10];
            LEDBuff[2] = LEDchar[sec/100%10];
            LEDBuff[3] = LEDchar[sec/1000%10];
        }
    }
}

}


void  InterruptTimer0() interrupt 1
{
TH0 = 0xfc;
TL0 = 0x67;
cnt++;
if(cnt >=1000)
{
cnt = 0;
flag = 1;
}


P2 = 0xe0;
P0 = 0xff;
P2 = 0;

switch(i)
{
    case 0:
        P2 = 0xc0;P0 = 0x08;P2 = 0;
        P2 = 0xe0;P0 = LEDBuff[0];P2=0;i++;break;
    case 1:
        P2 = 0xc0;P0 = 0x04;P2 = 0;
        P2 = 0xe0;P0 = LEDBuff[1];P2=0;i++;break;
    case 2:
        P2 = 0xc0;P0 = 0x02;P2 = 0;
        P2=0xe0;P0 = LEDBuff[2];P2=0;i++;break;
    case 3:
        P2 = 0xc0;P0 = 0x01;P2 = 0;
        P2=0xe0;P0 = LEDBuff[3];P2=0;i=0;break;
    default:break;
}

}

物联沃分享整理
物联沃-IOTWORD物联网 » STC15F2K60S2单片机特性与应用介绍

发表评论