STC 89C516rd+ 串口控制各I/O口编程求助
各位大侠,本人菜鸟,最近做项目想通过上位机经串口发命令,比如P1_1=1 or 0 控制各PORT口,输出高低电平。
有没有哪位好心人,能给个程序小样。
感谢
给你一个思路吧,用串口接收上位机数据,赋给某个char,再用这个char控制IO口 单片机与PC机采用9针串口,MAX232通讯,波特率默认为9600.
单片机接收PC机发送的十六进制码表如下:
01、全开:PC发送'I';
02、全关:PC发送'i';
03、第一路开:PC发送'A';
04、第二路开:PC发送'B';
05、第三路开:PC发送'C';
06、第四路开:PC发送'D';
07、第五路开:PC发送'E';
08、第六路开:PC发送'F';
09、第七路开:PC发送'G';
10、第八路开:PC发送'H';
11、第一路关:PC发送'a';
12、第二路关:PC发送'b';
13、第三路关:PC发送'c';
14、第四路关:PC发送'd';
15、第五路关:PC发送'e';
16、第六路关:PC发送'f';
17、第七路关:PC发送'g';
18、第八路关:PC发送'h';
*********************************************************************/
#include<reg52.h> //库文件
#define uchar unsigned char//宏定义无符号字符型
#define uint unsigned int//宏定义无符号整型
/********************************************************************
初始定义
*********************************************************************/
unsigned char dat; //用于存储单片机接收发送缓冲寄存器SBUF里面的内容
/*定义八位出为单片机P2口*/
sbit K1=P2^0;
sbit K2=P2^1;
sbit K3=P2^2;
sbit K4=P2^3;
sbit K5=P2^4;
sbit K6=P2^5;
sbit K7=P2^6;
sbit K8=P2^7;
/*定义八位入为单片机P1口*/
sbit SB1=P1^0;
sbit SB2=P1^1;
sbit SB3=P1^2;
sbit SB4=P1^3;
sbit SB5=P1^4;
sbit SB6=P1^5;
sbit SB7=P1^6;
sbit SB8=P1^7;
/********************************************************************
延时函数
*********************************************************************/
void delay(uchar t)
{
uchar i,j;
for(i=0;i<t;i++)
{
for(j=13;j>0;j--);
{ ;
}
}
}
/********************************************************************
功能:串口初始化,波特率9600,方式1
*********************************************************************/
void Init_Com(void)
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFd;
TL1 = 0xFd;
TR1 = 1;
}
/********************************************************************
主函数
*********************************************************************/
void main()
{
Init_Com();//串口初始化
while(1)
{
if ( RI ) //扫描判断是否接收到数据,
{
dat = SBUF; //接收数据SBUF赋与dat
RI=0; //RI 清零。
//SBUF = dat; //在原样把数据发送回去
}
/********************************************************************
接收数据判断函数
*********************************************************************/
switch(dat) //接收数据判断
{
uchar k;
k=10;
case 'I': P2=0X00;delay(k);break; //全开
case 'i': P2=0XFF;delay(k);break; //全关
case 'A': K1=0;delay(k);break; //第一路开
case 'B': K2=0;delay(k);break; //第二路开
case 'C': K3=0;delay(k);break; //第三路开
case 'D': K4=0;delay(k);break; //第四路开
case 'E': K5=0;delay(k);break; //第五路开
case 'F': K6=0;delay(k);break; //第六路开
case 'G': K7=0;delay(k);break; //第七路开
case 'H': K8=0;delay(k);break; //第八路开
case 'a': K1=1;delay(k);break; //第一路关
case 'b': K2=1;delay(k);break; //第二路关
case 'c': K3=1;delay(k);break; //第三路关
case 'd': K4=1;delay(k);break; //第四路关
case 'e': K5=1;delay(k);break; //第五路关
case 'f': K6=1;delay(k);break; //第六路关
case 'g': K7=1;delay(k);break; //第七路关
case 'h': K8=1;delay(k);break; //第八路关
default:break; //跳出
}
}
}
/********************************************************************
结束
*********************************************************************/
请参考一下这个!希望对你有帮助。 楼上思路好 学习了! 过来看看的! zhangfuhg 发表于 2012-10-12 23:11 static/image/common/back.gif
单片机与PC机采用9针串口,MAX232通讯,波特率默认为9600.
单片机接收PC机发送的十六进制码表如下:
先谢谢朋友,我去实践下。 本帖最后由 HeP028 于 2012-10-16 09:53 编辑
ks.albert 发表于 2012-10-16 09:27 static/image/common/back.gif
先谢谢朋友,我去实践下。#include <REG51.H>
#include <stdio.H>
#define uchar unsigned char
#define uint unsigned int
#define ON 0
#define OFF 1
//::::::::::::::::::::::::::::::::::::::::::
sbit D0=P0^0;
sbit D1=P0^1;
sbit D2=P0^2;
sbit D3=P0^3;
sbit D4=P0^4;
sbit D5=P0^5;
sbit D6=P0^6;
sbit D7=P0^7;
//::::::::::::::::::::::::::::::::::::::::::
unsigned char Address = 'A';
unsigned char a= {0x00,0x00};
unsigned char Count = 0x00;
bit outFlag;
//::::::::::::::::::::::::::::::::::::::::::
//::::::::::::::::::::::::::::::::::::::::::
void init_serialcomm(void)
{
SCON= 0x50; //SCON: serail mode 1, 8-bit UART, enable ucvr
TMOD |= 0x20; //TMOD: timer 1, mode 2, 8-bit reload
PCON |= 0x80; //SMOD=1;
TH1 = 0xFd; //Baud:9600fosc=11.0592MHz
TL1 = 0XFD; //Baud:9600fosc=11.0592MHz
IE |= 0x90; //Enable Serial Interrupt
TR1 = 1; // timer 1 run
}
//::::::::::::::::::::::::::::::::::::::::::
//::::::串口发送一个字符
//::::::::::::::::::::::::::::::::::::::::::
void COM_sendoneChar(unsigned char CH)
{
SBUF = CH;
while(!TI);
TI = 0;
}
//::::::::::::::::::::::::::::::::::::::::::
//::::::串口发送一个字符串
//::::::::::::::::::::::::::::::::::::::::::
void COM_sendstring(unsigned char *String)
{
while(*String != '\0')
{
COM_sendoneChar(*String);
String++;
}
}
//::::::::::::::::::::::::::::::::::::::::::
void main(void)
{
init_serialcomm();
COM_sendstring(">Version information:1.0.0 \r\n");
COM_sendstring(">Program function :Eight LED control Demo\r\n");
COM_sendstring("-------------------------------------\r\n");
while(1)
{
if(outFlag == 1)
{
if (a == 1)
{
switch(a)
{
case 1:if(a==0)D0=ON;else D0=OFF;break;
case 2:if(a==0)D1=ON;else D1=OFF;break;
case 3:if(a==0)D2=ON;else D2=OFF;break;
case 4:if(a==0)D3=ON;else D3=OFF;break;
case 5:if(a==0)D4=ON;else D4=OFF;break;
case 6:if(a==0)D5=ON;else D5=OFF;break;
case 7:if(a==0)D6=ON;else D6=OFF;break;
case 8:if(a==0)D7=ON;else D7=OFF;break;
default:break;
}
COM_sendstring(" ");
COM_sendstring("Number->");
COM_sendoneChar(a + 0x30); //输出通道显示
COM_sendstring(" = ");
COM_sendstring(a <= 0 ? "Open\r\n":"Close\r\n"); //输出状态
}
if (a == 8)
{
P0 = a <= 0 ? 0x00:0xff;
COM_sendstring(" ");
COM_sendstring(a <= 0 ? "All port = Open! \r\n" : "All port = Close! \r\n");
}
outFlag=0;
}
}
}
//::::::::::::::::::::::::::::::::::::::::::
//::::::::::::::::::::::::::::::::::::::::::
void serial_serve(void) interrupt 4
{
//起始地址:A(设备ss号) + 控制字 + 端口号 + 端口状态 + !(郑伟)
unsigned char temp = 0x00;
RI = 0;
EA = 0;
temp = SBUF;
switch(Count)
{
case 0:
if ((temp == Address) || (temp == 0xff))
Count = 1;
else Count = 0;
break;
case 1:
if ((temp == 0x31) || (temp == 0x38))
{ a = temp - 0x30;
switch (a)
{
case 1: Count = 2;break;
case 8: Count = 3;break;
default:
break;
}
}
elseCount = 0;
break;
case 2:
if ((temp > 0x30) && (temp < 0x39))
{ a = temp - 0x30;
Count = 3;
}
elseCount = 0;
break;
case 3:
if ((temp == 0x30) || (temp == 0x31))
{ a = temp - 0x30;
Count = 4;
}
elseCount = 0;
break;
case 4:
if (temp == '!')
{ Count = 0;
outFlag = 1;
}
elseCount = 0;
break;
default:
break;
}
EA=1;
}
这里下的回归这里! HeP028 发表于 2012-10-16 09:50 static/image/common/back.gif
这里下的回归这里!
看起来,都是只控制一个Port的8位I/O的,哪位朋友能修改下程序,适用控制所有可以控制的I/O吗?
同时,上位机发命令,可以同时控制多个I/O.
感谢 ks.albert 发表于 2012-10-16 10:37 static/image/common/back.gif
看起来,都是只控制一个Port的8位I/O的,哪位朋友能修改下程序,适用控制所有可以控制的I/O吗?
同时, ...
能控制一个了。其他的还难吗?
这不大家给你的是思路,看来你要的程序,为你悲哀了!应该没人会帮你! HeP028 发表于 2012-10-18 21:28 static/image/common/back.gif
能控制一个了。其他的还难吗?
这不大家给你的是思路,看来你要的程序,为你悲哀了!应该没人会帮你! ...
不是搞这行的,主要是上位编程。
你不帮不要紧,请你注意你的言辞。 ks.albert 发表于 2012-10-19 09:42 static/image/common/back.gif
不是搞这行的,主要是上位编程。
你不帮不要紧,请你注意你的言辞。
要不我帮你吧!
页:
[1]