返回信息流“#include <REG51.H>
#define uchar unsigned char
#define uint unsigned int
uchar code SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar code ACT[4]={0xfe,0xfd,0xfb,0xf7};
/***********************************************************/
sbit D0=P1^0;
sbit D1=P1^1;
sbit D2=P1^2;
sbit D3=P1^3;
sbit D4=P1^4;
sbit D5=P1^5;
sbit D6=P1^6;
sbit D7=P1^7;
#define ON 0
#define OFF 1
uchar a[2];
uchar cnt;
bit outflag;
/****************************************/
void delay(uint k)
{
uint data i,j;
for(i=0;i<k;i++)
{
for(j=0;j<121;j++){;}
}
}
/**************************************/
void init(void)
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
SCON=0x50;
TR1=1;
ES=1;
EA=1;
}
/****************************************/
void main(void)
{
init();
while(1)
{
P0=SEG7[a[0]];P2=ACT[2];delay(1);
P0=SEG7[a[1]];P2=ACT[0];delay(1);
if(outflag==1)
{
switch(a[0])
{
case 1:if(a[1]==1)D0=ON;else D0=OFF;break;
case 2:if(a[1]==1)D1=ON;else D1=OFF;break;
case 3:if(a[1]==1)D2=ON;else D2=OFF;break;
case 4:if(a[1]==1)D3=ON;else D3=OFF;break;
case 5:if(a[1]==1)D4=ON;else D4=OFF;break;
case 6:if(a[1]==1)D5=ON;else D5=OFF;break;
case 7:if(a[1]==1)D6=ON;else D6=OFF;break;
case 8:if(a[1]==1)D7=ON;else D7=OFF;break;
default:break;
}
outflag=0;
}
}
}
/******************************************/
void serial_serve(void) interrupt 4
{
uchar temp;
RI=0;
EA=0;
temp=SBUF;
switch(cnt)
{
case 0:if(temp=='#')cnt=1;else outflag=0;break;
case 1:if((temp>0x30)&&(temp<0x39)){a[0]=temp-0x30;cnt=2;}else outflag=0;break;
case 2:if(temp=='(')cnt=3;else outflag=0;break;
case 3:if((temp>=0x30)&&(temp<=0x38)){a[1]=temp-0x30;cnt=4;}else outflag=0;break;
case 4:if(temp==')'){cnt=0;outflag=1;}else outflag=0;break;
default:break;
}
EA=1;
}
”发送失败。 重新发送
emulate the deserv(343557513) 13:25:56
#include <REG51.H>
#define uchar unsigned char
#define uint unsigned int
uchar code SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar code ACT[4]={0xfe,0xfd,0xfb,0xf7};
/***********************************************************/
sbit D0=P1^0;
sbit D1=P1^1;
sbit D2=P1^2;
sbit D3=P1^3;
sbit D4=P1^4;
sbit D5=P1^5;
sbit D6=P1^6;
sbit D7=P1^7;
#define ON 0
#define OFF 1
uchar a[2];
uchar cnt;
bit outflag;
/****************************************/
void delay(uint k)
{
uint data i,j;
for(i=0;i<k;i++)
{
for(j=0;j<121;j++){;}
}
}
/**************************************/
void init(void)
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
SCON=0x50;
TR1=1;
ES=1;
EA=1;
}
/****************************************/
void main(void)
{
init();
while(1)
{
P0=SEG7[a[0]];P2=ACT[2];delay(1);
P0=SEG7[a[1]];P2=ACT[0];delay(1);
if(outflag==1)
{
switch(a[0])
{
case 1:if(a[1]==1)D0=ON;else D0=OFF;break;
case 2:if(a[1]==1)D1=ON;else D1=OFF;break;
case 3:if(a[1]==1)D2=ON;else D2=OFF;break;
case 4:if(a[1]==1)D3=ON;else D3=OFF;break;
case 5:if(a[1]==1)D4=ON;else D4=OFF;break;
case 6:if(a[1]==1)D5=ON;else D5=OFF;break;
case 7:if(a[1]==1)D6=ON;else D6=OFF;break;
case 8:if(a[1]==1)D7=ON;else D7=OFF;break;
default:break;
}
outflag=0;
}
}
}
/******************************************/
void serial_serve(void) interrupt 4
{
uchar temp;
RI=0;
EA=0;
temp=SBUF;
switch(cnt)
{
case 0:if(temp=='#')cnt=1;else outflag=0;break;
case 1:if((temp>0x30)&&(temp<0x39)){a[0]=temp-0x30;cnt=2;}else outflag=0;break;
case 2:if(temp=='(')cnt=3;else outflag=0;break;
case 3:if((temp>=0x30)&&(temp<=0x38)){a[1]=temp-0x30;cnt=4;}else outflag=0;break;
case 4:if(temp==')'){cnt=0;outflag=1;}else outflag=0;break;
default:break;
}
EA=1;
}
这段程序中,cnt是做什么用的?a[]又是怎么用的?通过串口助手,输入进去字符,相当于输入给哪个变量的呢?
这段程序,书上是这样讲的:
PC机发送控制指令给单片机,单片机收到后即控制D0~D7这8个发光管的亮、灭,同时收到的指令参数在个位、百位数码管上进行显示。说明:百位数码管显示发光管编号(1~8),个位数码管显示发光管的亮、灭。(1为亮,0为灭)
这是一条镜像帖。来源:北邮人论坛 / circuit / #17975同步于 2011/7/21
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Circuit机器人发帖
单片机中断的一些小问题。
jmxdj
2011/7/21镜像同步2 回复
订阅后,新回复会通过你的通知中心匿名送达。
2 条回复
cnt是实现一个状态机的功能。
但是这个状态机不太完善。
当在某些状态下,状态错误的时候,应该让cnt置零,但是作者没有。
同时flag在最后一个状态置即可。
switch(cnt)
{
case 0:if(temp=='#')cnt=1;else cnt=0;break;
case 1:if((temp>0x30)&&(temp<0x39)){a[0]=temp-0x30;cnt=2;}else cnt=0;break;
case 2:if(temp=='(')cnt=3;else cnt=0;break;
case 3:if((temp>=0x30)&&(temp<=0x38)){a[1]=temp-0x30;cnt=4;}else cnt=0;break;
case 4:if(temp==')'){cnt=0;outflag=1;}else cnt=0;break;
default:break;
}
a[0]选择的是数码管,a[1]控制的是LED的亮灭,PC在串口里以“#0(1)”的形式发送控制命令。
同时,被控制的LED的路数将在数码管2上显示出来,被控制的LED的状态将在数码管0上显示出来。