stc15f2k60s2:串口通信,用串口调试助手发送字符串,需发文本模式, 指令1 电脑端发送“数码管显示123” DIS2数码管显示123 ,(123为任意3位内的数字)电脑端接收到“已执行123”。 指令2 电脑端发送“关闭数码管” 所有数码管全灭灯 ,同时电脑端接收到“已执行”。
时间: 2024-03-24 11:40:02 浏览: 51
串口助手,可以打开串口发送接收信息
以下是stc15f2k60s2的串口通信代码:
```c
#include <REG51.H>
#define FOSC 11059200L
#define BAUD 9600
#define TIMER_1MS (65536-FOSC/12/1000)
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit beep=P2^5;
unsigned char code table[]={
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
0x80,0x90,0xBF,0x8E,0xC6,0xA1,0x86,0x8C
}; // 共阴数码管0~9,A~F显示段码值
volatile unsigned int ms_count = 0;
void delay(unsigned int x)
{
while(x--);
}
void Timer0Init()
{
TMOD|=0x01; // Timer0工作在模式1:16位定时器
TH0=(65536-BAUD*12/16/100)/256; // Timer0初值
TL0=(65536-BAUD*12/16/100)%256;
ET0=1; // 允许Timer0中断
TR0=1; // 启动Timer0
}
void Timer1Init()
{
TMOD|=0x10; // Timer1工作在模式1:16位定时器
TH1=TIMER_1MS/256; // Timer1初值
TL1=TIMER_1MS%256;
ET1=1; // 允许Timer1中断
TR1=1; // 启动Timer1
}
void UartInit()
{
SCON=0x50; // 串口工作在模式1:8位异步收发,波特率可变
TMOD&=0x0F; // Timer1工作在16位自动重载模式
TMOD|=0x20;
TH1=0xFD; // 波特率9600
TL1=0xFD;
TR1=1; // 启动Timer1
ES=1; // 允许串口中断
}
void display(unsigned char n)
{
unsigned char i;
unsigned char a[8];
a[0]=table[n/1000%10];
a[1]=table[n/100%10];
a[2]=table[n/10%10];
a[3]=table[n%10];
a[4]=0x00;
a[5]=0x00;
a[6]=0x00;
a[7]=0x00;
for(i=0;i<8;i++)
{
switch(i) // 在四个数码管中循环显示
{
case(0):
LSA=0; LSB=0; LSC=0; break; // 显示第0位
case(1):
LSA=1; LSB=0; LSC=0; break; // 显示第1位
case(2):
LSA=0; LSB=1; LSC=0; break; // 显示第2位
case(3):
LSA=1; LSB=1; LSC=0; break; // 显示第3位
case(4):
LSA=0; LSB=0; LSC=1; break; // 显示第4位
case(5):
LSA=1; LSB=0; LSC=1; break; // 显示第5位
case(6):
LSA=0; LSB=1; LSC=1; break; // 显示第6位
case(7):
LSA=1; LSB=1; LSC=1; break; // 显示第7位
}
P0=a[i]; // 在当前数码管中显示当前数字
delay(100); // 消除闪烁
P0=0x00; // 关闭当前数码管
}
}
void main()
{
UartInit();
Timer0Init();
Timer1Init();
while(1);
}
void Uart() interrupt 4 // 串口中断服务程序
{
unsigned char c;
if(RI) // 接收到数据
{
RI=0; // 清除接收中断标志
c=SBUF; // 获取接收到的数据
if(c=='数') // 收到指令1
{
while(!TI); // 等待上一次发送完成
TI=0; // 清除发送中断标志
SBUF='已'; // 发送“已执行”
display(123); // 显示123
}
else if(c=='关') // 收到指令2
{
while(!TI); // 等待上一次发送完成
TI=0; // 清除发送中断标志
SBUF='已'; // 发送“已执行”
P0=0x00; // 关闭所有数码管
}
}
if(TI) // 发送完成
{
TI=0; // 清除发送中断标志
}
}
void Timer0() interrupt 1 // 定时器0中断服务程序
{
TH0=(65536-BAUD*12/16/100)/256; // Timer0初值
TL0=(65536-BAUD*12/16/100)%256;
ms_count++; // 记录毫秒数
if(ms_count==2000) // 2秒后重置
{
ms_count=0;
P0=0x00; // 关闭所有数码管
}
}
void Timer1() interrupt 3 // 定时器1中断服务程序
{
TH1=TIMER_1MS/256; // Timer1初值
TL1=TIMER_1MS%256;
}
```
注意:此代码仅供参考,实际应用中还需要根据具体硬件环境进行调整。
阅读全文