導航:首頁 > 程序命令 > 海爾6i981串口命令

海爾6i981串口命令

發布時間:2022-08-09 23:44:45

A. 跪求高手幫忙修改,想用串口助手讀出紅外遙控的按鍵值,問題是串口助手什麼都沒收到,先謝過了!!!

你有可能還沒有運行到發送命令的那個程序去,先單編一個串口通訊程序,把串口通訊測試成功如下:
uint8 code trdata1[]={0,0,24,160,1,236};
void Txd2_num(void)
{
uint8 i=0;
for(i=0;i<6;i++)
{
Usart1.RxdBuf[i]=trdata1[i];
}
SBUF =Usart1.TxdBuf[0];
Usart1.TxdCnt=0;
Usart1.TxdNum =6;
Usart1.TxdBusy=1;
}
/*****************************************
*串口1中斷
*****************************************/
void RXD_Int_Service() interrupt 4
{
uint8 ch;
if(RI)
{
RI=0;
Usart1.RxdDly=6; //超過0.3S清空計數
Usart1.RxdBuf[Usart1.RxdCnt]=ch;
Usart1.RxdCnt++;
if(Usart1.RxdCnt>=10)
{
Usart1.RxdTrue=1; //接收正確。
Usart1.RxdNum=Usart1.RxdCnt;
Usart1.RxdCnt=0;
}
}
if(TI)
{
TI=0;
if(Usart1.TxdBusy)
{
Usart1.TxdCnt++;
if(Usart1.TxdCnt<Usart1.TxdNum) //發送計數。
SBUF=Usart1.TxdBuf[Usart1.TxdCnt];
else
Usart1.TxdBusy=0; //發送完成一幀數據,標志位。
}
}
}

我的紅外搖控接收程序如下,可作參考

//*********************************************
//中斷接收搖控頭的信號.
unsigned int code comp[5]={6000,2000,500,200,500}; //分別代表9mS,4.5mS,1.5mS,0.56mS,1.5mS.
//此時晶振為12MHz
unsigned char Cnt;
void Ex_Int0_InSevice() interrupt 0
{
unsigned char j=0,i=0,ch[4];
unsigned int comp_data=0;
ch[0]=0;
ch[1]=0;
ch[2]=0;
ch[3]=0;
if(red_rxd==0 && !rxd_ture && RedDly==0)
{

while(red_rxd==0)comp_data++; //等高電平的到來
if(comp_data>comp[0]) //9mS的低電平
{
comp_data=0;
while(red_rxd==1)
{
comp_data++; //等低電平的到來
if(comp_data>5000)
return;
}

if(comp_data>comp[1]) //4.5mS的低電平
{
while(i<4)
{
for(j=0;j<8;j++)
{
while(red_rxd==0); //等高電平的到來
comp_data=0;
while(red_rxd==1)
{
comp_data++; //等低電平的到來
if(comp_data>1500)
return;
}
ch[i]=ch[i]>>1;
if(comp_data>comp[2])
ch[i]=ch[i]|0x80;
}
i++;
}
Cnt++;
if(Cnt>3)Cnt=0;
if(ch[0]==0x00&&ch[1]==0xff&&(ch[2]+ch[3])==0xff)
{
IR_key=ch[2];
rxd_ture=1;
}
}
}
}
RedDly=3;
}

B. 如何用串口i軟體檢測串口設備波特率

簡單的運行 dmesg 命令
$ dmesg | grep tty
輸出:
[ 37.531286] serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[ 37.531841] 00:0b: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[ 37.532138] 0000:04:00.3: ttyS1 at I/O 0x1020 (irq = 18) is a 16550A
setserial 命令
setserial 是一個程序用於設定並/或報告某個串口關聯的配置信息。該信息包括串口用到的I/O 埠和中斷號,以及Break鍵是否應被解釋為Secure Attention Key 等等。 僅僅是輸出如下的命令:
$ setserial -g /dev/ttyS[0123]
輸出:
/dev/ttyS0, UART: 16550A, Port: 0x03f8, IRQ: 4
/dev/ttyS1, UART: 16550A, Port: 0x1020, IRQ: 18
/dev/ttyS2, UART: unknown, Port: 0x03e8, IRQ: 4
/dev/ttyS3, UART: unknown, Port: 0x02e8, IRQ: 3
帶-g選項的setserial幫助找到你的Linux板子上的物理串口。
Linux 串口控制台程序
一旦串口被確定了,你就能使用許多的工具來配置Linux板子:
minicom- 用於控制modem和連接到mp 設備的最好的串口通信程序。
wvidial or other GUI dial up networking program - 一個內建智能PPP 撥號器。
getty / agetty - agetty 打開一個 tty 埠, 提示登錄名稱並調用 /bin/login 命令。
grub / lilo configuration - 配置串口為系統控制台。

C. 關於串口通訊

利用串口進行數據通訊在通訊領域重佔有著重要的地位。利用RS232-RS485進行數據信號的採集和傳遞是VC編程的又一大熱點。串口通訊在通訊軟體重有著十分廣泛的應用。如電話、傳真、視頻和各種控制等。在各種開發工具中間,VC由於功能強大和靈活,同時也得到了Microsoft的最大支持,所以在一般進行涉及硬體操作的通訊編程中,大都推薦使用VC作為開發工具。然而工業控制串口通訊這個又不同於一般的串口通訊程序,因為控制外圍設備傳送的大都是十六進制數據(BYTE類型),所以,為了提高程序的運行穩定性,我們在編寫程序進行通訊時可以不考慮傳送BYTE類型數據的工作。
串口通訊目前流行的方法大概有兩種:一是利用Microsoft提供的CMSCOMM控制項進行通訊,不過現在很多程序員都覺應該放棄這種方式。二是利用WINAPI函數進行編程,這種編程的難度最高,要求你要掌握很多的API函數。三是利用現在網路上面提供的一些串口通訊控制項進行編寫,比如CSerial類等。

程序實現:
我在經過許多的項目的開發和實踐中發現,採用WIN API函數進行串口的開發能夠給程序員很大的控制項,並且程序運也很穩定。所以我將與串口接觸的函數進行封裝,然後在各個工程中進行調用,效果還是比較好的,現將各個函數和調用方法列舉出來,希望對各位有所幫助。
一、設置串口相關工作

#define MAXBLOCK 2048
#define XON 0x11
#define XOFF 0x13
BOOL SetCom(HANDLE &m_hCom, const char *m_sPort, int BaudRate, int Databit, CString parity, CString stopbit)
{
COMMTIMEOUTS TimeOuts; ///串口輸出時間 超時設置
DCB dcb; ///與埠匹配的設備
m_hCom=CreateFile(m_sPort, GENERIC_READ | GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
NULL); // 以重疊方式打開串口
if(m_hCom==INVALID_HANDLE_VALUE)
{
AfxMessageBox("設置串口部分,串口打開失敗"); /////重疊方式 非同步通信(INVALID_HANDLE_VALUE)函數失敗。
return FALSE;
}
SetupComm(m_hCom,MAXBLOCK,MAXBLOCK); //設置緩沖區
memset(&TimeOuts,0,sizeof(TimeOuts));
TimeOuts.ReadIntervalTimeout=MAXDWORD; // 把間隔超時設為最大,把總超時設為0將導致ReadFile立即返回並完成操作
TimeOuts.ReadTotalTimeoutMultiplier=0; //讀時間系數
TimeOuts.ReadTotalTimeoutConstant=0; //讀時間常量
TimeOuts.WriteTotalTimeoutMultiplier=50; //總超時=時間系數*要求讀/寫的字元數+時間常量
TimeOuts.WriteTotalTimeoutConstant=2000; //設置寫超時以指定WriteComm成員函數中的
SetCommTimeouts(m_hCom, &TimeOuts); //GetOverlappedResult函數的等待時間*/
if(!GetCommState(m_hCom, &dcb)) ////串口打開方式、埠、波特率 與埠匹配的設備
{
AfxMessageBox("GetCommState Failed");
return FALSE;
}

dcb.fParity=TRUE; //允許奇偶校驗
dcb.fBinary=TRUE;
if(parity=="NONE")
dcb.Parity=NOPARITY;
if(parity=="ODD")
dcb.Parity=ODDPARITY;
if(parity=="EVEN")
dcb.Parity=EVENPARITY;
if(stopbit=="1")//設置波特率
dcb.StopBits=ONESTOPBIT;
//if(stopbit=="0")//設置波特率
// dcb.StopBits=NONESTOPBIT;
if(stopbit=="2")//設置波特率
dcb.StopBits=TWOSTOPBITS;
BOOL m_bEcho=FALSE; ///
int m_nFlowCtrl=0;
BOOL m_bNewLine=FALSE; ///
dcb.BaudRate=BaudRate; // 波特率
dcb.ByteSize=Databit; // 每位元組位數
// 硬體流控制設置
dcb.fOutxCtsFlow=m_nFlowCtrl==1;
dcb.fRtsControl=m_nFlowCtrl==1 ?RTS_CONTROL_HANDSHAKE:RTS_CONTROL_ENABLE;
// XON/XOFF流控制設置(軟體流控制!)
dcb.fInX=dcb.fOutX=m_nFlowCtrl==2;
dcb.XonChar=XON;
dcb.XoffChar=XOFF;
dcb.XonLim=50;
dcb.XoffLim=50;
if(SetCommState(m_hCom, &dcb))
return TRUE; ////com的通訊口設置
else
{
AfxMessageBox("串口已打開,設置失敗");
return FALSE;
}
}

二、讀串口操作:
int ReadCom(HANDLE hComm, BYTE inbuff[], DWORD &nBytesRead, int ReadTime)
{
DWORD lrc; ///縱向冗餘校驗
DWORD endtime; /////////jiesuo
static OVERLAPPED ol;
int ReadNumber=0;
int numCount=0 ; //控制讀取的數目
DWORD dwErrorMask,nToRead;
COMSTAT comstat;
ol.Offset=0; ///相對文件開始的位元組偏移量
ol.OffsetHigh=0; ///開始傳送數據的位元組偏移量的高位字,管道和通信時調用進程可忽略。
ol.hEvent=NULL; ///標識事件,數據傳送完成時設為信號狀態
ol.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
endtime=GetTickCount()+ReadTime;//GetTickCount()取回系統開始至此所用的時間(毫秒)
for(int i=0;i<2000;i++)
inbuff[i]=0;
Sleep(ReadTime);
ClearCommError(hComm,&dwErrorMask,&comstat);
nToRead=min(2000,comstat.cbInQue);
if(int(nToRead)<2)
goto Loop;
if(!ReadFile(hComm,inbuff,nToRead,&nBytesRead,&ol))
{
if((lrc=GetLastError())==ERROR_IO_PENDING)
{
///////////////////
endtime=GetTickCount()+ReadTime;//GetTickCount()取回系統開始至此所用的時間(毫秒)
while(!GetOverlappedResult(hComm,&ol,&nBytesRead,FALSE))//該函數取回重疊操作的結果
{
if(GetTickCount()>endtime)
break;
}
}
}
return 1;
Loop: return 0;
}

三、寫串口命令
int WriteCom(HANDLE hComm, BYTE Outbuff[], int size, int bWrite[])
{
DWORD nBytesWrite,endtime,lrc;
static OVERLAPPED ol;
DWORD dwErrorMask,dwError;
COMSTAT comstat;
ol.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
ol.Offset=0;
ol.OffsetHigh=0;
ol.hEvent=NULL; ///標識事件,數據傳送完成時,將它設為信號狀態
ClearCommError(hComm,&dwErrorMask,&comstat);
if(!WriteFile(hComm,Outbuff,size,&nBytesWrite,&ol))
{
if((lrc=GetLastError())==ERROR_IO_PENDING)
{
endtime=GetTickCount()+1000;
while(!GetOverlappedResult(hComm,&ol,&nBytesWrite,FALSE))
{
dwError=GetLastError();
if(GetTickCount()>endtime)
{
AfxMessageBox("寫串口時間過長,目前串口發送緩沖區中的數據數目為空");
break;
}
if(dwError=ERROR_IO_INCOMPLETE)
continue; //未完全讀完時的正常返回結果
else
{
// 發生錯誤,嘗試恢復!
ClearCommError(hComm,&dwError,&comstat);
break;
}
}
}
}
FlushFileBuffers(hComm);
PurgeComm(hComm,PURGE_TXCLEAR);
bWrite=0;
return 1;
}

四、調用方法很簡單,只需要將你的串口參數進行簡單的設置就可以了。比如:
BOOL Main_OpenCom()//設置COM
{
int Boundrate=9600;//波特率
CString StopBits="1";//停止位
int DataBits=8;//數據位
CString Parity="ODD";//奇偶校驗
CString m_Port="COM1";
return SetCom(m_hCom1,m_Port,Boundrate,DataBits,Parity,StopBits);
}

void Main()
{
int SIZE;
DWORD BytestoRead=52*Count+6;//要11個位元組
int BWRITE[2];
int ReadTime=2000;
BYTE Outbuff[12]={0xff,0x00,0xea,0xff,0xea,0xff,0,0,0,0,0,0};
SIZE=sizeof(Outbuff);
WriteCom(m_hCom,Outbuff,SIZE,BWRITE);
ReadCom(m_hCom,m_Inbuff,BytestoRead,ReadTime);
//進行湘陰的解包處理
}

D. STC單片機串口程序

//注意,如您使用的MCU沒有那個功能,就不要操作相應的寄存器
//注意,如您使用的MCU沒有那那麼大的擴展SRAM,就不要操作超過范圍的SRAM

#include<reg51.h>
#include<intrins.h>
sfr S2CON = 0x9A;
//S2SM0,S2SM1,S2SM2,S2REN,S2TB8,SRB8,S2TI,S2RI

sfr IE2 = 0xAF;
//X,X,X,X,X,X,ESPI,ES2

sfr S2BUF = 0x9B;

sfr AUXR = 0x8e;
sfr BRT = 0x9c;
sfr IAP_CONTR = 0xC7;
sfr CCON = 0xD8;
sfr CMOD = 0xD9;
sfr CL = 0xE9;
sfr CH = 0xF9;
sfr CCAP0L = 0xEA;
sfr CCAP0H = 0xFA;
sfr CCAPM0 = 0xDA;
sfr CCAPM1 = 0xDB;
sbit CR = 0xDE;
sbit MCU_Start_Led = P1^7;
sbit S2_Interrupt_Receive_Led = P1^4;
//unsigned char self_command_array[4] = {0x22,0x33,0x44,0x55};
#define Self_Define_ISP_Download_Command 0x22
#define RELOAD_COUNT 0xfb //18.432MHz,12T,SMOD=0,9600bps

void serial_port_one_initial();
void send_UART_one(unsigned char);
void UART_one_Interrupt_Receive(void);

void serial_port_two_initial();
void send_UART_two(unsigned char);
void UART_two_Interrupt_Receive(void);

void soft_reset_to_ISP_Monitor(void);
void delay(void);
void display_MCU_Start_Led(void);
void send_PWM(void);

void main(void)
{
unsigned int array_point = 0;
unsigned char xdata Test_array_one[512] =
{
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,
0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f,
0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87,
0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f,
0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,
0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf,
0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf,
0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
0xff, 0xfe, 0xfd, 0xfc, 0xfb, 0xfa, 0xf9, 0xf8,
0xf7, 0xf6, 0xf5, 0xf4, 0xf3, 0xf2, 0xf1, 0xf0,
0xef, 0xee, 0xed, 0xec, 0xeb, 0xea, 0xe9, 0xe8,
0xe7, 0xe6, 0xe5, 0xe4, 0xe3, 0xe2, 0xe1, 0xe0,
0xdf, 0xde, 0xdd, 0xdc, 0xdb, 0xda, 0xd9, 0xd8,
0xd7, 0xd6, 0xd5, 0xd4, 0xd3, 0xd2, 0xd1, 0xd0,
0xcf, 0xce, 0xcd, 0xcc, 0xcb, 0xca, 0xc9, 0xc8,
0xc7, 0xc6, 0xc5, 0xc4, 0xc3, 0xc2, 0xc1, 0xc0,
0xbf, 0xbe, 0xbd, 0xbc, 0xbb, 0xba, 0xb9, 0xb8,
0xb7, 0xb6, 0xb5, 0xb4, 0xb3, 0xb2, 0xb1, 0xb0,
0xaf, 0xae, 0xad, 0xac, 0xab, 0xaa, 0xa9, 0xa8,
0xa7, 0xa6, 0xa5, 0xa4, 0xa3, 0xa2, 0xa1, 0xa0,
0x9f, 0x9e, 0x9d, 0x9c, 0x9b, 0x9a, 0x99, 0x98,
0x97, 0x96, 0x95, 0x94, 0x93, 0x92, 0x91, 0x90,
0x8f, 0x8e, 0x8d, 0x8c, 0x8b, 0x8a, 0x89, 0x88,
0x87, 0x86, 0x85, 0x84, 0x83, 0x82, 0x81, 0x80,
0x7f, 0x7e, 0x7d, 0x7c, 0x7b, 0x7a, 0x79, 0x78,
0x77, 0x76, 0x75, 0x74, 0x73, 0x72, 0x71, 0x70,
0x6f, 0x6e, 0x6d, 0x6c, 0x6b, 0x6a, 0x69, 0x68,
0x67, 0x66, 0x65, 0x64, 0x63, 0x62, 0x61, 0x60,
0x5f, 0x5e, 0x5d, 0x5c, 0x5b, 0x5a, 0x59, 0x58,
0x57, 0x56, 0x55, 0x54, 0x53, 0x52, 0x51, 0x50,
0x4f, 0x4e, 0x4d, 0x4c, 0x4b, 0x4a, 0x49, 0x48,
0x47, 0x46, 0x45, 0x44, 0x43, 0x42, 0x41, 0x40,
0x3f, 0x3e, 0x3d, 0x3c, 0x3b, 0x3a, 0x39, 0x38,
0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x30,
0x2f, 0x2e, 0x2d, 0x2c, 0x2b, 0x2a, 0x29, 0x28,
0x27, 0x26, 0x25, 0x24, 0x23, 0x22, 0x21, 0x20,
0x1f, 0x1e, 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 0x18,
0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10,
0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08,
0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00
};
unsigned char i = 0;

serial_port_one_initial(); //串口1初始化
// serial_port_two_initial(); //串口2初始化
display_MCU_Start_Led(); //點亮發光二極體表示單片機開始工作

// send_UART_two(0x55); //串口2發送數據表示單片機串口正常工作
// send_UART_two(0xaa); //串口2發送數據表示單片機串口正常工作
/*
for(array_point=0; array_point<512; array_point++)
{
send_UART_two(Test_array_one[array_point]);
}
*/
send_UART_one(0x34); //串口1發送數據表示單片機串口正常工作
send_UART_one(0xa7); //串口1發送數據表示單片機串口正常工作

for(array_point=0; array_point<512; array_point++)
{
send_UART_one(Test_array_one[array_point]);
}

// send_PWM(); //6kHz PWM, 50% ty
while(1);
}
void serial_port_one_initial()
{
SCON = 0x50; //0101,0000 8位可變波特率,無奇偶校驗位
// TMOD = 0x21; //0011,0001 設置頂時器1為8位自動重裝計數器
// TH1 = RELOAD_COUNT; //設置定時器1自動重裝數
// TL1 = RELOAD_COUNT;
// TR1 = 1; //開定時器1
BRT = RELOAD_COUNT;
// BRTR = 1, S1BRS = 1, EXTRAM = 1 ENABLE EXTRAM
AUXR = 0x11; // T0x12,T1x12,UART_M0x6,BRTR,S2SMOD,BRTx12,EXTRAM,S1BRS
ES = 1; //允許串口中斷
EA = 1; //開總中斷
}

void serial_port_two_initial()
{
//sfr SCON = 0x98;
//SM0,SM1,SM2,REN,TB8,RB8,TI,RI

//sfr S2CON = 0x9A;
//S2SM0,S2SM1,S2SM2,S2REN,S2TB8,S2RB8,S2TI,S2RI
//sfr S2BUF = 0x9B;
//sfr IE2 = 0xAF;
//X,X,X,X,X,X,ESPI,ES2

S2CON = 0x50; //0101,0000 8位可變波特率,無奇偶校驗位,允許接收

BRT = RELOAD_COUNT;
// BRTR = 1, S1BRS = 1, EXTRAM = 0 ENABLE EXTRAM
AUXR = 0x11; // T0x12,T1x12,UART_M0x6,BRTR,S2SMOD,BRTx12,EXTRAM,S1BRS
// ES = 1; //允許串口1中斷
// ES2 = 1
IE2 = 0x01; //允許串口2中斷,ES2=1
EA = 1; //開總中斷
}

void send_UART_one(unsigned char i)
{
ES = 0; //關串口中斷
TI = 0; //清零串口發送完成中斷請求標志
SBUF = i;
while(TI ==0); //等待發送完成
TI = 0; //清零串口發送完成中斷請求標志
ES = 1; //允許串口中斷
}

void send_UART_two(unsigned char i)
{
//sfr SCON = 0x98;
//SM0,SM1,SM2,REN,TB8,RB8,TI,RI

//sfr S2CON = 0x9A;
//S2SM0,S2SM1,S2SM2,S2REN,S2TB8,S2RB8,S2TI,S2RI
//sfr S2BUF = 0x9B;
//sfr IE2 = 0xAF;
//X,X,X,X,X,X,ESPI,ES2

unsigned char temp = 0;

// ES = 0; //關串口1中斷
IE2 = 0x00; //關串口2中斷,es2=0
// TI = 0; //清零串口1發送完成中斷請求標志
S2CON = S2CON & 0xFD; //B'11111101,清零串口2發送完成中斷請求標志
// SBUF = i;
S2BUF = i;
// while(TI ==0); //等待發送完成
do
{
temp = S2CON;
temp = temp & 0x02;
}while(temp==0);

// TI = 0; //清零串口發送完成中斷請求標志
S2CON = S2CON & 0xFD; //B'11111101,清零串口2發送完成中斷請求標志
// ES = 1; //允許串口1中斷
// ES2 = 1
IE2 = 0x01; //允許串口2中斷,ES2=1
}

void UART_one_Interrupt_Receive(void) interrupt 4
{
unsigned char k = 0;
if(RI==1)
{
RI = 0;
k = SBUF;
if(k==Self_Define_ISP_Download_Command) //是自定義下載命令
{
delay(); //延時1秒就足夠了
delay(); //延時1秒就足夠了
soft_reset_to_ISP_Monitor(); //軟復位到系統ISP監控區
}
send_UART_one(k+1);
}
else
{
TI = 0;
}
}

void UART_two_Interrupt_Receive(void) interrupt 8
{
//sfr SCON = 0x98;
//SM0,SM1,SM2,REN,TB8,RB8,TI,RI

//sfr S2CON = 0x9A;
//S2SM0,S2SM1,S2SM2,S2REN,S2TB8,S2RB8,S2TI,S2RI
//sfr S2BUF = 0x9B;
//sfr IE2 = 0xAF;
//X,X,X,X,X,X,ESPI,ES2

unsigned char k = 0;
k = S2CON ;
k = k & 0x01;
//if(S2RI==1)
if(k==1)
{
//RI = 0;
S2CON = S2CON & 0xFE; //1111,1110
S2_Interrupt_Receive_Led = 0;

k = S2BUF;
if(k==Self_Define_ISP_Download_Command) //是自定義下載命令
{

delay(); //延時1秒就足夠了
delay(); //延時1秒就足夠了

soft_reset_to_ISP_Monitor(); //軟復位到系統ISP監控區
}
send_UART_two(k+1);
}
else
{
//TI = 0;
S2CON = S2CON & 0xFD; //1111,1101
}
}
void soft_reset_to_ISP_Monitor(void)
{
IAP_CONTR = 0x60; //0110,0000 軟復位到系統ISP監控區
}
void delay(void)
{
unsigned int j = 0;
unsigned int g = 0;
for(j=0;j<5;j++)
{
for(g=0;g<60000;g++)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}

void display_MCU_Start_Led(void)
{
//sbit MCU_Start_Led = P1^7;
unsigned char i = 0;
for(i=0;i<1;i++)
{
MCU_Start_Led = 0; //頂亮MCU開始工作指示燈
delay();
MCU_Start_Led = 1; //熄滅MCU開始工作指示燈
delay();
MCU_Start_Led = 0; //頂亮MCU開始工作指示燈
}
}

void send_PWM(void)
{
CMOD = 0x00; // CIDL - - - - CPS1 CPS0 ECF Setup PCA Timer
// CPS1 CPS0 = 00, Fosc/12 is PCA/PWM clock
// 18432000/12/256 = 6000
CL = 0x00;
CH = 0x00;
CCAP0L = 0x80; //Set the initial value same as CCAP0H
CCAP0H = 0x80; //50% Duty Cycle
CCAPM0 = 0x42; //0100,0010 Setup PCA mole 0 in 8BIT PWM, P3.7
CR = 1; //啟動 PCA/PWM 定時器
}

E. 手機指令的專有指令

三星復位過電話 :*2767*2878#
三星硬體版本:*#8999*837#
三星解話機鎖:*2767*2878#/*2767*7377#
三星碼片復位:*2767*3855# 也可用於解機鎖或卡鎖
三星顯溫度、電池容量:*#0228#
三星調顯示屏對比度:*#0523#
三星軟體版本:*#9999#
三星A100-A188看版本:*#0837#
三星手機的秘籍:取消開機顯示的國家名
SGH-800c:輸入 *#9998*268#,這時手機會出現一個菜單,按向上或向下的按鍵,選取 Default Logo 即可;
SGH-A100:輸入 *#9998*627837793#,這時手機會顯示輸入的命令不對,不要緊,按一下向下的箭頭,輸入 *#9998*5646#,選取 Default Logo 即可
*#9998*4357# 可用指令列表(即HELP,可看到以下大部分指令);
*#9999# 查看軟體版本;
*#0837# 顯示硬體版本(包括軟體版本和硬體生產日期,第6屏 MP V1.xxx為硬體版本);
*#0001# 顯示RS232串列通信參數設置;
*#0324# 網路檢測(工程模式);
*#0636# 存儲器容量顯示;
*#0842# 測試震動;
*#0289#或*#9998*289# 測試響鈴(鈴聲調整,振鈴器頻率測試/顯示頻率,上下鍵調節);
*#0228#或*#9998*228#或*#1999# 顯示電池的所有信息,電池參數顯示,電池容量,類型/電壓/溫度;
*#0778#或*#9998*0778# 翻屏,就可以顯示SIM卡的詳細信息了;
*#0782# RTC Display(好象是顯示當前時鍾)
*#0523#或*#9998*523# LCD對比度,上下鍵調節
*#9998*364# 顯示Watchdog狀態
*#9998*427# WATCHDOG信號路徑設置
*#9998*746# SIM卡文件規格測試
*#9998*0377# 軟體出錯LOG (EEPROM錯誤顯示)
*#0638# SIM net Work ID
*#9998*3323# Forced Crash
(此欄估計是程序調試所用,慎用,有些死機只能下電池了)
*#9998*9266# 顯示收信通道號及收信強度;
*#9998*786# 顯示的內容為本次開機的時間以及本次開機後到當前的時間長。
按-後顯示最新的本次開機後到當前的時間長;
再按-後顯示上一次的開機時間;
再按-後顯示上一次的關機時間以及上次開關機的時長;
*#9998*5646# 更改開機顯示國家(GSM LOGO SET);
*2767*3855#或*9998*947# 把手機Flash中的IMEI碼還原到EEPROM碼片中,
再用*#06#可看IMEI是否被更改;
*2767*927# 這是I5版解決WAP設置從起,上網的方法;
*2767*2878# 機器主復位!會刪除話機中的電話簿和話機的設置;
*#9998*76#或*#9998*0076# 你的手機上會有「prot number」(Protion No)提示,
如果你的三星手機是行貨的話,在「number」下面有一串的數字,
水貨的話都沒有的;
NET1000
*#06#
*73738#默認設置(按發射鍵)
*#2820# 版本
SP鎖信息
* # 3210 # (按發射鍵)
*#8140#(按發射鍵) 網路鎖信息
SIM lock
*#4960 #(按發射鍵) 查* 4960 *口令*口令# (按發射鍵) 到鎖#4960*口令#(按發射鍵) 到開鎖!(口令是8位的)
網路鎖
*#7320#(按發射鍵) 查* 7320 *口令*口令#(按發射鍵) #7320*口令#開鎖
網路鎖2
*#2220#(按發射鍵) 查* 2220 *口令*口令#(按發射鍵) #2220*口令#開鎖
Subnet鎖
*#1110# (按發射鍵) 查* 1110 *口令*口令#(按發射鍵) #1110*口令#(按發射鍵) 開鎖 摩托羅拉T2688/T2988/T189/T191解所有鎖:19980722
摩托羅拉T190解所有鎖:20010903
T2688/2988/988d沒有中文:*#0000# OK(插卡)
摩托羅拉所有機鎖:按MENU+5+1/2 西門子亂文回中文:*#0000#/*#0086#
西門子軟體版本:*#06# 左鍵
西門子解密: *#0003*加解鎖碼# 愛立信老機回英語:*#0000#
愛立信新機回英語:按CLR-左鍵-0000-右鍵
愛立信顯出廠日期:右、*、左、左、*、左、*鍵 諾基亞顯出廠日期:*#0000#(插卡)
諾基亞省30%電:*#746025625#
對於所有諾基亞手機,可以通過在手機待機狀態下鍵入*#06#,查看該手機的串號。並從串號中獲知該機產地。顯示串號的第7、8位分別表示:
10 為芬蘭(Finland)生產
20 為德國(Germany)生產
30 為韓國(Korea)生產
40 為北京(China)生產
8110系列
軟體版本:*#8110#
輸入:*#92702689# 手機會出現「warranty code:」然後輸入
a.6232 (OK):顯示手機出廠年 月份
b.7332 (OK):顯示手機上次維修日期
c.7832 (OK):顯示手機購買日期
d.9268 (OK):顯示手機IMEI碼
61xx系列
顯示IMEI號*#06#
顯示軟體版本:*#0000#第一行--軟體版本;第二行--軟體發布日期;第三行--手機型號
鍵入下列命令:*#92702689#
第一屏表示-手機出廠日期;第二屏表示-串號和IMEI;第三屏表示-購買日期;第四屏表示-最後修理日期.
*3370#激活EFR模式(全速增強型編碼模式,可改善話音質量但會耗電)
#3370#關閉EFR模式(注意:在按下上面兩個命令後手機會重新開機一次,這是正常的。)
*4720#激活HR模式(半速模式)話音質量變低,但是大大延長電池使用時間(大概30%左右)需要網路支持。
#4720#關閉HR模式
5110系列
功能如6110、6150系列手機
5110鎖碼機解碼
⒈按C,按下 -> 按C不放 -> 按*不放 ->;按*不放 -> 鍵入04*PIN*PIN*PIN#,就完成了
另外檢查5110/6110/6150是否為鎖頻機方法如下:
#pw+1234567890+1# 查詢是否鎖國碼
#pw+1234567890+2# 查詢是否鎖網路碼
#pw+1234567890+3# 查詢是否鎖網路提供者鎖定的碼
#pw+1234567890+4# 查詢是否鎖 SIM 卡
注意: pw 和 + 的輸入為按 * 健數次後即會出現 飛利浦強迫重連網:*#2562*#
飛利浦顯示和更改手機密碼:*#7489*#
飛利普 顯示和更改手機的保密碼 *#7489*#>>
飛利浦手機的秘籍:Philips DIGA 和 GENIE 輸入 *#7489 *# 可以看到密碼,Philips FIZZ 輸入 *#1234*# 可以查看密碼 博世(BOSCH)909S回中文:*#0852#
博世(BOSCH)909s回英文:*#0851#
NEC顯軟體版本:*#2820#
NEC恢復原廠設置:*#73738#
華夏一號2.332的可以用19980722
波導s1000隱藏功能:*#*#1705#
波導s1000解鎖:*#*#1705#46
波導S1000 999d 720 開機 24681357 OK鍵
如死機再用---24681357
波導8xx/9xx系列:*#串號後9位的前8位按OK
SIM卡 波導串號最後9位去掉最後一位
阿爾卡特OT221/220解鎖:25228352/ALCATEL+D
阿爾卡特OT301/302解鎖:83227423
阿爾卡特OT500/700解鎖:25228352
康佳:*#0001# *#1001# ##1001#
康佳小雪5219:#8879576# 原始:1234
康佳3118看軟體版本:*3118#
康佳3228看軟體版本:*0519#
康佳3238看軟體版本:*300#
康佳5218解鎖:#8879576#
康佳3118。3118+。3228解鎖:##1001#
康佳3118 解除網路鎖*94726501#
康佳3238解鎖:19980722
康佳3118 3228隻識別一張卡鎖:*94726501# 話機鎖:##1001# *#0001#
GVC:*#1001* (海爾)
南方高科320開機鍵入##1001#,然後裝上卡輸入0000 OK
三菱NET LOCK:*787090或*787292
三菱IMSI LOCK:*362628或*360608
三菱NETSUB LOCK:*476989
三菱CP LOCK:*482896或*480896
三菱SP LOCK:*967678
三菱EXT LOCK:*574243
科建 *#722#不插卡調菜單 *#701# 版本號 *#715# 復位碼片解鎖 *#760# 調節對比度
阿爾卡特
BE3(221) 25228352
BE4(301、302、303) 83227423
BE5(500、700) 25228352 >>
康佳 gvc 海爾:*#0001#
康佳小雪5219 #8879576# 原始密碼:1234
TCL-8988,8188,8388,999D解密*#*#1705#選4在選6按OK就可以了
松下G600:撥打112時,按紅鍵停止,並在顯示END CALL時馬上輸入*#06#,此時顯示IMEIM碼,再按C
波導8xx,9xx的萬能密碼:*#+imei7-14#,
三菱
Net Lock:*787090 或 *787292
IMSI Lock:*362628 或 *360608
NetSub Lock:*476989
CP Lock:*482896 或 *480896
SP Lock:*967678
Ext Lock:*574243 基本信息
設置指令:*#66*#
中文語言:*#0086# + send
查看版本:*#8375##
軟體版本:*#8882#
測 試:*#87#
調 試:*#8899#
默認語言:*#0000#+通話鍵
設置英文:*#0044#+通話鍵
繁體中文:*#0886#+通話鍵
簡體中文:*#0086#+通話鍵
串號查詢:*#06#
原廠設置:*#66*#
查看版本:*#8375#
工程指令:*#3646633# 或*#3698741#
自動測試:*#87#
軟體版本:*#8882#
MMT晶元的出廠密碼為1122
原廠設置
┳━━Version版本信息
┃┣━━MCU SW微程序控制器軟體
┃┣━━Melody曲調版本
┃┣━━Serial No.序列號
┃┣━━BB Chip基板晶元 (MT6218B,還有哪個手機用它的?)
┃┣━━DSP Code數字信號處理器代碼
┃┣━━DSP Patch 數字信號處理器修正版本號
┃┣━━MS BoardMS 板(不太清楚,不知是什麼的縮寫。Memory System??)
┃┗━━Build No. 版本號

┣━━Resource BIN 資源 BIN(不知道該怎麼翻,二進制代碼嗎?)
┃┣━━Audio音頻
┃┣━━Image圖像
┃┣━━STR字元串(猜的)
┃┗━━Font字體

┣━━Echo Loop循環顯示(不知道翻的准不準) 可以開關,但是不知道有啥用

┣━━按鍵 (原本就是中文)按確定進入可以測試鍵盤上的鍵是否好使
┃按下相應的鍵,屏幕上的字元會消失,證明此鍵好使
┃UP:方向鍵上 DN:方向鍵下 LF:方向鍵左 RT:方向鍵右
┃LSK:左軟鍵(一點都沒覺得軟) RSK:有軟鍵(還不如左軟鍵)
┃Snd:接通鍵 End:掛機鍵 Vup:音量大 Vdn:音量小
┃1 2 3 4 5 6 7 8 9 0 * # :數字鍵及*#
┃測試完成後會出現Pass

┣━━Vibrator震動測試 選「開」測試震動功能是否可用

┣━━Loud Spk揚聲器(我一直想說「喇叭」)測試 選「開」測試揚聲器是否可以發聲

┣━━鈴聲(原本就是中文) 鈴聲測試 選「開」測試鈴聲功能是否正常

┣━━LED發光二極體指示燈(彩燈)測試
┃┣━━Main LCM BL 主顯示屏背光 (可開關,選關會熄滅,再按一下左鍵可再打開)
┃┣━━Sub LCM BL子顯示屏背光 (可開關,但我得沒什麼反應,沒壞吧?)
┃┣━━Keypad LED鍵盤燈(可開關)
┃┣━━Status LED R狀態燈紅色
┃┣━━Status LED G狀態燈綠色
┃┗━━Status LED B狀態燈藍色(我的三種顏色錯位了)

┣━━LCD顯示屏測試
┃┣━━Auto display自動測試 自動用紅綠藍白四色填充屏幕,可測出是否有壞點
┃┣━━Red用紅色填充屏幕
┃┣━━Green用綠色填充屏幕
┃┣━━Blue用藍色填充屏幕
┃┗━━White用白色填充屏幕

┣━━LCD Contract顯示屏對比度測試
┃┣━━Main LCD主顯示屏對比度,會顯示一張圖片
┃┃按方向鍵上下可調十五級對比度,不過我怎麼調都沒什麼變化
┃┗━━SubLCD子(外)顯示屏對比度,可以調十五級對比度
┃調整有變化,但是沒有圖片,只有文字

┣━━Receiver接收機(??)測試本來想翻成話筒的,但是話筒被什麼反應
┃不知這個Receiver指什麼
┃選開始就發出吱吱的聲音,刺耳死了

┣━━ADC不知是什麼的縮寫
┃┣━━VBAT電池電壓
┃┣━━BTemp電池溫度(很多人說電池溫度低不能充電,道理就在這)
┃┣━━VAUX輔助電壓(不知是什麼),通常為0.02V
┃┣━━Current充電電流,用數據線充電時為0.33A,不小阿
┃┗━━VChgr充電電壓,插上充電器/數據線才會有

┣━━Charger充電器,進入以後和上面的ADC是同一個菜單

┣━━Headset耳機測試(耳機丟了,沒法試),可以開關,可能插上耳機會有什麼聲音吧

┣━━RTC個人推測應該是Real Time Clock的縮寫,實際上是測試關機鬧鍾的
┃按「確定」會馬上關機並測試關機鬧鍾是否可以在關機狀態下啟動鬧鈴

┣━━MTBF依然不知是什麼的縮寫
┃按「確定」後把振動、揚聲器、LCD、LED整合在一起測試

┣━━Nand Flash快閃記憶體晶元測試,如果正常顯示「成功」

┗━━CAMERA攝像頭測試,按「確定」進入,選擇「選項」有三個選項
┣━━Flash Level R按照翻譯過來的意思,應該是調閃光燈色彩的
┣━━Flash Level G但是不管怎麼調都沒什麼變化
┗━━Flash Level B於是不知道這幾個是管什麼的了
工程模式
進入工程模式後,會出現一個全新界面,有很多人可能覺得新鮮,但我要說的是,看看可以,盡量不要隨意改動設置,畢竟這不是開放給普通用戶的,否則會造成很嚴重的後果,下面給大家介紹一下,具體內容:
打開數字鍵盤,輸入*#3646633#或*#3698741#進入工程模式菜單。
┳━網路號碼
┃┣━MRR Cell Sel
┃┣━MRR Ch Dscr
┃┣━MRR Ctrl Chan
┃┣━MRR RACH Ctrl
┃┣━RR LAI Info
┃┣━RR Radio Link
┃┣━RR Meas Rep
┃┣━CC Chan Info
┃┣━CC Call Info
┃┗━CB Info
┣━設備
┃┣━LCD---液晶顯示屏(Liquid Crystal Display)
┃┃ ┗━主屏幕
┃┃ ┣━Set Contrast---設置對比度
┃┃ ┣━Set Bias Ratio---設置斜比率
┃┃ ┣━Set Line Rate---設置行比率
┃┃ ┗━Set temperature---設置溫度
┃┣━GPIO---通用輸入輸出口(General Purpose I/O port)
┃┃ ┣━List GPIO---GPIO列表
┃┃ ┃ ┣━GP1_CAMPWREN
┃┃ ┃ ┣━GP2_CMlight_EN
┃┃ ┃ ┣━GP3_BTDATA
┃┃ ┃ ┣━GP4_BTDISCON
┃┃ ┃ ┣━GP6_CMFLASH
┃┃ ┃ ┣━GP7_ⅥBEN
┃┃ ┃ ┣━GP0_RLEDEN
┃┃ ┃ ┣━GP10_BTAUDIO
┃┃ ┃ ┣━GPIO11_PRELEDEN
┃┃ ┃ ┣━GPIO12_BTPWREN
┃┃ ┃ ┣━GP31_CHRCTL
┃┃ ┃ ┣━GP39_BTRESET
┃┃ ┃ ┣━GP38_BLED_EN
┃┃ ┃ ┣━GP23_KPLENDPWN
┃┃ ┃ ┣━GPIO52_GLED0
┃┃ ┃ ┣━GPO1_OPON
┃┃ ┃ ┣━GP54_OPON
┃┃ ┃ ┗━GPO2_USBEN
┃┃ ┣━GPIO Editor---GPIO編輯器
┃┃ ┗━GPO Editor---GPO編輯器
┃┣━PWM---脈沖寬度調制技術(Pulse Width Molation)
┃┃ ┣━PWM1
┃┃ ┃ ┣━Level: 5---等級
┃┃ ┃ ┣━Frequency: 200---頻率
┃┃ ┃ ┗━Duty: 0
┃┃ ┣━PWM2
┃┃ ┃ ┣━Level: 1
┃┃ ┃ ┣━Frequency: 200
┃┃ ┃ ┗━Duty: 20
┃┃ ┗━PWM3
┃┃ ┣━Level: 5
┃┃ ┣━Frequency: 200
┃┃ ┗━Duty: 0
┃┣━EINT---開啟中斷(Enable Interrupt)?
┃┃ ┣━Earphone 0---耳機
┃┃ ┣━Cable 0---電纜
┃┃ ┣━Charger 0---充電器
┃┃ ┗━Bluetooth 0---藍牙
┃┣━ADC---模擬數字轉換器(Analogue-Digital Converter)
┃┃ ┣━VBAT 3.88 V---電池電壓
┃┃ ┣━BTemp 36.66 C---電池溫度
┃┃ ┣━VAUX 0.28 V---輔助電壓
┃┃ ┣━Current n/a---電流
┃┃ ┗━VChgr 0.06 V---充電電壓
┃┣━Set Default Level---設置默認級別
┃┃ ┣━MainLCD Contrast---主屏對比度
┃┃ ┃ ┣━[LEV 1] 120
┃┃ ┃ ┣━[LEV 2] 122
┃┃ ┃ ┣━[LEV 3] 124
┃┃ ┃ ┣━[LEV 4] 126
┃┃ ┃ ┣━[LEV 5] 128
┃┃ ┃ ┣━[LEV 6] 130
┃┃ ┃ ┣━[LEV 7] 132
┃┃ ┃ ┣━[LEV 8] 134
┃┃ ┃ ┣━[LEV 9] 136
┃┃ ┃ ┣━[LEV 10] 138
┃┃ ┃ ┣━[LEV 11] 140
┃┃ ┃ ┣━[LEV 12] 142
┃┃ ┃ ┣━[LEV 13] 144
┃┃ ┃ ┣━[LEV 14] 146
┃┃ ┃ ┗━[LEV 15] 148
┃┃ ┣━Battery---電池
┃┃ ┃ ┣━LEV 1:3500000
┃┃ ┃ ┣━LEV 2:3550000
┃┃ ┃ ┣━LEV 3:3600000
┃┃ ┃ ┣━LEV 4:3650671
┃┃ ┃ ┣━LEV 5:3721801
┃┃ ┃ ┣━LEV 6:3801801
┃┃ ┃ ┣━LEV 7:3901801
┃┃ ┃ ┣━LEV 8:9999999
┃┃ ┃ ┣━LEV 9:9999999
┃┃ ┃ ┗━LEV 10:9999999
┃┃ ┣━PWM 1
┃┃ ┃ ┣━[Freq 1] 200
┃┃ ┃ ┣━[Duty 1] 100
┃┃ ┃ ┣━[Freq 2] 200
┃┃ ┃ ┣━[Duty 2] 60
┃┃ ┃ ┣━[Freq 3] 200
┃┃ ┃ ┣━[Duty 3] 40
┃┃ ┃ ┣━[Freq 4] 200
┃┃ ┃ ┣━[Duty 4] 20
┃┃ ┃ ┣━[Freq 5] 200
┃┃ ┃ ┗━[Duty 5] 0
┃┃ ┣━PWM 2
┃┃ ┃ ┣━[Freq 1] 200
┃┃ ┃ ┣━[Duty 1] 20
┃┃ ┃ ┣━[Freq 2] 200
┃┃ ┃ ┣━[Duty 2] 40
┃┃ ┃ ┣━[Freq 3] 200
┃┃ ┃ ┣━[Duty 3] 60
┃┃ ┃ ┣━[Freq 4] 200
┃┃ ┃ ┣━[Duty 4] 80
┃┃ ┃ ┣━[Freq 5] 200
┃┃ ┃ ┗━[Duty 5] 100
┃┃ ┗━PWM 3
┃┃ ┣━[Freq 1] 200
┃┃ ┣━[Duty 1] 100
┃┃ ┣━[Freq 2] 200
┃┃ ┣━[Duty 2] 60
┃┃ ┣━[Freq 3] 200
┃┃ ┣━[Duty 3] 40
┃┃ ┣━[Freq 4] 200
┃┃ ┣━[Duty 4] 20
┃┃ ┣━[Freq 5] 200
┃┃ ┗━[Duty 5] 0
┃┣━Set UART---設置通用非同步收發器(Universal Asynchronous Receiver/Transmitter)
┃┃ ┣━TST Config---測試配置
┃┃ ┃ ┣━UART Port: UART2---UART埠
┃┃ ┃ ┗━Buad Rate: 115200---波特率
┃┃ ┣━PS Config
┃┃ ┃ ┣━UART Port: UART1
┃┃ ┃ ┗━Buad Rate: 115200
┃┃ ┗━設定USB序列介面使用方法
┃┃ ┣━數據
┃┃ ┗━偵錯
┃┣━Sleep Mode---睡眠模式
┃┃ ┣━Enable(.)---有效
┃┃ ┗━Disable---無效
┃┣━SWDBG---軟體調試(Software Debug)
┃┃ ┣━OFF
┃┃ ┣━DSP L1 PS
┃┃ ┣━L1 PS
┃┃ ┣━MCU
┃┃ ┗━RESET
┃┗━NAND Format---NAND格式化
┣━音頻
┃┣━設置模式
┃┃ ┣━正常
┃┃ ┣━LoudSp Mode---擴音模式
┃┃ ┗━Headset Mode---耳機模式
┃┣━正常
┃┃ ┣━有限脈沖響應(1-5)
┃┃ ┣━Speech (0-6)---說話
┃┃ ┣━Key Tone (0-6)---按鍵音
┃┃ ┣━Melody (0-6)---音調
┃┃ ┣━Sound (0-6)---聲音
┃┃ ┣━Microphone 136---麥克風
┃┃ ┗━Side Tone 40---邊鍵音
┃┣━LoudSp Mode
┃┃ ┣━Speech (0-6)
┃┃ ┣━Key Tone (0-6)
┃┃ ┣━Melody (0-6)
┃┃ ┣━Sound (0-6)
┃┃ ┣━Microphone 80
┃┃ ┗━Side Tone 0
┃┣━Headset Mode
┃┃ ┣━Speech (0-6)
┃┃ ┣━Key Tone (0-6)
┃┃ ┣━Melody (0-6)
┃┃ ┣━Sound (0-6)
┃┃ ┣━Microphone 100
┃┃ ┗━Side Tone 0
┃┣━鈴聲 (IMY 0-9; MIDI 0-14;SOUND 0-9)
┃┣━語音增強
┃┃ ┣━通用參數(參數 0-11)
┃┃ ┣━正常(參數 0-7)
┃┃ ┣━Headset Mode(參數 0-7)
┃┃ ┣━LoudSp Mode(參數 0-7)
┃┃ ┣━藍牙耳機模式(參數 0-7)
┃┃ ┣━藍牙無線模式(參數 0-7)
┃┃ ┣━輔助模式1(參數 0-7)
┃┃ ┣━輔助模式2(參數 0-7)
┃┃ ┗━輔助模式3(參數 0-7)
┃┗━Max Swing: 12800
┣━Gprs act
┃┣━Attach---聯接
┃┣━Activate PDP (PDP Context 1-15)---激活
┃┣━Deactivate PDP---取消
┃┣━Send Data---發送數據
┃┃ ┣━Send Norm Data---發送基準數據
┃┃ ┗━Send RLC Data---發送實時時鍾(Real Time Clock)數據?
┃┗━PING
┃┣━Send Norm Data
┃┗━Send RLC Data
┣━頻寬選取
┃┣━900
┃┣━1800
┃┣━900/1800(.)
┃┗━Auto
┣━Misc.---雜類(miscellaneous)
┃┣━Auto Answer[關閉]---自動應答
┃┣━High Speed SIM[關閉]---高速SIM (別按,否者無法開機)
┃┣━PWR Duration---電源持續時間
┃┃ ┣━PWR Duration---電源持續時間
┃┃ ┣━Current Time---當前時間
┃┃ ┣━Duration---持續時間
┃┃ ┗━Last Duration---上次持續時間
┃┣━Backlight Mode[關閉]---背景燈
┃┣━序列阜偵測模式
┃┃ ┣━UART 1[關閉]
┃┃ ┣━UART 2[關閉]
┃┃ ┗━UART 3[關閉]
┃┣━Assert Testing(don't submit as a bug)---斷言測試(不作為缺陷提交)一
┃┣━RAM Test---RAM測試
┃┣━Memoey Dump[關閉]---內薦垃圾
┃┣━MMI Debug[關閉]---人機界面(Man-Machine Interface)調試
┃┣━WAP---無線應用協議(Wireless Application Protocol)
┃┃ ┣━WAP Assert for Debug[關閉]
┃┃ ┣━User Agent---用戶代理
┃┃ ┃ ┣━MAUI E800(.)
┃┃ ┃ ┣━SONY P800
┃┃ ┃ ┣━NOKIA 7250i
┃┃ ┃ ┣━SHARP GX21
┃┃ ┃ ┣━SONY T610
┃┃ ┃ ┣━SAMSUNG
┃┃ ┃ ┣━NOKIA 6230
┃┃ ┃ ┣━MOTO V303
┃┃ ┃ ┣━SE W800i
┃┃ ┃ ┗━SE Z800
┃┃ ┣━Accept Header---接受的數據頭
┃┃ ┃ ┣━WAP 1.2.1
┃┃ ┃ ┣━WAP 2.0(.)
┃┃ ┃ ┣━WML---無線標記語言(Wireless Markup Language)
┃┃ ┃ ┣━XHTML---擴展超文本標記語言(eXtend Hypertext Markup Language)
┃┃ ┃ ┗━HTML---超文本標記語言(Hypertext Markup Language)
┃┃ ┣━MMS Version---彩信(Multimedia Message Service)版本
┃┃ ┃ ┣━MMS Default
┃┃ ┃ ┣━MMS 1.0(.)
┃┃ ┃ ┣━MMS 1.1
┃┃ ┃ ┗━MMS 1.2
┃┃ ┗━Offline Page[關閉]---離線頁面
┃┣━J2ME TCK---J2ME(Java 2 Micro Edition) TCK(Technology Compatibility Kit)
┃┃ ┣━Normal(.)
┃┃ ┣━CLDC TCK
┃┃ ┣━MIDP TCK
┃┃ ┣━WMAPI TCK
┃┃ ┗━MMAPI TCK
┃┗━Video High Bitrate[關閉]---視頻的高比特率
┣━Auto Test List---自動測試列表
┃┣━Version---版本
┃┃ ┣━Add from List---從列表添加
┃┃ ┣━Change Priority---改變優先權
┃┃ ┗━Remove---移除
┃┣━Backlight---背景燈
┃┣━LCD---液晶顯示屏
┃┣━Receiver---受話器
┃┣━MIC---麥克風
┃┣━Speaker--揚聲器
┃┣━Headset---耳機
┃┣━Melody---鈴聲
┃┣━Vibrator---馬達
┃┣━CAMERA---攝像頭
┃┣━MemoryCard---存儲卡
┃┣━KeyPad---鍵盤
┃┗━Flashlight---七彩燈
┣━PWR Down Control---電源下降控制
┃ ┣━PDN_con0: 1278
┃ ┣━PDN_con1: 65175
┃ ┣━PDN_con2: 63470
┃ ┗━PDN_con3: 65535
┣━SW PATCH SELTECT---軟體補丁選擇
┃ ┗━DSP Patch: 0
┣━Debug Info---調試信息
┃ ┣━FS trace[關閉]---文件系統(File System)跟蹤
┃ ┗━Last Exception---上次異常
┗━Socket Test---套接字測試
┃ ┣━DNS Query: nul---域名伺服器(Domain Name Server)查詢
┃ ┣━HTTP Get: nul---獲取HTTP
┃┣━ECHO---回應
┃ ┣━Server IP: 000.000.000.000---伺服器IP(Internet protocal)
┃ ┗━Echo String: nul---回應的字元串
┃ ┗━Date Query---日期查詢
┃ ┗━Server IP: 000.000.000.000
┣━Bluetooth---藍牙
┃ ┣━Start Testing
┃ ┣━Add Audio Conn
┃ ┣━Remove Audio Conn
┃ ┣━Far End Lookback
┃ ┗━Exit Test Mode
┣━Profiling
┃ ┗━Multimedia
┗━RF Test Tool
如果自己要修改,最好在修改之前,把它的值記錄下來,以便能再次修改回來.
以上資料僅供參考!

F. 求解串口攝像頭問題,直接與PC相連接利用串口助手發指令有正確數據返回,接單片機串口發同樣指令無數據返

1. 確定收發沒有接反。確定物理連接沒有問題。
2. 確定波特率、幀格式完全一致。
3. 確定你的軟體沒有問題,命令幀的確已經正確發出。

G. C語言編寫串口通信程序在裸機下運行

單片機你在網上搜一下吧
如果想入門 最好去圖書館借點書看,比較難理解 祝好運了!!
我給你提供以下資料 是網路上找的。

概述
單片機是指一個集成在一塊晶元上的完整計算機系統。盡管它的大部分功能集成在一塊小晶元上,但是它具有一個完整計算機所需要的大部分部件:CPU、內存、內部和外部匯流排系統,目前大部分還會具有外存。同時集成諸如通訊介面、定時器,實時時鍾等外圍設備。而現在最強大的單片機系統甚至可以將聲音、圖像、網路、復雜的輸入輸出系統集成在一塊晶元上。
目錄[隱藏]

單片機介紹
單片機的應用領域
學習應用六大重要部分
單片機學習
常用單片機晶元簡介
從無線電世界到單片機世界
單片機攻擊技術
單片機侵入型攻擊的一般過程

單片機也被稱為微控制器(Microcontroller),是因為它最早被用在工業控制領域。單片機由晶元內僅有CPU的專用處理器發展而來。最早的設計理念是通過將大量外圍設備和CPU集成在一個晶元中,使計算機系統更小,更容易集成進復雜的而對體積要求嚴格的控制設備當中。INTEL的Z80是最早按照這種思想設計出的處理器,從此以後,單片機和專用處理器的發展便分道揚鑣。
早期的單片機都是8位或4位的。其中最成功的是INTEL的8031,因為簡單可靠而性能不錯獲得了很大的好評。此後在8031上發展出了MCS51系列單片機系統。基於這一系統的單片機系統直到現在還在廣泛使用。隨著工業控制領域要求的提高,開始出現了16位單片機,但因為性價比不理想並未得到很廣泛的應用。90年代後隨著消費電子產品大發展,單片機技術得到了巨大的提高。隨著INTEL i960系列特別是後來的ARM系列的廣泛應用,32位單片機迅速取代16位單片機的高端地位,並且進入主流市場。而傳統的8位單片機的性能也得到了飛速提高,處理能力比起80年代提高了數百倍。目前,高端的32位單片機主頻已經超過300MHz,性能直追90年代中期的專用處理器,而普通的型號出廠價格跌落至1美元,最高端的型號也只有10美元。當代單片機系統已經不再只在裸機環境下開發和使用,大量專用的嵌入式操作系統被廣泛應用在全系列的單片機上。而在作為掌上電腦和手機核心處理的高端單片機甚至可以直接使用專用的Windows和Linux操作系統。
單片機比專用處理器更適合應用於嵌入式系統,因此它得到了最多的應用。事實上單片機是世界上數量最多的計算機。現代人類生活中所用的幾乎每件電子和機械產品中都會集成有單片機。手機、電話、計算器、家用電器、電子玩具、掌上電腦以及滑鼠等電腦配件中都配有1-2部單片機。而個人電腦中也會有為數不少的單片機在工作。汽車上一般配備40多部單片機,復雜的工業控制系統上甚至可能有數百台單片機在同時工作!單片機的數量不僅遠超過PC機和其他計算的綜合,甚至比人類的數量還要多。
[編輯本段]單片機介紹

單片機又稱單片微控制器,它不是完成某一個邏輯功能的晶元,而是把一個計算機系統集成到一個晶元上。概括的講:一塊晶元就成了一台計算機。它的體積小、質量輕、價格便宜、為學習、應用和開發提供了便利條件。同時,學習使用單片機是了解計算機原理與結構的最佳選擇。
單片機內部也用和電腦功能類似的模塊,比如CPU,內存,並行匯流排,還有和硬碟作用相同的存儲器件,不同的是它的這些部件性能都相對我們的家用電腦弱很多,不過價錢也是低的,一般不超過10元即可......用它來做一些控制電器一類不是很復雜的工作足矣了。我們現在用的全自動滾筒洗衣機、排煙罩、VCD等等的家電裡面都可以看到它的身影!......它主要是作為控制部分的核心部件。
它是一種在線式實時控制計算機,在線式就是現場控制,需要的是有較強的抗干擾能力,較低的成本,這也是和離線式計算機的(比如家用PC)的主要區別。
單片機是靠程序的,並且可以修改。通過不同的程序實現不同的功能,尤其是特殊的獨特的一些功能,這是別的器件需要費很大力氣才能做到的,有些則是花大力氣也很難做到的。一個不是很復雜的功能要是用美國50年代開發的74系列,或者60年代的CD4000系列這些純硬體來搞定的話,電路一定是一塊大PCB板!但是如果要是用美國70年代成功投放市場的系列單片機,結果就會有天壤之別!只因為單片機的通過你編寫的程序可以實現高智能,高效率,以及高可靠性!
由於單片機對成本是敏感的,所以目前占統治地位的軟體還是最低級匯編語言,它是除了二進制機器碼以上最低級的語言了,既然這么低級為什麼還要用呢?很多高級的語言已經達到了可視化編程的水平為什麼不用呢?原因很簡單,就是單片機沒有家用計算機那樣的CPU,也沒有像硬碟那樣的海量存儲設備。一個可視化高級語言編寫的小程序裡面即使只有一個按鈕,也會達到幾十K的尺寸!對於家用PC的硬碟來講沒什麼,可是對於單片機來講是不能接受的。 單片機在硬體資源方面的利用率必須很高才行,所以匯編雖然原始卻還是在大量使用。一樣的道理,如果把巨型計算機上的操作系統和應用軟體拿到家用PC上來運行,家用PC的也是承受不了的。
可以說,二十世紀跨越了三個「電」的時代,即電氣時代、電子時代和現已進入的電腦時代。不過,這種電腦,通常是指個人計算機,簡稱PC機。它由主機、鍵盤、顯示器等組成。還有一類計算機,大多數人卻不怎麼熟悉。這種計算機就是把智能賦予各種機械的單片機(亦稱微控制器)。顧名思義,這種計算機的最小系統只用了一片集成電路,即可進行簡單運算和控制。因為它體積小,通常都藏在被控機械的「肚子」里。它在整個裝置中,起著有如人類頭腦的作用,它出了毛病,整個裝置就癱瘓了。現在,這種單片機的使用領域已十分廣泛,如智能儀表、實時工控、通訊設備、導航系統、家用電器等。各種產品一旦用上了單片機,就能起到使產品升級換代的功效,常在產品名稱前冠以形容詞——「智能型」,如智能型洗衣機等。現在有些工廠的技術人員或其它業余電子開發者搞出來的某些產品,不是電路太復雜,就是功能太簡單且極易被仿製。究其原因,可能就卡在產品未使用單片機或其它可編程邏輯器件上。
單片機歷史
單片機誕生於20世紀70年代末,經歷了SCM、MCU、SoC三大階段。
1.SCM即單片微型計算機(Single Chip Microcomputer)階段,主要是尋求最佳的單片形態嵌入式系統的最佳體系結構。「創新模式」獲得成功,奠定了SCM與通用計算機完全不同的發展道路。在開創嵌入式系統獨立發展道路上,Intel公司功不可沒。
2.MCU即微控制器(Micro Controller Unit)階段,主要的技術發展方向是:不斷擴展滿足嵌入式應用時,對象系統要求的各種外圍電路與介面電路,突顯其對象的智能化控制能力。它所涉及的領域都與對象系統相關,因此,發展MCU的重任不可避免地落在電氣、電子技術廠家。從這一角度來看,Intel逐漸淡出MCU的發展也有其客觀因素。在發展MCU方面,最著名的廠家當數Philips公司。
Philips公司以其在嵌入式應用方面的巨大優勢,將MCS-51從單片微型計算機迅速發展到微控制器。因此,當我們回顧嵌入式系統發展道路時,不要忘記Intel和Philips的歷史功績。
3.單片機是嵌入式系統的獨立發展之路,向MCU階段發展的重要因素,就是尋求應用系統在晶元上的最大化解決;因此,專用單片機的發展自然形成了SoC化趨勢。隨著微電子技術、IC設計、EDA工具的發展,基於SoC的單片機應用系統設計會有較大的發展。因此,對單片機的理解可以從單片微型計算機、單片微控制器延伸到單片應用系統。
[編輯本段]單片機的應用領域
目前單片機滲透到我們生活的各個領域,幾乎很難找到哪個領域沒有單片機的蹤跡。導彈的導航裝置,飛機上各種儀表的控制,計算機的網路通訊與數據傳輸,工業自動化過程的實時控制和數據處理,廣泛使用的各種智能IC卡,民用豪華轎車的安全保障系統,錄像機、攝像機、全自動洗衣機的控制,以及程式控制玩具、電子寵物等等,這些都離不開單片機。更不用說自動控制領域的機器人、智能儀表、醫療器械了。因此,單片機的學習、開發與應用將造就一批計算機應用與智能化控制的科學家、工程師。
單片機廣泛應用於儀器儀表、家用電器、醫用設備、航空航天、專用設備的智能化管理及過程式控制制等領域,大致可分如下幾個范疇:
1.在智能儀器儀表上的應用
單片機具有體積小、功耗低、控制功能強、擴展靈活、微型化和使用方便等優點,廣泛應用於儀器儀表中,結合不同類型的感測器,可實現諸如電壓、功率、頻率、濕度、溫度、流量、速度、厚度、角度、長度、硬度、元素、壓力等物理量的測量。採用單片機控制使得儀器儀表數字化、智能化、微型化,且功能比起採用電子或數字電路更加強大。例如精密的測量設備(功率計,示波器,各種分析儀)。
2.在工業控制中的應用
用單片機可以構成形式多樣的控制系統、數據採集系統。例如工廠流水線的智能化管理,電梯智能化控制、各種報警系統,與計算機聯網構成二級控制系統等。
3.在家用電器中的應用
可以這樣說,現在的家用電器基本上都採用了單片機控制,從電飯褒、洗衣機、電冰箱、空調機、彩電、其他音響視頻器材、再到電子秤量設備,五花八門,無所不在。
4.在計算機網路和通信領域中的應用
現代的單片機普遍具備通信介面,可以很方便地與計算機進行數據通信,為在計算機網路和通信設備間的應用提供了極好的物質條件,現在的通信設備基本上都實現了單片機智能控制,從手機,電話機、小型程式控制交換機、樓宇自動通信呼叫系統、列車無線通信、再到日常工作中隨處可見的行動電話,集群移動通信,無線電對講機等。
5.單片機在醫用設備領域中的應用
單片機在醫用設備中的用途亦相當廣泛,例如醫用呼吸機,各種分析儀,監護儀,超聲診斷設備及病床呼叫系統等等。
6.在各種大型電器中的模塊化應用
某些專用單片機設計用於實現特定功能,從而在各種電路中進行模塊化應用,而不要求使用人員了解其內部結構。如音樂集成單片機,看似簡單的功能,微縮在純電子晶元中(有別於磁帶機的原理),就需要復雜的類似於計算機的原理。如:音樂信號以數字的形式存於存儲器中(類似於ROM),由微控制器讀出,轉化為模擬音樂電信號(類似於音效卡)。
在大型電路中,這種模塊化應用極大地縮小了體積,簡化了電路,降低了損壞、錯誤率,也方便於更換。
7.單片機在汽車設備領域中的應用
單片機在汽車電子中的應用非常廣泛,例如汽車中的發動機控制器,基於CAN匯流排的汽車發動機智能電子控制器,GPS導航系統,abs防抱死系統,制動系統等等。
此外,單片機在工商,金融,科研、教育,國防航空航天等領域都有著十分廣泛的用途。
[編輯本段]學習應用六大重要部分
單片機學習應用的六大重要部分
一、匯流排:我們知道,一個電路總是由元器件通過電線連接而成的,在模擬電路中,連線並不成為一個問題,因為各器件間一般是串列關系,各器件之間的連線並不很多,但計算機電路卻不一樣,它是以微處理器為核心,各器件都要與微處理器相連,各器件之間的工作必須相互協調,所以需要的連線就很多了,如果仍如同模擬電路一樣,在各微處理器和各器件間單獨連線,則線的數量將多得驚人,所以在微處理機中引入了匯流排的概念,各個器件共同享用連線,所有器件的8根數據線全部接到8根公用的線上,即相當於各個器件並聯起來,但僅這樣還不行,如果有兩個器件同時送出數據,一個為0,一個為1,那麼,接收方接收到的究竟是什麼呢?這種情況是不允許的,所以要通過控制線進行控制,使器件分時工作,任何時候只能有一個器件發送數據(可以有多個器件同時接收)。器件的數據線也就被稱為數據匯流排,器件所有的控制線被稱為控制匯流排。在單片機內部或者外部存儲器及其它器件中有存儲單元,這些存儲單元要被分配地址,才能使用,分配地址當然也是以電信號的形式給出的,由於存儲單元比較多,所以,用於地址分配的線也較多,這些線被稱為地址匯流排。
二、數據、地址、指令:之所以將這三者放在一起,是因為這三者的本質都是一樣的——數字,或者說都是一串『0』和『1』組成的序列。換言之,地址、指令也都是數據。指令:由單片機晶元的設計者規定的一種數字,它與我們常用的指令助記符有著嚴格的一一對應關系,不可以由單片機的開發者更改。地址:是尋找單片機內部、外部的存儲單元、輸入輸出口的依據,內部單元的地址值已由晶元設計者規定好,不可更改,外部的單元可以由單片機開發者自行決定,但有一些地址單元是一定要有的(詳見程序的執行過程)。數據:這是由微處理機處理的對象,在各種不同的應用電路中各不相同,一般而言,被處理的數據可能有這么幾種情況:
1•地址(如MOV DPTR,1000H),即地址1000H送入DPTR。
2•方式字或控制字(如MOV TMOD,#3),3即是控制字。
3•常數(如MOV TH0,#10H)10H即定時常數。
4•實際輸出值(如P1口接彩燈,要燈全亮,則執行指令:MOV P1,#0FFH,要燈全暗,則執行指令:MOV P1,#00H)這里0FFH和00H都是實際輸出值。又如用於LED的字形碼,也是實際輸出的值。
理解了地址、指令的本質,就不難理解程序運行過程中為什麼會跑飛,會把數據當成指令來執行了。
三、P0口、P2口和P3的第二功能用法:初學時往往對P0口、P2口和P3口的第二功能用法迷惑不解,認為第二功能和原功能之間要有一個切換的過程,或者說要有一條指令,事實上,各埠的第二功能完全是自動的,不需要用指令來轉換。如P3.6、P3.7分別是WR、RD信號,當微片理機外接RAM或有外部I/O口時,它們被用作第二功能,不能作為通用I/O口使用,只要一微處理機一執行到MOVX指令,就會有相應的信號從P3.6或P3.7送出,不需要事先用指令說明。事實上『不能作為通用I/O口使用』也並不是『不能』而是(使用者)『不會』將其作為通用I/O口使用。你完全可以在指令中按排一條SETB P3.7的指令,並且當單片機執行到這條指令時,也會使P3.7變為高電平,但使用者不會這么去做,因為這通常會導致系統的崩潰。
四、程序的執行過程: 單片機在通電復位後8051內的程序計數器(PC)中的值為『0000』,所以程序總是從『0000』單元開始執行,也就是說:在系統的ROM中一定要存在『0000』這個單元,並且在『0000』單元中存放的一定是一條指令。
五、堆棧: 堆棧是一個區域,是用來存放數據的,這個區域本身沒有任何特殊之處,就是內部RAM的一部份,特殊的是它存放和取用數據的方式,即所謂的『先進後出,後進先出』,並且堆棧有特殊的數據傳輸指令,即『PUSH』和『POP』,有一個特殊的專為其服務的單元,即堆棧指針SP,每當執一次PUSH指令時,SP就(在原來值的基礎上)自動加1,每當執行一次POP指令,SP就(在原來值的基礎上)自動減1。由於SP中的值可以用指令加以改變,所以只要在程序開始階段更改了SP的值,就可以把堆棧設置在規定的內存單元中,如在程序開始時,用一條MOV SP,#5FH指令,就時把堆棧設置在從內存單元60H開始的單元中。一般程序的開頭總有這么一條設置堆棧指針的指令,因為開機時,SP的初始值為07H,這樣就使堆棧從08H單元開始往後,而08H到1FH這個區域正是8031的第二、三、四工作寄存器區,經常要被使用,這會造成數據的混亂。不同作者編寫程序時,初始化堆棧指令也不完全相同,這是作者的習慣問題。當設置好堆棧區後,並不意味著該區域成為一種專用內存,它還是可以象普通內存區域一樣使用,只是一般情況下編程者不會把它當成普通內存用了。
六、單片機的開發過程: 這里所說的開發過程並不是一般書中所說的從任務分析開始,我們假設已設計並製作好硬體,下面就是編寫軟體的工作。在編寫軟體之前,首先要確定一些常數、地址,事實上這些常數、地址在設計階段已被直接或間接地確定下來了。如當某器件的連線設計好後,其地址也就被確定了,當器件的功能被確定下來後,其控制字也就被確定了。然後用文本編輯器(如EDIT、CCED等)編寫軟體,編寫好後,用編譯器對源程序文件編譯,查錯,直到沒有語法錯誤,除了極簡單的程序外,一般應用模擬機對軟體進行調試,直到程序運行正確為止。運行正確後,就可以寫片(將程序固化在EPROM中)。在源程序被編譯後,生成了擴展名為HEX的目標文件,一般編程器能夠識別這種格式的文件,只要將此文件調入即可寫片。在此,為使大家對整個過程有個認識,舉一例說明:
單片機試驗板ORG 0000H
LJMP START
ORG 040H
START:
MOV SP,#5FH ;設堆棧
LOOP:
NOP
LJMP LOOP ;循環
END ;結束
[編輯本段]單片機學習

目前,很多人對匯編語言並不認可。可以說,掌握用C語言單片機編程很重要,可以大大提高開發的效率。不過初學者可以不了解單片機的匯編語言,但一定要了解單片機具體性能和特點,不然在單片機領域是比較致命的。如果不考慮單片機硬體資源,在KEIL中用C胡亂編程,結果只能是出了問題無法解決!可以肯定的說,最好的C語言單片機工程師都是從匯編走出來的編程者因為單片機的C語言雖然是高級語言,但是它不同於台式機個人電腦上的VC++什麼的單片機的硬體資源不是非常強大,不同於我們用VC、VB等高級語言在台式PC上寫程序畢竟台式電腦的硬體非常強大,所以才可以不考慮硬體資源的問題。還有就是在單片機編程中C語言雖然編程方便,便於人們閱讀,但是在執行效率上是要比匯編語言低10%到20%,所以用什麼語言編寫程序是要看具體用在什麼場合下。總是來說做單片機編程要靈活使用匯編語言與C語言,讓單片機的強大功能以最高是效率展示給用戶。
以8051單片機為例講解單片機的引腳及相關功能;
《單片機引腳圖》
40個引腳按引腳功能大致可分為4個種類:電源、時鍾、控制和I/O引腳。
⒈ 電源:
⑴ VCC - 晶元電源,接+5V;
⑵ VSS - 接地端;
註:用萬用表測試單片機引腳電壓一般為0v或者5v,這是標準的TTL電平。但有時候在單片機程序正在工作時候測試結果並不是這個值而是介於0v-5v之間,其實這是萬用表的響應速度沒這么快而已,在某一個瞬間單片機引腳電壓仍保持在0v或者5v。
⒉ 時鍾:XTAL1、XTAL2 - 晶體振盪電路反相輸入端和輸出端。
⒊ 控制線:控制線共有4根,
⑴ ALE/PROG:地址鎖存允許/片內EPROM編程脈沖
① ALE功能:用來鎖存P0口送出的低8位地址
② PROG功能:片內有EPROM的晶元,在EPROM編程期間,此引腳輸入編程脈沖。
⑵ PSEN:外ROM讀選通信號。
⑶ RST/VPD:復位/備用電源。
① RST(Reset)功能:復位信號輸入端。
② VPD功能:在Vcc掉電情況下,接備用電源。
⑷ EA/Vpp:內外ROM選擇/片內EPROM編程電源。
① EA功能:內外ROM選擇端。
② Vpp功能:片內有EPROM的晶元,在EPROM編程期間,施加編程電源Vpp。
⒋ I/O線
80C51共有4個8位並行I/O埠:P0、P1、P2、P3口,共32個引腳。
P3口還具有第二功能,用於特殊信號輸入輸出和控制信號(屬控制匯流排)
5. P3口第二功能
P30 RXD 串列輸入口
P31 TXD 串列輸出口
P32 INT0 外部中斷0(低電平有效)
P33 INT1 外部中斷1(低電平有效)
P34 T0 定時計數器0
P35 T1 定時計數器1
P36 WR 外部數據存儲器寫選通(低電平有效)
P37 RD 外部數據存儲器讀選通(低電平有效)
[編輯本段]常用單片機晶元簡介
STC單片機
STC公司的單片機主要是基於8051內核,是新一代增強型單片機,指令代碼完全兼容傳統8051,速度快8~12倍,帶ADC,4路PWM,雙串口,有全球唯一ID號,加密性好,抗干擾強.
PIC單片機:
是MICROCHIP公司的產品,其突出的特點是體積小,功耗低,精簡指令集,抗干擾性好,可靠性高,有較強的模擬介面,代碼保密性好,大部分晶元有其兼容的FLASH程序存儲器的晶元.
EMC單片機:
是台灣義隆公司的產品,有很大一部分與PIC 8位單片機兼容,且相兼容產品的資源相對比PIC的多,價格便宜,有很多系列可選,但抗干擾較差.
ATMEL單片機(51單片機):
ATMEl公司的8位單片機有AT89、AT90兩個系列,AT89系列是8位Flash單片機,與8051系列單片機相兼容,靜態時鍾模式;AT90系列單片機是增強RISC結構、全靜態工作方式、內載在線可編程Flash的單片機,也叫AVR單片機.
PHLIPIS 51PLC系列單片機(51單片機):
PHILIPS公司的單片機是基於80C51內核的單片機,嵌入了掉電檢測、模擬以及片內RC振盪器等功能,這使51LPC在高集成度、低成本、低功耗的應用設計中可以滿足多方面的性能要求.
HOLTEK單片機:
台灣盛揚半導體的單片機,價格便宜,種類較多,但抗干擾較差,適用於消費類產品.
TI公司單片機(51單片機):
德州儀器提供了TMS370和MSP430兩大系列通用單片機.TMS370系列單片機是8位CMOS單片機,具有多種存儲模式、多種外圍介面模式,適用於復雜的實時控制場合;MSP430系列單片機是一種超低功耗、功能集成度較高的16位低功耗單片機,特別適用於要求功耗低的場合
松翰單片機(SONIX):
是台灣松翰公司的單片,大多為8位機,有一部分與PIC 8位單片機兼容,價格便宜,系統時鍾分頻可選項較多,有PMW ADC 內振 內部雜訊濾波。缺點RAM空間過小,抗干擾較好。
[編輯本段]從無線電世界到單片機世界
現代計算機技術的產業革命,將世界經濟從資本經濟帶入到知識經濟時代。在電子世界領域,從20世紀中的無線電時代也進入到21世紀以計算機技術為中心的智能化現代電子系統時代。現代電子系統的基本核心是嵌入式計算機系統(簡稱嵌入式系統),而單片機是最典型、最廣泛、最普及的嵌入式系統。

如果對您有幫助,請記得採納為滿意答案,謝謝!祝您生活愉快!

H. 串口通信如何使用MODBUS協議

Modbus兩種協議的編程方法:

1、LRC校驗
LRC域是一個包含一個8位二進制值的位元組。LRC值由傳輸設備來計算並放到消息幀中,接收設備在接收消息的過程中計算LRC,並將它和接收到消息中LRC域中的值比較,如果兩值不等,說明有錯誤。
LRC校驗比較簡單,它在ASCII協議中使用,檢測了消息域中除開始的冒號及結束的回車換行號外的內容。它僅僅是把每一個需要傳輸的數據按位元組疊加後取反加1即可。下面是它對應的代碼:

BYTE GetCheckCode(const char * pSendBuf, int nEnd)//獲得校驗碼
{
BYTE byLrc = 0;
char pBuf[4];
int nData = 0;
for(i=1; i<end; i+=2) //i初始為1,避開「開始標記」冒號
{
//每兩個需要發送的ASCII碼轉化為一個十六進制數
pBuf [0] = pSendBuf [i];
pBuf [1] = pSendBuf [i+1];
pBuf [2] = '\0';
sscanf(pBuf,"%x",& nData);
byLrc += nData;
}

byLrc = ~ byLrc;
byLrc ++;
return byLrc;
}

2、CRC校驗
CRC域是兩個位元組,包含一16位的二進制值。它由傳輸設備計算後加入到消息中。接收設備重新計算收到消息的CRC,並與接收到的CRC域中的值比較,如果兩值不同,則有誤。
CRC是先調入一值是全「1」的16位寄存器,然後調用一過程將消息中連續的8位位元組各當前寄存器中的值進行處理。僅每個字元中的8Bit數據對CRC有效,起始位和停止位以及奇偶校驗位均無效。
CRC產生過程中,每個8位字元都單獨和寄存器內容相或(OR),結果向最低有效位方向移動,最高有效位以0填充。LSB被提取出來檢測,如果LSB為1,寄存器單獨和預置的值或一下,如果LSB為0,則不進行。整個過程要重復8次。在最後一位(第8位)完成後,下一個8位位元組又單獨和寄存器的當前值相或。最終寄存器中的值,是消息中所有的位元組都執行之後的CRC值。
CRC添加到消息中時,低位元組先加入,然後高位元組。下面是它對應的代碼:
WORD GetCheckCode(const char * pSendBuf, int nEnd)//獲得校驗碼
{
WORD wCrc = WORD(0xFFFF);
for(int i=0; i<nEnd; i++)
{
wCrc ^= WORD(BYTE(pSendBuf[i]));
for(int j=0; j<8; j++)
{
if(wCrc & 1)
{
wCrc >>= 1;
wCrc ^= 0xA001;
}
else
{
wCrc >>= 1;
}
}
}
return wCrc;
}

對於一條RTU協議的命令可以簡單的通過以下的步驟轉化為ASCII協議的命令:

1、 把命令的CRC校驗去掉,並且計算出LRC校驗取代。
2、 把生成的命令串的每一個位元組轉化成對應的兩個位元組的ASCII碼,比如0x03轉化成0x30,0x33(0的ASCII碼和3的ASCII碼)。
3、 在命令的開頭加上起始標記「:」,它的ASCII碼為0x3A。
4、 在命令的尾部加上結束標記CR,LF(0xD,0xA),此處的CR,LF表示回車和換行的ASCII碼。

掌握兩種協議的編程方法,剩下的就是C語言的問題了。

閱讀全文

與海爾6i981串口命令相關的資料

熱點內容
megawin單片機 瀏覽:685
以色列加密貨幣監督 瀏覽:907
程序員前端現在怎麼樣 瀏覽:497
伺服器和介面地址ping不通 瀏覽:555
linux命令返回上級目錄 瀏覽:897
移動花卡寶藏版為什麼不能選免流app 瀏覽:255
速騰carplay怎麼用安卓 瀏覽:13
紅塔銀行app怎麼樣 瀏覽:564
農行app怎麼開網銀 瀏覽:651
java迭代器遍歷 瀏覽:303
閩政通無法請求伺服器是什麼 瀏覽:48
怎麼做積木解壓神器 瀏覽:205
王者榮耀解壓玩具抽獎 瀏覽:49
12位是由啥加密的 瀏覽:872
程序員編迷你世界代碼 瀏覽:898
php取現在時間 瀏覽:248
單片機高吸收 瀏覽:430
怎麼區分五代頭是不是加密噴頭 瀏覽:247
hunt測試伺服器是什麼意思 瀏覽:512
2013程序員考試 瀏覽:641