單片機c語言串口通信
如果在字元數字發送框發0X00蜂鈴器就會叫,如果發0xff蜂鈴器就停叫。
#include <REG52.H>
#include <stdio.h>
sbit BEEP = P1^4;
unsigned char b;
void main (void) {
SCON = 0x50; //REN=1允許串列接受狀態,串口工作模式1
TMOD|= 0x20; //定時器工作方式2
PCON|= 0x80;
//TH1 = 0xFD; //baud*2 /* reload value 19200、數據位8、停止位1。效驗位無 (11.0592)
TH1 = 0xF3; // //baud*2 /* 波特率4800、數據位8、停止位1。效驗位無 (12M)
TL1 = 0xF3;
TR1 = 1;
ES = 1; //開串口中斷
EA = 1; // 開總中斷
BEEP=1;
// IE = 0x0;
while(1)
{
if (RI) //RI接受中斷標志
{ RI=0; //清除RI接受中斷標志
b=SBUF; //SUBF接受/發送緩沖器
}
BEEP=b;
}
}
這個是個發送程序,接收程序類似,不懂可繼續追問,一般人都是在別人程序基礎上改改稱為自己的,希望樓主能夠自己研究出自己的一套編程理論
『貳』 51單片機C語言的串口通訊協議
舉個例子
二、 串列口通訊方式:
2.1 工作方式:主從方式。上位機為主,順序閃光燈主機為從;控制命令和查詢命令由上位機發出,順序閃光燈主機做相應信息返回。
2.2 工作模式:8位數據,無校驗;對於51系列單片機為模式1
2.3 波特率:1200,2400,4800,9600(可選,預設為4800)。
2.4 信息格式:
序號 名稱 位元組數 內容 說明
1 幀信息頭 1 0xAA 用於表示信息的開始
2 幀信息類型 1 控制0x01 用於區別控制命令、查詢命令及返回信息;「控制」和「查詢」由上位機發出,「返回」為順序閃光燈主機返回信息時發出。
查詢0x02
返回0x03
3 有效信息長度 1 n 表示有效信息的位元組數
4 有效信息 n n個位元組 有效信息。詳見具體信息定義
5 校驗碼 1 LRC 對幀信息類型、有效信息長度、有效信息進行單位元組相加,取低8位補碼(即對低8位取反後再加一)作為校驗碼。
說明:上位機和順序閃光燈主機使用相同的信息格式,不同之處在於信息類型、信息長度的不同。
『叄』 要個計算機與單片機的串口通信上位機C語言程序
兄弟,下面是我自己寫的,希望給你幫助,把數據用Send_One_Uart()這個函數直接發送到串口就行了!最後求採納,哈哈!
//-----頭文件
#include<reg52.h>
//-----定義全局變數
unsigned char Temp;
/***************************************************
** 函數名稱: UART_Init
** 功能描述: 串口初始化函數
** 輸 入:無
** 輸 出: 無
** 說 明: 無
****************************************************/
void UART_Init(void)
{
SCON = 0x50; //-----SCON: 模式 1, 8-bit UART, 使能接收
TMOD |= 0x20; //-----TMOD: timer 1, mode 2, 8-bit 重裝
TH1 = 0xFD; //-----TH1: 重裝值 9600 波特率 晶振 11.0592MHz
TR1 = 1; //-----TR1: timer 1 打開
ES = 1; //-----打開串口中斷
EA = 1; //-----打開總中斷
}
/***************************************************
** 函數名稱: SendByte
** 功能描述: 發送位元組函數
** 輸 入:無
** 輸 出: 無
** 說 明: 無
****************************************************/
void SendByte(unsigned char dat)
{
SBUF = dat;
while(!TI);
TI = 0;
}
/***************************************************
** 函數名稱: SendStr
** 功能描述: 發送字元串函數
** 輸 入:無
** 輸 出: 無
** 說 明: 無
****************************************************/
void SendStr(unsigned char *s)
{
while(*s!='\0')
{
SendByte(*s);
s++;
}
}
/***************************************************
** 函數名稱: main
** 功能描述: 主函數
** 輸 入:無
** 輸 出: 無
** 說 明: 無
****************************************************/
void main (void)
{
UART_Init(); //-----串口初始化
while(1)
{
if(Temp=='H'&&'i')
{
Temp=0;
SendStr("hello");
}
}
}
/***************************************************
** 函數名稱: UART_SER
** 功能描述: 串口中斷服務子函數
** 輸 入:無
** 輸 出: 無
** 說 明: 無
****************************************************/
void UART_SER (void) interrupt 4 //-----串列中斷服務程序
{
if(RI) //-----判斷是接收中斷產生
{
RI=0; //-----標志位清零
Temp=SBUF; //-----讀入緩沖區的值
}
}
『肆』 編寫單片機串口收發數據的完整程序(C語言編寫)
我用的新唐晶元,8051內核,跟51差不多,望採納
void UART_Initial (void)
{
P02_Quasi_Mode; //Setting UART pin as Quasi mode for transmit
P16_Quasi_Mode; //Setting UART pin as Quasi mode for transmit
SCON_1 = 0x50; //UART1 Mode1,REN_1=1,TI_1=1
T3CON = 0x08; //T3PS2=0,T3PS1=0,T3PS0=0(Prescale=1), UART1 in MODE 1
clr_BRCK;
RH3 = HIBYTE(65536 - (1000000/u32Baudrate)-1); /*16 MHz */
RL3 = LOBYTE(65536 - (1000000/u32Baudrate)-1); /*16 MHz */
set_TR3; //Trigger Timer3
}
以上是初始化的
void Send_Data_To_UART1(UINT8 c)
{
TI_1 = 0;
SBUF_1 = c;
while(TI_1==0);
}
這個是發送
void UART_isr (void) interrupt 4 //串列中斷服務程序
{
if (RI_1==1)
{ /* if reception occur */
clr_RI_1; /* clear reception flag for next reception */
Receive_Date[c] = SBUF_1;
if (Receive_Date[0] == First_Date)
{
c++;
}
else if(Receive_Date_Size > 0 && Receive_Date_Size < 4)
{
c++;
}
else if(Receive_Date[c] == Last_Date && Receive_Date_Size ==4)
{
c = 0;
Flag_Receive_One = 1;
}
else
{
c = 0;
}
}
}
接收
『伍』 如何用c語言編程實現c51單片機中從串口接收一個字元串
如果用中斷方式接收的話,只能接收單個字元。而如果用查詢方式的話,接收字元串佔用的時間真太長了,整個CPU將陷入一個長期無法工作的狀態,按照波特率為19200來算,接收一個字元的時間是573微秒,十個字元的話就是5.73毫秒了,系統無法正常工作。建議用中斷接收單個字元。
『陸』 單片機串口通信和C語言循環
應該可以,用軟體模擬一下,一般串口接受都採用中斷.這樣可以省出CPU去執行別的任務.
『柒』 一道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單片機串口通信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;
}
『玖』 單片機串口通信C語言程序
#include<reg52.h>
unsigned
char
flag,a;
void
main()
{
TMOD=0x20;//設置定時器1為工作方式2
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
while(1)
{
/*
if(RI==1)
{
RI=0;
P1=SBUF;
}*/
if(flag==1)
{
ES=0;
flag=0;
SBUF='1';//28;
while(!TI);
TI=0;
SBUF='2';//28;
while(!TI);
TI=0;
SBUF='3';//28;
while(!TI);
TI=0;
ES=1;
}
}
}
void
ser()
interrupt
4
{
RI=0;
//
P1=SBUF;
a=SBUF;
flag=1;
}
這段程序是你發送一個字元後再發送回來!
『拾』 單片機串列口通信程序C語言
發送:
#include
<reg52.h>
#include<intrins.h>
#include<string.h>
#define
uchar
unsigned
char
uchar
data
i,j,p,TEST;
sbit
INTT0=P3^2;
uchar
code
V_35[10]={'V','o','l','t','
','3','.','5',13,10};
void
Init();
void
Delay();
void
Volt_35();
void
main()
{
Init();
while(1)
{
if(TEST)
{
Volt_35();
TEST=0;
}
}
}
void
Init()
{
P0=0XFF;
//I/O口初始化
P1=0xFF;
P2=0XFF;
P3=0xFF;
SCON=0x50;
//設置成串口方式1
T2CON=0x34;
TH2=0xff;
//晶振11.0592MHZ,波特率9600
TL2=0xdc;
RCAP2H=0XFF;
RCAP2L=0XdC;
EA=1;
EX0=1;
IT0=1;
TEST=0;
}
void
Delay()
{
for(i=0;i<100;i++)
for(j=0;j<100;j++);
}
void
Volt_35()
{
for(p=0;p<10;p++)
{
SBUF=V_35[p];
while(!TI);
TI=0;
}
}
void
int0svr(void)
interrupt
0
using
1
{
Delay();
if(!INTT0)
{
while(!INTT0);
TEST=1;
}
}
接收:
#include
<reg52.h>
#include<intrins.h>
#include<string.h>
#define
uchar
unsigned
char
uchar
data
i;
void
Init();
void
main()
{
Init();
while(1)
{
for(i=0;i<10;i++)
{
while(!RI);
P1=SBUF;
RI=0;
}
}
}
void
Init()
{
P0=0XFF;
P1=0xFF;
P2=0XFF;
P3=0xFF;
SCON=0x50;
T2CON=0x34;
TH2=0xff;
TL2=0xdc;
RCAP2H=0XFF;
RCAP2L=0XdC;
}