就是发送到串口1的数据,会被串口3中断接收到 好奇怪。 串口3没有复用;把pb11的浮空输入改成上拉或下拉输入都不行,都能收到 修改优先级也不行 实在搞不懂。 上来请教各位大神,先谢谢了
FATFS在裸机运行没问题,在FreeRTOS中,用FS指针可以挂在,用FS变量就会进硬件错误中断,而且用指针却不能打开文件,错误是文件无效。前提都是裸机没问题,请问一下?!
内部有2个APP。通过IAP跳转 想法是:做固件升级,内部放2个APP,一个是当前版本,一个是上一个版本。 2个APP互相轮询的烧录。 例如: APP1 keil编辑的起始地址0x8002000 向量表偏移0x2000。 APP2 keil编辑的起始地址0x8002000 。向量表偏移0x12000 ,APP2采用USB写入FLASH 0x8012000的地址。 IAP跳转 APP1 为0x8002000,跳转 APP2 为 0x8012000。 keil编辑的起始地址都是按照0x8002000,只是放到别的地址了,用IAP跳转到那个地址, 能运行吗? 我的思路能行吗?
接收的数据存入33H ~ 3FH 需要显示前11位 怎么用最少的程序显示出来 下面的程序只显示第一位(接收的第一位是A) 后面显示的是BCDEFGHIJK 显示的不是接收的数据 怎样才能把里面的数据显示出来 还有为什么接收时用的是#33H 显示的时候可以直接用33H显示 MOV R3#11; 显示数量 MOV R133H; 数据存放地址 MOV R2#0C2H; 显示地址 DIPA: MOV P1R2; INC R2; LCALL WR_CODE MOV AR1 INC R1 LCALL WR_DATA DJNZ R3DIPA
这次一个无源蜂鸣器驱动算是遇到问题了 此程序并非本人所写也是借鉴于论坛大神帖子的! 程序如下: 定时器为八位自动重装模式 定时250us; void timer() interrupt 1 { static uint16 count=0; uint16 count; if(num>0) { count++; if(count<400) { beep=~beep; if(count>=400) beep=1; if(count>=800) { count=0; num--; } } } } 求问:三个if里面的的数值都决定了蜂鸣器的什么状态?
例如128KB空间。程序占用空间40K. 通过升级,固件缩小到30K. 覆盖30K以后,后面10K是之前的残留,需要判断并擦除吗?还是留着不管也可以的?
一个非常简单的小程序,利用外部中断控制静态数码管和动态数码管轮流显示数字0~7,可是无论是实际下载到开发板还是用protues仿真都只有动态显示,无法切换到静态显示,代码也检查了许多遍,刚刚开始学51,不知道是不是算法的问题,恳求大佬帮忙指点一点,下面是代码。 #include <reg52.h> #define LED1 P1//静态数码管 #define LED2 P0//动态数码管 sbit c=P2^7; sbit b=P2^6; sbit a=P2^5; sbit k1=P3^2; sbit k2=P3^3; unsigned char code num[8]={0x3f0x060x5b0x4f0x660x6d0x7d0x07}; unsigned char M[8]; unsigned char k; void displayLED1(); void displayLED2(); void zhong_duan_kai_qi(); void delay(unsigned int time); void main() { zhong_duan_kai_qi();//外部中断开启 while(1) { unsigned char i; if(k) { LED2=0x00; while(k) { displayLED1(); } } else { for(i=0;i<8;i++) { M[i]=num[i]; } LED1=0x00; while(~k) { displayLED2(); } } } } void delay(unsigned int time) { unsigned char i; unsigned int j; for(i=0;i<time;i++) { for(j=0;j<125;j++); } } void zhong_duan_kai_qi() { //设置INT0 IT0=1;//跳变沿出发方式(下降沿) EX0=1;//打开INT0的中断允许。 //设置INT1 IT1=1; EX1=1; //打开总中断 EA=1; } void displayLED1() { unsigned char i; for(i=0;i<8;i++) { LED1=num[i]; delay(500); } } void displayLED2() { unsigned char i; unsigned int j; for(i=0;i<8;i++) { switch(i) { case 0: c=0;b=0;a=0;break; case 1: c=0;b=0;a=1;break; case 2: c=0;b=1;a=0;break; case 3: c=0;b=1;a=1;break; case 4: c=1;b=0;a=0;break; case 5: c=1;b=0;a=1;break; case 6: c=1;b=1;a=0;break; case 7: c=1;b=1;a=1;break; } LED2=M[i]; j=500; while(j--); LED2=0x00;//消隐 } } void Int0()interrupt 0 { delay(1);//延时消抖 if(k1==0) { k=0; } } void Int1()interrupt 2 { delay(1); if(k2==0) { k=1; } }
#include <reg52.h> #include <stdio.h> #include "lcd1602.h" //ADC0809 sbit CLK=P3^4; sbit ST=P3^5; sbit EOC=P3^6; sbit OE=P3^7; sbit RELAY = P3^3; unsigned int pass = 0; unsigned int ADCshow; unsigned char pressure = 50; unsigned char mode=0; unsigned char status = 0; void delay(unsigned int s) { while(s--); } void DelayMS(unsigned int ms) { unsigned char i; while(ms--) { for(i=0;i<120;i++); } } void Timer0_INT() interrupt 1 { TH0=(65536-200)/256; TL0=(65536-200)%256; CLK=~CLK; } void UART_init() //设置串行通信 本晶振为11.0592MHZ,其他的就自己算一下应该设置多少 { TMOD = 0x20; TH1 = 0xfd; TL1 = 0xfd; //波特率9600 SM0 = 0; SM1 = 1; // 串口工作方式1 10位异步 REN = 1; //串口允许接收 TR1 = 1; EA = 1; ES =1 ; //串口中断 } void main(void) { RELAY=1; //关灯 UART_init(); lcd_init(); //初始化1602 TMOD=0x01; //设置定时器0 TH0=(65536-200)/256; //初值重装 TL0=(65536-200)%256; EA=1; //开总中断 ET0=1; //开定时器中断 TR0=1; //开定时器0 while(1) { //adc0809读取数据 ST=0; OE=0; ST=1; ST=0; while(EOC==0); OE=1; ADCshow=P1; OE=0; //lcd1602显示压力传感器值 LCD_ShowStr(00"Real:"); LCD_ShowChar(50ADCshow/100+'0'); LCD_ShowChar(60ADCshow%100/10 +'0'); LCD_ShowChar(70ADCshow%10 +'0'); if(ADCshow<pressure||pass==0x11) { RELAY=0; //亮灯 } else { //否则 RELAY=1; //灭灯 } } } void UART_INTERRUPT() interrupt 4 { pass = SBUF; RI = 0; SBUF = pass; ) while(!TI); TI = 0; } 原理图
我新建了GD32的工程,用GD标准库,在测试滴答定时器中断时,发现中断能进去,但是进一次中断大概是7ms左右。我只把原来主频108M改成72M,原来108M系统初始化不了,进不去Main函数。
请问一下我在使用51最小系统板做流水灯的时候通过程序无法改变I/O输出电平是怎么回事,I/O持续输出5V高电平,但是把芯片换到另一个基座就可以改变,请问哪里可能出问题了
自己在做裸机实验有时候在printf中加入“\n\r”换行符时会莫名跑死,哪怕都没执行printf也会跑死,程序本身确定没有问题而且只要去掉换行符就恢复正常,不限程序,有时候却不会出现问题,串口和格式化输出程序都是用的原子提供的,就很迷,有人遇到这种情况吗?
用数码管做了数字钟,运行没有什么问题,但是加了流水灯之后,数码管会闪烁,这是怎么回事?应该怎么解决?求大佬指教! 代码如下:#include<regx51.h> #define uint unsigned int #define uchar unsigned char sbit s1 = P3^2;//闹钟开关 sbit s2 = P3^3;//设置 sbit s3 = P3^4;//小时键 sbit s4 = P3^5;//分 sbit s5 = P3^6;//退出键 sbit fs = P3^0;//蜂鸣器 sbit d = P3^1;//小灯 unsigned char mfsw;//秒,分,时,计数器 uchar f_naos_nao;//闹钟分,时 bit flag_nao;//闹钟标志 void zuo(); void you(); void delay(uint i); //void ledscan(uchar huchar muchar s); void alarm(); void tiaojie(); void delay(uint i) { while(i--); } void zuo() {unsigned char d; unsigned char a = 0x01; for(d = 0;d<8;d++) { P0 = ~a; delay(1); a = a<<1; } if(a == 0) { a = 0x01; } } void ledscan(uchar huchar muchar s) reentrant { uchar LED[]={0x3f0x060x5b0x4f0x660x6d0x7d0x070x7f0x6f}; uint j; P1 = LED[s%10]; P2 = 0x7f; for(j = 0;j<100;j++); P2 = 0xff; P1 = LED[s/10]; P2 = 0xbf; for(j = 0;j<100;j++); P2 = 0xff; P1 = 0x40; P2 = 0Xdf; for(j = 0;j<100;j++); P2 = 0xff; P1 = LED[m%10]; P2 = 0xef; for(j = 0;j<100;j++); P2 = 0xff; P1 = LED[m/10]; P2 = 0xf7; for(j = 0;j<100;j++); P2 = 0xff; P1 = 0x40; P2 = 0xfb; for(j = 0;j<100;j++); P2 = 0xff; P1 = LED[h%10]; P2 = 0xfd; for(j = 0;j<100;j++); P2 = 0xff; P1 = LED[h/10]; P2 = 0xfe; for(j = 0;j<100;j++); P2 = 0xff; } void tiaojie() { if(s3 == 0) { ledscan(sfm); if(s3 == 0) { if(s == 23) s = 0; else s++; while(!s3)ledscan(sfm); } } else if(s4 == 0) { ledscan(sfm); if(s4 == 0) { if(f == 59) f = 0; else f++; while(!s4)ledscan(sfm); } } }void alarm() { //uchar a; if(flag_nao) { if(f==f_nao&&s==s_nao) { while(m<=5&&flag_nao) { fs = ~fs; ledscan(sfm);} } } } void t0() interrupt 1 { TH0 = (65536-50000)/256; TL0 = (65536-50000)%256; w++; if(w == 20) { w = 0; m++; if(m == 60) { f++; m = 0; if(f == 60) {s++; f = 0; if(s == 24) s = 0;} } }zuo(); } void guan_naozhong() interrupt 0 { flag_nao = ~flag_nao; d = ~d; while(!s1)ledscan(sfm); } void naozhong()interrupt 2 { f_nao = f; s_nao = s; while(s5) { ledscan(s_naof_nao0); if(s3 == 0) { ledscan(s_naof_nao0); if(s3 == 0) { if(s_nao == 24)s_nao =0; else s_nao++; } while(!s3) ledscan(s_naof_nao0); } else if(s4 == 0) { ledscan(s_naof_nao0); if(s4 == 0) { if(f_nao == 59)f_nao =0; else f_nao++; } while(!s4) ledscan(s_naof_nao0); } } } void main() { TMOD = 0X01; TH0 =(65536 - 50000)/256; TL0 =(65536 - 50000)%256; TR0 = 1; ET0 = 1; IT1 = 1; IT0 = 0; EX1 = 1; EX0 = 1; PT0 = 1; EA = 1; f = 0; m = 0; fs = 0; flag_nao = 0; while(1) { ledscan(sfm); tiaojie(); alarm(); //zuo(); } }