導航:首頁 > 操作系統 > 51單片機串口c程序

51單片機串口c程序

發布時間:2022-07-04 13:35:00

Ⅰ 51單片機串口通信c語言編程

#include <REG52.H>
#define uchar unsigned char
#define uint unsigned int

sbit ring=P3^7;
sbit CASE1=P2^0;
sbit CASE2=P2^1;
sbit CASE3=P2^2;
sbit CASE4=P2^3;

uchar se=0,re=0;
uchar temp=0;

void wait(uint cnt)
{
while(--cnt);
}

//串口發送程序
void send(uchar se)
{
SBUF=se; //發送數據
while(TI == 0);
TI = 0;
}
//串口接收程序
uchar receive(void)
{
re=SBUF; //接收數據
while(RI==0);
RI=0;
return re;
}
//串口初始化
void sinti(void)
{
SCON = 0x50;
TMOD |= 0x20;
TH1 = 0xFD;
TR1 = 1;
EA = 1;
ES = 1;
}
void delay(int cnt)
{
while(--cnt);
}

//主程序
int main (void)
{
int i;
sinti(); //串口初始化程序
ring=1;
while(1)
{
while (1)
{
if(CASE1==0)
{
send('a');
ring=0;
break;
}
if(CASE2==0)
{
send('b');
ring=0;
break;
}
if(CASE3==0)
{
send('c');
ring=0;
break;
}
if(CASE4==0)
{
send('d');
ring=0;
break;
}
}
if(ring==0)
{
wait(60000);
ring=1;
}
for(i=0;i<10000;i++);
}
}
//串口中斷程序
void UART_SER (void) interrupt 4 //串列中斷服務程序
{

if(RI) //判斷是接收中斷產生
{
RI=0; //標志位清零
temp=SBUF;
}
if(TI) //如果是發送標志位,清零
TI=0;
}

Ⅱ 一道51單片機的C語言程序,關於串口通訊的,很簡單......

#include<reg52.h> //增強型52寄存器的定義
#define uchar unsigned char //用uchar代替unsigned char
#define uint unsigned int //用uint代替unsigned int
unsigned char flag,a,i; //定義變數flag,a,i
uchar code table[]="I receive,thanks"; //定義一個字元串數組

void init()
{
} //設置工作方式,這個懂。

void main()
{
init(); //系統初始化,你懂的
while(1) //主循環部分,一直運行
{
if(flag==1) //等待flag標志位置位,當接收到數據的時候在串口接收中斷中置位
{
ES=0; //禁止串口中斷,但是注意發送中斷標志位的置位仍然正常
for(i=0;i<18;i++) //for循環為了一個個把之前定義的字元串
{
SBUF=table[i]; //向串口收發緩沖器中寫入回應的內容「I receive,thanks」
while(!TI); //等待發送完成,發送中斷標志被置一,否則while循環一直進行
TI=0; //清除發送中斷標志位
}
SBUF=a; //繼續通過串口向串口收發緩沖器發送a,回顯收到的數據
while(!TI); //等待發送完成
TI=0; //清除發送中斷標志位
ES=1; //重新使能串口中斷
flag=0; //清除flag,為了等待下一次接收
}
}
}
void serial() interrupt 4 //串口中斷服務程序,優先順序為4
{
RI=0; //當接收完成之後RI被置一,發生串口中斷,清標志位
a=SBUF; //讀取收到的字元,並賦給變數a
flag=1; //置接收完成標志flag為一,便於主程序中發送響應
}

Ⅲ 51單片機從電腦串口接收10位元組的數據,程序用c語言

可靠的接受程序!!從LZ 的display(a1......a10)看出來這程序就不咋樣,如果顯示函數 還是 用 延時做的,可靠的接受程序給LZ 也是 白瞎……
以下是 UART 驅動程序

/***10位非同步收發串口通訊驅動——火柴天堂作品-20130119***/
/***源程序硬體環境:52單片機,11.0592MHz晶振,定時器1作為波特率發生器,通訊波特率9600 bit/s***/
/******/
#define UART_H
#include"REG52.h" //包含52頭文件
#include"UART.h" //包含串口頭文件
#define th1 0xfa //6.51us at 11.0592MHz Fosc for 8bit auto reload mode

static uchar UART_DataR; //串口接收數據寄存器
static uchar bdata Flag=0; //標志位 寄存器
sbit UART_ReFlag=Flag^0; //串口接收標志位 0:無數據 1:新數據
sbit UART_SendFlag=Flag^1; //串口發送標志位 0:空閑中 1:發送中

void UART()interrupt 4 //串口中斷函數
{
if(RI) //若串口接收完成
{
RI=0; //清 串口接收溢出位
UART_DataR=SBUF; //將串口收到的數據存進 UART_DataR
UART_ReFlag=TRUE; //串口接收標志位 置位(有新數據)
}
if(TI) //若串口發送完成
{
TI=0; //清 串口發送溢出位
UART_SendFlag=FALSE; //清串口發送標志位(空閑中)
}
}

void UART_Init() //串口初始化函數
{
SCON=0x50; //選擇通訊方式:10位非同步收發,串口中斷使能
PCON=0x80; //波特率倍頻
TMOD&=0x0f; //定時器1控制位清0
TMOD|=0x20; //定時器1工作模式2(8位自重裝,做波特率發生器)
TH1=th1; //定時器初值
TL1=th1; //定時器初值
TR1=1; //開始計時
ES=1; //允許串口中斷
EA=1; //允許系統中斷
}

bit UART_SendByte(uchar send_data) //串口發送位元組函數,發送內容send_data,返回值:0 操作失敗,1操作成功
{
if(!UART_SendFlag) //若串口空閑中,則
{
SBUF=send_data; //將發送內容 送到 串口寄存器
UART_SendFlag=TRUE; //置位串口發送標志位(進入忙態)
return TRUE; //返回1,操作成功
}
return FALSE; //否則,返回0,操作失敗
}

uchar ASCII_ToHex(uchar ascii_data) //ASCII 轉 Hex 函數
{
uchar hex_data=0; //定義 Hex變數存儲轉換結果
if(ascii_data>='0' && ascii_data<='9') hex_data=ascii_data-'0'; //若 轉換內容為 字元'0-9',則轉成對應數字0-9
else if(ascii_data>='a' && ascii_data<='f') hex_data=ascii_data-'a'+10; //若 轉換內容為 字元'a-f',則轉成數字10-15
else if(ascii_data>='A' && ascii_data<='F') hex_data=ascii_data-'A'+10; //若 轉換內容為 字元'A-F',則轉成數字10-15
return hex_data; //返回轉換結果,非以上字元,不在Hex(0-F)范圍內,默認0
}

bit UART_ReadByte(uchar *p_data,bit data_mode) //串口讀位元組函數,返回值0 無數據,1 有數據,將data_mode模式(ASCII_Mode或HEX_Mode)轉成Hex結果存到p_data指向地址
{
if(!UART_ReFlag) return FALSE; //若無新數據,則返回 0(無數據)
UART_ReFlag=FALSE; //否則,清 串口接收標志位
if(data_mode==HEX_Mode) *p_data=UART_DataR; //Hex模式,將串口接收結果存到p_data指向地址
if(data_mode==ASCII_Mode) *p_data=ASCII_ToHex(UART_DataR); //ASCII模式,將串口接收結果轉成Hex後,存到p_data指向地址
return TRUE; //返回 1(有數據)
}

Ⅳ C語言51單片機串口通信程序求教

串口通訊,首先設置波特率,再設置串口模式,之後就可以收發數據了。比如:

init()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SCON=0x50;
}
send(unsignedchardat)
{
SBUF=dat;
while(TI==0);
TI==0;
}
unsignedcharrecive()
{
unsignedchardd;
if(RI)
{
dd=SBUF;
RI=0;
}
return(dd);
}

Ⅳ 求51單片機串口程序,串口控制單片機,C語言

波特率得看程序設置,11.0592MHz 晶振,12T模式單片機,最大支持9600 波特率。真需要C程序的話,留Q吧

Ⅵ 51單片機串口校驗和C程序怎麼寫,我是個新手,麻煩清楚點說明

你指的校驗應該是奇偶校驗位,奇偶校驗是看數據位元組的0/1的個數是奇數還是偶數。下面復制一段話:在串口通信中一種簡單的檢錯方式。有四種檢錯方式:偶、奇、高和低。當然沒有校驗位也是可以的。對於偶和奇校驗的情況,串口會設置校驗位(數據位後面的一位),用一個值確保傳輸的數據有偶個或者奇個邏輯高位。例如,如果數據是011,那麼對於偶校驗,校驗位為0,保證邏輯高的位數是偶數個。如果是奇校驗,校驗位為1,這樣就有3個邏輯高位。高位和低位不是真正的檢查數據,簡單置位邏輯高或者邏輯低校驗。這樣使得接收設備能夠知道一個位的狀態,有機會判斷是否有雜訊干擾了通信或者是否傳輸和接收數據是否不同步。

Ⅶ 求一個基於51單片機的C語言程序,要求從串口接收一組數據,然後將其通過串口輸出

#include <AT89X51.H>//單片機51頭文件,存放著單片機的寄存器
unsigned char dat; //用於存儲單片機接收發送緩沖寄存器SBUF裡面的內容
sbit gewei=P2^2; //個位選通定義
sbit shiwei=P2^3; //十位選通定義
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0x77,0x7c,0x39,0x5e,0x79,0x71};
//{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,};// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
void Delay(unsigned int tc) //延時程序
{
while( tc != 0 )
{unsigned int i;
for(i=0; i<100; i++);
tc--;}
}
void LED() //LED顯示接收到的數據
{
shiwei=0;
P0=~table[dat/16];
Delay(8);
shiwei=1;
gewei=0;
P0=~table[dat%16];
Delay(5);
gewei=1;
}
void Init_Com(void)//功能:串口初始化,波特率9600,方式1
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFd;
TL1 = 0xFd;
TR1 = 1;
}
void main()//主程序功能:實現接收數據並把接收到的數據原樣發送回去///////
{
Init_Com();//串口初始化
// P1=0xf0;
while(1)
{
if ( RI ) //掃描判斷是否接收到數據,
{
dat = SBUF; //接收數據SBUF賦與dat
RI=0; //RI清零。
SBUF = dat; //在原樣把數據發送回去
}
LED(); //顯示接收到的數據
}
}

Ⅷ 51單片機 串口收發 C語言

SpeedLimit是16位的速度值,串口是分開兩次發的,第一次是高八位,所以要移位(Delever=Delever<<8;),接下是低八位,直接相加(Delever=Delever+ch; )

Ⅸ C語言---51單片機與PC串口通信程序

可以用個一維陣列來儲存,然後判斷是否為3.06

Ⅹ 51單片機 串口設計c語言程序簡單設計

第一題,已經測試成功:
#include
#define
uchar
unsigned
char
#define
uint
unsigned
int
uchar
flag,
a;
sbit
d
=
P0^0;
void
init()
{
TMOD
=
0x20;
//設置定時器1為工作方式2
TH1
=
0xfd;
TL1
=
0xfd;
TR1
=
1;
//開定時器1
REN
=
1;
//開
串口通信
.
SM0
=
0;
//設置串口通信方式1
SM1
=
1;
EA
=
1;
//開總中斷.
ES
=
1;
//開串口中斷.
}
void
delay(uint
z)
{
uint
x,
y;
for(x
=
z;
x
>
0;
x--)
for(y
=
110;
y
>
0;
y--);
}
void
main()
{
init();
a
=
'4';
while(1)
{
if(a
==
'1')
{
d
=
0;
delay(400);
d
=
1;
delay(400);
}
else
if(a
==
'2')
{
d
=
0;
delay(200);
d
=
1;
delay(200);
}
else
if(a
==
'3')
{
d
=
0;
delay(100);
d
=
1;
delay(100);
}
else
if(a
==
'4')
{
d
=
1;
}
}
}
void
ser()
interrupt
4
{
if
(TI
==
1)
{
TI
=
0;
}
else
if
(RI
==
1)
{
RI
=
0;
a
=
SBUF;
//中間變數.
flag
=
1;
}
}

閱讀全文

與51單片機串口c程序相關的資料

熱點內容
文件夾常用命令 瀏覽:203
被調侃的程序員 瀏覽:489
哪裡有無損音樂app下載 瀏覽:221
單片機如何使用proteus 瀏覽:991
java常用的伺服器 瀏覽:281
集結APP在哪裡下載 瀏覽:800
歐洲cf玩什麼伺服器 瀏覽:529
如何連接另一台電腦上的共享文件夾 瀏覽:681
如何讓桌面文件夾搬家到e盤 瀏覽:73
java自動格式化 瀏覽:619
ipad怎麼查看文件夾大小 瀏覽:583
手工粘土解壓球 瀏覽:552
在線視頻教育源碼 瀏覽:41
快四十學什麼編程 瀏覽:754
gnumakelinux 瀏覽:537
視易峰雲伺服器怎麼改系統 瀏覽:535
javamap取值 瀏覽:768
mac和win磁碟加密軟體 瀏覽:474
蘋果為什麼會連接不到伺服器 瀏覽:726
pdf格式文件如何保存 瀏覽:303