[求助] 如下程序為何在串口下“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); } } } |