8051单片机(STC89C52)以轮询方式实现串行通信

 8051向笔记本电脑发送0 ~ 15, 且本次发送和前一次发送间间隔一小段时间.

#include <STC89C5xRC.H>

void delay()
{
	int i, j;
	for(i = 0; i < 300; i++)
		for(j = 0; j < 300; j++)
			;
}

void send()
{
	int i;
	for(i = 0; i <= 15; i ++)
	{
		delay();
		SBUF = i;
		while(TI == 0); //等待数据发送完毕
		TI = 0;
	}
}

int main()
{
	TMOD = 0x21; //设定timer1的工作模式
	SCON = 0x50; //设置串行通信格式
	TH1 = 0xE6; //设定timer1的初始值
	TL1 = 0xE6; 
	TR1 = 1; //开启timer1
	while(1)
	{
		send();
	}
	return 0;
}

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
实现这个功能,你可以采用以下步骤: 1. 在两个51单片机之间建立好双机通信的串口协议,确保数据能够正常传输。 2. 连接LCD1602显示屏,并初始化LCD1602。 3. 在单片机中存储学号、姓名和班级等信息。 4. 监测按键事件,当按键被按下时,从单片机中读取学号、姓名和班级等信息,并将其显示在LCD1602上。 具体实现步骤如下: 1. 建立双机通信串口协议,通过串口通信实现双机之间的数据传输。可以使用UART通信协议,设置好波特率、数据位、停止位和校验位等参数。 2. 连接LCD1602显示屏,初始化LCD1602。可以使用4位或8位并行方式,将LCD1602的RS、RW和E引脚连接到单片机的IO口,将LCD1602的数据引脚连接到单片机的IO口,然后通过IO口控制LCD1602的各项功能。 3. 在单片机中存储学号、姓名和班级等信息。可以使用数组或结构体等数据类型,将学号、姓名和班级等信息存储在单片机的内部存储器中。 4. 监测按键事件,当按键被按下时,从单片机中读取学号、姓名和班级等信息,并将其显示在LCD1602上。可以使用中断方式轮询方式来检测按键事件,当检测到按键事件时,从单片机中读取学号、姓名和班级等信息,并将其格式化成字符串格式,然后通过LCD1602显示出来。 示例代码如下: ```c #include <reg51.h> #include <stdio.h> #define LCD_RS P1_0 #define LCD_RW P1_1 #define LCD_E P1_2 #define LCD_D4 P1_3 #define LCD_D5 P1_4 #define LCD_D6 P1_5 #define LCD_D7 P1_6 char *name = "Tom"; char *class = "Class A"; char *id = "123456"; void delay(unsigned int i) { while (i--) { NOP(); } } void lcd_write_cmd(unsigned char cmd) { LCD_RS = 0; LCD_RW = 0; LCD_E = 1; LCD_D7 = (cmd & 0x80) >> 7; LCD_D6 = (cmd & 0x40) >> 6; LCD_D5 = (cmd & 0x20) >> 5; LCD_D4 = (cmd & 0x10) >> 4; LCD_E = 0; delay(5); LCD_E = 1; LCD_D7 = (cmd & 0x08) >> 3; LCD_D6 = (cmd & 0x04) >> 2; LCD_D5 = (cmd & 0x02) >> 1; LCD_D4 = (cmd & 0x01); LCD_E = 0; delay(5); } void lcd_write_data(unsigned char data) { LCD_RS = 1; LCD_RW = 0; LCD_E = 1; LCD_D7 = (data & 0x80) >> 7; LCD_D6 = (data & 0x40) >> 6; LCD_D5 = (data & 0x20) >> 5; LCD_D4 = (data & 0x10) >> 4; LCD_E = 0; delay(5); LCD_E = 1; LCD_D7 = (data & 0x08) >> 3; LCD_D6 = (data & 0x04) >> 2; LCD_D5 = (data & 0x02) >> 1; LCD_D4 = (data & 0x01); LCD_E = 0; delay(5); } void lcd_init() { lcd_write_cmd(0x02); // return home lcd_write_cmd(0x28); // function set lcd_write_cmd(0x0c); // display on, cursor off, blink off lcd_write_cmd(0x06); // entry mode set lcd_write_cmd(0x01); // clear display } void lcd_puts(char *str) { while (*str) { lcd_write_data(*str++); } } void lcd_clear() { lcd_write_cmd(0x01); // clear display delay(100); } void main() { lcd_init(); lcd_clear(); while (1) { if (P3_0 == 0) { // detect key event lcd_clear(); lcd_write_cmd(0x80 | 0x00); // set cursor to first line lcd_puts("ID: "); lcd_puts(id); lcd_write_cmd(0x80 | 0x40); // set cursor to second line lcd_puts("Name: "); lcd_puts(name); lcd_puts(" "); lcd_puts(class); while (P3_0 == 0); // wait for key release } } } ``` 在本示例中,我们使用了P1口来连接LCD1602显示屏的各个引脚,并通过lcd_write_cmd()和lcd_write_data()函数来控制LCD1602的各项功能。在检测到按键事件时,我们通过lcd_puts()函数将学号、姓名和班级等信息直接输出到LCD1602上。需要注意的是,在输出字符串前要先通过lcd_clear()函数清除LCD1602上的内容,以避免上一次输出的内容残留在屏幕上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

好梦成真Kevin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值