对话框串口COMM控件中使用Sleep函数验证 串口控件 Sleep函数 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 测试发送800次01H,02H,04H,00H, 共计3200个数据,每个数据调用一次Sleep(1); STC单片机接收后在串口中断函数中判断数据,接收到01H,点亮LED1, 02H点亮LED2, 04H点亮LED3, 00H全灭。循环800次后结束,用时5秒左右。,每个数据调用一次Sleep(1); 验证似乎没有问题,付VC和单片机源码。// newaDlg.cpp : implementation file/*2014 4 11 串口收发十六进制数据***/#include "stdafx.h"#include "dos.h"#include "newa.h"#include "newaDlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/***********************************/class CAboutDlg : public CDialog{public: CAboutDlg(); enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV supportprotected: DECLARE_MESSAGE_MAP()};/***********************************/CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD){// }/***********************************/void CAboutDlg::DoDataExchange(CDataExchange* pDX){ CDialog::DoDataExchange(pDX);}/***********************************/BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)//END_MESSAGE_MAP()/***********************************/CNewaDlg::CNewaDlg(CWnd* pParent /*=NULL*/) : CDialog(CNewaDlg::IDD, pParent){ m_count = _T(""); m_recmess = _T(""); m_sendmess = _T(""); m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}/***********************************/void CNewaDlg::DoDataExchange(CDataExchange* pDX){ CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CNewaDlg) DDX_Control(pDX, IDC_COMSELECT, m_com); DDX_Control(pDX, IDC_SENDDATA, m_clrsend); DDX_Control(pDX, IDC_RECDATA, m_clrrec); DDX_Control(pDX, IDC_OPENSEND, m_OPENSEND); DDX_Control(pDX, IDC_MSCOMM1, m_Comm); DDX_Text(pDX, IDC_COUNT, m_count); DDX_Text(pDX, IDC_RECMESS, m_recmess); DDX_Text(pDX, IDC_SENDMESS, m_sendmess); //}}AFX_DATA_MAP}/***********************************/BEGIN_MESSAGE_MAP(CNewaDlg, CDialog) //{{AFX_MSG_MAP(CNewaDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_CBN_SELENDOK(IDC_COMSELECT, OnComselect) ON_BN_CLICKED(IDC_OPENSEND, OnOpensend) ON_BN_CLICKED(IDC_SENDDATA, OnSenddata) ON_BN_CLICKED(IDC_RECDATA, OnRecdata) //}}AFX_MSG_MAPEND_MESSAGE_MAP()/***********************************/BOOL CNewaDlg::OnInitDialog(){ CDialog::OnInitDialog(); ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon int i=9600; CString temp; temp.Format("%d,n,8,1",i); m_Comm.SetSettings(temp); m_com.SetCurSel(0); m_Comm.SetInputMode(1); //输入方式为二进制方式 m_Comm.SetInBufferSize(1024); //设置输入缓冲区大小 m_Comm.SetOutBufferSize(1024); //设置输出缓冲区大小,波特率4800无校验,8个数据位,2个停止位 m_Comm.SetRThreshold(1); //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件 m_Comm.SetSThreshold(1);//参数1表示当传输缓冲区完全空时将引发一个接收数据的OnComm事件 m_Comm.SetInputLen(0); //设置当前接收区数据长度为0 m_Comm.GetInput(); //先预读缓冲区以清除残留数据 if(!m_Comm.GetPortOpen())//判断串口的状态,如果是关闭状态,则打开 m_Comm.SetPortOpen(TRUE);//打开串口 return TRUE; // return TRUE unless you set the focus to a control}/***********************************/void CNewaDlg::OnSysCommand(UINT nID, LPARAM lParam){ if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { CDialog::OnSysCommand(nID, lParam); }}/***********************************/void CNewaDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); }}/***********************************/HCURSOR CNewaDlg::OnQueryDragIcon(){ return (HCURSOR) m_hIcon;}/***********************************/BEGIN_EVENTSINK_MAP(CNewaDlg, CDialog) //{{AFX_EVENTSINK_MAP(CNewaDlg) ON_EVENT(CNewaDlg, IDC_MSCOMM1, 1 /* OnComm */, OnComm, VTS_NONE) //}}AFX_EVENTSINK_MAPEND_EVENTSINK_MAP()/***检测一个字符是不是十六进制字符,若是返回相应的值,否则返回0x10***/char HexChar(char c){ if((c>='0')&&(c<='9')) // return c-0x30; //数字0-9 else if((c>='A')&&(c<='F')) // return c-'A'+10; //大写A-F else if((c>='a')&&(c<='f')) // return c-'a'+10; //小写a-f else return 0x10; //不符返回0X10}/***将一个字符串作为十六进制串转化为一个字节数组,字节间可用空格分隔,返回转换后的字节数组长度,同时字节数长度自动设置***/int Str2Hex(CString str,CByteArray &data){ int t,t1; // int rlen=0,len=str.GetLength(); // data.SetSize(len/2); // for(int i=0;i<len;) // { char l,h=str[i]; // if(h==' ') // { i++; // continue; // } i++; if(i>=len)break; // l=str[i]; // t=HexChar(h); // t1=HexChar(l); // if((t==16)||(t1==16)) // break; // else t=t*16+t1; // i++; // data[rlen]=(char)t; // rlen++; // } // data.SetSize(rlen); // return rlen; //返回长度}/***********************************/void CNewaDlg::OnComm() {VARIANT m_input1;COleSafeArray m_input2;long length,i;BYTE data[1024];CString str;if(m_Comm.GetCommEvent()==2) //接收缓冲区内有字符{m_input1=m_Comm.GetInput(); //读取缓冲区内的数据m_input2=m_input1; //VARIANT变量转换ColeSafeArray型变量length=m_input2.GetOneDimSize(); //确定数据长度for(i=0;i<length;i++)m_input2.GetElement(&i,data+i); //将数据转换为BYTE型数组for(i=0;i<length;i++) //将数组转换为Cstring型变量{BYTE a=* (char *)(data+i);str.Format("%02X ",a);m_recmess+=str;}}UpdateData(FALSE); //更新编辑框内容}/***********************************/void CNewaDlg::OnComselect() { int i=9600; // CString temp; // temp.Format("%d,n,8,1",i); // m_Comm.SetSettings(temp); // if(m_Comm.GetPortOpen()) // m_Comm.SetPortOpen(false); //?? m_Comm.SetCommPort(m_com.GetCurSel()+1);// }/***********************************/void CNewaDlg::OnOpensend() { int count; count=0; do { count++; CString str_tmp; GetDlgItemText(count,str_tmp); str_tmp.Format(_T("%d"),count); SetDlgItemText(IDC_STATIC_1,str_tmp); if(!m_Comm.GetPortOpen()) //检测串口是否打开 m_Comm.SetPortOpen(TRUE); //打开串口 CByteArray data; //定义位数组 CString str; //定义字符串变量对象 str = "01"; //字符串赋值 int len=Str2Hex(str,data); //字符串转换十六进制 m_Comm.SetOutput(COleVariant(data)); //发送数据 Sleep(1); //等待 str = "02"; //字符串赋值 len=Str2Hex(str,data); //字符串转换十六进制 m_Comm.SetOutput(COleVariant(data)); //发送数据 Sleep(1); //等待 str="04"; //字符串赋值 len=Str2Hex(str,data); //字符串转十六进制 m_Comm.SetOutput(COleVariant(data)); //发送数据 Sleep(1); //等待 str="00"; //字符串赋值 len=Str2Hex(str,data); //字符串转十六进制 m_Comm.SetOutput(COleVariant(data)); //发送数据 Sleep(1); } while(count<=800); }/***********************************/void CNewaDlg::OnSenddata() { m_sendmess= _T(""); m_count = _T(""); UpdateData(FALSE);}/***********************************/void CNewaDlg::OnRecdata() { m_recmess = _T(""); UpdateData(FALSE);}/***********************************/void CNewaDlg::OnOK() { m_Comm.SetPortOpen(false); //关闭串口 CDialog::OnOK();}////////////////////////////////////////////////////////////////////////////////// *********************************************/ #include "reg51.h" #include "intrins.h" #define uint unsigned int #define uchar unsigned char typedef uchar BYTE; typedef uint WORD; #define SLAVE 1 //定义从机编号,0 为从机 1, 1 为从机 2 #if SLAVE==0 #define SAMASK 0x33 //从机 1 地址屏蔽位 #define SERADR 0x55 //从机 1 的地址为 xx01,xx01 #define ACKTST 0x78 //从机 1 应答测试数据 #else #define SAMASK 0x3C //从机 2 地址屏蔽位 #define SERADR 0x5A //从机 2 的地址为 xx01,10xx #define ACKTST 0x49 //从机 2 应答测试数据 #endif #define URMD 2 //0:使用定时器 2 作为波特率发生器 sfr AUXR=0x8e; //辅助寄存器 sfr SADDR=0xA9; //从机地址寄存器 sfr SADEN=0xB9; //从机地址屏蔽寄存器 char count; sfr P4=0xc0; sfr P5=0xc8; sbit out=P1^5;// sbit out1=P4^5;// sbit out2=P1^6;// sbit out3=P1^7;// sbit key1=P0^0;// sbit key2=P0^1;// int Buff; void sw_out(unsigned char a);//开关量输出/*--------UART 中断服务程序-------------------*/ void Uart() interrupt 4 using 1 { if(RI) { Buff=SBUF; RI=0; } if(Buff==0x01) { out1=0; out2=1; out3=1; } else if(Buff==0x02) { out1=1; out2=0; out3=1; } else if(Buff==0x04) { out1=1; out2=1; out3=0; } else if(Buff==0x00) { out1=1; out2=1; out3=1; } }/*------------初始化串口---------------------*/ void InitUart() { SADDR=SERADR; SADEN=SAMASK; SCON=0x50; //8位数据,可变波特率允许接收 #if URMD==0 T2L=0xDF; //设置波特率重装值 T2H=0xFE; //9600bps(65536-11059200/4/9600) AUXR &=0x40; //定时器1时钟为Fosc/12,即12T AUXR&=0xFE; //串口1选择定时器1为波特率发生器 #elif URMD==1 AUXR=0x40; //定时器 1 为 1T 模式 TMOD=0x20; //设定定时器1为16位自动重装方式 TL1=0xDF; //设定定时初值 TH1=0xFE; //设定定时初值 ET1=0; //禁止定时器1中断 TR1=1; //启动定时器1 #else TMOD=0x20; //设置定时器 1 为 8 位自动重装载模式 AUXR=0x40; //定时器 1 为 1T 模式 TL1=TH1=0xDB; // 9600 bps(256 - 11059200/32/9600) TR1=1; #endif }/*******************************************/ void delay(uint t) { uint i,j; for(i=0;i<t;i++) { for(j=0;j<121;j++); } }/*******************************************/ void send(unsigned temp) { unsigned serial; serial=temp; SBUF=(unsigned char)temp; while(TI!=1); TI=0; } /*******************************************/ void main(void) { unsigned char a=255; InitUart(); //初始化串口 ES = 1; EA = 1; P0=0XFF; out1=0; out2=1; out3=1; delay(2000); out1=1; out2=0; out3=1; delay(2000); out1=1; out2=1; out3=0; delay(2000); out1=1; out2=1; out3=1; while(1) { if(!key1) { send(0X1F); out1=0; delay(1000); out1=1; } if(!key2) { send(0XF1); out1=0; delay(10); out1=1; } out=0; delay(2000); out=1; delay(2000); } } 做的测试,把01.02.04.00H用sleep函数间断发送出去,初步验证了一下,有什么逗不逗的?看着单片机点亮相对应的LED.刚开始sleep1000.具体每一段代码还没有仔细核查。 循环函数不能使用for的另一种方法。 对话框按键 的循环函数for中不能使用sleep的另一种方法。 MFC中如何禁止组合框 VC调用新浪微博API 线程中传递类成员 图片link的a标签,在程序代码中不能打开文件,但放在单独的html中则可以 该死的2005 第一次使用就出问题了 如何得到一个IDispatch 有谁知道猜心灵程序的原理是什么? 菜鸟求助!!!!!!!关于数组! 哪儿可以下载acrobat5.0? mfc数据库改成文件 调试CPen penFocus(PS_DASHDOTDOT, 2, colorFocus);其中PS_DASHDOTDOT未定义 拖动窗口,花屏
每个数据调用一次Sleep(1);
STC单片机接收后在串口中断函数中判断数据,
接收到01H,点亮LED1, 02H点亮LED2, 04H点亮LED3, 00H全灭。
循环800次后结束,用时5秒左右。,
每个数据调用一次Sleep(1);
验证似乎没有问题,付VC和单片机源码。
// newaDlg.cpp : implementation file
/*2014 4 11 串口收发十六进制数据***/
#include "stdafx.h"
#include "dos.h"
#include "newa.h"
#include "newaDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/***********************************/
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
protected:
DECLARE_MESSAGE_MAP()
};
/***********************************/
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//
}
/***********************************/
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
/***********************************/
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//
END_MESSAGE_MAP()
/***********************************/
CNewaDlg::CNewaDlg(CWnd* pParent /*=NULL*/)
: CDialog(CNewaDlg::IDD, pParent)
{
m_count = _T("");
m_recmess = _T("");
m_sendmess = _T("");
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
/***********************************/
void CNewaDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CNewaDlg)
DDX_Control(pDX, IDC_COMSELECT, m_com);
DDX_Control(pDX, IDC_SENDDATA, m_clrsend);
DDX_Control(pDX, IDC_RECDATA, m_clrrec);
DDX_Control(pDX, IDC_OPENSEND, m_OPENSEND);
DDX_Control(pDX, IDC_MSCOMM1, m_Comm);
DDX_Text(pDX, IDC_COUNT, m_count);
DDX_Text(pDX, IDC_RECMESS, m_recmess);
DDX_Text(pDX, IDC_SENDMESS, m_sendmess);
//}}AFX_DATA_MAP
}
/***********************************/
BEGIN_MESSAGE_MAP(CNewaDlg, CDialog)
//{{AFX_MSG_MAP(CNewaDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_CBN_SELENDOK(IDC_COMSELECT, OnComselect)
ON_BN_CLICKED(IDC_OPENSEND, OnOpensend)
ON_BN_CLICKED(IDC_SENDDATA, OnSenddata)
ON_BN_CLICKED(IDC_RECDATA, OnRecdata)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/***********************************/
BOOL CNewaDlg::OnInitDialog()
{
CDialog::OnInitDialog();
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
int i=9600;
CString temp;
temp.Format("%d,n,8,1",i);
m_Comm.SetSettings(temp);
m_com.SetCurSel(0);
m_Comm.SetInputMode(1); //输入方式为二进制方式
m_Comm.SetInBufferSize(1024); //设置输入缓冲区大小
m_Comm.SetOutBufferSize(1024); //设置输出缓冲区大小,波特率4800无校验,8个数据位,2个停止位
m_Comm.SetRThreshold(1); //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
m_Comm.SetSThreshold(1);//参数1表示当传输缓冲区完全空时将引发一个接收数据的OnComm事件
m_Comm.SetInputLen(0); //设置当前接收区数据长度为0
m_Comm.GetInput(); //先预读缓冲区以清除残留数据
if(!m_Comm.GetPortOpen())//判断串口的状态,如果是关闭状态,则打开
m_Comm.SetPortOpen(TRUE);//打开串口
return TRUE; // return TRUE unless you set the focus to a control
}
/***********************************/
void CNewaDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
/***********************************/
void CNewaDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
/***********************************/
HCURSOR CNewaDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
/***********************************/
BEGIN_EVENTSINK_MAP(CNewaDlg, CDialog)
//{{AFX_EVENTSINK_MAP(CNewaDlg)
ON_EVENT(CNewaDlg, IDC_MSCOMM1, 1 /* OnComm */, OnComm, VTS_NONE)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
/***检测一个字符是不是十六进制字符,
若是返回相应的值,否则返回0x10***/
char HexChar(char c)
{
if((c>='0')&&(c<='9')) //
return c-0x30; //数字0-9
else if((c>='A')&&(c<='F')) //
return c-'A'+10; //大写A-F
else if((c>='a')&&(c<='f')) //
return c-'a'+10; //小写a-f
else return 0x10; //不符返回0X10
}
/***将一个字符串作为十六进制串转化为一个字节数组,字节间可用
空格分隔,返回转换后的字节数组长度,同时字节数长度自动设置***/
int Str2Hex(CString str,CByteArray &data)
{
int t,t1; //
int rlen=0,len=str.GetLength(); //
data.SetSize(len/2); //
for(int i=0;i<len;) //
{
char l,h=str[i]; //
if(h==' ') //
{
i++; //
continue; //
}
i++;
if(i>=len)break; //
l=str[i]; //
t=HexChar(h); //
t1=HexChar(l); //
if((t==16)||(t1==16)) //
break; //
else t=t*16+t1; //
i++; //
data[rlen]=(char)t; //
rlen++; //
} //
data.SetSize(rlen); //
return rlen; //返回长度
}
/***********************************/
void CNewaDlg::OnComm()
{
VARIANT m_input1;
COleSafeArray m_input2;
long length,i;
BYTE data[1024];
CString str;
if(m_Comm.GetCommEvent()==2) //接收缓冲区内有字符
{
m_input1=m_Comm.GetInput(); //读取缓冲区内的数据
m_input2=m_input1; //VARIANT变量转换ColeSafeArray型变量
length=m_input2.GetOneDimSize(); //确定数据长度
for(i=0;i<length;i++)
m_input2.GetElement(&i,data+i); //将数据转换为BYTE型数组
for(i=0;i<length;i++) //将数组转换为Cstring型变量
{
BYTE a=* (char *)(data+i);
str.Format("%02X ",a);
m_recmess+=str;
}
}
UpdateData(FALSE); //更新编辑框内容
}
/***********************************/
void CNewaDlg::OnComselect()
{
int i=9600; //
CString temp; //
temp.Format("%d,n,8,1",i); //
m_Comm.SetSettings(temp); //
if(m_Comm.GetPortOpen()) //
m_Comm.SetPortOpen(false); //??
m_Comm.SetCommPort(m_com.GetCurSel()+1);//
}
/***********************************/
void CNewaDlg::OnOpensend()
{
int count;
count=0;
do
{
count++;
CString str_tmp;
GetDlgItemText(count,str_tmp);
str_tmp.Format(_T("%d"),count);
SetDlgItemText(IDC_STATIC_1,str_tmp);
if(!m_Comm.GetPortOpen()) //检测串口是否打开
m_Comm.SetPortOpen(TRUE); //打开串口
CByteArray data; //定义位数组
CString str; //定义字符串变量对象
str = "01"; //字符串赋值
int len=Str2Hex(str,data); //字符串转换十六进制
m_Comm.SetOutput(COleVariant(data)); //发送数据
Sleep(1); //等待
str = "02"; //字符串赋值
len=Str2Hex(str,data); //字符串转换十六进制
m_Comm.SetOutput(COleVariant(data)); //发送数据
Sleep(1); //等待
str="04"; //字符串赋值
len=Str2Hex(str,data); //字符串转十六进制
m_Comm.SetOutput(COleVariant(data)); //发送数据
Sleep(1); //等待
str="00"; //字符串赋值
len=Str2Hex(str,data); //字符串转十六进制
m_Comm.SetOutput(COleVariant(data)); //发送数据
Sleep(1);
}
while(count<=800);
}
/***********************************/
void CNewaDlg::OnSenddata()
{
m_sendmess= _T("");
m_count = _T("");
UpdateData(FALSE);
}
/***********************************/
void CNewaDlg::OnRecdata()
{
m_recmess = _T("");
UpdateData(FALSE);
}
/***********************************/
void CNewaDlg::OnOK()
{
m_Comm.SetPortOpen(false); //关闭串口
CDialog::OnOK();
}
//////////////////////////////////////////////////////////////////////////////////
#include "reg51.h"
#include "intrins.h"
#define uint unsigned int
#define uchar unsigned char
typedef uchar BYTE;
typedef uint WORD;
#define SLAVE 1 //定义从机编号,0 为从机 1, 1 为从机 2
#if SLAVE==0
#define SAMASK 0x33 //从机 1 地址屏蔽位
#define SERADR 0x55 //从机 1 的地址为 xx01,xx01
#define ACKTST 0x78 //从机 1 应答测试数据
#else
#define SAMASK 0x3C //从机 2 地址屏蔽位
#define SERADR 0x5A //从机 2 的地址为 xx01,10xx
#define ACKTST 0x49 //从机 2 应答测试数据
#endif
#define URMD 2 //0:使用定时器 2 作为波特率发生器
sfr AUXR=0x8e; //辅助寄存器
sfr SADDR=0xA9; //从机地址寄存器
sfr SADEN=0xB9; //从机地址屏蔽寄存器
char count;
sfr P4=0xc0;
sfr P5=0xc8;
sbit out=P1^5;//
sbit out1=P4^5;//
sbit out2=P1^6;//
sbit out3=P1^7;//
sbit key1=P0^0;//
sbit key2=P0^1;//
int Buff;
void sw_out(unsigned char a);//开关量输出
/*--------UART 中断服务程序-------------------*/
void Uart() interrupt 4 using 1
{
if(RI)
{
Buff=SBUF;
RI=0;
}
if(Buff==0x01)
{
out1=0;
out2=1;
out3=1;
}
else if(Buff==0x02)
{
out1=1;
out2=0;
out3=1;
}
else if(Buff==0x04)
{
out1=1;
out2=1;
out3=0;
}
else if(Buff==0x00)
{
out1=1;
out2=1;
out3=1;
}
}
/*------------初始化串口---------------------*/
void InitUart()
{
SADDR=SERADR;
SADEN=SAMASK;
SCON=0x50; //8位数据,可变波特率允许接收
#if URMD==0
T2L=0xDF; //设置波特率重装值
T2H=0xFE; //9600bps(65536-11059200/4/9600)
AUXR &=0x40; //定时器1时钟为Fosc/12,即12T
AUXR&=0xFE; //串口1选择定时器1为波特率发生器
#elif URMD==1
AUXR=0x40; //定时器 1 为 1T 模式
TMOD=0x20; //设定定时器1为16位自动重装方式
TL1=0xDF; //设定定时初值
TH1=0xFE; //设定定时初值
ET1=0; //禁止定时器1中断
TR1=1; //启动定时器1
#else
TMOD=0x20; //设置定时器 1 为 8 位自动重装载模式
AUXR=0x40; //定时器 1 为 1T 模式
TL1=TH1=0xDB; // 9600 bps(256 - 11059200/32/9600)
TR1=1;
#endif
}
/*******************************************/
void delay(uint t)
{
uint i,j;
for(i=0;i<t;i++)
{
for(j=0;j<121;j++);
}
}
/*******************************************/
void send(unsigned temp)
{
unsigned serial;
serial=temp;
SBUF=(unsigned char)temp;
while(TI!=1);
TI=0;
}
/*******************************************/
void main(void)
{
unsigned char a=255;
InitUart(); //初始化串口
ES = 1;
EA = 1;
P0=0XFF;
out1=0;
out2=1;
out3=1;
delay(2000);
out1=1;
out2=0;
out3=1;
delay(2000);
out1=1;
out2=1;
out3=0;
delay(2000);
out1=1;
out2=1;
out3=1;
while(1)
{
if(!key1)
{
send(0X1F);
out1=0;
delay(1000);
out1=1;
}
if(!key2)
{
send(0XF1);
out1=0;
delay(10);
out1=1;
}
out=0;
delay(2000);
out=1;
delay(2000);
}
}