8051 c中断
发布时间:2020-12-16 05:02:42 所属栏目:百科 来源:网络整理
导读:我正在使用C在8051微控制器上编写程序.我正在使用的编译器是Keil Microvision.我陷入困境,无法弄清楚我的代码中缺少什么.我知道这是非常基本的代码,我无法弄清楚我应该做些什么. 所以我正在做的就是向用户发送一个句子并让他们通过串口回答是或否,我使用了串
我正在使用C在8051微控制器上编写程序.我正在使用的编译器是Keil Microvision.我陷入困境,无法弄清楚我的代码中缺少什么.我知道这是非常基本的代码,我无法弄清楚我应该做些什么.
所以我正在做的就是向用户发送一个句子并让他们通过串口回答是或否,我使用了串行中断.那部分工作正常.如果我从那个人那里得到一个no,我想通过定时器中断产生5kHz的方波.我希望这个方波由外部中断控制,当P3.2引脚上的外部中断打开或关闭时,它会打开和关闭. #include <REG52.H> #include <stdio.h> sbit WAVE = P1 ^ 7; #define BIT(x) (1 << (x)) void timer0() interrupt 1 // timer is controlling square wave timer 0 { WAVE = ~WAVE; } void interrupt0() interrupt 0 { IE ^= BIT(1); } void serial0() interrupt 4 { unsigned char x; unsigned int i,z; unsigned char yes[] = " YES "; unsigned char no[] = " NO "; unsigned char nvalid[] = " NOT VALID TRY AGAIN "; while (RI == 1) { x = SBUF; RI = 0; if (z < 1) { if (x == 'n') { for (i = 0; i < 4; i++) { SBUF = no[i]; while (TI == 0) ; //wait for transmit TI = 0; z++; } } } else { return; } if (x == 'y') { for (i = 0; i < 5; i++) { SBUF = yes[i]; while (TI == 0) ; TI = 0; } } else if (x != 'n') { for (i = 0; i < 21; i++) { SBUF = nvalid[i]; while (TI == 0) ; TI = 0; } } TI = 0; return; } } void main() { TMOD = 0x20; TH1 = 0xF6; //baud rate SCON = 0x50; TH0 = 0xA4; IE = 0x93; //enable interrupts IP = 0x10; // propriety to serial interrupt TR1 = 1; //start timer 1 TR0 = 1; //clear timer 0 TI = 1; printf("Hello,Are you okay? Press y for yes and n for no "); while (1) ; } 我遇到问题的部分是来自前面代码的这两个中断 void timer0() interrupt 1 // timer is controlling square wave timer 0 { WAVE=~WAVE; } void interrupt0() interrupt 0 { IE ^= BIT(1); } 任何正确方向的提示将不胜感激!谢谢.抱歉格式化 解决方法
由中断修改的变量应定义为volatile:
volatile sbit WAVE = P1 ^ 7; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |