導航:首頁 > 操作系統 > 8051單片機控制io介面

8051單片機控制io介面

發布時間:2022-06-28 21:47:49

單片機串口控制io口

需要可以私信我,還有電腦上位機軟體控制單片機

㈡ MCS-51單片機4個I/O口的作用是什麼

4個I/O口的作用是:
第一功能是普通I/O口,其中P0口需外接上拉電阻;
第二功能各不相同,分別為:
P0口:作外部三匯流排的地址匯流排(低8位)/數據匯流排;
P1口:作擴展型晶元的外部引腳,例如52的C/T2外部信號輸入,S52之WDT的報警輸出等;
P2口:作外部三匯流排的地址匯流排(高8位);
P3口:作串口、定時器、外部中斷的輸入/出線,及外部RAM讀寫的控制信號(外部控制匯流排的一部分)。

外部三匯流排是如何分配的:
數據匯流排:P0口;
地址匯流排:P0口,外部地址匯流排(低8位,需鎖存);P2口,外部地址匯流排(高8位);
控制匯流排有:P3.6(外部RAM /WR)、P3.7(外部RAM /RD)、EA、ALE、PSEN等。

㈢ 簡述80c51單片機的i/o口的功能和特點

80C51單片機的引腳及其功能介紹
首先我們來連接一下單片機的引腳圖,如果,具體功能在下面都有介紹。

單片機的40個引腳大致可分為4類:電源、時鍾、控制和I/O引腳。

⒈ 電源: ⑴ VCC - 晶元電源,接+5V;

⑵ VSS - 接地端;

⒉ 時鍾:XTAL1、XTAL2 - 晶體振盪電路反相輸入端和輸出端。

⒊ 控制線:控制線共有4根,

⑴ ALE/PROG:地址鎖存允許/片內EPROM編程脈沖

① ALE功能:用來鎖存P0口送出的低8位地址

② PROG功能:片內有EPROM的晶元,在EPROM編程期間,此引腳輸入編程脈沖。

⑵ PSEN:外ROM讀選通信號。

⑶ RST/VPD:復位/備用電源。

① RST(Reset)功能:復位信號輸入端。

② VPD功能:在Vcc掉電情況下,接備用電源。

⑷ EA/Vpp:內外ROM選擇/片內EPROM編程電源。

① EA功能:內外ROM選擇端。

② Vpp功能:片內有EPROM的晶元,在EPROM編程期間,施加編程電源Vpp。

⒋ I/O線

80C51共有4個8位並行I/O埠:P0、P1、P2、P3口,共32個引腳。P3口還具有第二功能,用於特殊信號輸入輸出和控制信號(屬控制匯流排)。

㈣ 8051單片機的串列口擴展並行IO介面,控制16個發光二極體,2片CD4094並聯,...

/*寫數據到串入並出移位寄存器函數*/

void WR(unsigned char data num2 )
{
unsigned char data count1;

for(count1=0;count1<=7;count1++)
{
if((num2&0x80)==0x80) /*最高位為1,則向SDATA發送1*/
SDATA=1;/*發出數據的最高位*/
else
SDATA=0;
num2<<=1; /*右移位*/
SCLK=0;
_nop_();
_nop_();
SCLK=1; /*產生上生沿*/
}
}

㈤ 51單片機 類似數組調用的方法控制一組IO口 for循環語句控制多個IO口

很簡單的。
用序號0~7,可以對一個 8 位的 IO 口,隨意操作。

iunsigned char num[8]={1, 2, 4, 8, 16, 32, 64, 128};

P2 |= num[3]; //P2.3 = 1

P2 &= ~num[5]; //P2.5 = 0

P2 ^= num[7]; //P2.7 取非

編寫循環程序,也可。

㈥ 8051單片機IO口不夠用,又不想用IO擴展晶元,怎麼辦

使用串列方式驅動液晶只需要3個IO口這是程序
/****************************************************************************/
/***************************12864LCD驅動程序*********************************/
/*****連接關系: ********************************************************/
/**** CS----->PA0 ********************************************************/
/**** SID---->PA1 ********************************************************/
/**** CLK---->PA2 ********************************************************/
/****************************************************************************/
/****創建日期:2009.8.21*****************************************************/
/********作者:孫嘉瑞 *****************************************************/
/****************************************************************************/

#include"LCD12864.H"
#define LCDDELAY Delay_1us(10)
/*向LCD寫一位元組數據*/
void WriteLcdByte( byte date )
{

byte i = 0;
byte temp = 0;
SIDOUT;
CLKOUT;
CSOUT;
LCDDELAY;
for(i = 0;i<8;i++)
{
temp = date&(1<<(7-i));
if(temp)
{
SIDH;
}
else
{
SIDL;
}
CLKL;
LCDDELAY;
CLKH ; //產生上升沿,鎖存數據
LCDDELAY;
}
}
/*從LCD讀取一位元組數據*/
byte ReadLcdByte()
{
byte Ret = 0;
byte i;
SIDIN;
CLKH;
for(i = 0;i < 8;i++)
{

CLKL ; /*產生下降沿,輸出一位數據*/
LCDDELAY;
if(SIDSTA)
{
Ret|=1<<(7-i);
}
else
{
Ret&=~(1<<(7-i));

}
CLKH;
LCDDELAY;
}
return Ret;
}
/*讀忙標志*/
byte BusyCheck(void)
{
byte temp = 0;
byte ldata = 0;
byte hdata = 0;

CSH;
LCDDELAY;
WriteLcdByte(RLCDDAT);
hdata = ReadLcdByte();
ldata = ReadLcdByte();
CSL;
LCDDELAY;
temp = hdata&(1<<7);
return (temp);

}
/*寫LCD命令*/
void WriteComd(byte data)
{
byte ldata = 0;
byte hdata = 0;
while(BusyCheck());
ldata = data<<4; //數據的低四位
hdata = data&0xf0; //數據的高四位
CSL;
LCDDELAY;
CSH;
LCDDELAY;
WriteLcdByte(WLCDCOM);
WriteLcdByte(hdata);
WriteLcdByte(ldata);
CSL;
LCDDELAY;
}
/*寫LCD數據*/
void WriteData( byte data )
{
byte ldata = 0;
byte hdata = 0;
while(BusyCheck());
ldata = data<<4; //數據的低四位
hdata = data&0xf0; //數據的高四位
CSL;
LCDDELAY;
CSH;
LCDDELAY;
WriteLcdByte(WLCDDAT);
WriteLcdByte(hdata);
WriteLcdByte(ldata);
CSL;
LCDDELAY;
}

/*液晶初始化*/
void LcdInit(void)
{

WriteComd(0x30);//0x30
WriteComd(0x04);
WriteComd(0x0C);
WriteComd(0x01);
WriteComd(0x02);
WriteComd(0x80);

}
/*寫入若干位元組*/
void WritenByte(byte *p,byte lengh)
{
while(lengh--)
{
WriteData(*p);
p++;
}
}
/*************************************************/
/*****功能:設定顯示的坐標 ******************/
/*入口參數:row: 1-4 選擇行坐標******************/
/**********line: 1-1選擇列坐標********************/
/*************************************************/
unsigned char LcdSetxy(byte row,byte line)
{

//坐標選擇
if(row>=1&&row<=4&&line>=1&&line<=16)
{
switch(row)
{
case 1: WriteComd(0x80+line-1);break;
case 2: WriteComd(0x90+line-1);break;
case 3: WriteComd(0x88+line-1);break;
case 4: WriteComd(0x98+line-1);break;
}
return 1;
}
else
{
return 0;
}

}

/*************************************************/
/*功能:在液晶的任意位置寫入單個字元******************/
/*入口參數:row : 1-4 選擇要顯示的行**************/
/***********line: 1-16 選擇要顯示的列**************/
/*********** data: 要顯示的字元************/
/*************************************************/
void WriteCode( byte row,byte line,byte data)
{

byte checkerr = 0;
checkerr = LcdSetxy(row, line);
if(checkerr) //坐標正確設定
{
WriteData( data);
}
else //坐標錯誤
{
WriteComd(ClearScreen);
WriteComd(0x80);
WritenByte("坐標輸入錯誤!!",15);
}

}
/*************************************************/
/*功能:在液晶的任意位置寫入字元串******************/
/*入口參數:row : 1-4 選擇要顯示的行**************/
/***********line: 1-16 選擇要顯示的列**************/
/*********** *P: 要顯示的字元串的指針************/
/*************************************************/
void WriteString( byte row,byte line,byte *p)
{

byte checkerr = 0;
byte length = 0;
length = strlen(p); //計算字元串的長度
checkerr = LcdSetxy(row, line);
if(checkerr) //坐標正確設定
{
WritenByte(p, length);
}
else //坐標錯誤
{
WriteComd(ClearScreen);
WriteComd(0x80);
WritenByte("坐標輸入錯誤!!",15);
}

}
/*************************************************/
/*功能:在液晶的任意位置寫入整形數據**************/
/*入口參數:row : 1-4 選擇要顯示的行**************/
/***********line: 1-8 選擇要顯示的列**************/
/*********** num: 要顯示的整形數字***************/
/*************************************************/
void WriteInteger( byte row,byte line, word num )
{
byte checkerr = 0;
byte tab[5];
byte i = 0;
//取出各位數字
tab[0] = num / 10000;
tab[1] = num / 1000 % 10;
tab[2] = num / 100 % 10;
tab[3] = num % 100 / 10;
tab[4] = num % 10;
checkerr = LcdSetxy(row, line);
if(checkerr) //坐標正確設定
{
for(i = 0;i<5;i++)
{
WriteData(tab[i]+48);
}
}
else //坐標錯誤
{
WriteComd(ClearScreen);
WriteComd(0x80);
WritenByte("坐標輸入錯誤!!",15);
}

}
void Dispicture(byte *str)
{

byte i = 0;
byte j = 0;
WriteComd(ClosPict);
for(i = 0;i<32;i++)
{

WriteComd(0x80+i);
WriteComd(0x80);
for(j = 0;j<16;j++)
{
WriteData(str[16*i+j]);
}
}
for(i = 0;i<32;i++)
{

WriteComd(0x80+i);
WriteComd(0x88);
for(j = 0;j<16;j++)
{
WriteData(str[16*32+16*i+j]);
}
}
WriteComd( OpenPict ); //關閉繪圖顯示);

}

㈦ 51單片機io口相連

RXD連接另一片單片機的TXD時可以 即近距離的串口通信時可以,在同一片單片機是不可以的

㈧ 最近來用51的單片機玩玩,為什麼控制不了IO口咯,就是設置輸入輸出,

P0口需要外部上拉,其它直接操作就行。

㈨ 新手關於51單片機的io口問題

你知道P1口比較特殊嗎?它沒有上拉電平,所以在讀入數據時最好先寫入P1=0xFF;才能再寫入數據。而其他埠有上拉電平,所以可以a=P2;
對P1而言,得先P1=0xFF,再a=P1;才是讀入數據

閱讀全文

與8051單片機控制io介面相關的資料

熱點內容
oraclelinux安裝目錄 瀏覽:129
安卓系統可以安裝編譯器嗎 瀏覽:566
javajson實體類 瀏覽:686
板加密鋼筋是否取代原鋼筋 瀏覽:62
學習編程的思路 瀏覽:228
app易語言post怎麼學 瀏覽:963
地梁的箍筋加密區位置 瀏覽:300
二分法排序程序及編譯結果 瀏覽:677
日語命令形和禁止型 瀏覽:283
安裝軟體用管理員解壓 瀏覽:503
編譯原理代碼塊 瀏覽:398
小孩可以用壓縮面膜嗎 瀏覽:12
錐形倒角怎麼計演算法 瀏覽:880
java合並鏈表 瀏覽:505
pic單片機編譯器 瀏覽:803
麗水四軸加工中心編程 瀏覽:689
國產系統怎麼解壓 瀏覽:552
戰雙程序員 瀏覽:483
him觸摸編程軟體 瀏覽:931
植物大戰僵屍存檔怎麼轉移安卓 瀏覽:852