
如果是用C去写的话,像汇编一样,开中断就行了。位置一般就在MAIN 之前的。
//晶振频率221184MHz
#include<at89x52h>
#define TIMER0H 0x4c
#define TIMER0L 0x00
#define TIMER0_RUN TR0=1
#define SECOND_OVERFLOW 40
#define SEG_PORT P0
#define DISPLAY_DIG1 P1&=0xf0;P1|=0x01
unsigned char g_CurrentDigit=0; //当前显示的数字
void timer() interrupt 1
{
static unsigned char s_Count = 0;
TH0 = TIMER0H; //重置定时器初值
TL0 = TIMER0L;
//每次进入中断服务程序,TH0和 TL0 的值都
TIMER0_RUN; //定时器运行,开始下一
if(s_Count != SECOND_OVERFLOW)
{ //未到整秒,把 sCount 值加1
s_Count++;
}
else
{ //到整秒,s_Count归 0,更新把当前显示
s_Count = 0;
if(g_CurrentDigit != 9)
{
g_CurrentDigit++;
}
else
{
g_CurrentDigit = 0;
}
}
return;
}
void Initial(void) //初始化
{
IE = 0x82; //仅允许Timer0 中断
TMOD = 0x01; //Timer0 使用工作方式 1(16位) ,定时器
TH0 = TIMER0H; //设置定时器初值
TL0 = TIMER0L;
TIMER0_RUN; //定时器开始运行
DISPLAY_DIG1;
}
void main()
{
unsigned char code SEG_CODE[]
= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
Initial();
while(1)
{
SEG_PORT = SEG_CODE[g_CurrentDigit]; //显示当前的数字
//当timer0溢出时,单片机响应 timer0 中断,调用 timer 函数,
//每40 次调用当前显示的数字加 1
}
}
程序分析:
程序中主程序做的事只是在死循环中反复显示当前的数字,每产生一次中断,程序就跳
转到中断服务函数 timer()中进行相应的更新。
这里中断服务函数 timer()有别于普通 C函数的地方是在声明中多了“interrupt 1” ,说明
这个函数是中断号为 1的中断服务函数。各个中断对应的中断号如表 38所示。
这个程序需要初始化的东西比较多, 我们把这些初始化语句都放在了初始化函数 Initial()
中,这也是程序初始化很常见的做法。我们还第一次用到了静态变量和全局变量。全局变量
是中断处理函数与外界程序进行参数传递的唯一途径,因此在单片机程序中全局变量的使
用频率要比普通的 C 语言程序高。尽管如此,由于全局变量的使用会影响程序的结构化,
所以在可以不使用全局变量的地方,还是要避免使用全局变量。在程序中,为了把全局变
量与静态变量跟普通变量区别开来,我们在变量前分别加了小写 g_和小写 s_以示区别。
IE 寄存器中的使能位和C中的中断号 中断源
0 外部中断0
1 定时器0溢出
2 外部中断1
3 定时器1溢出
4 串行口中断
5
定时器2溢出(仅在S52、
C52中有此中断源)
好了,以上是我找的一个实例,希望对你有帮助!
interrupt 后面的数字简单的说就是中断服务函数的代号
0代表外中断0
1代表定时计数器0中断
2代表外中断1
3代表定时计数器1中断
4代表串行口中断
所以interrupt 1代表定时计数器产生中断后就转到这个函数里面执行
using 后面的数字是个工作寄存器的代号,也就是R0—R7。如果不写的话由系统自动分配,一般不用去理会
晕,你不会这样设计你的程序吧你不会在中断中停留1S的时间吧
教你个方法,你的中断应该是设置的20ms吧即T0的溢出时间设置为20ms,在T0中断程序里设一个计数器,从1自增到50后归0,也就是用设计标记的方法来计时1S,到了1S就执行你要的内容就行了
中断程序不用你设置退出,执行完了它自己退出的
#include<stch>
sbit
d1=P2^0;
sbit
p1=P2^1;
void
main()
{
方式一;
}
void
main()
{
EA=1;
EX0=1;
IT0=1;
方式二;
}
void
main()
{
EA=1;
EX1=1;
IT0=1;
方式三;
}
void
zd0()
interrupt
0
{
d1=0;
}
void
zd1()
interrupt
1
{
p1=0;
}
用的是外部中断0和1,程序很简单,注释就不写了。如果有错误的话,还请指正。
void functionName() interrupt 1 //using 2
类型固定为void即无返回值
中断函数名functionName只要是合法标识,不与已有的函数重名即可,且函数固定无参数
interrupt为关键字,表明当前是一个中断函数,不需要被主函数直接或间接调用,也会编译连接进程序中,一般的非中断函数如果未被主函数直接或间接调用,也不被中断函数直接或间接调用,则不会链接进程序最终代码
interrupt后的数字表明是中断号几,单片机中 51系列的有0 1 2 3 4 等几个中断, 52系列的中断可能到了7或8 中断号与中断事件是绑定的,不能随便设置,对应的中断向量会指向这个函数入口地址
可选的using N 表示中断中使用第几个寄存器组
以上就是关于单片机的C语言中如何实现汇编中的中断程序,写哪里还有org这个伪指令可以在C中实现吗全部的内容,包括:单片机的C语言中如何实现汇编中的中断程序,写哪里还有org这个伪指令可以在C中实现吗、用keil51编译器编写的单片机C语言中断程序void Time0(void) interrupt 1 using 0中各个数字代表什么含义、在单片机C语言编程中断中如何退出中断等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)