ks.albert 发表于 2012-10-12 10:13:27

STC 89C516rd+ 串口控制各I/O口编程求助

各位大侠,

本人菜鸟,最近做项目想通过上位机经串口发命令,比如P1_1=1 or 0 控制各PORT口,输出高低电平。
有没有哪位好心人,能给个程序小样。

感谢



tony90 发表于 2012-10-12 20:49:45

给你一个思路吧,用串口接收上位机数据,赋给某个char,再用这个char控制IO口

zhangfuhg 发表于 2012-10-12 23:11:18

单片机与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;                                           //跳出
}

}
}
       
/********************************************************************
                              结束
*********************************************************************/
请参考一下这个!希望对你有帮助。

actshuishan 发表于 2012-10-13 07:05:13

楼上思路好

jj123paopao 发表于 2012-10-13 10:11:11

学习了!

scwscw 发表于 2012-10-13 10:35:11

过来看看的!

ks.albert 发表于 2012-10-16 09:27:35

zhangfuhg 发表于 2012-10-12 23:11 static/image/common/back.gif
单片机与PC机采用9针串口,MAX232通讯,波特率默认为9600.

单片机接收PC机发送的十六进制码表如下:


先谢谢朋友,我去实践下。

HeP028 发表于 2012-10-16 09:50:08

本帖最后由 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;
}





这里下的回归这里!

ks.albert 发表于 2012-10-16 10:37:42

HeP028 发表于 2012-10-16 09:50 static/image/common/back.gif
这里下的回归这里!

看起来,都是只控制一个Port的8位I/O的,哪位朋友能修改下程序,适用控制所有可以控制的I/O吗?

同时,上位机发命令,可以同时控制多个I/O.

感谢

HeP028 发表于 2012-10-18 21:28:07

ks.albert 发表于 2012-10-16 10:37 static/image/common/back.gif
看起来,都是只控制一个Port的8位I/O的,哪位朋友能修改下程序,适用控制所有可以控制的I/O吗?

同时, ...

能控制一个了。其他的还难吗?

这不大家给你的是思路,看来你要的程序,为你悲哀了!应该没人会帮你!

ks.albert 发表于 2012-10-19 09:42:19

HeP028 发表于 2012-10-18 21:28 static/image/common/back.gif
能控制一个了。其他的还难吗?

这不大家给你的是思路,看来你要的程序,为你悲哀了!应该没人会帮你! ...

不是搞这行的,主要是上位编程。

你不帮不要紧,请你注意你的言辞。

xtxtt 发表于 2012-12-17 17:40:40

ks.albert 发表于 2012-10-19 09:42 static/image/common/back.gif
不是搞这行的,主要是上位编程。

你不帮不要紧,请你注意你的言辞。

要不我帮你吧!


页: [1]
查看完整版本: STC 89C516rd+ 串口控制各I/O口编程求助