你看看接收並回傳給串口助手的數據是否正確
if(Rev_Data == "t")
{
Sector_erase(0x2000); //扇區擦除。。。。把這一句注釋掉,再看看結果
P1 = 0x55;
delay(5);
flag = 1;
i = 0;
}
㈡ 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);
}
㈢ 單片機串口通信C程序
"TMOD = 0x2f;"改成"TMOD = 0x20;"試試,另外還有你要確保你的單片機的晶振是11.059MHz的,你的波特率設置是沒有問題的。
㈣ 單片機串列口通信程序C語言
/*
程序把接收的數據發送出去,波速率為2400。
打開串口調試軟體,把波速率設置為2400,
向板發送一個位元組數據,軟體應能接收到同樣的數據。
*/
#include<reg51.h>
void delayms(unsigned int i);
unsigned char b;
void rs_dmx() interrupt 4 using 2//串口中斷服務程序
{
b=SBUF;//接收數據
SBUF=b;//把接收的數據發送出去
while(TI==0);TI=0;
delayms(1);
RI=0;
}
main()
{
//write(1,60);
//b=read(1);
EA=1;
// TR0=1;
// ET0=1;
// TMOD=0X01;
TMOD=0x21;
TH1=0xF3;//波速率為2400
TL1=0xf3;
TR1=1;
EA=1;
SCON=0XD0;
ES=1;
while(1)
{
}
}
void delayms(unsigned int i)
{
unsigned int j;
for(;i>0;i--)
for(j=100;j>0;j--);
}
自己改波特率,該程序通過單片機與串口助手相互通信
㈤ 要個計算機與單片機的串口通信上位機C語言程序
兄弟,下面是我自己寫的,希望給你幫助,把數據用Send_One_Uart()這個函數直接發送到串口就行了!最後求採納,哈哈!
//-----頭文件
#include
//-----定義全局變數
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程序
我也來說兩有句。
1.樓主首先要確定是硬體沒有問題,先用232直接與電腦通迅看能否正常工作,用單片機接232晶元再接電腦就可用串口調試助手來看了。
1>用示波器測232晶元的接收與發送/或測單片機的RX/TX引腳;
2>可直接用printf來輸出,包涵相應的頭文件#include <stdio.h>,設置好波特率即可,注意波特率一定要設置正確;如:printf (" This is a test! \n");
2.傳一個51串口中斷接收與發送的例子
/*-----------------------------------------------------*
*文件描述:本文件包含了串列通信的4子程序,分別為: *
*(1)SCISend1:串列發送1位元組 *
*(2)SCISendN:串列發送n位元組 *
*(3)SCIRe1:串列接收1位元組 *
*(4)SCIReN:串列接收n位元組 *
*-------------《嵌入式應用技術基礎教程》--------------*/
//[以下為子程序源代碼]
//[包含頭文件]
#include "SCI.h"
/*SCISend1:串列發送1個位元組-----------------------------*
*功 能:串列發送1個位元組 *
*參 數:要發送的數據 *
*返 回:無 *
*-----------------------------------------------------*/
void SCISend1(unsigned char o)
{
ReSendDataR=o;
while(1)
{
//判斷ReStatusR的SendIntBit位是否為1,是1就清0
if (SendIntBit!=0)
{
SendIntBit=0;
break;
}
}
}
/*SCISendN:串列發送N個位元組-----------------------------*
*功 能:發送數組中的N個位元組數據 *
*參 數:待發送的數據位元組數及其要存放的數組首地址 *
*返 回:無 *
*-----------------------------------------------------*/
void SCISendN(unsigned char n,unsigned char ch[])
{ int i;
for(i=0;i<n;i++)
{
SCISend1(ch[i]);
}
}
/*SCIRe1:串列收一個位元組數據----------------------------*
*功 能:從串列口接收1個位元組的數據 *
*參 數:標志指針p *
*返 回:接收到的數據(若接收失敗,返回0xff) *
*說 明:參數*p帶回接收標志=0收到數據,=1未收到數據 *
*-----------------------------------------------------*/
unsigned char SCIRe1(unsigned char *p)
{ unsigned int k;
unsigned char i;
//ReStatusR的ReIntBit位為1表示可接收數據
for(k=0;k<0xfbbb;k++)
{
if (ReIntBit!=0)
{i=ReSendDataR;
*p=0x00;
ReIntBit=0;
break;}
}
if(k>=0xfbbb)
{i=0xff;
*p=0x01;}
return i; //返回接收到的數據
}
/*SCIReN:HC08串列接收N個位元組---------------------------*
*功 能:接收N個位元組數據,並存放在ch數組中 *
*參 數:待接收的數據位元組數及其存放的數組首地址 *
*返 回:接收標志=0收到數據,=1未收到數據 *
*-----------------------------------------------------*/
unsigned char SCIReN(unsigned char n,unsigned char ch[])
{int m;
unsigned char fp;
m=0;
while (m<n)
{
ch[m]=SCIRe1(&fp);
if (fp==1) return 1;
m++;
}
return 0;
}
//**************************中斷方式*************************************
void main()
{
EA=0; // 開中斷
InitSerial(); //初始化
EA=1; // 關中斷
ES=1; //允許串口接收中斷
//主循環
while(1);
}
/*
**************************************************************************************
* uart初始化
*
**************************************************************************************
*/
void InitSerial(void)
{
TMOD=TMOD&0x0F;
TMOD=TMOD|0x20; //定時器1 定時方式2
TL1=0xFA;TH1=0xFA; //4800 11.0592MHz fosc
SCON=0x50; //串列方式1 允許接收
PCON=0x00; //波特率不增倍
TR1=1; //啟動定時器1
}
//增加個人說明:功能-->將從串口接收到的數據發送出去.注意波特率的設置.
//如果在PC終端一次性將"abcdefghi........"一連串的字元發送會出現什麼情況?會不會亂?
//答案是不會,因為當收到一位元組,如'a'時,立即將'a'發送出去了,此時SBUF就可以接收新的數據,所以不會亂.....
void Int1(void) interrupt 4 // interrupt 4 表示串口中斷
{
unsigned char SerialBuff[1]; //存放接收數據的數組
unsigned char i;
EA = 0; // 開中斷
//接收1個數據
i=SCIReN(1,SerialBuff);
//若收到數據,則發送接到的數據
if(i==0) SCISendN(1,SerialBuff);
EA = 1; // 關中斷
}
以上回答希望你滿意
㈦ 兩片單片機通過串口一發一收的C語言常式
/*甲機串口程序:甲機向乙機發送控制命令字元,甲機同時接收乙機發送的數字,並顯示在數碼管上。*/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED1=P1^0;
sbit LED2=P1^3;
sbit K1=P1^7;
uchar Operation_No=0; //操作代碼
//數碼管代碼
uchar codeDSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//延時
void DelayMS(uint ms)
{
uchari;
while(ms--)for(i=0;i<120;i++);
}
//向串口發送字元
void Putc_to_SerialPort(uchar c)
{
SBUF=c;
while(TI==0);
TI=0;
}
//主程序
void main()
{
LED1=LED2=1;
P0=0x00;
SCON=0x50; //串口模式1,允許接收
TMOD=0x20; //T1工作模式2
PCON=0x00; //波特率不倍增
TH1=0xfd;
TL1=0xfd;
TI=RI=0;
TR1=1;
IE=0x90; //允許串口中斷
while(1)
{
DelayMS(100);
if(K1==0) //按下K1時選擇操作代碼0,1,2,3
{
while(K1==0);
Operation_No=(Operation_No+1)%4;
switch(Operation_No) //根據操作代碼發送A/B/C或停止發送
{
case0: Putc_to_SerialPort('X');
LED1=LED2=1;
break;
case1: Putc_to_SerialPort('A');
LED1=~LED1;LED2=1;
break;
case2: Putc_to_SerialPort('B');
LED2=~LED2;LED1=1;
break;
case3: Putc_to_SerialPort('C');
LED1=~LED1;LED2=LED1;
break;
}
}
}
}
//甲機串口接收中斷函數
void Serial_INT() interrupt 4
{
if(RI)
{
RI=0;
if(SBUF>=0&&SBUF<=9)P0=DSY_CODE[SBUF];
elseP0=0x00;
}
}
/*乙機程序接收甲機發送字元並完成相應動作:乙機接收到甲機發送的信號後,根據相應信號控制LED完成不同閃爍動作。*/
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED1=P1^0;
sbit LED2=P1^3;
sbit K2=P1^7;
uchar NumX=-1;
//延時
void DelayMS(uint ms)
{
uchari;
while(ms--)for(i=0;i<120;i++);
}
//主程序
void main()
{
LED1=LED2=1;
SCON=0x50; //串口模式1,允許接收
TMOD=0x20; //T1工作模式2
TH1=0xfd; //波特率9600
TL1=0xfd;
PCON=0x00; //波特率不倍增
RI=TI=0;
TR1=1;
IE=0x90;
while(1)
{
DelayMS(100);
if(K2==0)
{
while(K2==0);
NumX=++NumX%11; //產生0~10范圍內的數字,其中10表示關閉
SBUF=NumX;
while(TI==0);
TI=0;
}
}
}
void Serial_INT() interrupt 4
{
if(RI) //如收到則LED則動作
{
RI=0;
switch(SBUF)//根據所收到的不同命令字元完成不同動作
{
case'X': LED1=LED2=1;break; //全滅
case'A': LED1=0;LED2=1;break; //LED1亮
case'B': LED2=0;LED1=1;break; //LED2亮
case'C': LED1=LED2=0; //全亮
}
}
}
㈧ 怎樣編寫單片機的串口通信的程序,一般的步驟是怎麼樣
編寫串口通訊程序步驟為:
1、設置波特率
2、設置串口工作方式
3、收發數據。
比如:
main()
{
unsignedchardat;
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SCON=0x50;
while(1)
{
while(RI==0);
RI=0;
dat=SBUF;
SBUF=~dat;
while(TI==0)
TI=0;
}
}
㈨ 急!!!單片機C語言實現串口通信編程
以下是我剛改的程序編譯成功了
請參考
#include"reg51.h"
//定義全局變數
unsigned char data_10[10]={0,0,0,0,0,0,0,0,0,0};
unsigned char Time_50ms,count;
bit flag=0;
bit data_flag=0;
/*********************************************************************************************
函數名:UART串口初始化函數
調 用:UART_init();
參 數:無
返回值:無
結 果:啟動UART串口接收中斷,允許串口接收,啟動T/C1產生波特率(佔用)
備 註:振盪晶體為12MHz,PC串口端設置 [ 4800,8,無,1,無 ]
/**********************************************************************************************/
void UART_init (void){
EA = 1; //允許總中斷(如不使用中斷,可用//屏蔽)
ES = 1; //允許UART串口的中斷
TMOD |= 0x20;//定時器T/C1工作方式2
SCON = 0x50;//串口工作方式1,允許串口接收(SCON = 0x40 時禁止串口接收)
TH1 = 0xF3;//定時器初值高8位設置
TL1 = 0xF3;//定時器初值低8位設置
PCON = 0x80;//波特率倍頻(屏蔽本句波特率為2400)
TR1 = 1;//定時器啟動
}
/**********************************************************************************************/
/*********************************************************************************************
函數名:UART串口接收中斷處理函數
調 用:[SBUF收到數據後中斷處理]
參 數:無
返回值:無
結 果:UART串口接收到數據時產生中斷,用戶對數據進行處理(並發送回去)
備 註:過長的處理程序會影響後面數據的接收
/**********************************************************************************************/
void UART_R (void) interrupt 4 using 1{ //切換寄存器組到1
TR0=1; //打開定時器開始計時
RI = 0;//令接收中斷標志位為0(軟體清零)
data_10[count] = SBUF;//將接收到的數據送入變數 UART_data
count++;//接收到一個位元組數據計數+1
if(count>=10) //如果接收到10個數據
{
TR0=0; //停止定時器
TH0 = 0x3C; //給定時器賦初值
TL0 = 0xB0; //給定時器賦初值
count=0;//清零數據計數
//data_flag=1; //數據有效標志位
SBUF = 0x55;//返回數據 55H
while(TI == 0);//檢查發送中斷標志位
TI = 0;//令發送中斷標志位為0(軟體清零)
}
if(flag)
{
TR0=0; //停止定時器
TH0 = 0x3C; //給定時器賦初值
TL0 = 0xB0; //給定時器賦初值
count=0;//清零數據計數
SBUF = 0xff;//返回數據 ffH
while(TI == 0);//檢查發送中斷標志位
TI = 0;//令發送中斷標志位為0(軟體清零)
}
}
/**********************************************************************************************/
/*********************************************************************************************
函數名:定時/計數器初始化函數
調 用:T_C_init();
參 數:無
返回值:無
結 果:設置SFR中T/C1和(或)T/C0相關參數
備 註:本函數控制T/C1和T/C0,不需要使用的部分可用//屏蔽
/**********************************************************************************************/
void T_C_init (void){
TMOD |= 0x01; //高4位控制T/C1 [ GATE,C/T,M1,M0,GATE,C/T,M1,M0 ]
EA = 1;//中斷總開關
TH0 = 0x3C; //16位計數寄存器T0高8位
TL0 = 0xB0; //16位計數寄存器T0低8位(0x3CB0 = 50mS延時)
ET0 = 1; //T/C0中斷開關
TR0 = 0; //T/C0開關
}
/**********************************************************************************************/
/*********************************************************************************************
函數名:定時/計數器0中斷處理函數
調 用:[T/C0溢出後中斷處理]
參 數:無
返回值:無
結 果:重新寫入16位計數寄存器初始值,處理用戶程序
備 註:必須允許中斷並啟動T/C本函數方可有效,重新寫入初值需和T_C_init函數一致
/**********************************************************************************************/
void T_C0 (void) interrupt 1 using 1{ //切換寄存器組到1
TH0 = 0x3C; //16位計數寄存器T0高8位(重新寫入初值)
TL0 = 0xB0; //16位計數寄存器T0低8位(0x3CB0 = 50mS延時)
Time_50ms++; //50ms到 計數+1
if(Time_50ms>=100)
{
Time_50ms=0;// 清零50ms計數
flag=1; //5s時間 標志置位
TR0=0;//關閉計時器
}
}
/**********************************************************************************************/
main()
{
IP = 0x10; //中斷優先順序設置(串口中斷最高優先順序)
UART_init();//初始化串口
T_C_init(); // 初始化計數器
while(1);// 空循環
}