‘壹’ 单片机编程出现问题 我现在只是让它能实现24小时的时钟 但是烧录程序后,8位数码管显示00-00-00,不会走动
你的主函数写的有问题,当然,其实你整个函数架构都写的不好,但是你描述的问题,是你的主函数有问题,看看你的主函数:
void main()
{
TMOD=0x01;//设置定时器零为工作方式1
TH0=0x3C;
TL0=0xB0;
EA=1;
ET0=1;
TR0=1;
P1=Tab[shi/10%10];buf0=0;delay(1);buf0=1;
P1=Tab[shi%10];buf1=0;delay(1);buf1=1;
P1=0x40;buf2=0;delay(1);buf2=1;
P1=Tab[fen/10%10];buf3=0;delay(1);buf3=1;
P1=Tab[fen%10];buf4=0;delay(1);buf4=1;
P1=0x40;buf5=0;delay(1);buf5=1;
P1=Tab[miao/10%10];buf6=0;delay(1);buf6=1;
P1=Tab[miao%10];buf7=0;delay(1);buf7=1;
}
从第一句 TMOD = 0x01到最后一句:P1 = Tab[....]
执行了一次,这个程序就彻底完了,就是说,你的程序已经执行完了,不在执行了。
你没发现,所有的C语言程序都有While(1)或者for(;;)吗?
所以,你的主程序修改一下:
把显示放到while(1)里或者for(;;)
while(1)
{
P1=Tab[shi/10%10];buf0=0;delay(1);buf0=1;
P1=Tab[shi%10];buf1=0;delay(1);buf1=1;
P1=0x40;buf2=0;delay(1);buf2=1;
P1=Tab[fen/10%10];buf3=0;delay(1);buf3=1;
P1=Tab[fen%10];buf4=0;delay(1);buf4=1;
P1=0x40;buf5=0;delay(1);buf5=1;
P1=Tab[miao/10%10];buf6=0;delay(1);buf6=1;
P1=Tab[miao%10];buf7=0;delay(1);buf7=1;
}
这样这个程序就能永远的执行下去。
当然,结果能不能达到你的预期我不知道,我没仔细看,但是肯定不会只显示 00 -00 -00然后不动
‘贰’ uchar buf ()在单片机什么意思
定义一个无符号字符型的数组,数组名称是buf(一般指缓冲的缩写)
uchar buf [10]={1,2,3,4,6,7,8,9,10};
括号内10代表数组有10个元素,也可以不写
‘叁’ 51单片机串口接收指令控制发送速度 怎么接收到的指令经常有错误的字节 跪求大神
uchar buf[6]={0x7f}; 你通过这个定义了buf是6个字符的数组,
但是在中断中你要他显示范围之外的东西,不出错也算怪了。
把buf加大到11看看吧
‘肆’ 帮忙看一下,51单片机的4位数码管动态显示
你的现象应该是那两位数码管在
16 以前显示的是 0 和 一个数,如15 时显示的是 0 和 F、14 时显示的是 0 和 e。。。
16 时显示的是 1 和 0 ,17 时显示的是 1 和 1
disbuf[0]=(((firstdat&0xf0)>>4)&0x0f);
disbuf[1]=firstdat&0x0f;
disbuf[2]=(((seconddat&0xf0)>>4)&0x0f);
disbuf[3]=seconddat&0x0f;
这里不用这么麻烦吧,直接
disbuf[0]=firstdat>>4; 右移时,低四位被移出,高四位移入0,就是你要的结果了
disbuf[1]=firstdat&0x0f;
disbuf[2]=seconddat>>4;
disbuf[3]=seconddat&0x0f;
或者
disbuf[0]=firstdat/16; 除以16 得到 16 进制的十位
disbuf[1]=firstdat%16; 对16取余得到 16进制的个位
disbuf[2]=seconddat/16;
disbuf[3]=seconddat%16;
就行了吧
我想应该不会出现没消影的,不知道你说的消影是指什么现象
‘伍’ 单片机串口发送中断程序
结部分我自己用的程序用参考下了
;***********************************************************************************************
ORG 0000H
SJMP START
ORG 0003H
LJMP INT0_INT
ORG 000BH
LJMP TIMER0_INT
ORG 0023H
LCALL UART_INT
RETI
;-----------------------------------------------
START:
MOV SP,#70H
LCALL INITIAL ; 初始化
;
LCALL LOAD_DATA ;读入EPORM数据
;
MOV A,DATA_SET_ALME ;设置参数-警报开关
CLR ALM_ON
JZ SS1
SETB ALM_ON
SS1:
;
MOV DIS_S_DA1,DATA_SET_SET1
MOV DIS_S_DA2,DATA_SET_SET2
MOV DIS_S_DA3,DATA_SET_SET3
MOV DIS_S_DA4,DATA_SET_SET4
;**************************************************
ORG 0050H
MAIN:
JNB KEY_HAVE_DO,MAIN_N1
LCALL KEY_INPUT_SCANF ;按键输入扫描
MAIN_N1:
JNB HAVE_DATA_DO,MAIN_N2 ;接收数据要处理
CLR HAVE_DATA_DO
LCALL DATA_MANAGER ;接收数据处理
MAIN_N2:
JNB LED_OUT1,MAIN_N3
LCALL PLAUSE_OUT_STF
MAIN_N3:
JNB LED_OUT2,MAIN_N4
LCALL PLAUSE_OUT_STR
MAIN_N4:
JNB DATA_NEED_SAVE,MAIN_N5
CLR DATA_NEED_SAVE
LCALL SAVE_DATA
MAIN_N5:
JNB DATA_SET_NEED_SAVE,MAIN_N55
CLR DATA_SET_NEED_SAVE
LCALL SAVE_SET_DATA
MAIN_N55:
JB LED_ALM1,MAIN_N6
JB LED_ALM2,MAIN_N6
SETB ALM_OUT
SJMP MAIN_N7
MAIN_N6:
CLR ALM_OUT ;警报输出
MAIN_N7:
;----------------------
JNB FLASH_ON,MAIN_N8
LCALL FLASH_DO ;闪烁
MAIN_N8:
;------
INC DELAY_COUNT
MOV A,DELAY_COUNT
CJNE A,DATA_SET_TIME,MAIN_N10 ;设置参数-时间间隔
MOV DELAY_COUNT,#0
CLR LED_AT
JNB LGD_CHECK_BIT,MAIN_N9
SETB LED_AT ;数据中断
MOV DIS_DATA1,#14 ;E
MOV DIS_DATA2,#26 ;r
MOV DIS_DATA3,#26 ;r
MOV DIS_DATA4,#18
MAIN_N9:
LCALL LGD_SEND ;查询发送
MAIN_N10:
LCALL DELAY
CPL LED
LCALL WARCH_DOG ;喂看门狗
SJMP MAIN
;-------------------------------------------------------
INT0_INT:
JB KEY_HAVE_DO,KEY_NO_DO
SETB KEY_HAVE_DO
KEY_NO_DO:
RETI
;-------------------------------------------
;***********************************************************************************
;OUT_485 BIT P3.3 ;485输出允许-低
;****************************
UART_INT: ;串口中断入口
CLR RI
CLR ES
PUSH ACC
PUSH PSW
;PUSH B
;
LCALL UART_MANAGER
;
;POP B
POP PSW
POP ACC
;JB TR0,IS_ON_DELAY
CLR RI
SETB ES
IS_ON_DELAY:
RETI
;*****************************
;-----------------
UART_SEND: ;发送
;
MOV SBUF,A ;
JNB TI,$ ;
CLR TI ;
RET ;
;奇偶发送;;;;;
;*****************************************
RECEIVE_ONE_BYTE: ;防死循环接收一个字节 ,数据在A,RECEIVE_DATA_ERR 为1超时
MOV RECEIVE_DELAY1,#200 ;4Ms 实际1.3
RE_CHICK_RI:
JNB RI,RECEIVE_OUT_CHECK ;JNB RI,$
CLR RI
MOV A,SBUF
;LCALL PARITY_CHECK ;奇偶校验
;JC RECEIVE_BYTE_ERR
CLR RECEIVE_DATA_ERR
RET
RECEIVE_OUT_CHECK:
MOV RECEIVE_DELAY2,#221 ;100uS 11.0592M(5T)
DJNZ RECEIVE_DELAY2,$
DJNZ RECEIVE_DELAY1,RE_CHICK_RI
RECEIVE_BYTE_ERR:
MOV A,#00H
SETB RECEIVE_DATA_ERR ;接收超时
RET
;********************************************
;****************************************
LGD_SEND: ;发送
CLR OUT_485_EA ;485发
CLR ES
NOP
MOV A,#01H ;01
LCALL UART_SEND
MOV A,#41H ;41
LCALL UART_SEND
MOV A,#0DH ;0D
LCALL UART_SEND
NOP
CLR RI
SETB ES
SETB OUT_485_EA ;485收
SETB LGD_CHECK_BIT
RET
;*******************************************
UART_MANAGER:
MOV A,SBUF
CJNE A,#41H,RECEIVE_ERROR ;41
LCALL RECEIVE_ONE_BYTE
JB RECEIVE_DATA_ERR,RECEIVE_ERROR ;接收超时
CJNE A,#30H,RECEIVE_ERROR ;30
LCALL RECEIVE_ONE_BYTE
JB RECEIVE_DATA_ERR,RECEIVE_ERROR ;接收超时
MOV RECEIVE_DATA_BUF1,A ;D1
LCALL RECEIVE_ONE_BYTE
JB RECEIVE_DATA_ERR,RECEIVE_ERROR ;接收超时
MOV RECEIVE_DATA_BUF2,A ;D2
LCALL RECEIVE_ONE_BYTE
JB RECEIVE_DATA_ERR,RECEIVE_ERROR ;接收超时
MOV RECEIVE_DATA_BUF3,A ;D3
LCALL RECEIVE_ONE_BYTE
JB RECEIVE_DATA_ERR,RECEIVE_ERROR ;接收超时
MOV RECEIVE_DATA_BUF4,A ;D4
LCALL RECEIVE_ONE_BYTE
JB RECEIVE_DATA_ERR,RECEIVE_ERROR ;接收超时
;D5
LCALL RECEIVE_ONE_BYTE ;ALL
JB RECEIVE_DATA_ERR,RECEIVE_ERROR ;接收超时
LCALL RECEIVE_ONE_BYTE ;45
CJNE A,#45H,RECEIVE_ERROR
JB RECEIVE_DATA_ERR,RECEIVE_ERROR ;接收超时
CLR LGD_CHECK_BIT ;接收成功
;
SETB HAVE_DATA_DO ;接收数据要处理
RECEIVE_ERROR:
RET
‘陆’ 单片机程序的一些疑问,请问这条语句是什么功能啊
你贴出来的程序中是没有递增,从语义上来讲这应该是一个计时器,一般需要使用计时器时这个变量应该在定时器中断中递增,所以你到定时器中断函数中看一下这个变量是否有递增操作。
‘柒’ 串口调试助手向单片机发送一串数字,单片机只显示最后一位,该怎么解决
你好!!
你每次串口中断的时候都会 uint m=0;
那你 m++ 还有什么意义,把 uint m=0; 拿到中断的外面;中断结束后 m 清零
还有,别用 while 循环,用 if 判断
‘捌’ 单片机编程(求共阴数码管转换成共阳数码管的程序)
并不用改动段码的数组。
显示一位数字,要改动如下:
P2 = ~0xfe;
P0 = ~tab[buf[0]];
delay(10);
P0 = ~0x00;
看到了吗?改动,就是加上了三个波浪号,即代表取反。
其余三位,都依此类推,即可。
‘玖’ 单片机串口SBUF与数组的问题..
你的A是字符还是十六进制呐?
//假设你单片机想接收的是十六进制的,程序如下
uchar char_count = 0;
if(temp == ',')
{
char_count = 0;
}
else
{
if(temp >= 'a' && temp <= 'f')
{
temp = temp - 'a' + 10;
}
else if(temp >= 'A' && temp <= 'F')
{
temp = temp - 'A' + 10;
}
else if(temp >= '0' && temp <= '9')
{
temp = temp - '0';
}
char_count++;
if(char_count >= 2)
{
temp = buf[--j] * 16 + temp;
}
buf[j++] = temp;
}