当前位置: 首页 > news >正文

积分赛——串口控制指示灯

设计要求

使用套件上提供的USB转串口功能,完成下列程序设计要求。

串口每次收到8位数字0和1构成的字符串,控制单片机上8个LED指示灯的状态,并将收到的这8个数字显示在数码管上。

每一位数字0表示该位指示灯点亮,1表示该位指示灯熄灭。

例如:通过串口助手向设备发送:“10010011”,控制8个LED指示灯L1 - L8的亮灭顺序:灭、亮、亮、灭、亮、亮、灭、灭。

数码管显示格式如下图所示:

备注:

单片机IRC振荡器频率设置为12MHz。

键盘模式:BTN;扩展模式:IO模式

串口波特率:9600bps

上电指示灯均处于熄灭状态。

代码:

other.h

#ifndef __OTHER_H__
#define __OTHER_H__

#include <STC15F2K60S2.H>
extern unsigned char Seg_Buff[8];//数码管显示缓存数组
void init74hc138(unsigned char n);//选通
void init();//系统初始化
void led_uart();//根据缓冲区数值控制LED
void seg_uart(unsigned char *str);//根据接收到的字符串更新数码管缓冲区
void Seg_Loop();//数码管动态刷新

#endif

main.c

#include "other.h"
bit flag_seg=0;
bit flag_uart=0;
unsigned char readstr[8];//用于存储接收到的8位数字字符
unsigned char read_i=0;//接收字符的索引
void Timer0_Init(void)		//100微秒@12.000MHz
{
	AUXR |= 0x80;			//定时器时钟1T模式
	TMOD &= 0xF0;			//设置定时器模式
	TL0 = 0x50;				//设置定时初始值
	TH0 = 0xFB;				//设置定时初始值
	TF0 = 0;				//清除TF0标志
	TR0 = 1;				//定时器0开始计时
	ET0 = 1;				//使能定时器0中断
	EA=1;
}
void UartInit(void)		//9600bps@12.000MHz
{
	SCON = 0x50;		//8位数据,可变波特率
	AUXR |= 0x40;		//定时器时钟1T模式
	AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
	TMOD &= 0x0F;		//设置定时器模式
	TL1 = 0xC7;			//设置定时初始值
	TH1 = 0xFE;			//设置定时初始值
	ET1 = 0;			//禁止定时器中断
	TR1 = 1;			//定时器1开始计时
	ES=1;
	EA=1;
}
void main(){
	init();
	UartInit();
	Timer0_Init();
	while(1){
		if(flag_seg){
			flag_seg=0;
			Seg_Loop();
		}
		if(flag_uart){
			flag_uart=0;
			seg_uart(readstr);
			led_uart();
		}
	}
}
void Timer0_Isr(void) interrupt 1
{
	static unsigned char count1=0;
	count1++;
	if(count1==20){
		flag_seg=1;
		count1=0;
	}
}
void uart() interrupt 4
{
	if(RI){
		RI=0;
		readstr[read_i++]=SBUF;
		if(read_i==8){
			read_i=0;
			flag_uart=1;
		}
	}
}

other.c

#include "other.h"

void init74hc138(unsigned char n){
	P2=(P2&0x1f)|(n<<5);
	P2&=0x1f;
}
void init(){
	P0=0x00;
	init74hc138(5);
	P0=0xff;
	init74hc138(4);
}
void led_uart(){
	unsigned char i;
	EA=0;
	P0=0;
	for(i=0;i<8;i++){
		if(Seg_Buff[i]==1){
			P0|=(1<<i);
		}
	}
	init74hc138(4);
	EA=1;
}

seg.c

#include "other.h"

void init74hc138(unsigned char n){
	P2=(P2&0x1f)|(n<<5);
	P2&=0x1f;
}
void init(){
	P0=0x00;
	init74hc138(5);
	P0=0xff;
	init74hc138(4);
}
void led_uart(){
	unsigned char i;
	EA=0;
	P0=0;
	for(i=0;i<8;i++){
		if(Seg_Buff[i]==1){
			P0|=(1<<i);
		}
	}
	init74hc138(4);
	EA=1;
}

http://www.dtcms.com/a/99577.html

相关文章:

  • MySQL排序详解
  • vue3 响应式系统指南
  • 无人机中继传输数据链技术,(无人机+自组网)远距离传输技术实现详解
  • 大唐杯02 DTM.PX4.016
  • 企业级知识库建设:自建与开源产品集成的全景解析 —— 产品经理、CTO 与 CDO 的深度对话
  • Python基础知识第二天:从格式化到流程控制
  • VSCode Java 单元测试没有运行按钮
  • 代码随想录day2 数组总结
  • 03-SpringBoot3入门-配置文件(自定义配置及读取)
  • Centos 7 搭建 jumpserver 堡垒机
  • Nginx 解决具有不安全、不正确或缺少 SameSite 属性的 Cookie方案
  • IPD流程:科技企业IPD流程培训稿
  • 独立站系统:架构设计、功能实现与用户界面优化
  • 【项目合集】只能xx养殖系统,STM32、esp8266、OLED屏幕、dht11、光敏、水位、加热、风扇
  • STL性能优化实战:如何让C++程序畅快运行
  • 从代码学习数值优化算法 - 分片McCormick放松方法Python版
  • 如何使用postman调用多参数接口(包含文件上传)
  • C++ 中std::vector<T>清除方式
  • win32汇编环境,网络编程入门之十六
  • Reidis介绍
  • 收集的一些问题?
  • SolidJS 深度解析:高性能响应式前端框架
  • 基于SpringBoot的求职招聘网站系统(源码+数据库)
  • 【Spring Boot 与 Spring Cloud 深度 Mape 之十】体系整合、部署运维与进阶展望
  • 排序算法1--插入排序
  • 策略模式_行为型_GOF23
  • 深入理解前端防抖(Debounce)与节流(Throttle):原理、区别与实战示例
  • AWE 2025:当AI科技遇见智能家居
  • 请描述下你对vue生命周期的理解?在created和mounted这两个生命周期中请求数据有什么区别呢?
  • Java面向对象一篇通:从类与对象到Lambda(万字详解)