MOV AL, 00H 全零
OUT DX, AL输出出去
MOV AL, 0FFH 全一
OUT DX, AL输出唯瞎出去
MOV AL, 00H 全零
OUT DX, AL输出出去
MOV AL, 0FFH 全一
OUT DX, AL输出出去
HLT
按照这个方法,外接的 LED 一定会亮灭闪烁。
应该单步执行。
如果连续执行,速度太快,就看不出来指吵空了。
用普通 I/O 口也可以模拟标准 UART 串行口,进行串行通信。帧
UART 通信规范是以 8 位二进制数为一帧,低位在前,逐位的传输。
为了区分各个帧,在每一帧之前,要有一个 0 作为起始标记,之后,有一个 1,作为结束符。
在结束符改肆之前,还可选发一个“校验位”游歼桥,但是,目前多数的应用都不选择这个位。
那么,每次的串行通信,就是传送一个字节,加上前后的标记,共 10 位二进制数。
空闲时,发送的都是 1;一旦出现了 0,就说明开始传输数据了。
波特率
串行通信的一个重要指标就是传输速度,就是每秒传送了多少位二进制数。
这个速度称为波特率,单位是 bps,中文就是“位/秒”。
时间设定
当以 9600bps 来传送数据时,每一位数的持续时间是 (1/9600)s,这也就是间隔时间。
如果选用晶振频率是 11059200Hz,一个机器周期T的时间就是 (12/11059200)s
那么,一位数的持续时间 (1/9600)s,是多少个机器周期T呢 ?
这是很容易算的,就是下面的这个算式:
X = (1/9600) / (12/11059200) = 11059200 / 12 / 9600 = 96T
为了精确定时,可以利用定时器来定时,每当 96T 时间到了,就发送出去一位二进制数,这就行了。
实验程序
用 IO 口模拟串口输出的程序如下:
#include<reg52.h>
sbit TXD1 = P2^0//用IO口模拟串口发送端
sbit RXD1 = P2^1//用IO口模拟串口接收端
bit T96 //位变量
//----------------------------------------
void Wait96(void) //延时,控制波特率
{
while(T96) //等待出现0
T96 = 1 //清标志
}
//----------------------------------------
void WByte(char x)//发送一帧数神猛据
{
char i
TL0 = 160 //初值=256-96=160
TXD1 = 0//发送起始位0
TR0 = 1 //启动定时器
Wait96()//等待96T
for (i = 0i <8i++) { //8位数
TXD1 = x &1 //先传低位
x >>= 1
Wait96() //等待96T
}
TXD1 = 1//发送结束位1
Wait96()//等待96T
TR0 = 0 //关闭定时器
}
//----------------------------------------
void main()
{
char i
TMOD = 0x02 //T0定时方式2
TH0 = 160 //初值=256-96=160
IE = 0x82
T96 = 1 //清标志
while(1) {
for (i = 0x41i <0x5bi++) //A~Z
WByte(i)
WByte(0x0D)
WByte(0x0A)
}
}
//----------------------------------------
void inttime0() interrupt 1 //T0中断
{
T96 = 0 //设置标志
}
//----------------------------------------
AT89C51是一种常见的8位单片机,可以用来控制各种不同的外设,包括IO口。下面是使用AT89C51控制IO口的基本步骤:
定义和初始化端口:在程序中,需要先定义要控制的漏芹端口,然后初始化端口的输入/输出状态。例如,如果要使用P1端口,可以在程序的开头添加以下代码:
控制端口状态:可以使用语句来控制端口的状态。例如,如果要将P1.0口设置为高电平,可以使用以下代码:
等待一段时间:为了保证IO口能够正确地工作,茄唤有时候需要在控制端口状态后等待一段时间。例如,如果要让LED闪烁,可以使用以下代码:
这是一个简单的闪烁程序,它使用delay函数等待1秒钟。在实际编程中,delay函数可以使用定时器来实现更精确的控制。
以上是使用AT89C51控制IO口的基本步骤,可以根据具体应用进行进一步的开发颤搜凯和调试。注意,在编程时需要遵循AT89C51的相关规范和注意事项。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)