具体是用串口不间断发送ASCII 回车(CR) 换行(LF) 数字 数字 数字 小数点 数字 数字
但是仿真时接收不到
- #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;} //波特率延时
- uchar bit_c=0; //数码管位选
- uchar bit_data[3]; //数码管(四)显示数据
- uchar Dp_flag_L=0; //精确0.01小数点
- uchar Dp_flag_H=0; //精确0.1小数点
- uchar Dp_flag_D=0; //调试功能小数点
- uchar Dp_flag=0; //数码管小数点总标志位
- 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 };//对应ACSII码
- volatile uchar RXD_Data[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};//用于接收长度为8的数据
- volatile uchar RUDR; //接收数据暂存
- volatile uchar z=0; //接收探头信息计位
- uchar TUDR=0; //模拟IO发送数据缓存区 //UDR
- volatile uchar flag_bps=0; //104us标志位
- #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(); //延时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) //接收的信息是否为回车或者换行,是则置零
- {
- 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) //发送
- {
- uchar j;
- uchar TUDR; //发送缓冲寄存器
- TUDR=TXD_Data;
- L_Bit(PORTD,MK_TXD);//发送起始位START
- time_bps();
- while(j<8)
- {
- if(TUDR & 0x01) //取0x01位的值,先发送低位
- {
- H_Bit(TUDR,MK_TXD);
- }
- else
- {
- L_Bit(TUDR,MK_TXD);
- }
- TUDR>>=1;
- j++;
- time_bps();
- }
- H_Bit(PORTD,MK_TXD);//发送STOP信号
- 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; //小数点标志位开
- if(RXD_Data[0]) //显示百位,精确0.1 //j=0,1,2,3,4,5分别为百位十位个位
- //小数点 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 数码管 置位输出
- PORTD = 0x04; // 0000 0100 PORTD口初始化
- DDRD = 0xBA; //1011 1010 //MK_TXD PD3=1/声光报警 PD4=1
- }
- void timer0_init(void) //定时器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") //关全局中断
- TCNT0=0x98;
- #asm("sei") //开全局中断
- flag_bps=1; // 波特率计时标志位
- if(++counter_2ms>=20) //每2ms刷新一次数码管
- {
- LED_bit();
- counter_2ms=0;
- counter_20ms++;
- }
- }
- void main(void)
- {
- init_devices();
- while(1);
- }
复制代码
|