- 時間:2020.02.19
- 芯片:STC12C5A60S2
- 晶振:11.0592MHz 波特率4800bps
- 引腳定義:串行口1:發(fā)送----TxD/P3.1; 接收---.000-RxD/P3
- 串行口2: 發(fā)送----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;
- /****************串行口初始化函數(shù)****************/
- 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; //開總中斷
- }
- /****************串行口連續(xù)發(fā)送char型數(shù)組****************/
- 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;
- }
- /************發(fā)送命令***********/
- 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校驗低字節(jié)在前
- Tx_Buffer[7]=crcnow.byte[0];
- Send_data(8); //發(fā)送數(shù)據(jù)
- }
- /*******端口初始化********/
- 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中斷處理函數(shù)*************/
- 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++);
- }
復制代碼 |