如何實(shí)現(xiàn)串口通信?
1.以2400bps從計(jì)算機(jī)發(fā)送任一字節(jié)數(shù)據(jù),當(dāng)單片機(jī)收到該數(shù)據(jù)后,將其送到數(shù)碼管顯示,在此數(shù)據(jù)前加上一序號(hào)然后連同此數(shù)據(jù)一起發(fā)送至計(jì)算機(jī),當(dāng)序號(hào)超過255時(shí)歸零。
#include
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
/**
題目要求:以2400bps從計(jì)算機(jī)發(fā)送任一字節(jié)數(shù)據(jù),當(dāng)單片機(jī)收到該數(shù)據(jù)后,將其送到數(shù)碼管顯示,在此數(shù)據(jù)前加上一序號(hào)然后連同此數(shù)據(jù)一起發(fā)送至計(jì)算機(jī),當(dāng)序號(hào)超過255時(shí)歸零。
**/
/**
步驟
接線方式:
1、P0接數(shù)碼管J12,實(shí)現(xiàn)段選
2、譯碼器和數(shù)碼管位選輸入短接,J15+J16
3、P2用來控制譯碼器的輸入
4、P1是串口接收中斷的指示,P1+JP1
5、本實(shí)驗(yàn)使用的晶振是11.0592
**/
//=========全局變量區(qū)============================================
sbit high=P2^4;
sbit mid=P2^3;
sbit low=P2^2;
uint code NumTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//數(shù)字的編碼
uint Received_Flag=0;//用來標(biāo)志是否接收到信號(hào)
uchar ReceiveCount,Data_Received=0;//ReceiveCount是接受的條數(shù),接收到的數(shù)據(jù)
uchar code table[]="index ";
//=========全局變量區(qū)結(jié)束========================================
//========函數(shù)區(qū)開始============================================
/**
延時(shí)
**/
voiddelay_1ms(uint x){
uint i=x;
uint j;
for(;i>0;--i){
for(j=110;j>0;--j);
}
}
/**
在數(shù)碼管上顯示對應(yīng)的值
**/
voiddisplay(uchar Num)
{
P0=NumTable[Num];
delay_1ms(1);
P0=0;//送完段選信號(hào)后,進(jìn)行消影的處理
}
/**
控制數(shù)碼管顯示后3位,并分解計(jì)數(shù)值
**/
voidDisplayNumByOrder(uint Value){
low=0;mid=0;high=0;display(0);
low=1;mid=0;high=0;display(0);
low=0;mid=1;high=0;display(0);
low=1;mid=1;high=0;display(0);
low=0;mid=0;high=1;display(0);
low=1;mid=0;high=1;display(Value%1000/100);
low=0;mid=1;high=1;display(Value%100/10);
low=1;mid=1;high=1;display(Value%10);
}
voidinit(){//初始化定時(shí)器T1和串口
SCON=0x50;//設(shè)置串口工作方式1,并打開接收中斷
TMOD=0x20;//設(shè)置T1工作方式2
PCON=0x00;//設(shè)置SMOD為串口工作方式1
TL1=0xf4;
TH1=0xf4;//2400bps(12MHZ的晶振)
TR1=1;//開啟時(shí)鐘
ES=1;//開啟串口中斷允許
EA=1;//開啟中斷總允許
}
/**
發(fā)送數(shù)據(jù)
**/
voidSendData(uchar value){
SBUF=value;
while(!TI);
TI=0;
}
/**
處理接收到的數(shù)據(jù)
**/
voidProcessData(){
inti=0;
for(i=0;i<6;i++){
SendData(table[i]);
}
SendData(ReceiveCount);
SendData(':');
SendData(Data_Received);
}
intmain(){
init();//初始化數(shù)據(jù)
while(1){
if(1==Received_Flag){//當(dāng)單片機(jī)收到該數(shù)據(jù)后,將其送到數(shù)碼管顯示
ES=0;//將串口接收總中斷關(guān)閉,因?yàn)榘l(fā)送數(shù)據(jù)的時(shí)候,往緩沖區(qū)內(nèi)寫數(shù)據(jù)也會(huì)引發(fā)串口接收中斷。
ProcessData();
ES=1;
Received_Flag=0;
}
//在此數(shù)據(jù)前加上一序號(hào)然后連同此數(shù)據(jù)一起發(fā)送至計(jì)算機(jī),當(dāng)序號(hào)超過255時(shí)歸零。
DisplayNumByOrder(Data_Received);//在數(shù)碼管上顯示
}
return0;
}
//========函數(shù)區(qū)結(jié)束============================================
//========中斷函數(shù)區(qū)============================================
/**
串口接收中斷
**/
voidser_received()interrupt4
{
RI=0;//RI=1代表緩沖區(qū)內(nèi)有數(shù)據(jù),清零以便等待下次數(shù)據(jù)到來
Data_Received=(uchar)SBUF;//從緩沖區(qū)內(nèi)讀取數(shù)據(jù)
Received_Flag=1;//設(shè)置已經(jīng)接收到數(shù)據(jù)
P1=~P1;
ReceiveCount++;
}
//========中斷函數(shù)區(qū)結(jié)束==========================================
2.以16進(jìn)制發(fā)送一個(gè)0-65536之間的任一數(shù),當(dāng)單片機(jī)收到后在數(shù)碼管上動(dòng)態(tài)顯示出來,波特率自定。
#include
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
/**
題目要求:以16進(jìn)制發(fā)送一個(gè)0-65536之間的任一數(shù),當(dāng)單片機(jī)收到后在數(shù)碼管上動(dòng)態(tài)顯示出來,波特率自定。
**/
/**
步驟
接線方式:
1、P0接數(shù)碼管J12,實(shí)現(xiàn)段選
2、譯碼器和數(shù)碼管位選輸入短接,J15+J16
3、P2用來控制譯碼器的輸入
4、P1是串口接收中斷的指示,P1+JP1
5、本實(shí)驗(yàn)使用的晶振是11.0592
**/
//=========全局變量區(qū)============================================
sbit high=P2^4;
sbit mid=P2^3;
sbit low=P2^2;
uint code NumTable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//數(shù)字的編碼
uint Received_Flag=0;//用來標(biāo)志是否接收到信號(hào)
uchar ReceiveCount,DecodeCount,Data_Received=0;//ReceiveCount是已經(jīng)接收的條數(shù),DecodeCount是已經(jīng)解析的數(shù)目,Data_Received是接收到的數(shù)據(jù)
ulong NumToDisplay=0;
//=========全局變量區(qū)結(jié)束========================================
//========函數(shù)區(qū)開始============================================
/**
延時(shí)
**/
voiddelay_1ms(uint x){
uint i=x;
uint j;
for(;i>0;--i){
for(j=110;j>0;--j);
}
}
/**
在數(shù)碼管上顯示對應(yīng)的值
**/
voiddisplay(uchar Num)
{
P0=NumTable[Num];
delay_1ms(1);
P0=0;//送完段選信號(hào)后,進(jìn)行消影的處理
}
/**
控制數(shù)碼管顯示后3位,并分解計(jì)數(shù)值
**/
voidDisplayNumByOrder(ulong Value){
low=0;mid=0;high=0;display(0);
low=1;mid=0;high=0;display(0);
low=0;mid=1;high=0;display(0);
low=1;mid=1;high=0;display(Value%100000/10000);
low=0;mid=0;high=1;display(Value%10000/1000);
low=1;mid=0;high=1;display(Value%1000/100);
low=0;mid=1;high=1;display(Value%100/10);
low=1;mid=1;high=1;display(Value%10);
}
voidinit(){//初始化定時(shí)器T1和串口
SCON=0x50;//設(shè)置串口工作方式1,并打開接收中斷
TMOD=0x20;//設(shè)置T1工作方式2
PCON=0x00;//設(shè)置SMOD為串口工作方式1
TL1=0xf4;
TH1=0xf4;//2400bps(11.0592MHZ的晶振)
TR1=1;//開啟時(shí)鐘
ES=1;//開啟串口中斷允許
EA=1;//開啟中斷總允許
}
/**
發(fā)送數(shù)據(jù)
**/
voidSendData(uchar value){
SBUF=value;
while(!TI);
TI=0;
}
intmain(){
init();//初始化數(shù)據(jù)
while(1){
if(1==Received_Flag){//當(dāng)單片機(jī)收到該數(shù)據(jù)后,將其送到數(shù)碼管顯示
ES=0;//將串口接收總中斷關(guān)閉,因?yàn)榘l(fā)送數(shù)據(jù)的時(shí)候,往緩沖區(qū)內(nèi)寫數(shù)據(jù)也會(huì)引