『壹』 單片機串列不能發送數據,求指點。程序如下:
問題很簡單,也很多!首先你已經開串口中斷也就是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++;
}