#include reg51.h
在從化等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專(zhuān)注、極致的服務(wù)理念,為客戶(hù)提供成都做網(wǎng)站、成都網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)制作定制網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站制作,網(wǎng)絡(luò)營(yíng)銷(xiāo)推廣,成都外貿(mào)網(wǎng)站建設(shè)公司,從化網(wǎng)站建設(shè)費(fèi)用合理。
#include intrins.h
unsigned char key_s, key_v, tmp;
char code str[] = "welcome!??\n\r";
void send_str();
bit scan_key();
void proc_key();
void delayms(unsigned char ms);
void send_char(unsigned char txd);
sbit K1 = P1^4;
main()
{
TMOD = 0x20; // 定時(shí)器1工作于8位自動(dòng)重載模式, 用于產(chǎn)生波特率
TH1 = 0xFD; // 波特率9600
TL1 = 0xFD;
SCON = 0x50; // 設(shè)定串行口工作方式
PCON = 0xef; // 波特率不倍增
TR1 = 1; // 啟動(dòng)定時(shí)器1
IE = 0x0; // 禁止任何中斷
while(1)
{
if(scan_key()) // 掃描按鍵
{
delayms(10); // 延時(shí)去抖動(dòng)
if(scan_key()) // 再次掃描
{
key_v = key_s; // 保存鍵值
proc_key(); // 鍵處理
}
}
if(RI) // 是否有數(shù)據(jù)到來(lái)
{
RI = 0;
tmp = SBUF; // 暫存接收到的數(shù)據(jù)
P0 = tmp; // 數(shù)據(jù)傳送到P0口
send_char(tmp); // 回傳接收到的數(shù)據(jù)
}
}
}
bit scan_key()
// 掃描按鍵
{
key_s = 0x00;
key_s |= K1;
return(key_s ^ key_v);
}
void proc_key()
// 鍵處理
{
if((key_v 0x01) == 0)
{ // K1按下
send_str(); // 傳送字串"welcome!...
}
}
void send_char(unsigned char txd)
// 傳送一個(gè)字符
{
SBUF = txd;
while(!TI); // 等特?cái)?shù)據(jù)傳送
TI = 0; // 清除數(shù)據(jù)傳送標(biāo)志
}
void send_str()
// 傳送字串
{
unsigned char i = 0;
while(str[i] != '\0')
{
SBUF = str[i];
while(!TI); // 等特?cái)?shù)據(jù)傳送
TI = 0; // 清除數(shù)據(jù)傳送標(biāo)志
i++; // 下一個(gè)字符
}
}
void delayms(unsigned char ms)
// 延時(shí)子程序
{
unsigned char i;
while(ms--)
{
for(i = 0; i 120; i++);
}
}
拓展資料
C語(yǔ)言是一門(mén)通用計(jì)算機(jī)編程語(yǔ)言,應(yīng)用廣泛。C語(yǔ)言的設(shè)計(jì)目標(biāo)是提供一種能以簡(jiǎn)易的方式編譯、處理低級(jí)存儲(chǔ)器、產(chǎn)生少量的機(jī)器碼以及不需要任何運(yùn)行環(huán)境支持便能運(yùn)行的編程語(yǔ)言。
盡管C語(yǔ)言提供了許多低級(jí)處理的功能,但仍然保持著良好跨平臺(tái)的特性,以一個(gè)標(biāo)準(zhǔn)規(guī)格寫(xiě)出的C語(yǔ)言程序可在許多電腦平臺(tái)上進(jìn)行編譯,甚至包含一些嵌入式處理器(單片機(jī)或稱(chēng)MCU)以及超級(jí)電腦等作業(yè)平臺(tái)。
二十世紀(jì)八十年代,為了避免各開(kāi)發(fā)廠商用的C語(yǔ)言語(yǔ)法產(chǎn)生差異,由美國(guó)國(guó)家標(biāo)準(zhǔn)局為C語(yǔ)言制定了一套完整的美國(guó)國(guó)家標(biāo)準(zhǔn)語(yǔ)法,稱(chēng)為ANSI C,作為C語(yǔ)言最初的標(biāo)準(zhǔn)。目前2011年12月8日,國(guó)際標(biāo)準(zhǔn)化組織(ISO)和國(guó)際電工委員會(huì)(IEC)發(fā)布的C11標(biāo)準(zhǔn)是C語(yǔ)言的第三個(gè)官方標(biāo)準(zhǔn),也是C語(yǔ)言的最新標(biāo)準(zhǔn),該標(biāo)準(zhǔn)更好的支持了漢字函數(shù)名和漢字標(biāo)識(shí)符,一定程度上實(shí)現(xiàn)了漢字編程。
需要用到的頭文件包含:
#include winsock2.h
#include windows.h
與Linux環(huán)境下socket編程相比,windows環(huán)境多了一個(gè)步驟:?jiǎn)?dòng)或者初始化winsock庫(kù)
Winsock,一種標(biāo)準(zhǔn)API,一種網(wǎng)絡(luò)編程接口,用于兩個(gè)或多個(gè)應(yīng)用程序(或進(jìn)程)之間通過(guò)網(wǎng)絡(luò)進(jìn)行數(shù)據(jù)通信。具有兩個(gè)版本:
Winsock 1:
Windows CE平臺(tái)支持。
頭文件:WinSock.h
庫(kù):wsock32.lib
Winsock 2:
部分平臺(tái)如Windows CE貌似不支持。通過(guò)前綴WSA可以區(qū)別于Winsock 1版本。個(gè)別函數(shù)如WSAStartup、WSACleanup、WSARecvEx、WSAGetLastError都屬于Winsock 1.1規(guī)范的函數(shù);
頭文件:WinSock2.h
庫(kù):ws2_32.lib
mswsock.h用于編程擴(kuò)展,使用時(shí)必須鏈接mswsock.dll
擴(kuò)展資料
winsock庫(kù)的加載與卸載:
加載:int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
加載成功,返回值為0。
WORD wVersionRequested:加載的winsock版本,使用宏MAKEWORD(x, y),x表示高字節(jié),y表示低字節(jié)。然而使用時(shí)MAKEWORD(2, 2)。高字節(jié)與低字節(jié)相同~~
LPWSADATA lpWSAData:WSADATA結(jié)構(gòu)的指針,傳入?yún)?shù)后,系統(tǒng)幫助我們填充版本信息。有興趣的可以看看結(jié)構(gòu)體內(nèi)容,不過(guò)基本用不著。
卸載:int WSACleanup(void);比起加載,卸載的函數(shù)真是輕松愉快。
//?Win32Project1.cpp?:?定義應(yīng)用程序的入口點(diǎn)。
//
#include?"stdafx.h"
#include?"Win32Project1.h"
#define?MAX_LOADSTRING?100
//?全局變量:?
HINSTANCE?hInst; //?當(dāng)前實(shí)例
TCHAR?szTitle[MAX_LOADSTRING]; //?標(biāo)題欄文本
TCHAR?szWindowClass[MAX_LOADSTRING]; //?主窗口類(lèi)名
//?此代碼模塊中包含的函數(shù)的前向聲明:?
ATOM MyRegisterClass(HINSTANCE?hInstance);
BOOL InitInstance(HINSTANCE,?int);
LRESULT?CALLBACK WndProc(HWND,?UINT,?WPARAM,?LPARAM);
INT_PTR?CALLBACK About(HWND,?UINT,?WPARAM,?LPARAM);
int?APIENTRY?_tWinMain(_In_?HINSTANCE?hInstance,
_In_opt_?HINSTANCE?hPrevInstance,
_In_?LPTSTR????lpCmdLine,
_In_?int???????nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
//?TODO:??在此放置代碼。
MSG?msg;
HACCEL?hAccelTable;
//?初始化全局字符串
LoadString(hInstance,?IDS_APP_TITLE,?szTitle,?MAX_LOADSTRING);
LoadString(hInstance,?IDC_WIN32PROJECT1,?szWindowClass,?MAX_LOADSTRING);
MyRegisterClass(hInstance);
//?執(zhí)行應(yīng)用程序初始化:?
if?(!InitInstance?(hInstance,?nCmdShow))
{
return?FALSE;
}
hAccelTable?=?LoadAccelerators(hInstance,?MAKEINTRESOURCE(IDC_WIN32PROJECT1));
//?主消息循環(huán):?
while?(GetMessage(msg,?NULL,?0,?0))
{
if?(!TranslateAccelerator(msg.hwnd,?hAccelTable,?msg))
{
TranslateMessage(msg);
DispatchMessage(msg);
}
}
return?(int)?msg.wParam;
}
//
//??函數(shù):??MyRegisterClass()
//
//??目的:??注冊(cè)窗口類(lèi)。
//
ATOM?MyRegisterClass(HINSTANCE?hInstance)
{
WNDCLASSEX?wcex;
wcex.cbSize?=?sizeof(WNDCLASSEX);
wcex.style =?CS_HREDRAW?|?CS_VREDRAW;
wcex.lpfnWndProc =?WndProc;
wcex.cbClsExtra =?0;
wcex.cbWndExtra =?0;
wcex.hInstance =?hInstance;
wcex.hIcon =?LoadIcon(hInstance,?MAKEINTRESOURCE(IDI_WIN32PROJECT1));
wcex.hCursor =?LoadCursor(NULL,?IDC_ARROW);
wcex.hbrBackground =?(HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName =?MAKEINTRESOURCE(IDC_WIN32PROJECT1);
wcex.lpszClassName =?szWindowClass;
wcex.hIconSm =?LoadIcon(wcex.hInstance,?MAKEINTRESOURCE(IDI_SMALL));
return?RegisterClassEx(wcex);
}
//
//???函數(shù):??InitInstance(HINSTANCE,?int)
//
//???目的:??保存實(shí)例句柄并創(chuàng)建主窗口
//
//???注釋:?
//
//????????在此函數(shù)中,我們?cè)谌肿兞恐斜4鎸?shí)例句柄并
//????????創(chuàng)建和顯示主程序窗口。
//
BOOL?InitInstance(HINSTANCE?hInstance,?int?nCmdShow)
{
HWND?hWnd;
hInst?=?hInstance;?//?將實(shí)例句柄存儲(chǔ)在全局變量中
hWnd?=?CreateWindow(szWindowClass,?szTitle,?WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,?0,?CW_USEDEFAULT,?0,?NULL,?NULL,?hInstance,?NULL);
if?(!hWnd)
{
return?FALSE;
}
ShowWindow(hWnd,?nCmdShow);
UpdateWindow(hWnd);
return?TRUE;
}
//
//??函數(shù):??WndProc(HWND,?UINT,?WPARAM,?LPARAM)
//
//??目的:????處理主窗口的消息。
//
//??WM_COMMAND -?處理應(yīng)用程序菜單
//??WM_PAINT -?繪制主窗口
//??WM_DESTROY -?發(fā)送退出消息并返回
//
//
LRESULT?CALLBACK?WndProc(HWND?hWnd,?UINT?message,?WPARAM?wParam,?LPARAM?lParam)
{
int?wmId,?wmEvent;
PAINTSTRUCT?ps;
HDC?hdc;
switch?(message)
{
case?WM_COMMAND:
wmId????=?LOWORD(wParam);
wmEvent?=?HIWORD(wParam);
//?分析菜單選擇:?
switch?(wmId)
{
case?IDM_ABOUT:
DialogBox(hInst,?MAKEINTRESOURCE(IDD_ABOUTBOX),?hWnd,?About);
break;
case?IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return?DefWindowProc(hWnd,?message,?wParam,?lParam);
}
break;
case?WM_PAINT:
hdc?=?BeginPaint(hWnd,?ps);
//?TODO:??在此添加任意繪圖代碼...
EndPaint(hWnd,?ps);
break;
case?WM_DESTROY:
PostQuitMessage(0);
break;
default:
return?DefWindowProc(hWnd,?message,?wParam,?lParam);
}
return?0;
}
//?“關(guān)于”框的消息處理程序。
INT_PTR?CALLBACK?About(HWND?hDlg,?UINT?message,?WPARAM?wParam,?LPARAM?lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch?(message)
{
case?WM_INITDIALOG:
return?(INT_PTR)TRUE;
case?WM_COMMAND:
if?(LOWORD(wParam)?==?IDOK?||?LOWORD(wParam)?==?IDCANCEL)
{
EndDialog(hDlg,?LOWORD(wParam));
return?(INT_PTR)TRUE;
}
break;
}
return?(INT_PTR)FALSE;
}
不可能知道服務(wù)器是否已經(jīng)發(fā)送完畢,因?yàn)槟惆l(fā)送的沒(méi)有數(shù)據(jù)協(xié)議的格式,你可以讓發(fā)送方與接收方定個(gè)協(xié)議。其實(shí)你可以在recv時(shí)加個(gè)參數(shù),讓它只是看看有沒(méi)有數(shù)據(jù)到達(dá),recv最后那個(gè)參數(shù)設(shè)為MSG_OOB就可以,當(dāng)發(fā)現(xiàn)有數(shù)據(jù)到時(shí),你先Sleep一下,至于多長(zhǎng)時(shí)間就要看實(shí)際情況,一般幾十個(gè)毫秒就絕對(duì)夠了,然后,你再recv一下,這次最后那個(gè)參數(shù)為MSG_WAITALL就可以,這樣就一次性接收完畢