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语言的问题了。