‘壹’ 单片机串行不能发送数据,求指点。程序如下:
问题很简单,也很多!首先你已经开串口中断也就是ES=1,需要相应的串口中断服务程序,其次ET1不需要51定时器1方式2就是用作串口通信波特率的,最后你定义的unsigned char table [] = {"单片机串行通信"};直接这样发送你不可以的,如果需要发送衫消则汉字建议直接调用stdio标准输入输出库中的printf函数,不过需要重载,或棚你进入while(1)循环中就检测TI是否等于1,问题你之前有没有发送过,TI复位等于0,所以TI永远等不可能等于1,建议多看看书!我把程序稍微给你修改一下,这样就可以了,如果还有问题桥轮可以QQ
#include"reg51.h"
void main()
{
unsigned char table [] = {"01234567"};
unsigned char i,j,k;
SCON = 0x40;
TMOD = 0x20;
TH1 = 0xfa;(波特率是22.1184MHZ吗)
TL1 = 0xfa;
TR1 = 1;
while(1)
{
for(i = 0;i < 7;i++)
{
SBUF = table[i];
while(TI == 0);
TI = 0;
}
}
}
‘贰’ AT89C51单片机怎么用汇编语言让4个数码管同时显示1234
1、首先我们先打开keil。
‘叁’ 单片机C语言一程序问题
while(!input)
{
DataPort=dofly_WeiMa[i]; 这部分带有松手检测 如果按键按下 因为单片机速度很快 刚开始i是位0的 但是因为有松手检测 所以可能i++好几下了 然后你松败悔后了之后 退出松手检测 那么你显示的值当然就是跳跃的啦
LATCH2=1;
LATCH2=0;
DataPort=dofly_DuanMa[i];就说这里吧 第一薯野次i=0,因为松手检测 后面的i++了 当你按键放开了后 你的i假设++到了5 那么这里就是DataPort=dofly_DuanMa[5];但是这是随机的 因为谁也不知道你什么时候松手 你不松手 那么i就一直++ 然后到8 变为零
说白了 就是数枯喊你的松手检测和显示没做好
LATCH1=1;
LATCH1=0;
i=i+1;
if(i==8)
{
i=0;
}
}
‘肆’ at89c51单片机驱动8个数码管滚动显示数字,要求8个数码管同时显示。我看到的是8个数码管全灭!!!
题目的要求是什么?
要求8个数码管同时显示。
让数码管依次显示0~7这8个数字,
8个数裤洞码管滚动显示数字,
是先显示1秒钟01234567,之后再显示70123456,1秒钟之后,再显示67012345,...吗?
楼主的程序,现启纯歼在是显示出来什么了?
========
电路图有明显错误。
看程序中的段码,应该使用共阳的数码管,即,数码管的公共端,应该接高电平。
但是,电路中,却经过三极管,接地了。悄冲
‘伍’ 教程上的一段单片机程序,有bug,有时候总按出0来,不知道怎么回事,大神帮忙具体分析下~
程序BUG是你子函数内部没有返回数值;
unsigned char KeyScan(void) //函数的正确使用方法
{
return (); //郑消返回数据
}
你的程序写的效率不高我给你改一下。
程序我给你改了一下:
unsigned char KeyScan(void)
{
unsigned char keyvalue;
if(KeyPort!=0xff)
{
delayms(10);//延时10ms后再漏丛枝检测一次
if(KeyPort!=0xff)
{
keyvalue=KeyPort;//此是本程序的BUG P1口的值 在松手前获得 但松手后又无法获得 朋友们可以考虑一下解决方法
while(KeyPort!=0xff);
}
}
switch(keyvalue)
{
case 0xfe:return 1;break;//比较keyvalue是否=0xfe 如相等 返回 值1
case 0xfd:return 2;break;
case 0xfb:return 3;break;
case 0xf7:return 4;break;
case 0xef:return 5;break;
case 0xdf:return 6;break;
case 0xbf:return 7;break;
case 0x7f:return 8;break;
default:return 0;break;
}
return (keyvalue); //返敏返回按键数值
}
‘陆’ 51单片机编程 采用中断方式循环发送一组字符
;启动入口
ORG 0000H ;复位启动
LJMP START ;
ORG 0023H ;串口中断
LJMP COM1 ;
ORG 0200H ;主控程序
;
;主控程序
START: MOV SCON,#50H ;8位数据,可变波特率[email protected]
ANL PCON,#7FH ;波特率不倍速
MOV TMOD,#20H ;定时器1工作于方式2
MOV TL1,#0FDH ;设定定时初值
MOV TH1,#0FDH ;设定定时器重装值
;
MOV SP,#80H ;设置堆栈
SETB TR1 ;启动定时器1
CLR ET1 ;禁止定缓知时器1中断
SETB ES ;允许串口中断
SETB EA ;允许总中断
;
MOV R0,SDAT00 ;收发数据首地址
MOV B,#8 ;8字节数据
MOV A,#30H ;'0'
LOOP: MOV @R0,A ;
INC A ;
INC R0 ;
DJNZ B,LOOP ;装填‘01234567’
;
MOV FSQZZ,#61H ;串口发送指针
MOV SBUF,#0 ;启动发送
JMP $
;
;串行口中断服务程序(9600波特率1起始位8数据位1停止位无校验)
COM1: PUSH PSW ;先行保护现场,9600bps
PUSH ACC ;
MOV PSW,#10H ;选2组R寄存器
;
JBC TI,PDZZ ;发送中断
CLR RI ;接收中断
LJMP QCOM ;
;
PDZZ: MOV R0,FSQZZ ;串口发送指灶陪针
CJNE R0,#SDATDN,WBUF ;比较下越界值
MOV FSQZZ,#60H ;串口隐哪蠢发送指针
;
WBUF: MOV SBUF,@R0 ;发送当前字节
INC FSQZZ ;发送指针+1
;
QCOM: POP ACC ;恢复现场
POP PSW ;
RETI ;
;
;收发缓冲区
SDATUP EQU 5FH ;数据地址上越界值
SDAT00 EQU 60H ;收发数据首地址
SDAT11 EQU 67H ;收发数据尾地址
SDATDN EQU 68H ;数据地址下越界值
FSQZZ EQU 69H ;串口发送指针
END ;
‘柒’ 单片机8个流水灯程序 要求:间隔0.5秒流水灯一次(01234567) 两盏流水一次(01,23,45,67) 闪亮一次(8盏灯亮灭
#include<reg51>
#define uchar unsigned char
#define uint unsigned int
void delay(uchar t)
{
uchar x;
for(x=0;x<t;x++)
{
TH0=0x3c;
TL0=0xb0;
TR0=1;
while(!TF0);
TF0=0;
}
}
uchar code display[]={0x03,0x06,0x60};
uchar k,m;
void main()
{
while(1)
{
TMOD=0x01;
for(m=0;m<3;m++)
{ P1= display[k];
delay(10);
}
}
顺手写的觉得好就采纳吧
‘捌’ LED数码管动态显示2017的51单片机汇编语言
共阳极接法。
abcdefg 为 P0 口,位选端为 P2 口。
八个数码管同掘孝时显示 01234567。判没稿
电路与程察核序,如下所示:
‘玖’ 单片机编程
上个提问电脑不能回复了,在这里发程序。
#include<reg51.h>
unsigned char code distab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char disbuf[]={0,1,2,3};
unsigned char t0n; //定时器中断次数
void delay()
{
unsigned int j;
for(j=300;j>0;j--);
}
//显示子程序
void display()
{
unsigned char j,disbit=0x01;
for(j=0;j<4;j++)
{
P2=~disbit;
P0=distab[disbuf[j]];
disbit<<=1;
delay();
}
}
void main()
{
unsigned char n=3;
TMOD=0x01;
TH0 =0x3C;//晶振12M,定时50ms
TL0 =0xB0;
IE =0x82;
TR0 =1;
while(1)
{
display();
if(t0n>=20)/缓悔仔/1秒到
{
t0n=0;
n++;
if(n>7)
n=0;
disbuf[0]=disbuf[1];//显示的四位数向前搭左移一位扰汪
disbuf[1]=disbuf[2];
disbuf[2]=disbuf[3];
disbuf[3]=n;
}
}
}
//定时器T0中断服务程序
void T0_isr() interrupt 1
{
TH0 =0x3C;
TL0 =0xB0;
t0n++;
}