导航:首页 > 操作系统 > 单片机buf4

单片机buf4

发布时间:2022-09-21 20:43:55

‘壹’ 单片机编程出现问题 我现在只是让它能实现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;
}

阅读全文

与单片机buf4相关的资料

热点内容
android平滑滚动效果 浏览:841
什么是编译器指令 浏览:219
微控制器逻辑命令使用什么总线 浏览:885
程序员在学校里是学什么的 浏览:601
oraclejava数据类型 浏览:890
程序员考注册会计师 浏览:957
怎么使用access的命令按钮 浏览:899
有点钱app在哪里下载 浏览:832
博途v15解压后无法安装 浏览:205
什么是根服务器主机 浏览:438
安卓手游怎么申请退款 浏览:555
安卓系统如何分享网页 浏览:278
ad如何编译pcb工程 浏览:414
除了滴滴app哪里还能用滴滴 浏览:399
截图怎么保存文件夹然后压缩 浏览:8
幻影服务器怎么样 浏览:28
具体哪些广东公司招程序员 浏览:870
嵌入式编译器教程 浏览:307
ssl数据加密传输 浏览:87
51单片机定时器方式2 浏览:332