陈桂友教授《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
只开一个贴发表学习心得,后面跟贴
好的 配置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功能
}
利用单片机一个外部中断和一个普通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中断
}
按照5#测试了一下,旋转一个脉冲,数据加2,不知道是什么原因?
页:
[1]