设计要求
使用套件上提供的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;
}