Ⅰ 我正在寫一個單片機串口與PC機通信的程序,開始:0xf0,數據,結束0xff. 怎麼寫啊
單片機作為從機,定義為接收狀態,PC機的通信軟體應主動向單片機發送詢問數據,單片機接受到規定格式的數據後,即進行回答。若規定通信協議格式就是 開始0xf0, 數據,結束0xff。應在單片機接受中斷中進行判斷,若接收到0xf0,即認為數據流開始, 將其後接受的數據依次存在接收緩沖區里,直到檢索到0xff,視為數據流結束。 接收結束後,作為應答, 仍然依照規定的數據格式發送數據串即可, 上位機軟體同樣依據以上流程做接受處理。
但是,你這個通信協議規定的過於簡單,不能實用。如果數據中出現0xff也可能被誤認為結束符。如果想以特定的字頭作為數據流起始標志,可以多設幾個位元組,比如3個位元組, 如規定0xf0,0x2a,0x7e三個數據連續出現時,作為數據流的開始,那麼可靠性就會提高,另外,通信協議必須具有校驗位元組,例如校驗和,或者CRC校驗,校驗位元組後,才是結束符。如果沒有校驗,數據常常錯亂,不能使用。 當接受到校驗不能通過的數據流後,數據應當丟棄,重新接收。校驗位元組是必須要有的。
如果是簡單的一對一通信,可以規定固定的數據流個數,那麼此時可以沒有結束符和起始符,只有固定的數據流個數和校驗位元組,就可滿足通信要求。
Ⅱ 51單片機F0是什麼意思
F0是程序狀態字尺做局PSW的第6位,是用戶胡敗標志位。供用戶使用的軟體標志,其功能和內部RAM中位定址區的陵讓各個位相似。
還有一個F1是PSW的第2位,用法與F0相似,你看看單片機的書,找到PSW狀態字就清楚。
Ⅲ 51單片機psw各個標志位的定義
Bit7
Cy
Bit6
AC
Bit5
F0
Bit4
RS1
Bit3
RS0
Bit2
OV
Bit1
-
Bit0
P
1.
CY(Carry):
CY表示加法進算中的進位和減法運算中的借位,加法運算中有進位或減法運算中有借位則CY位置1,否則為0。
2.
AC(Auxiliary
Carry):
與CY基本相同,不同的是AC表示的是低4位向高4位的進、借位。
3.F0:
該位是用戶自己管理的標志位,用戶可以根據自己的需要來設定。
4.
RS1、RS0:
這兩位用於選擇當前工作寄存器區。8051有8個8位寄存器R0~R7,它們在RAM中的地址可以根據用戶需要來確定。
5.OV:
該位表示運算是否發生了溢出。若運算結果超過了8位有符號數所能表示的范圍,即-128
~
+127,則
OV
=
1。
6.P:
P是奇偶標志位。若累加器A中1的個數為奇數,則P
=
1;若累加器A中1的個數為偶數,則P
=
0。
Ⅳ 求單片機片內固定的P1.0等等的地址。。 P1 是0x90~97 P2是0xa0~a7 P3.......
如果你用keil 的話,一般主程序都會有 「#include <regx52.h>」, 打開這個文件就有你想要的內容,下圖更直觀一點
附 REG52.H 內容
/*--------------------------------------------------------------------------
REG52.H
Header file for generic 80C52 and 80C32 microcontroller.
Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
--------------------------------------------------------------------------*/
#ifndef __REG52_H__
#define __REG52_H__
/* BYTE Registers */
sfr P0 = 0x80;
sfr P1 = 0x90;
sfr P2 = 0xA0;
sfr P3 = 0xB0;
sfr PSW = 0xD0;
sfr ACC = 0xE0;
sfr B = 0xF0;
sfr SP = 0x81;
sfr DPL = 0x82;
sfr DPH = 0x83;
sfr PCON = 0x87;
sfr TCON = 0x88;
sfr TMOD = 0x89;
sfr TL0 = 0x8A;
sfr TL1 = 0x8B;
sfr TH0 = 0x8C;
sfr TH1 = 0x8D;
sfr IE = 0xA8;
sfr IP = 0xB8;
sfr SCON = 0x98;
sfr SBUF = 0x99;
/* 8052 Extensions */
sfr T2CON = 0xC8;
sfr RCAP2L = 0xCA;
sfr RCAP2H = 0xCB;
sfr TL2 = 0xCC;
sfr TH2 = 0xCD;
/* BIT Registers */
/* PSW */
sbit CY = PSW^7;
sbit AC = PSW^6;
sbit F0 = PSW^5;
sbit RS1 = PSW^4;
sbit RS0 = PSW^3;
sbit OV = PSW^2;
sbit P = PSW^0; //8052 only
/* TCON */
sbit TF1 = TCON^7;
sbit TR1 = TCON^6;
sbit TF0 = TCON^5;
sbit TR0 = TCON^4;
sbit IE1 = TCON^3;
sbit IT1 = TCON^2;
sbit IE0 = TCON^1;
sbit IT0 = TCON^0;
/* IE */
sbit EA = IE^7;
sbit ET2 = IE^5; //8052 only
sbit ES = IE^4;
sbit ET1 = IE^3;
sbit EX1 = IE^2;
sbit ET0 = IE^1;
sbit EX0 = IE^0;
/* IP */
sbit PT2 = IP^5;
sbit PS = IP^4;
sbit PT1 = IP^3;
sbit PX1 = IP^2;
sbit PT0 = IP^1;
sbit PX0 = IP^0;
/* P3 */
sbit RD = P3^7;
sbit WR = P3^6;
sbit T1 = P3^5;
sbit T0 = P3^4;
sbit INT1 = P3^3;
sbit INT0 = P3^2;
sbit TXD = P3^1;
sbit RXD = P3^0;
/* SCON */
sbit SM0 = SCON^7;
sbit SM1 = SCON^6;
sbit SM2 = SCON^5;
sbit REN = SCON^4;
sbit TB8 = SCON^3;
sbit RB8 = SCON^2;
sbit TI = SCON^1;
sbit RI = SCON^0;
/* P1 */
sbit T2EX = P1^1; // 8052 only
sbit T2 = P1^0; // 8052 only
/* T2CON */
sbit TF2 = T2CON^7;
sbit EXF2 = T2CON^6;
sbit RCLK = T2CON^5;
sbit TCLK = T2CON^4;
sbit EXEN2 = T2CON^3;
sbit TR2 = T2CON^2;
sbit C_T2 = T2CON^1;
sbit CP_RL2 = T2CON^0;
#endif
Ⅳ 51單片機F0位元組地址後面存的是什麼
51單片機高128位元組地址80H~FFH分配給特殊功能寄存器,但因為並沒有128個寄存器,所以,有很多地址是空的,什麼也沒有。見下表,寄存器B的位元組地址是F0H,再大的地址F1H~FFH就全部是空的,什麼也不存,什麼也不是。
Ⅵ 單片機c51的按鍵0~f的代碼
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar key;
unsigned char code disp_code[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char code key_code[]={
0xee,0xed,0xeb,0xe7,0xde,0xdd,0xdb,0xd7,
0xbe,0xbd,0xbb,0xb7,0x7e,0x7d,0x7b,0x77 };
/**********************************************************
延時子函數
**********************************************************/
void delayms(uint ms)
{
uchar t;
while(ms--)
{
for(t = 0; t < 120; t++);
}
}
/**********************************************************
鍵盤掃描子函數
**********************************************************/
uchar keyscan()
{
uchar scan1,scan2,keycode,j;
P3=0xf0;
scan1=P3;
if((scan1&0xf0)!=0xf0) //判鍵是否按下
{
delayms(30); //延時30ms
scan1=P3;
if((scan1&0xf0)!=0xf0) //二次判鍵是否按下
{
P3=0x0f;
scan2=P3;
keycode=scan1|scan2; //組合成鍵編碼
for(j=0;j<=15;j++)
{
if(keycode== key_code[j]) //查表得鍵值
{
key=j;
return(key);
}
}
}
}
else P3=0xff;
return (16);
}
/**********************************************************
判鍵是否按下子函數
**********************************************************/
void keydown()
{
P3=0x0f;
if((P3&0x0f)!=0x0f)
{
keyscan();
P0=disp_code[key];
beep();
}
}
/**********************************************************
主函數
**********************************************************/
main()
{
P0 = 0xbf;
P2 = 0x7f; //數碼管顯示"-"
P3 = 0xff;
while(1)
{
keydown();
}
}