欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
大家幫看看為啥這個51單片機程序只有發送,沒有接收呢?
[打印本頁]
作者:
jgsliguangzhao
時間:
2020-3-3 13:47
標題:
大家幫看看為啥這個51單片機程序只有發送,沒有接收呢?
時間:2020.02.19
芯片:STC12C5A60S2
晶振:11.0592MHz 波特率4800bps
引腳定義:串行口1:發送----TxD/P3.1; 接收---.000-RxD/P3
串行口2: 發送----TxD2/P1.3;接收----RxD2/P1.2
功能描述:STC12雙串口通信(中斷方式)
***********************************************************************/
#include<STC12C5A60S2.h>
//#include<reg51.h>
#include <intrins.h>
#include<stdlib.h>
#include <stdio.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
#define FOSC 11059200L //System frequency
#define BAUD 4800 //UART baudrate
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
unsigned char Tx_Buffer[8];
unsigned char RX_Buffer[50];
unsigned char read_enable,receive_finished,reveive_number,ms,number;
unsigned long Voltage_data,Voltage,Voltage1;
unsigned long Vh6,Vl6,Vh5,Vl5,Vh4,Vl4,Vh3,Vl3;
union crcdata //CRC機構體
{
unsigned int word16;
unsigned char byte[2];
}crcnow;
void power_out_mode();
void Delay_ms(unsigned int n);
sbit led = P2^0;
sbit WDT_WDI= P3^2;
/****************串行口初始化函數****************/
void InitUART(void)
{
SCON = 0x50; //8-bit variable UART
TMOD=0x21; //定時1工作方式于串口,定時器0工作方式1
TH1 = TL1 = -(FOSC/12/32/BAUD); //Set auto-reload vaule定時器1初值
TR1=1; //啟動定時器1
REN=1; //允許接收中斷
ES=1; //允許串行口中斷
TH0=(65535-50000)/256; //以下設置為時鐘,裝初值
TL0=(65535-50000)%256;
ET0=1; //開定時器0中斷
TR0=1; //啟動定時器0
EA =1; //開總中斷
}
/****************串行口連續發送char型數組****************/
void Uart1Sends(unsigned char DAT)
{
//ES = 0;
TI=0;
SBUF=DAT ;
while(TI==0);
TI=0;
//ES = 1;
}
void Send_data(unsigned char lenth )
{
unsigned char i = 0 ;
for(i=0; i<lenth; i++)
{
Uart1Sends(Tx_Buffer[i]) ;
}
}
/************CRC***********/
unsigned int calccrc(unsigned char crcbuf,unsigned int crc)
{
unsigned char i;
unsigned char chk;
crc=crc ^ crcbuf;
for(i=0;i<8;i++)
{
chk=( unsigned char)(crc&1);
crc=crc>>1;
crc=crc&0x7fff;
if (chk==1)
crc=crc^0xa001;
crc=crc&0xffff;
}
return crc;
}
unsigned int chkcrc(unsigned char *buf,unsigned char len)
{
unsigned char hi,lo;
unsigned int i;
unsigned int crc;
crc=0xFFFF;
for(i=0;i<len;i++)
{
crc=calccrc(*buf,crc);
buf++;
}
hi=( unsigned char)(crc%256);
lo=( unsigned char)(crc/256);
crc=(((unsigned int)(hi))<<8)|lo;
return crc;
}
/************發送命令***********/
void read_data(void)
{
read_enable=0;
Tx_Buffer[0]=0x01; //模塊的ID 號,默認0x01
Tx_Buffer[1]=0x03;
Tx_Buffer[2]=0x00;
Tx_Buffer[3]=0x48;
Tx_Buffer[4]=0x00;
Tx_Buffer[5]=0x08;
crcnow.word16=chkcrc(Tx_Buffer,6);
Tx_Buffer[6]=crcnow.byte[1]; //CRC校驗低字節在前
Tx_Buffer[7]=crcnow.byte[0];
Send_data(8); //發送數據
}
/*******端口初始化********/
void IO_Init()
{
led=1;
}
void main()
{
InitUART();
IO_Init();
Delay_ms(10);
while(1)
{
WDT_WDI=~WDT_WDI;
Delay_ms(10);
if(read_enable==1) //到時間讀取模塊,間隔時間為1s
{
read_data();
}
if(receive_finished==1) //接受完成
{
led=0;
receive_finished=0;
}
}
}
/*******定時中斷*********/
void Timer0(void) interrupt 1
{
TH0 = (65535-50000)/256; //50ms
TL0 = (65535-50000)%256;
ms++;
if(ms>=60) //1s
{
ms=0;
read_enable=1;
}
}
/************串行口1中斷處理函數*************/
void UART_1Interrupt() interrupt 4
{
//ES=0;
if(RI)
{
RI=0;
RX_Buffer[number] = SBUF;
number++;
if(number>36)
{
receive_finished=1;
number=0;
}
}
// ES=1;
}
//MS延時函 */
//****************************************************
void Delay_ms(unsigned int n)
{
unsigned int i,j;
for(i=0;i<n;i++)
for(j=0;j<110;j++);
}
復制代碼
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1