查查爱玩 发表于 2023-8-27 22:23:02

陈桂友教授《STC8051单片机原理及应用-STC8H8K64U》学习记录

中断定时器点灯代码#include <stc8h.h>#include "intrins.h"
void Delay(unsigned long x);void Timer1_Init(void);void INT0_Init(void);
void main(void){/*准双向口模式*/        P2M1=0X00;        P2M0=0X00;        EA = 1; //总中断允许/*定时器初始化*/        Timer1_Init();/**中断初始化*/        INT0_Init();        while(1)        {                P22=0;                Delay(1000);                P22=1;                Delay(1000);        }}
/***************************************************************/void Delay(unsigned long x)                //@11.0592MHz{        unsigned char i, j;        while(x--)        {                i = 15;                j = 90;                do                {                        while (--j);                } while (--i);        }}
void Timer1_Init(void)                //10毫秒@11.0592MHz{        AUXR &= 0xBF;                        //定时器时钟12T模式        TMOD &= 0x0F;                        //设置定时器模式        TL1 = 0x00;                                //设置定时初始值        TH1 = 0xDC;                                //设置定时初始值        TF1 = 0;                                //清除TF1标志        TR1 = 1;                                //定时器1开始计时        ET1 = 1;}
void Timer1_Rountine(void) interrupt 3{        static unsigned int x=0;        x++;        if(x==50)        {                P20 = !P20;                x=0;        }
}
void INT0_Isr() interrupt 0{        P27 = !P27;}
void INT0_Init(void){        IT0 = 1;//使能INT0下降沿中断        EX0 = 1;//使能INT0中断}



神农鼎 发表于 2023-8-28 08:31:46

只开一个贴发表学习心得,后面跟贴

查查爱玩 发表于 2023-8-28 10:44:56

神农鼎 发表于 2023-8-28 08:31
只开一个贴发表学习心得,后面跟贴

好的

查查爱玩 发表于 2023-8-29 17:25:57

配置EEPROM ,通过外部中断改变变量的值,将值写入EEPROM中,实现掉电记忆功能
#include <STC8H.H>
#include "intrins.h"

void IapIdle();
char IapRead(int addr);
void IapPrograme(int addr, char dat);
void IapErase(int addr);
void INT0_Init(void);

unsigned char temp=1;

void main()
{
        /**中断初始化*/
        INT0_Init();
        EA = 1; //总中断允许
        P_SW2|=0X80;   //使能访问XFR
       
        P2M0 = 0X00;
        P2M1 = 0X00;
        //P2 = IapRead(0X0400);
        while(1)
        {

                P2 = IapRead(0X0400);
               
        }
}

/********************************/
void INT0_Isr() interrupt 0
{
        temp++;
               
        if(temp == 1)
        {
                IapErase(0x0400);
                IapPrograme(0x0400, 0XFE);
        }
        if(temp == 2)
        {
                IapErase(0x0400);
                IapPrograme(0x0400, 0XFD);
        }
        if(temp == 3)
        {
                IapErase(0x0400);
                IapPrograme(0x0400, 0XFB);
        }
    if(temp > 3)
        {
                temp = 1;
                _nop_();
                IapErase(0x0400);
        }

}

void INT0_Init(void)
{
        IT0 = 1;//使能INT0下降沿中断
        EX0 = 1;//使能INT0中断
}

void IapIdle()
{
        IAP_CONTR = 0;//关闭IAP功能
        IAP_CMD = 0;//清除命令寄存器
        IAP_TRIG = 0;//清除触发寄存器
        IAP_ADDRH = 0X80;
        IAP_ADDRL = 0;
}

char IapRead(int addr)
{
        char dat;
       
        IAP_CONTR = 0X80;       //使能IAP
        IAP_TPS = 12;                        //设置等待参数12MHz
        IAP_CMD = 1;                         //设置IAP读命令
        IAP_ADDRL = addr;                //设置IAP低地址
        IAP_ADDRH = addr >> 8;//设置IAP高地址
        IAP_TRIG = 0X5A;                 //写触发命令(0X5A)
        IAP_TRIG = 0XA5;                //写触发命令(0XA5)
        _nop_();
        dat = IAP_DATA;                //读IAP数据
        IapIdle();                        //关闭IAP功能
       
        return dat;
}

void IapPrograme(int addr, char dat)
{
        IAP_CONTR = 0X80;       //使能IAP
        IAP_TPS = 12;                        //设置等待参数12MHz
        IAP_CMD = 2;                         //设置IAP写命令
        IAP_ADDRL = addr;                //设置IAP低地址
        IAP_ADDRH = addr >> 8;//设置IAP高地址
        IAP_DATA = dat;                        //写IAP数据
        IAP_TRIG = 0X5A;                 //写触发命令(0X5A)
        IAP_TRIG = 0XA5;                //写触发命令(0XA5)
        _nop_();
        IapIdle();                        //关闭IAP功能
}

void IapErase(int addr)
{
        IAP_CONTR = 0X80;       //使能IAP
        IAP_TPS = 12;                        //设置等待参数12MHz
        IAP_CMD = 3;                         //设置IAP擦除命令
        IAP_ADDRL = addr;                //设置IAP低地址
        IAP_ADDRH = addr >> 8;//设置IAP高地址
        IAP_TRIG = 0X5A;                 //写触发命令(0X5A)
        IAP_TRIG = 0XA5;                //写触发命令(0XA5)
        _nop_();
        IapIdle();                        //关闭IAP功能
}


查查爱玩 发表于 2023-9-5 20:55:38

利用单片机一个外部中断和一个普通io口实现检测EC11旋转编码器的正反转和计数功能
#include <stc8h.h>
#include "intrins.h"

char LED[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
char i;

//sbit PIN1 = P2^0;

void Delay(unsigned long x);
void Timer1_Init(void);
void INT0_Init(void);

void main(void)
{
/*准双向口模式*/
        P2M1=0X00;
        P2M0=0X00;
        P0M1=0X00;
        P0M0=0X00;
        P3M0 = 0x00; P3M1 = 0xFF; P3NCS = 0x00;

        EA = 1; //总中断允许
/**中断初始化*/
        INT0_Init();
       
        while(1)
        {
                P2 = LED;
        }
}

/*********************************************/
void INT0_Isr() interrupt 0
{
        if(P10 == 1)
        {
                i++;
        }
        if(i > 7)       
        {
                i=0;}
        if(P10 == 0)
        {
                i--;
        }
        if(i < 0)
        {
          i=7;
        }

       
}

void INT0_Init(void)
{
        IT0 = 1;//使能INT0下降沿中断
        EX0 = 1;//使能INT0中断
}

duoker2024 发表于 2024-12-6 16:39:58

按照5#测试了一下,旋转一个脉冲,数据加2,不知道是什么原因?
页: [1]
查看完整版本: 陈桂友教授《STC8051单片机原理及应用-STC8H8K64U》学习记录