#include #define uint unsigned int#define uchar unsigned char#define ulong unsigned long#define Echo PC_IDR_IDR6#define Trig PC_ODR_ODR5float distance;void delay_ms(uint ms) //延时函数{ uint i,j; for(i=0;i<ms;i++) for(j=0;j<3164;j++);}void IO() //IO初始化{ PB_DDR_DDR5=0; //PB4配置为输入 PB_CR1_C15=1; //PB4为上拉电阻输入 PB_CR2_C25=0; PC_DDR_DDR6=0; PC_CR1_C16=1; PC_CR1_C16=0;}void uart1_init(void) //串口初始化{ UART1_CR1=0x00; UART1_CR2=0x00; UART1_CR3=0x00; UART1_BRR2 = 0x03; UART1_BRR1 = 0x68; //9600波特率 UART1_CR2_TEN = 1; //允许发送 UART1_CR2_REN = 1; //允许接收 UART1_CR2_RIEN = 1; //接收中断使能}void uart1_send(uchar dat) //串口发送{ while((UART1_SR & 0x80)==0x00); UART1_DR = dat;}void timer_Init(void){ TIM1_PSCRH = 0; TIM1_PSCRL = 15; //(15+1)分频为1M TIM1_ARRH = 0x0; TIM1_ARRL = 0x32; //每50us中断一次 TIM1_CCMR1_OC1M = 6; //pwm模式2 TIM1_CCER1_CC1E = 1; //CC1引脚使能 TIM1_CCR1H = 0; TIM1_CCR1L = 0; //默认输出低 TIM1_BKR |= 0x80; //设置刹车寄存器 TIM1_IER = 0x01; //允许更新中断 TIM1_CR1 = 0x01; //计数器使能,开始计数}/****千位数上的每一位数的读取*****/void uart1_int(uint distance){ char bai,shi,ge; bai=distance%100; shi=distance/10%10; ge=distance%10; uart1_send(bai+48); uart1_send(shi+48); //0x30对应的字符是‘0‘,数字加上0X30后为数字所对应的Ascall码 uart1_send(ge+48); uart1_send(0x0a); //0X0a对应的字符是换行\n}/*********** 定时器计数 ***********/void calc(){//0..034cm/us int t=0; t=TIM1_CCR1H*256+TIM1_CCR1L; distance=t*0.017; TIM1_CCR1H = 0; TIM1_CCR1L = 0; uart1_int(distance);}void Trigger(){ Trig=1; TIM1_ARRH = 0x0; TIM1_ARRL = 0x32; Trig=0;}void main(void){ CLK_CKDIVR &=0xe7; //配置时钟为16MHz asm("sim"); //关总中断 IO(); //IO uart1_init(); timer_Init(); asm("rim"); //开总中断 while(1) { Trigger(); //发送触发信号 while(Echo) TIM1_CR1 = 0x01; //启动定时器 while(!Echo) TIM1_CR1 = 0x00; //关闭定时器 calc(); //计算 uart1_send(0x0a); }}#pragma vector = UART1_R_RXNE_vector__interrupt void uart1rxd(void){ UART1_SR_RXNE = 0; //data = UART1_DR;}#pragma vector = TIM1_OVR_UIF_vector__interrupt void TIM1_OVR_UIF(void){ TIM1_SR1_UIF = 0; //add your code here}