想要看就干脆看个明白从非定时转定时代码基本一样。 #include "reg52.h" unsigned char code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0,64}; //共阴0~F消隐减号 sbit k1=P3^4; sbit k2=P3^5; sbit k3=P3^6; sbit k4=P3^7; bit k=0,kk=0; void CKF(unsigned char C) {//向串口发送数据 SBUF=C; while(!TI); TI=0; } void CKS() interrupt 4 {//串口接收数据 if(RI) { RI=0; if(SBUF=='S'){k=1;kk=0;} if(SBUF=='X'){k=0;kk=1;} if(SBUF=='L'){k=kk=0;} } } void CKSZ() { SCON=0X50;//串口模式1允许接收 TMOD=0X20;//T1工作模式2 PCON=0X00;//波特率不倍增 TH1=TL1=0XFD;//波特率9600 TI=RI=0; TR1=1; IE=0X90;//允许串口中断 } void main() {//缘由https://ask.csdn.net/questions/8117223 unsigned char Xd=0,ls=0,ys=0,sy=0,sm=0; CKSZ(); while(1) { if(++ys==0) { if(++sy==0) { if(k) { if(ls)ls*=2;else ls=1; if(sm<9)++sm;else sm=0; } if(kk) { if(ls)ls/=2;else ls=128; if(sm)--sm;else sm=9; } if(k==kk)ls=k; } P1=ls;//流水灯 P2=smgduan[sm];//静态数码管 } if(!k1&&!++Xd) { CKF('S'); while(!k1); } if(!k2&&!++Xd) { CKF('X'); while(!k2); } if(!k3&&!++Xd) { CKF('L'); while(!k3); } } } https://blog.csdn.net/xianfajushi/article/details/139620581 |
void CKSZ() { SCON=0X50;//串口模式1允许接收 TMOD=0X21;//T1工作模式2 PCON=0X00;//波特率不倍增 TH1=TL1=0XFD;//波特率9600 TI=RI=0; TR1=1; IE=0X90;//允许串口中断 TH0+=0Xdc;//定时器赋初值,定时10ms触发中断,自动补偿方式 TL0+=0X00; TR0=1; //启动定时器T0。 ET0=1; //开启定时器 EA=1; //全局中断开关 } void ZhongDuan() interrupt 1 { ++Js; TH0+=0Xdc; TL0+=0X00; } ———————————————— 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 原文链接:https://blog.csdn.net/xianfajushi/article/details/139632525 |
jiesz185 发表于 2024-5-27 14:31 流水灯程序不要放在U1,U1只负责发送按键信息,流水灯程序由U2负责。 |
第一个ic发送控制信息 0x01 0x02 第二个ic收到后执行 定时器里设定1秒标志位 用for循环 |
就两个状态,用啥串口啊,两个脚各自表示一个状态就行了啊。把两个按键传递到P30和P31就行了吧 |
![]() |
这是两码事。 两机串行通讯,只要开启双方的串行中断,通讯时,约几ms中断一次,完成一个字节的交流。 流水闪烁中人用定时器,每间隔1S处理一下显示就行了。 |
U1发送按键标志码,U2接收标志码,定时器+流水灯。各个击破,难度不大。 |
用的Proteus仿真的 |