[求助] 如下程序为何在串口下“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.51hei.com/bbs/) | Powered by Discuz! X3.1 |