大侠们,我要实现计算机通过端口对51单片机下命令来控制其运行,有没有通信端口的C语言程序?给个例子!谢
如上!现在比较穷,悬赏不多!我的意思是我通过通信端口下命令给51单片机,单片机根据命令执行相应的动作!单片机内接受命令的程序是怎么写的?有没有例子给个。...
如上!现在比较穷,悬赏不多!
我的意思是我通过通信端口下命令给51单片机,单片机根据命令执行相应的动作!单片机内接受命令的程序是怎么写的?有没有例子给个。 展开
我的意思是我通过通信端口下命令给51单片机,单片机根据命令执行相应的动作!单片机内接受命令的程序是怎么写的?有没有例子给个。 展开
4个回答
展开全部
#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]; //a[0]用于存放发光管编号,a[1]用于存放发光管亮、灭的选择
uchar cnt;
uchar temp,tp,i;
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; //定时器T1方式2
TH1=0xfd; //波特率9600 初值由公式P210得来,SMOD默认是0
TL1=0xfd; //
SCON=0x50; //串口方式1,10位可变波特率,允许接收
TR1=1; //启动T1
ES=1; //串口1开中断
EA=1; //打开总中断
}
/****************************************/
void main(void)
{
init();
while(1)
{
P0=SEG7[a[0]];P2=ACT[2];delay(1); //显示变量a[0](发光管编号)
P0=SEG7[a[1]];P2=ACT[0];delay(1); //显示变量a[1](发光管亮、灭的选择)
if(outflag==1) //如果输出标志为1,进入if语句
{
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; //置输出标志为0
}
if(RI)
{
RI=0;
SBUF=tp; while(TI==0);TI=0;
EA=1;
}
}
}
/******************************************/
void serial_serve(void) interrupt 4 //定义函数名为serial_serve的串口接收中断服务函数,使用默认的寄存器组
{
//RI=0; //清除接收标志
EA=0; //关闭总中断
temp=SBUF; //将接收到的信息存放在temp中,单片机中的SBUF一般只有一个字节,字符也是一个字节,因此一次只接受一个字符,这里一共进行了5次中断
tp=temp;
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; //打开总中断
}
串口通讯,你还是好好看看吧,直接给你个程序有什么用呢?又不是万能的,要自己根据实际情况写的。
#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]; //a[0]用于存放发光管编号,a[1]用于存放发光管亮、灭的选择
uchar cnt;
uchar temp,tp,i;
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; //定时器T1方式2
TH1=0xfd; //波特率9600 初值由公式P210得来,SMOD默认是0
TL1=0xfd; //
SCON=0x50; //串口方式1,10位可变波特率,允许接收
TR1=1; //启动T1
ES=1; //串口1开中断
EA=1; //打开总中断
}
/****************************************/
void main(void)
{
init();
while(1)
{
P0=SEG7[a[0]];P2=ACT[2];delay(1); //显示变量a[0](发光管编号)
P0=SEG7[a[1]];P2=ACT[0];delay(1); //显示变量a[1](发光管亮、灭的选择)
if(outflag==1) //如果输出标志为1,进入if语句
{
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; //置输出标志为0
}
if(RI)
{
RI=0;
SBUF=tp; while(TI==0);TI=0;
EA=1;
}
}
}
/******************************************/
void serial_serve(void) interrupt 4 //定义函数名为serial_serve的串口接收中断服务函数,使用默认的寄存器组
{
//RI=0; //清除接收标志
EA=0; //关闭总中断
temp=SBUF; //将接收到的信息存放在temp中,单片机中的SBUF一般只有一个字节,字符也是一个字节,因此一次只接受一个字符,这里一共进行了5次中断
tp=temp;
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; //打开总中断
}
串口通讯,你还是好好看看吧,直接给你个程序有什么用呢?又不是万能的,要自己根据实际情况写的。
展开全部
VC++有通信控件MSCOMM,直接编程就可以对串口通信,通信编程参考龚建伟的《VISUAL C++/TURBO C串口通信编程实践》基本上就可以实现编程
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
首先,你要用VB或者VC在电脑上编个上位机,然后用RS232将单片机与电脑相连,当然,单片机里面还要有相应的程序——串口通讯的,大概就是这个过程
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
用串口通讯就OK了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询