[求助] 如下程序?yàn)楹卧诖谙隆?0”后會(huì)進(jìn)入死循環(huán)?
我用AT89S52+ADC0809【Clock部分沒有用SUN7474/74HC74】采集一個(gè)光敏電阻的光訊號(hào)強(qiáng)度,其余的開關(guān)控制都沒有問題!
目前唯獨(dú)在采集光訊號(hào)這邊有問題!
#include<reg52.h> #include <stdio.h> #include <string.h> #include <intrins.h>
/*****************************宏定義無符號(hào)型變量****************************/ #define uchar unsigned char #define uint unsigned int #define ad_data P2
/*****************************申明函數(shù)變量*********************************/ void delay_ms(unsigned int); //延遲函數(shù) void AD_data(unsigned int ad_data);
/*****************************AD轉(zhuǎn)換端口定義**********************************/ 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動(dòng)作 sbit keypad2=P0^1; //控制氣缸2動(dòng)作 sbit keypad3=P0^2; //控制氣缸3動(dòng)作 sbit keypad4=P0^3; //控制氣缸4動(dòng)作 sbit keypad5=P0^4; //控制短路動(dòng)作
unsigned char ch; //定義串口寫入字符名稱 bit read_flag= 0 ; //串口發(fā)送標(biāo)志位
/******************************1ms延時(shí)函數(shù)************************************/ 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; }
/****************************向串口發(fā)送一個(gè)字符程序************************/ void send_char_com(unsigned char ch) { SBUF=ch; while (TI== 0); TI= 0 ; }
/* //向串口發(fā)送一個(gè)字符串,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); } */
/*******************************主函數(shù)開始***********************************/ 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); //查詢轉(zhuǎn)換結(jié)束 OE=1; ch=P2; OE=0; } }
void cl() interrupt 3 { clk=!clk; }
/****************************串口接收中斷函數(shù)************************/ void serial () interrupt 4 using 3 { unsigned char ch; if (RI) { RI = 0 ; ch=SBUF;
if(ch==0x00) { AD_data(ad_data); //采樣光訊號(hào) }
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 ; //就置位取數(shù)標(biāo)志 } }
main() //主函數(shù) { 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) //如果取數(shù)標(biāo)志已置位,就將讀到的數(shù)從串口發(fā)出 { read_flag= 0 ; //取數(shù)標(biāo)志清0 send_char_com(ch); } } } |