历史上的今天
返回首页

历史上的今天

今天是:2025年07月12日(星期六)

正在发生

2018年07月12日 | 51单片机的中断与定时计数器尝试

2018-07-12 来源:eefocus

这是我的第一篇有关51单片机的博客,主要记录我的学习历程与中间遇到的问题,如有错漏请指出。

在我理解里面中断与定时计数器是这样的:

中断是通过检查P3.2(INT0)与P3.3(INT1)两个引脚来触发的

计数器是通过检查P3.4(T0)与P3.5(T1)两个引脚的状态,要达到一定的次数(一般是记脉冲数)才触发

定时器不需要检测引脚,直接计数

先说中断的代码


#include

#include

 

#define SDT P0//静态数码管定义

 

unsigned char temp;

 

unsigned char code SDT_map[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//静态数码管字模

 

void delay10ms(unsigned int c)

{

unsigned int i,j;

for(;c>0;c--)

for(i=38;i>0;i--)

for(j=130;j>0;j--);

}

 

void interCongf()

{

//设置中断0

IT0=1;//IT=0表示低电平触发   IT=1表示负跳变沿触发

EX0=1;//EX为外部中断的允许位

PX0=0;//PX=0表示低优先级   PX=1表示高优先级

//设置中断1

IT1=1;

EX1=1;

PX1=1;//中断1的优先级比中断0高

 

EA=1;//总中断允许位

}

 

void main()

{

unsigned char ininum=0;

interCongf();

SDT=0x00;

while(1){}

}

 

void inter0() interrupt 0 //外部中断0

{

EX0=0;

for(temp=0;temp<10;temp++) //中断内部无法定义函数

{

SDT=SDT_map[temp];

delay10ms(10);

}

EX0=1;  //在开始和结尾关开中断,防止中断运行过程中误触

}

 

//void timer0() interrupt 1  {}  //定时器中断0   

 

void inter1() interrupt 2 //外部中断1

{

EX1=0;

SDT=0xff;

delay10ms(30);

EX1=1;

}

  

//void timer1() interrupt 3  {}  //定时器中断1

 

//void serialport() interrupt 4  {} //串行口中断



其中,SDT为共阳极静态数码管,P3.2(INT0)与P3.3(INT1)两个引脚分别接两个共阴的开关K1与K2


这个程序的功能就是无按键时,数码管全亮(0x00),


当按下K1时,数码管从一走到九


当按下K2时,数码管熄灭600ms,如果在INT0的执行过程中按K2,INT0会被中断(其实是挂起),立刻执行INT1,完成INT1后再返回INT0




然后说说计数器


#include

#include

 

#define SDT P0//静态数码管定义

sbit pulse=P1^0;

 

unsigned char temp=0;

 

unsigned char code SDT_map[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//静态数码管字模

 

void delay10ms(unsigned int c)

{

unsigned int i,j;

for(;c>0;c--)

for(i=38;i>0;i--)

for(j=130;j>0;j--);

}

 

void timeConfg()

{

TMOD=0x05; //选用计数模式和 选用模式1

TH0=0xD8;

TL0=0xF6; //计数10000次

EA=1;

ET0=1;

TR0=1;

}

 

void main()

{

SDT=0xff;

timeConfg();

while(1)

{

pulse=0;

_nop_();

_nop_();

_nop_();

_nop_();

pulse=1;

_nop_();

_nop_();

_nop_();

_nop_();

}

}

 

//void inter0() interrupt 0   {} //外部中断0

 

void timer0() interrupt 1    //定时器中断0

{

TH0=0xD8;//如果不更新TH0与TL0的值,第二次计数将从0~65535+1

TL0=0xF6;

SDT=SDT_map[(temp++)%10];

}

 

//void inter1() interrupt 2   {} //外部中断1

  

//void timer1() interrupt 3  {}  //定时器中断1

 

//void serialport() interrupt 4  {} //串行口中断



定时器


#include

#include

 

#define SDT P0//静态数码管定义

 

unsigned char temp=0, status=0;

 

unsigned char code SDT_map[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//静态数码管字模

 

void timeConfg()

{

TMOD=0x01; //选用定时器模式和 选用模式1

TH0=0xd8;

TL0=0xf0; //定时  计数10000次

EA=1;

ET0=1;

TR0=1;

}

 

void main()

{

SDT=SDT_map[temp];

timeConfg();

while(1)

{

if(status==100)

{

temp++;

status=0;

SDT=SDT_map[temp%10];

}

}

}

 

//void inter0() interrupt 0   {} //外部中断0

 

void timer0() interrupt 1    //定时器中断0

{

TH0=0xd8;//如果不更新TH0与TL0的值,第二次计数将从0~65535+1

TL0=0xf0;

status++;

}

 

//void inter1() interrupt 2   {} //外部中断1

  

//void timer1() interrupt 3   {}  //定时器中断1

 

//void serialport() interrupt 4  {} //串行口中断

 


其实定时器和计数器很相似,只用在TMOD里修改就行




总结:


其实中断,计数器,定时器很相似


共用的寄存器:定时计数器控制寄存器TCON, 中断优先寄存器IP 和 中断允许寄存器IE


定时计数器特有的寄存器:工作方式寄存器TMOD


附一些有关这些寄存器的资料:




推荐阅读

史海拾趣

Genisco Electronics公司的发展小趣事
根据使用环境的温度、湿度、海拔等因素选择适合的发电机型号和配置。
FINECHIPS公司的发展小趣事

FINECHIPS公司自成立以来,始终将技术创新视为企业发展的核心驱动力。公司投入大量资源于研发部门,专注于集成电路(IC)和电子元器件的技术创新。在某一关键时期,FINECHIPS成功研发出一款高性能、低功耗的模拟开关芯片,该芯片凭借其卓越的性能迅速获得市场认可,不仅在国内市场占据一席之地,还成功打入国际市场,为公司带来了显著的品牌影响力和市场份额增长。

CML Microcircuits公司的发展小趣事

随着技术的不断进步,CML Microcircuits公司始终保持对创新的追求。在模拟、数字和混合信号集成电路领域,CML不断推出具有创新性的产品,满足市场的多样化需求。通过与全球顶级客户的紧密合作,CML深入了解市场趋势,并将其转化为具有竞争力的产品。这些努力使CML在行业中逐渐建立了技术创新的引领者地位。

Custom Components Inc公司的发展小趣事

随着业务规模的不断扩大,CCI面临着日益严峻的供应链管理挑战。为了降低生产成本、提高交货速度并保障产品质量,CCI对供应链管理进行了全面优化。

公司首先加强了与原材料供应商的合作与沟通,确保原材料的稳定供应和成本控制。同时,CCI还引入了先进的生产管理系统和质量控制体系,实现了生产过程的数字化和智能化。此外,公司还通过优化物流运输和库存管理等方式,进一步提高了供应链的效率和灵活性。

ASSMANN WSW components公司的发展小趣事

ASSMANN WSW components公司一直致力于技术创新和产品研发。在某个关键时刻,公司研发团队成功开发出了一种具有革命性的新型连接器,这种连接器不仅性能稳定、寿命长,而且具有极高的可靠性和安全性。这一技术突破使得ASSMANN WSW在电子元件市场上脱颖而出,迅速成为行业内的佼佼者。

DCD [Digital Core Design]公司的发展小趣事

在市场竞争日益激烈的情况下,DCD公司意识到单打独斗难以取得更大的发展。因此,公司开始寻求与其他企业建立战略合作关系。通过与上下游企业的紧密合作,DCD公司实现了资源共享和优势互补,进一步提升了自身的竞争力。同时,公司还积极参与行业标准的制定和推广工作,为行业的健康发展贡献了自己的力量。

问答坊 | AI 解惑

AVR单片机在线编程下载线电路图,PCB图及HEX文件

AVR单片机在线编程下载线电路图,PCB图及HEX文件…

查看全部问答>

wince 5 沙漏(Hourglass)显示问题:点击屏幕,沙漏才有漏沙效果.

刚刚发现的问题,wince 5中用EVC 写应用程序自己调用显示沙漏, 第一种情况:如下,在初始化时显示沙漏持续5s钟,实际效果是,我双击打开应用程序,什么也看不到,如果我点击下屏幕,就会显示出沙漏,如不笔离开屏幕,沙漏也立刻消失.好像只有在点击屏幕是才 ...…

查看全部问答>

切换LCD分辨率时,调色板创建错误,大家来探讨一下!

MINI2440开发板下为了支持动态修改分辨率,在S3C2440DISP:S3C2440DISP()中生成了一个2个元素的数组GPEModeEx  m_ModeInfoEx[2],保存了2个显示模式的分辨率,NumModes()改为返回2,此外其他修改的源代码如下: SCODE S3C2440DISP::GetM ...…

查看全部问答>

ARM下的64位加法运算?

高手们:    在ARM中,哪个能写一个这个程序:  有一个数:123456789ABCDFE    又有一个数987654321FEDCBA   这两个数如何比较大小?    …

查看全部问答>

WINCE中调用connect函数出错

char *sIp=\"192.168.11.105\";         int nPort = 3000;         int rc;         WSADATA  wsaData;         //SOCKET nConnect;   &nb ...…

查看全部问答>

高手帮我看看这个开关电源的图对不对

搞了好几天,总算有点眉目了,第一次画还希望大侠们提些宝贵意见哈。感觉过流保护还不完整,参数有的不会算,大侠们发现了就尽管说哈,教教小弟,多谢啦 [ 本帖最后由 yuelianghudie 于 2010-8-8 15:23 编辑 ]…

查看全部问答>

CH2输入捕获问题

我用TIME2的CH2做输入捕获,数据不对,请大家帮我看一下初始化对不!谢谢! int main(void) { #ifdef DEBUG   debug(); #endif   /* System Clocks Configuration */   RCC_Configuration();  &nb ...…

查看全部问答>

问个C++调试问题(不知道能不能在这里问)

最近在学习C语言,用C++调试程序的时候发现在一个问题,每次我单步运行的时候总会出现如图的东西,这就把我的MAIN程序看不到了,怎么让这个不要显示 [ 本帖最后由 zjjone1023 于 2011-4-18 23:59 编辑 ]…

查看全部问答>

SAMSUNG6410 死机

本帖最后由 jameswangsynnex 于 2015-3-3 20:02 编辑 用6410做了个平台,放着过一段时间,就死机了,不知道什么原因,我HOST USB没有,但没接15K,下拉,不知道,有没有关系 …

查看全部问答>