[求助] 如下程序為何在串口下“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);
}
}
}
歡迎光臨 (http://www.zg4o1577.cn/bbs/) | Powered by Discuz! X3.1 |