单片机中断函数C语言的问题?
代码太长,没细看
我感觉问题可能是:
1,中断初始化是否完善,是否中断使能,
2,进入中断程序的时候,要禁止中断,
你的那个问题:中断初始化完成后,会中断产生会自动调用中断函数。
1.void(中断函数返回类型(空型)) Time1 (中断函数名)(void(参数类型) interrupt 3 (中断号)
2: 中断条件发生时执行中断,比如void Time1(void) interrupt 3 是定时器1定时时间到发生中断,中断函数放在那里无所谓
3:void PxInt0(void) interrupt 0 中断名为PxInt0的0号中断
void PxInt1(void) interrupt 2 中断名为PxInt1的2号中断
void time0_int(void) interrupt 1 中断名为time0_int的1号中断
void time1_int(void) interrupt 3 中断名为time1_int的3号中断
4:中断的代码是你想中断执行的工作,中断的代码是根据任务,需要你自己写的
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仿真可能不太准确,可以通过仿真示波器看波形及频率就好了;
蜂鸣器响,需要每隔约 2ms 令 BEEP 翻转一次。
这就需要用 T1 定时 2ms。
如果需要低频,就需要更长的的定时。
参考程序如下:
两片单片机通过串口一发一收的C语言例程
LED1=~LED1;LED2=LED1;break;} } } } \/\/甲机串口接收中断函数 void Serial_INT() interrupt 4 { if(RI){ RI=0;if(SBUF>=0&&SBUF<=9)P0=DSY_CODE[SBUF];elseP0=0x00;} } \/* 乙机程序接收甲机发送字符并完成相应动作:乙机接收到甲机发送的信号后,根据相应信号控制LED完成不同...
单片机怎么从主函数跳到中断函数中
为了把主程序全部放入(定时)中断中,必须把程序化分成一个个的模块,即任务,每个任务完成一个特定的功能,例如扫描键盘并检测按键。 设定一个合理的时基 (tick),例如 5, 10 或 20 ms, 每次定时中断,把所有任务执行一遍,为减少复杂性。一般不做动态调度(最多使用固定数组以简化设计,做动态调度...
一个很简单的delay延时小函数,有点小问题,请C51高手帮忙!
这是c的编译规则的问题。对于int型7FFF次是可直接执行的 因为不管你定义的是什么型,对于1个循环跳转次数来说都是0-255是单跳转 0-7fff是2个跳转嵌套,16位数的最高位是符号的。这里不管i是什么型 对于循环就是把i的值带入入口而已。通常做软循环不建议用INT的变量因为太不好就算了 而且切效率低。
请教C语言高手(关于在TC中编键盘测试程序的DOS中断问题)
1.进入键盘中断程序。2.从键盘I\/O端口60H读取一个字节的按键码,并将它存入一个全局变量中供main程序处理,或者将按键码存入一个数据表中。3.读取控制寄存器61H,并用82h完成一个OR操作。4.将结果写回控制寄存器端口61H。5.在控制寄存器上用7fh完成一个AND操作,以便复位键盘触发器,告诉硬件一...
学习单片机是用汇编语言好呢?还是用c语言好呢?
可以跟踪寄存器的值,因为寄存器都是自己定义的,比较直接,控制硬件也比较直观。C相对容易读写。对于新手,相对来说,C容易上手和理解,在算法上也有自己的函数,而汇编必须自己编写各种函数。所以各有优劣,有时候优点也是缺点。编程主要还是思路,也就是流程,语言只是个工具,用熟了都好用。
单片机80C51中的C指的是CMOS还是说用C语言进行编程?
片机80C51中的C指的是CMOS。用什么语言编程和单片没有关系,编程语言和编译器有关,不管用什么语言编程,最后都会编译成机器码即二进制码烧写到单片机里面。CMOS single-chip 8-bit microcontrollers。The Philips 80C31\/80C51\/87C51 is a high-performance microcontroller fabricated with Philips high-...
C语言与单片机C语言的区别 急求
1、单片机中C的语法一般都对 ANSI C有些扩展,及一些特殊写法 如C51扩展的 data xdata bit sbit 一类的,还有一些中断程序写法 void int() interrput 1 一类的。2、C是一门语言,由对应平台的编译器编译成对应平台汇编的程序,各平台的汇编不一样,当然编译器也不一样 DOS上的TC2 TC3 WINDOWS上...
c语言常见面试题
在C语言中,关键字static有三个明显的作用:1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。3) 在模块内,一个被声明为静态的函数只可被这一模块...
单片机C语言如何实现8个LED流水灯来回流动?
1、可以通过左移函数_crol_()和右移函数_cror_()来实现LED等的来回流动。2、具体实现方法可以参考如下程序:
C语言与C++语言的区别在哪?
C语言是结构化和模块化的面向过程的语言,C++语言是面向对象的程序设计语言。C++语言是C语言的超集,也就是说学会了C++,你其实已经把C语言学会了。至于说有什么区别,应该说是编程思想的区别吧,C是基于过程的,强调的是程序的功能,以函数(功能)为中心。C++是面向对象的,强调程序的分层、分类,以抽象为基础,进行对象的...
羽纪复方: 中断执行后,回到while循环里面.定时器2是自装载的,初始化一次就可以了,定时时间到了,他会自己恢复初值的,看看芯片的资料就知道了.
雄县17298504742: 单片机C语言多个中断问题 - ?
羽纪复方: timer0() interrupt 1 timer1() interrupt 3 这两个函数后面 interrupt X 这个表示中断号,1是定时器0中断,3是定时器1中断还有别的.中断时,会从中断向量地址处跳到相对应的中断号的函数中.
雄县17298504742: 单片机 C语言 中断 - ?
羽纪复方: TR0是控制T0时间中断的.TR0=1,中断开启但并不是马上中断,要等寄存器加到满后才产生中断,执行中断程序.执行完中断程序内容后返回,等待下次中断.一般不会关闭中断.如果你只执行一次中断那你就得写一句TR0=0.
雄县17298504742: 单片机C语言编程的中断号是指代什么意义啊?如:void timer1() interrupt 3 中的3 - ?
羽纪复方: 51单片机通常有5个中断,当中断发生时,程序会跳到相应的中断服务程序去执行.为了区别不同的中断,引入了中断号,单片机的中断号对应的中断类型如下: 中断号 中断源 中断向量复位 0000H 0------------外部中断0-------------------------0003H ...
雄县17298504742: 求51单片机中,用C语言写的五个中断源的中断函数的书写规则,就是进入中断函数时的那个函数名,并说明... - ?
羽纪复方: #include<reg51.h> #include<intrins.h> void delay() { int a=5000; while(a--) {_nop_();} } int0()interrupt 0 { delay(); if(INT0==0) { P2_0=!P2_0; while(INT0==0); } }这是一个简单的中断
雄县17298504742: 单片机c语言中断函数 - ?
羽纪复方: 这是单片机C语言中断函数的编程格式,()后面的只是告诉编译系统该函数是一个中断函数,具体的执行还是按照C语言函数的执行方式去执行.
雄县17298504742: 单片机c语言中断程序 - ?
羽纪复方: #include <reg51.h> void init(void)//声明中断初始化 { EA=1;//中断总开关EX0=1;//开中断0开关.中断1为,EX1=1;IT1=1;//采用边沿触发,下降沿有效.IT1=0为低电平触发中断. } main() { init();调用中断初始化函数== ===主程序; } void in_0(void)interrupt 0//中断服务函数 { == ==要服务的程序 }
雄县17298504742: 8051单片机写中断程序需要注意什么?(C语言) - ?
羽纪复方: 注意中断的中断号,优先级,以及中断处理是否需要清中断标志.
雄县17298504742: 单片机c语言中断 - ?
羽纪复方: 设好中断,计算到10ms一次.把8个led引脚全部打成亮的状态.主程序死循环.设置个全局变量times.10ms中断里面按键扫描.当有按键按下时,把里面数字写成6.设置个全局变量counter.counter初值50.设置一个判断,当counter清空的时候,counter=50,把8个led的引脚依次取反、或者整个口取反、或者整个口和0xff异或.并且把times减一.设置一个判断,当times变成0的时候把8个led引脚全部打成亮的状态.烧程序,搞下一个.
雄县17298504742: 单片机c语言中断问题 - ?
羽纪复方: 这个简单,不要用goto语句,程序会跑飞,你可以写个标志程序如下:MAIN_Flag; int main(void) { while(1) { if( MAIN_Flag == 1) { 执行相应的程序} } } void INTO(void)interrupt 0 {MAIN_Flag = 1; //打开标志 } 也可以写个进入外部中断让单片机内部看门狗复位,程序从头开始执行