No.71363 作者:slowly2004 邮件:zzl07067@yahoo.com.cn ID:133940 登陆:2次 文章数:1篇 最后登陆IP:221.237.64.108 最后登陆:2009/6/17 16:50:31 注册:2009/4/17 9:50:43 财富:106 发帖时间:2009/6/17 16:50:31 发贴者IP:221.237.64.108 标题:slowly2004:串口和定时器中断冲突 摘要:No.71363串口和定时器中断冲突 /********************初始化***********************/ void uart_init() { P0=0xff;//初始化单片机 P1=0xff; P2=0xff; P3=0xff; uart_count=0; SCON=0x50;//串口工作在模式1,8位AURT,使能接收 TMOD=0x21;//定时器1工作在模式2,8位自动重装;定时器0工作在模式1,16位定时器 TH1=0xfd;//波特率为9600,时钟为11.059MHZ TL1=0xfd; IE=0X96;//中断总使能,串口中断使能,外部中断1使能,定时器0中断使能 PS=1;//串口中断高优先级 TR1=1;//定时器0和1开始计数 TR0=1; PT0=0;//定时器0低优先级 IT1=0;//外部中断1低电古触发 EX1=0; } /*******************串口接收中断*************************/ void uart_rec_inter() interrupt 4 { while(RI) { RI=0; uart_buf[uart_count]=SBUF; uart_count++; if(uart_count==1) { err_count=30; uart_err=1; }; if(uart_count==11) { uart_ready=1; uart_count=0; uart_err=0; }; } } /*************************向串口发送一个字节*****************/ void uart_sendone(uchar ch) { SBUF=ch; while(TI==0); TI=0; } /**********向串口发送字符串,strlen为字符串长度***********/ void uart_sendstring(uchar *str,uint strlen) { uint k; for(k=0;k <strlen;k++) { uart_sendone(*(str+k)); } } /************************校验和**************************/ void uart_checksum() { uint check_s;//校验和时,字节计数器 if((uart_buf[0]==0x5a)&&(uart_buf[1]==0x53))//首先校验第一和第二个字节是否正确 { checksum=0; for(check_s=0;check_s <10;check_s++) { checksum+=uart_buf[check_s]; } if(checksum==uart_buf[10]) { sum=1; } } } void timer0() interrupt 1 { uchar sen_count;//读状态计数器 TH0=0xd8;//3ms f448 10ms d8f0 15ms c568 5ms ec78 TL0=0xf0; TIME=0; for(sen_count=0;sen_count <=3;sen_count++) { xc_en=0; sen_en=1; delay(5); xc_buf[sen_count]=P0;//读3次行程开关状态 xc_en=1; sen_en=0; delay(5); sen_buf[sen_count]=P0;//读3次传感器状态 }; if((xc_buf[0]==xc_buf[1])&&(xc_buf[0]==xc_buf[2]))//三次状态相同 { if(xc_flag!=xc_b ......
>>返回讨论的主题
|