㈠ 51單片機如何讓兩個中斷交替進行
不用交替進行,你只要設定中斷的優先順序就可以了.
或者,你把兩個定時器交換一下功能,也不用設優先順序了.
㈡ 51單片機 串口程序
void
main()
{
scon
=
0x50;
tmod
=
0x20;
//設置定時器1為工作方式2
th1
=
0xf4;
tl1
=
0xf4;
tr1
=
1;
ea
=
1;
es
=
1;
while(1)
{
if(flag)
{
flag
=
0;
//不關閉串口中斷,要讓它繼續接收
num1++;
//超過255,自動就是0
sbuf
=
num1;
while(!ti);
ti
=
0;
sbuf
=
a;
while(!ti);
ti
=
0;
}
}
}
void
ser()
interrupt
4
{
if
(ri)
{
ri
=
0;
a
=
sbuf;
flag
=
1;
}
}
㈢ 51單片機 C語言 串口數組賦值問題
貼上來的程序部分,修改如下:
#include<reg52.h>
#include<stdio.h> //列印到串口函數
#define uchar unsigned char
#define uint unsigned int
uchar date_zi[4][11]; //存放接收到的數據
uint i_index=0; //接收到的字元個數
uint i=0; //i字元用於循環
unsigned int xia = 0; //用於保存到數據的下標
void fh_zi(uchar a) //返回字元到串口
{
ES=0;
SBUF=a;
while(!TI);
TI=0;
ES=1;
}
void init()
{
TMOD=0x20;
TH1=0xfd;
TL1=0Xfd;
//TH0=(65536-45872)/256;
//TL0=(65536-45872)%256;
TR1=1;
SM0=0;
SM1=1;
REN=1;
EA=1;
ES=1;
}
void main()
{
i_index=0;
xia=2;
init();
while(1);
}
void ser() interrupt 4 //串口
{
if(RI == 1)
{
RI=0;
date_zi[xia][i_index] = SBUF;
i_index++;
if(i_index>10) //接受完10個字元後顯示數組所有內容
{
i_index=0;
for(i=0;i<11;i++) //顯示數組中所有內容
fh_zi(date_zi[0][i]);
for(i=0;i<11;i++)
fh_zi(date_zi[1][i]);
for(i=0;i<11;i++)
fh_zi(date_zi[2][i]);
for(i=0;i<11;i++)
fh_zi(date_zi[3][i]);
}
}
}
㈣ 51單片機串口中斷函數響應並返回後主函數運行到末尾後卡著不動,主函數無法循環了
有幾個問題和樓主探討一下:
1、main主程序中少一條while(1)或for(;;)的循環,運行後主程序應該是「跑飛」了;
2、中斷返回貌似不需要加return;
3、串口初始化不知道時候正常,是否和上位機設置了1樣的波特率;
㈤ 51單片機與計算機串口通信無法讀出數據
答:
1 判斷你的硬體有沒有問題;方法是 用跳線講串口的pin2 和pin3短接,用串口調試助手發送數據看調試助手能不 能自己收到,能就說明是單片機程序有問題
2 你檢查你的波特率是生成程序是否正確, 中斷和主程序用 1樓給你程序,我看了 沒問題。
這樣就可以實現串口通信了
㈥ 51單片機 串口發送程序
void ser()interrupt 4
{
if(TI)
{
TI=0;
flag=1;
}
}
至於P1=0xff;是因為P1作為輸入口,讀數據前先送高,以保證讀數的穩定可靠。
㈦ 51單片機如何對接收的字元串進行判斷
對從s開始直到下一個s(如果有的話,沒有則設置命令超時)為止的字元串求CRC,然後switch case
一直都是這么做,串口中斷只管接收,不必分析數據格式,如果串格式定長,那更好辦了。。。
㈧ 大神快來解釋下面51單片機程序的意思呀,著急啊,看了一個下午了
4hc595是串列輸入8位並行輸出移位寄存器
SER應該是位變數,只能是0和1,即595的串列數據輸入端
如果dat的最高位是1,那麼右移7位後得到SER是1
如果dat的最高位是0,那麼右移7位後得到SER是0
由於發送時高位在前,所以每發送一次dat要左移1位,把次高位往最高位推,循環8次即把8位數據全發送出去了
如果dat=0xfe,則循環8次後 Q7Q6....Q0=0xfe
㈨ 51單片機定時和串口沖突
T0中斷太頻繁了,因為同級中斷,T0優先,所以總搶佔中斷,串口被邊緣話了。修改一下程序:
voidtimer_init()
{
TMOD=0x22;
SCON=0X50;
TH1=0xfd;
TL1=0xfd;
TR1=1;
TH0=246;
TL0=246;
ET0=1;
TR0=1;
ES=1;
EA=1;
PS=1;
}
voidtimer0_int()interrupt1
{
time++;
if(time<50) //count為占空比
{
PWM=1; //輸出高電平
}
else
PWM=0;
if(time>=100)
{
time=0;
}
}
voidser()interrupt4
{
if(RI)
{
RI=0;
Re_buf[counter]=SBUF;
if(counter==0&&Re_buf[0]!=0x55)return;//第0號數據不是幀頭
counter++;
if(counter==11)//接收到11個數據
{
counter=0;//重新賦值,准備下一幀數據的接收
switch(Re_buf[1])
{
case0x53:
ucStrAngle[0]=Re_buf[2];
ucStrAngle[1]=Re_buf[3];
ucStrAngle[2]=Re_buf[4];
ucStrAngle[3]=Re_buf[5];
ucStrAngle[4]=Re_buf[6];
ucStrAngle[5]=Re_buf[7];
break;
}
}
}
Vax=((short)(ucStrAngle[1]<<8|ucStrAngle[0]))/32768.0*180;
if(Vax>0)
{
x=1;
xx=0;
}
elseif(Vax<=0)
{
x=0;
xx=1;
}
}