投影串口测试程序_小弟求大侠写个模拟程序,投影机RS232串口开机关机程序?...

该博客介绍了如何使用STC的串口代码来实现投影机的开机关机控制。通过将P3.1连接到经过电平转换的投影仪RS232接口,P3.2和P3.3分别用于开机和关机控制,触发方式为上升沿有效。
摘要由CSDN通过智能技术生成

elecfun用STC的工具生产的串口代码,不处理串口接收的数据,没验证过你自己测试下。
P3.1接电平转换电平后到投影仪的RS232,P3.2接开机控制上升沿有效,P3.3接关机控制上升沿有效

/*---------------------------------------------------------------------*//* --- STC MCU Limited ------------------------------------------------*//* --- STC15F4K60S4 系列 定时器1用作串口1的波特率发生器举例------------*//* --- Mobile: (86)13922805190 ----------------------------------------*//* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*//* --- Tel: 86-0513-55012928,55012929,55012966-------------------------*//* --- Web: www.STCMCU.com --------------------------------------------*//* --- Web: www.GXWMCU.com --------------------------------------------*//* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序        *//* 如果要在文章中应用此代码,请在文章中注明使用了STC的资料及程序        *//*---------------------------------------------------------------------*///本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译
//若无特别说明,工作频率一般为11.0592MHz
#include "reg51.h"#include "intrins.h"typedef unsigned char BYTE;typedef unsigned int WORD;#define FOSC 11059200L          //系统频率#define BAUD 9600             //串口波特率#define NONE_PARITY     0       //无校验#define ODD_PARITY      1       //奇校验#define EVEN_PARITY     2       //偶校验#define MARK_PARITY     3       //标记校验#define SPACE_PARITY    4       //空白校验#define PARITYBIT NONE_PARITY   //定义校验位
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr P4M1 = 0xb3;
sfr P4M0 = 0xb4;
sfr P5M1 = 0xC9;
sfr P5M0 = 0xCA;
sfr P6M1 = 0xCB;
sfr P6M0 = 0xCC;
sfr P7M1 = 0xE1;
sfr P7M0 = 0xE2;
sfr AUXR  = 0x8e;               //辅助寄存器
sfr P_SW1   = 0xA2;             //外设功能切换寄存器1#define S1_S0 0x40              //P_SW1.6#define S1_S1 0x80              //P_SW1.7//sbit P22 = P2^2;#define PORT_KEY    P3#define KEY_ON      0x04    //按键ON#define KEY_OFF     0x08    //按键OFF#define KEY_MASK    (PORT_KEY |= (KEY_ON | KEY_OFF))unsigned char KeyShort;     //按键触发unsigned char KeyLong;      //长按值char code CMD_ON[]={0x50,0x57,0x52,0x20,0x4F,0x4E,0x0D,0x00};char code CMD_OFF[]={0x50,0x57,0x52,0x20,0x4F,0x46,0x46,0x0D,0x00};
bit busy;void SendData(BYTE dat);void SendString(char *s);void Delay(unsigned int t)
{unsigned int a,b;for (a=0; a        for (b=0; b<500; b++)
            ;
}//读按键值void KeyRead( void )
{unsigned char ReadData = PORT_KEY ^ 0xFF;         //读端口值,并取反    ReadData &= (KEY_ON | KEY_OFF);                //只取有效按键值    KeyShort =  ReadData & (ReadData ^ KeyLong);    //只在第一次按下时为按键值,以后为0    KeyLong  =  ReadData;                           //长按、短按都为按键值}void main()
{
    P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;
    P6M0 = 0x00;
    P6M1 = 0x00;
    P7M0 = 0x00;
    P7M1 = 0x00;
    ACC = P_SW1;
    ACC &= ~(S1_S0 | S1_S1);    //S1_S0=0 S1_S1=0    P_SW1 = ACC;                //(P3.0/RxD, P3.1/TxD)    //  ACC = P_SW1;
//  ACC &= ~(S1_S0 | S1_S1);    //S1_S0=1 S1_S1=0
//  ACC |= S1_S0;               //(P3.6/RxD_2, P3.7/TxD_2)
//  P_SW1 = ACC;  
//  
//  ACC = P_SW1;
//  ACC &= ~(S1_S0 | S1_S1);    //S1_S0=0 S1_S1=1
//  ACC |= S1_S1;               //(P1.6/RxD_3, P1.7/TxD_3)
//  P_SW1 = ACC;  
#if (PARITYBIT == NONE_PARITY)
    SCON = 0x50;                //8位可变波特率#elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
    SCON = 0xda;                //9位可变波特率,校验位初始为1#elif (PARITYBIT == SPACE_PARITY)
    SCON = 0xd2;                //9位可变波特率,校验位初始为0#endif
    AUXR = 0x40;                //定时器1为1T模式    TMOD = 0x20;                //定时器1为模式2(8位自动重载)    TL1 = (256 - (FOSC/32/BAUD));   //设置波特率重装值    TH1 = (256 - (FOSC/32/BAUD));
    TR1 = 1;                    //定时器1开始工作    ES = 1;                     //使能串口中断    EA = 1;while(1)
    {
        KEY_MASK;
        KeyRead();if (KeyShort & KEY_ON)       //ON        {
            SendString(CMD_ON);
        }if (KeyShort & KEY_OFF)      //OFF        {
            SendString(CMD_OFF);
        }
        Delay(100);
    }
}/*----------------------------
UART 中断服务程序
-----------------------------*/
void Uart() interrupt 4 using 1
{if (RI)
    {
        RI = 0;                 //清除RI位        //P0 = SBUF;              //P0显示串口数据        //P22 = RB8;              //P2.2显示校验位    }if (TI)
    {
        TI = 0;                 //清除TI位        busy = 0;               //清忙标志    }
}/*----------------------------
发送串口数据
----------------------------*/
void SendData(BYTE dat)
{while (busy);               //等待前面的数据发送完成    ACC = dat;                  //获取校验位P (PSW.0)    if (P)                      //根据P来设置校验位    {#if (PARITYBIT == ODD_PARITY)
        TB8 = 0;                //设置校验位为0#elif (PARITYBIT == EVEN_PARITY)
        TB8 = 1;                //设置校验位为1#endif
    }else
    {#if (PARITYBIT == ODD_PARITY)
        TB8 = 1;                //设置校验位为1#elif (PARITYBIT == EVEN_PARITY)
        TB8 = 0;                //设置校验位为0#endif
    }
    busy = 1;
    SBUF = ACC;                 //写数据到UART数据寄存器}/*----------------------------
发送字符串
----------------------------*/
void SendString(char *s)
{while (*s)                  //检测字符串结束标志    {
        SendData(*s++);         //发送当前字符    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值