|
100黑幣
具體是用串口不間斷發(fā)送ASCII 回車(chē)(CR) 換行(LF) 數(shù)字 數(shù)字 數(shù)字 小數(shù)點(diǎn) 數(shù)字 數(shù)字
但是仿真時(shí)接收不到
- #include <iom32v.h>
- #include <macros.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define CR 0x0D
- #define LF 0x0A
- #define H_Bit(val, bitn) (val |=(1<<(bitn))) // bitn位置1
- #define L_Bit(val, bitn) (val&=~(1<<(bitn))) // bitn位置0
- #define G_Bit(val, bitn) (val &(1<<(bitn)) ) //取bitn的值
- #define time_bps() {while(!flag_bps);flag_bps=0;} //波特率延時(shí)
- uchar bit_c=0; //數(shù)碼管位選
- uchar bit_data[3]; //數(shù)碼管(四)顯示數(shù)據(jù)
- uchar Dp_flag_L=0; //精確0.01小數(shù)點(diǎn)
- uchar Dp_flag_H=0; //精確0.1小數(shù)點(diǎn)
- uchar Dp_flag_D=0; //調(diào)試功能小數(shù)點(diǎn)
- uchar Dp_flag=0; //數(shù)碼管小數(shù)點(diǎn)總標(biāo)志位
- uint counter=0;
- uint counter_2ms=0;
- uint counter_20ms=0;
- int k=0;
- uchar const show[]={0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x00,0x3F,0x06,
- 0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x80,
- // C H
- 0x39,0x76 };//對(duì)應(yīng)ACSII碼
- volatile uchar RXD_Data[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//用于接收長(zhǎng)度為8的數(shù)據(jù)
- volatile uchar RUDR; //接收數(shù)據(jù)暫存
- volatile uchar z=0; //接收探頭信息計(jì)位
- uchar TUDR=0; //模擬IO發(fā)送數(shù)據(jù)緩存區(qū) //UDR
- volatile uchar flag_bps=0; //104us標(biāo)志位
- #define MK_RXD PINA1 // 模擬RXD
- #define MK_TXD PIND3 // 模擬TXD
- /*************************/
- uchar IO_UART_RXD(void) //接收
- {
- uchar i=0x00;
- uchar RUDR=0x00;
- while(G_Bit(PORTA,MK_RXD));
- time_bps(); //延時(shí)104US
- while(i<8)
- {
- RUDR>>=1;
- if(G_Bit(PORTA,MK_RXD))
- {
- RUDR|=0x80;
- }
- i++;
- time_bps();
- }
- while(!G_Bit(PORTA,MK_RXD));//接收完8位信息
- time_bps();
- return RUDR;
- }
- void rx_com(uchar IO_UART_RXD)
- {
- if(IO_UART_RXD==0x0D||IO_UART_RXD==0x0A||k>0) //接收的信息是否為回車(chē)或者換行,是則置零
- {
- k++;
- if(IO_UART_RXD>=0x30&&IO_UART_RXD<=0x39||IO_UART_RXD==0x2E)
- {
- RXD_Data[z]=IO_UART_RXD;
- z++;
- if(z=9)
- {
- z=0;
- k=0;
- }
- }
- }
- }
- void IO_UART_TXD(uchar TXD_Data) //發(fā)送
- {
- uchar j;
- uchar TUDR; //發(fā)送緩沖寄存器
- TUDR=TXD_Data;
- L_Bit(PORTD,MK_TXD);//發(fā)送起始位START
- time_bps();
- while(j<8)
- {
- if(TUDR & 0x01) //取0x01位的值,先發(fā)送低位
- {
- H_Bit(TUDR,MK_TXD);
- }
- else
- {
- L_Bit(TUDR,MK_TXD);
- }
- TUDR>>=1;
- j++;
- time_bps();
- }
- H_Bit(PORTD,MK_TXD);//發(fā)送STOP信號(hào)
- time_bps();
- }
- void LED_bit()
- {
- bit_c++;
- bit_c &= 0x03; //0000 0011
- PORTC &= ~0xFF; //0000 0000
- switch(bit_c)
- {
- case 0x00:
- PORTB&=0xF0; //1
- PORTB|=0x07; //0000 0111
- break;
- case 0x01:
- PORTB&=0xF0; //2
- PORTB|=0x0B; //0000 1011
- break;
- case 0x02:
- PORTB&=0xF0; //3
- PORTB|=0x0D; //0000 1101
- break;
- case 0x03:
- PORTB&=0xF0; //4
- PORTB|=0x0E; //0000 1110
- break;
- default:
- break;
- }
- PORTC = show[bit_data[bit_c]];
- if(!Dp_flag)
- {
- if((Dp_flag_D==1)&&(bit_c==0x03)) //4
- PORTC |= 0x80;
- else if((Dp_flag_L==1)&&(bit_c==0x02)) //3
- PORTC |= 0x80;
- else if((Dp_flag_H==1)&&(bit_c==0x01)) //2
- PORTC |= 0x80;
- else PORTC &= ~0x80;
- }
- }
- void Display() //顯示接收信息
- {
- Dp_flag=1; //小數(shù)點(diǎn)標(biāo)志位開(kāi)
- if(RXD_Data[0]) //顯示百位,精確0.1 //j=0,1,2,3,4,5分別為百位十位個(gè)位
- //小數(shù)點(diǎn) 0.1位 0.01位
- { Dp_flag_H=1;
- bit_data[0]=RXD_Data[0];
- bit_data[1]=RXD_Data[1];
- bit_data[2]=RXD_Data[2];
- bit_data[3]=RXD_Data[4];
- }
- else //顯示十位,精確0.01
- {
- Dp_flag_L=1;
- bit_data[0]=RXD_Data[1];
- bit_data[1]=RXD_Data[2];
- bit_data[2]=RXD_Data[4];
- bit_data[3]=RXD_Data[5];
- }
- }
- void port_init(void)
- {
- PORTA = 0x00; // PORTA口初始化
- DDRA = 0xC1; //1100 0000 指示燈 置位輸出 MK_RXD PA1=0
- PORTB = 0xFF; // PORTB口初始化
- DDRB = 0xFF; //1111 1111
- PORTC = 0x00; //PORTC口初始化
- DDRC = 0xFF; //11111111 數(shù)碼管 置位輸出
- PORTD = 0x04; // 0000 0100 PORTD口初始化
- DDRD = 0xBA; //1011 1010 //MK_TXD PD3=1/聲光報(bào)警 PD4=1
- }
- void timer0_init(void) //定時(shí)器0
- {
- TCCR0 = 0x00;
- TCNT0 = 0x98;
- TCCR0 = 0x02;
- }
- void init_devices(void)
- {
- CLI();
- port_init();
- timer0_init();
- MCUCR = 0x00;
- GICR = 0x00;
- TIMSK = 0x01;
- SEI();
- }
- #pragma interrupt_handler timer0_ovf_isr:iv_TIM0_OVF
- void timer0_ovf_isr(void)
- {
- #asm("cli") //關(guān)全局中斷
- TCNT0=0x98;
- #asm("sei") //開(kāi)全局中斷
- flag_bps=1; // 波特率計(jì)時(shí)標(biāo)志位
- if(++counter_2ms>=20) //每2ms刷新一次數(shù)碼管
- {
- LED_bit();
- counter_2ms=0;
- counter_20ms++;
- }
- }
- void main(void)
- {
- init_devices();
- while(1);
- }
復(fù)制代碼
|
|