㈠ 单片机串口控制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;才是读入数据