找回密码
 立即注册
查看: 771|回复: 5

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

[复制链接]

2

主题

4

回帖

58

积分

注册会员

积分
58
发表于 2023-8-27 22:23:02 | 显示全部楼层 |阅读模式

中断定时器点灯代码

#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中断

}





回复

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:61
  • 最近打卡:2025-05-08 08:36:09

718

主题

1万

回帖

1万

积分

管理员

积分
15706
发表于 2023-8-28 08:31:46 | 显示全部楼层
只开一个贴发表学习心得,后面跟贴
回复 支持 反对

使用道具 举报 送花

2

主题

4

回帖

58

积分

注册会员

积分
58
发表于 2023-8-28 10:44:56 | 显示全部楼层
神*** 发表于 2023-8-28 08:31
只开一个贴发表学习心得,后面跟贴

好的
回复 支持 反对

使用道具 举报 送花

2

主题

4

回帖

58

积分

注册会员

积分
58
发表于 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-08-29 172520.jpg

回复 支持 反对

使用道具 举报 送花

2

主题

4

回帖

58

积分

注册会员

积分
58
发表于 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[i];
        }
}

/*********************************************/
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中断
}
截图202309052047489271.jpg
截图202309052050317015.gif
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2024-12-06 10:10:30
已绑定手机

0

主题

1

回帖

20

积分

新手上路

积分
20
发表于 2024-12-6 16:39:58 | 显示全部楼层

按照5#测试了一下,旋转一个脉冲,数据加2,不知道是什么原因?

回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-8 14:54 , Processed in 0.118970 second(s), 85 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表