单片机c语言中断
1. 单片机中断c语言
#include<reg51.h>
#defineucharunsignedchar
ucharcodeledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//0-9
ucharscanled;
ucharflag=0;
uchardisdat[6];
voiddelay(unsignedintx)
{
unsignedinti,j;
for(i=0;i<x;i++)
for(j=0;j<120;j++);
}
voiddischg()
{
uchari;
for(i=0;i<6;i++)
disdat[i]=10;
}
voidext0()interrupt0
{
flag=1;
}
voidext1()interrupt2
{
flag=2;
}
voidt1isr()interrupt3 //显示
{
TH1=0xec;
TL1=0x78;
switch(scanled)
{
case0:
P2=0x01;
P0=~ledtab[disdat[5]];
break;
case1:
P2=0x02;
P0=~ledtab[disdat[4]];
break;
case2:
P2=0x04;
P0=~ledtab[disdat[3]];
break;
case3:
P2=0x08;
P0=~ledtab[disdat[2]];
break;
case4:
P2=0x10;
P0=~ledtab[disdat[1]];
break;
case5:
P2=0x20;
P0=~ledtab[disdat[0]];
break;
default:break;
}
scanled++;
scanled%=6;
}
main()
{
uchari,j;
TMOD=0x10;
TH1=0xec;
TL1=0x78;
TR1=1;
ET1=1;
IT0=1;
IT1=1;
EX0=1;
EX1=1;
EA=1;
scanled=0;
dischg();
while(1)
{
i=0;
switch(flag)
{
case1:
for(j=0;j<3;j++)
for(i=0;i<10;i++)
{
disdat[5]=disdat[4];
disdat[4]=disdat[3];
disdat[3]=disdat[2];
disdat[2]=disdat[1];
disdat[1]=disdat[0];
disdat[0]=i;
delay(200);
}
dischg();
flag=0;
break;
case2:
for(j=0;j<3;j++)
for(i=0;i<10;i++)
{
disdat[0]=disdat[1];
disdat[1]=disdat[2];
disdat[2]=disdat[3];
disdat[3]=disdat[4];
disdat[4]=disdat[5];
disdat[5]=i;
delay(200);
}
dischg();
flag=0;
break;
default:break;
}
}
}
2. 单片机中断函数C语言的问题
void Timer1() interrupt 3
{ TH1=xx; TL1=xx; //建议还是取定时值为1ms,或者是 0.5ms ;
cnt++;
if (s<50)
{
if(cnt>500) { cnt=0; beep=~beep;}
}
else if (s>=50 && s<100)
{
if(cnt>1000) { cnt=0; beep=~beep;}
}
.........
}
如果定时中断为20ms,对应的频率计数50Hz,这个频率已经很低了,那么再通过cnt计数500次,输出信号频率就远远超出音频范围,你根本就听不到声音;
另外,蜂鸣器的proteus仿真可能不太准确,可以通过仿真示波器看波形及频率就好了;
3. 51系列单片机C语言中的中断的问题
①这几个是中断服务函数的声明,仅仅表示当有对应向量的中断产生时、应跳转到对应的函数,并不代表开启了中断。
②一塌糊涂。向量3是定时器1中断,你在里面重新赋值TH0、TH0做什么?而下面向量1明明是定时器0中断,你又去折腾TH1、TL1……
4. 几种单片机C语言的中断程序写法
关于c的中断使用一般是,定义函数的时候在后面加上interrupt
n
其中
n
对应中断源的编号,其值从
0
开始,以
80c51
单片机为例,编号从
0~4,分别对应外中断
0.
定时器0
中断.外部中断
1
.定时器1
中断.和串行口中断
.
void
xxxx(void)interrupt
n//中断服务函数
{
要写的中断服务程序.
}
5. c语言怎么编写单片机的中断
给你上个较完整的程序,可以直接在KEIL中运行并观察输出
/******************************************************************************
功能:
本程序在12M晶振模式下,通过定时器中断精确实现数字时钟计时操作,并在KEIL
中实现输出。时、分、秒的变化在定时中断里处理。
说明:
因采用工作方式2,自动装入初值,所以此程序计时很精确,只是在KEIL中模拟输
出显示的变化速度很快,这点可不理会
******************************************************************************/
#include
#include
#define
TEST
//此行用于KEIL输出显示,如果不需要显示可将其删除
typedef
unsigned
char
uchar;
typedef
unsigned
int
uint;
#define
TH0TL0_INIT
(256-250)
//定时器8位自动装入模式下寄存器初值,0.25ms中断一次
char
cHour;
//时
char
cMin;
//分
char
cSec;
//秒
uint
iCount;
//秒计数,计数达到4000时1s,4000*0.25ms
=1000ms
=
1s
bit
bSecChanged;
//秒发生变化标志,每秒送一次输出显示,送显完成后清0,提高主程序效率
//==============================================================================
//T0定时器中断服务程序,12M晶振下每0.25ms产生中断,本程序执行一次
//==============================================================================
void
Timer0()
interrupt
1
{
iCount++;
//秒计数值+1
if(iCount==4000)
{//时间计数达到1S
iCount
=
0;
//重新开始下一秒计数
cSec++;
//时钟:秒+1
bSecChanged
=
1;
//置秒发生变化标志
if(cSec==60)
{//计够60s
cSec
=
0;
//重新开始下一分计数
cMin++;
//时钟:分+1
}
if(cMin==60)
{//计够60分钟
cMin
=
0;
//重新开始下一小时计数
cHour++;
//时钟:小时+1
}
if(cHour==24)
{//计够24小时
cHour
=
0;
//重新开始第二天计数
}
}
}
//==============================================================================
//主程序
//==============================================================================
void
main()
{
uchar
outstr[10];
//输出字符串,我的编译器可能有问题,直接输出有错
TMOD
=
0X02;//工作方式2,8位自动重装计时模式
TH0
=
TH0TL0_INIT;
//0.25ms中断一次
TL0
=
TH0TL0_INIT;
//0.25ms中断一次
#ifdef
TEST
SCON
=
0x50;
/*
SCON:
mode
1,
8-bit
UART,
enable
rcvr
*/
TMOD
|=
0x20;
/*
TMOD:
timer
1,
mode
2,
8-bit
reload
*/
TH1
=
221;
/*
TH1:
reload
value
for
1200
baud
@
16MHz
*/
TR1
=
1;
/*
TR1:
timer
1
run
*/
TI
=
1;
/*
TI:
set
TI
to
send
first
char
of
UART
*/
#endif
cHour
=
0;
//时
cMin
=
0;
//分
cSec
=
0;
//秒
iCount
=
0;
//秒计数
bSecChanged
=
0;
outstr[2]
=
':';
//时分分隔符
outstr[5]
=
':';
//分秒分隔符
outstr[8]
=
0;
//字符串结束符
EA=1;
//开总中断
ET0=1;
//允许T0中断
TR0=1;
//启动T0
while(1)
{
if(bSecChanged==1)
{//秒发生变化,将时间值转换为可显示字符串准备送显示
bSecChanged
=
0;//清除标志,节省CPU资源
outstr[0]
=
cHour/10
+
0x30;
//将秒转换为ASCII码
outstr[1]
=
cHour%10
+
0x30;
outstr[3]
=
cMin/10
+
0x30;
//将分转换为ASCII码
outstr[4]
=
cMin%10
+
0x30;
outstr[6]
=
cSec/10
+
0x30;
//将小时转换为ASCII码
outstr[7]
=
cSec%10
+
0x30;
#ifdef
TEST
printf("
%s\r",outstr);
//在KEIL中显示时钟
#endif
}
}
}
6. 如何知道单片机C语言中断入口函数关键字的标准写法
单片机C语言中断入口函数标准写法如下:
外部中断0:void
ext0()
interrupt
0
定时器0:
void
time0()
interrupt
1
外部中断1:void
ext1()
interrupt
2
定时器1:void
timer1()
interrupt
3
串口:
void
uart()
interrupt
4
如果要用其他工作寄存器组,后面可以加:using
n(n=0,1,2,3)
7. 单片机C语言中断函数的定义形式是怎样的
形式如下:
void 中断名(void) inerrupt 中断号 using 工作寄存器组
比如外部中断0
void ext0(void) interrupt 0 using 1 //后面的using 1可以省略,缺省为0
定时器1
void t1isr() interrupt 3
(7)单片机c语言中断扩展阅读:
单片机内部结构
1、CPU
它的名字没有改,还是称为CPU(Central Processing Unit)。它是单片机的核心部件,包括运算器和控制器。
运算器既是算术逻辑单元ALU(Arithmetic logic Unit),其功能是进行算术运算和逻辑运算。
控制器一般由指令寄存器、指令译码器、时序电路和控制电路组成。其作用是完成取指令、将指令译码形成各种微操作并执行指令,同时控制计算机的各个部件有条不紊地工作。
2、单片机内部结构之一ROM
“硬盘”,改了名字,称为程序存储器,也叫只读存储器。用ROM(Read only memery)表示。其作用和计算机的硬盘差不多,用来存放用户编写的程序。特点是:掉电后不会丢失数据(程序)。
8. 单片机c语言中断
查询传送方式查询方式的过程为: 查询—等待—数据传送。直接存储器存取(DMA)方式。在下述两种情况下可考虑采用DMA 方式:外设和存储器之间有大量的数据需要传送, 如磁盘驱动器中的大量数据需快速送到微机系统的RAM 中;外部设备的工作速度很高。同其他计算机系统一样, 单片机系统还有另一种非常重要的数据输入/ 输出方式———中断方式。中断的概念中断优先级:中断系统中有两个不可寻址的“优先级生效”触发器, 一个指出CPU 是否正在执行高优先级的中断服务程序, 另一个指出CPU 是否正在执行低优先级中断服务程序。二级中断嵌套当CPU 正在处理一个中断请求时, 又出现了另一个优先级比它高的中断请求, 这时,CPU 就暂时中止执行对原来优先级较低的中断源的服务程序, 保护当前断点, 转去响应优先级更高的中断请求, 并为其服务。中断处理的大致流程 中断响应条件1有中断源发出中断请求;2中断总允许位EA = 1 , 即CPU 开中断;3申请中断的中断源的中断允许位为1 , 即中断没有被屏蔽;4无同级或更高级中断正在被服务;5当前的指令周期已经结束;6若现行指令为RETI 或者是访问IE 或IP 指令, 则该指令以及紧接着的另一条指令已执行完。 </SPAN></SPAN>
9. 单片机C语言,如何使用多个中断。
优先级高的中断在执行时,如有低优先级中断到达,低优先级被挂起。等高优先级结束后,再处理低优先级。
优先级低的中断在执行时,如有高优先级中断到达,开始执行高优先级中断。等高优先级结束后,再返回处理低优先级。
如果你一直在不断地触发外部中断,那等于让程序不断地执行外部中断,就没时间去处理显示了。
10. 51单片机 C语言 如何实现中断调用
#include<stc.h>
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,程序很简单,注释就不写了。如果有错误的话,还请指正。