[求助] 如下程序为何在串口下“00”后会进入死循环?
我用AT89S52+ADC0809【Clock部分没有用SUN7474/74HC74】采集一个光敏电阻的光讯号强度,其余的开关控制都没有问题!
目前唯独在采集光讯号这边有问题!
#include<reg52.h> #include <stdio.h> #include <string.h> #include <intrins.h>
/*****************************宏定义无符号型变量****************************/ #define uchar unsigned char #define uint unsigned int #define ad_data P2
/*****************************申明函数变量*********************************/ void delay_ms(unsigned int); //延迟函数 void AD_data(unsigned int ad_data);
/*****************************AD转换端口定义**********************************/ sbit clk=P1^1; sbit ST=P1^2; sbit EOC=P1^3; sbit OE=P1^4;
sbit start=P3^3; sbit keydown=P3^4; sbit keyback=P3^5; sbit keyled=P3^6;
sbit keypad1=P0^0; //控制气缸1动作 sbit keypad2=P0^1; //控制气缸2动作 sbit keypad3=P0^2; //控制气缸3动作 sbit keypad4=P0^3; //控制气缸4动作 sbit keypad5=P0^4; //控制短路动作
unsigned char ch; //定义串口写入字符名称 bit read_flag= 0 ; //串口发送标志位
/******************************1ms延时函数************************************/ void delay_ms(unsigned int ms) { unsigned int i; unsigned char j; for(i=0;i<ms;i++) { for(j=0;j<200;j++); for(j=0;j<102;j++); } }
void delayus(uint us) { while(us--); }
/****************************串口初始化程序************************/ void init_serialcom(void) { SCON = 0x50 ; //SCON: serail mode 1, 8-bit UART, enable ucvr TMOD |= 0x20 ; //TMOD: timer 1, mode 2, 8-bit reload PCON |= 0x80 ; //SMOD=1; TH1 = 0xFA ; //波特率:19200 晶振=22.1184MHz;波特率:9600 晶振=11.0592MHz IE |= 0x90 ; //开启串行口中断 TR1 = 1 ; // timer 1 run TI=1; }
/****************************向串口发送一个字符程序************************/ void send_char_com(unsigned char ch) { SBUF=ch; while (TI== 0); TI= 0 ; }
/* //向串口发送一个字符串,strlen为该字符串长度 void send_string_com( unsigned char *str, unsigned int strlen) { unsigned int k= 0 ; do { send_char_com(*(str + k)); k++; } while (k < strlen); } */
/*******************************主函数开始***********************************/ void AD_data(unsigned int ad_data) { TMOD=0x01; TH0=(65536-4000)/256; TL0=(65536-4000)%256; TR0=1; ET0=1; EA=1; while(1) { ST=0; ST=1; ST=0; while(EOC==0); //查询转换结束 OE=1; ch=P2; OE=0; } }
void cl() interrupt 3 { clk=!clk; }
/****************************串口接收中断函数************************/ void serial () interrupt 4 using 3 { unsigned char ch; if (RI) { RI = 0 ; ch=SBUF;
if(ch==0x00) { AD_data(ad_data); //采样光讯号 }
else if (ch==0x01) { delay_ms(500); keypad4=1; //测试按键气缸 Close delay_ms(1000); keypad4=0; //测试按键气缸 Open }
else if (ch==0x02) { delay_ms(500); keypad5=1; //短路测试 Close delay_ms(1000); keypad5=0; //短路测试 Open }
else if (ch==0x03) { delay_ms(500); keypad3=0; //LED暗箱气缸 Open loop2: if(keyled==0) { delay_ms(500); keypad2=0; //后推气缸 Open loop3: if(keyback==0) { keypad1=0; //下降气缸 Open } else goto loop3; } else goto loop2; }
else P0=0x00;
read_flag= 1 ; //就置位取数标志 } }
main() //主函数 { P0=0x00; P1=0x00; P2=0xff; P3=0xff;
init_serialcom(); //初始化串口 loop: if(start==0) { delay_ms(500); keypad1=1; //下降气缸 Close loop1: if(keydown==0) { delay_ms(500); keypad2=1; //后推气缸 Close keypad3=1; //LED暗箱气缸 Close ch=0x04; send_char_com(ch); } else goto loop1; }
else goto loop; TI=1; while (1) { if (read_flag) //如果取数标志已置位,就将读到的数从串口发出 { read_flag= 0 ; //取数标志清0 send_char_com(ch); } } } |