- 打卡等级:常住居民II
- 打卡总天数:95
- 最近打卡:2025-10-02 07:43:14
已绑定手机
中级会员
- 积分
- 239
|
#include <reg52.h>
#include <intrins.h>
#define FOSC 11059200L // 晶振频率
#define BAUD 9600 // 波特率
/* 串口初始化函数 */
void UART_Init(void)
{
SCON = 0x50; // 8位数据,可变波特率
TMOD &= 0x0F; // 清除定时器1模式位
TMOD |= 0x20; // 设定定时器1为8位自动重装方式
TL1 = 0xFD; // 设定定时初值
TH1 = 0xFD; // 设定定时器重装值
ET1 = 0; // 禁止定时器1中断
TR1 = 1; // 启动定时器1
EA = 1; // 开启总中断
ES = 1; // 开启串口中断
}
/* 主函数 */
void main(void)
{
UART_Init();
P0 = 0xFF; // 初始化P0口,LED全灭
P1 = 0xFF; // 初始化P1口,LED全灭
while(1)
{
// 主循环保持空转,等待串口中断
}
}
/* 串口中断服务函数 */
void UART_Isr(void) interrupt 4
{
unsigned char received_char;
if (RI)
{
RI = 0; // 清除接收中断标志位
received_char = SBUF; // 读取接收到的字符
// 直接在中断函数中处理,避免函数调用问题
if(received_char >= '0' && received_char <= '9')
{
unsigned char led_index = received_char - '0';
if(led_index < 8)
{
P0 ^= (1 << led_index); // 翻转P0口的LED
}
else
{
P1 ^= (1 << (led_index - 8)); // 翻转P1口的LED
}
}
else if(received_char >= 'A' && received_char <= 'F')
{
unsigned char led_index = received_char - 'A' + 10;
P1 ^= (1 << (led_index - 8)); // 翻转P1口的LED
}
else if(received_char >= 'a' && received_char <= 'f')
{
unsigned char led_index = received_char - 'a' + 10;
P1 ^= (1 << (led_index - 8)); // 翻转P1口的LED
}
}
}
这是一个串口控制IO口的引脚,单片机型号为STC89C52
当串口发送01,02,03,04,05,06,07,08,09,0A,0B,0C,0D,0E,0F是分别控制了P0.1-0.7,P1.0-1.6的IO口翻转,当串口发送10时,P1.7IO口应该翻转的,但是单片机没有任何反应
求各位大神给一个代码能够实现当串口发送01,02,03,04,05,06,07,08,09,0A,0B,0C,0D,0E,0F,10,11,12,13,14,15,16,17,18
分别控制P0,P1,P2口的24个IO口状态翻转
|
|