stc15f2k60s2开启串口通信后,影响了数码管显示是为什么
时间: 2024-03-19 18:40:31 浏览: 132
可能是因为stc15f2k60s2芯片的串口通信引脚与数码管的引脚冲突了。stc15f2k60s2芯片的串口通信需要使用其中的几个引脚,如果这些引脚与数码管的引脚重复使用了,就会影响数码管的显示。此外,如果串口的数据输出频率过高,也可能会对数码管的显示造成影响。建议检查一下引脚的使用情况,调整串口的数据输出频率。
相关问题
用stc15f2k60s2的串口2接受一个两位数并显示在数码管上
好的,我可以为您提供一份简单的代码实现。请确保数码管和STC15F2K60S2的串口2正确连接。以下是代码示例:
```
#include <STC15F2K60S2.H>
#include <intrins.h>
#define DIG P0
sbit D1 = P1^0;
sbit D2 = P1^1;
void init_serial()
{
S2CON = 0x50;
T2L = 0xE0;
T2H = 0xFE;
RCAP2L = 0xE0;
RCAP2H = 0xFE;
TR2 = 1;
EA = 1;
ES = 1;
}
void send_data(unsigned char dat)
{
S2BUF = dat;
while(!TI);
TI = 0;
}
unsigned char receive_data()
{
while(!RI);
RI = 0;
return S2BUF;
}
void display(unsigned char num)
{
unsigned char shi, ge;
shi = num / 10;
ge = num % 10;
D1 = 0;
DIG = 0x7F; //关闭数码管
D2 = 1;
DIG = shi; //显示十位数
_nop_();
_nop_();
D2 = 0;
DIG = 0x7F; //关闭数码管
D1 = 1;
DIG = ge; //显示个位数
_nop_();
_nop_();
D1 = 0;
DIG = 0x7F; //关闭数码管
}
void main()
{
unsigned char num;
init_serial();
while(1)
{
num = receive_data(); //接收数据
display(num); //显示数据
}
}
```
在上面的代码中,我们使用串口2接收一个两位数并将其显示在数码管上。请注意,在本示例中,我们使用P1.0和P1.1来控制数码管的两个数字位。
希望这可以帮助您开始实现您的项目。如果您有任何问题,请随时问我。
stc15f2k60s2:串口通信,用串口调试助手发送字符串,需发文本模式, 指令1 电脑端发送“数码管显示123” DIS2数码管显示123 ,(123为任意3位内的数字)电脑端接收到“已执行123”。 指令2 电脑端发送“关闭数码管” 所有数码管全灭灯 ,同时电脑端接收到“已执行”。
以下是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;
}
```
注意:此代码仅供参考,实际应用中还需要根据具体硬件环境进行调整。
阅读全文