钻石会员
主题
回帖0
积分11931
阅读权限50
注册时间2009-7-18
最后登录1970-1-1
在线时间 小时
|
楼主 |
发表于 2010-9-19 13:37
|
显示全部楼层
应该串口调试助手问题,换用其他串口调试助手软没问题
//机器人测试程式 用UM5140X计时器电路改装
//晶体振荡器为22.1184MHZ 16/09/2010
#include<AT89X52.h>
#define uchar unsigned char
#define uint unsigned int
//void scan1();//发送指令02030405070217
//void scan2();//发送指令02030405070318
void cal(); //缓冲区清零
void beep();//读return值是否为0203040509024F4BB3
void adc1(); //读return值是否为0203040508030019*/
void display(uchar , uchar , uchar , uchar ); //显示函数
void delay_1ms(uint x);//1MS延时
//sbit start_key = P3^3;//开始定时器0
uchar bai , shi , ge ,i , a = 0 , k=0;
bit l=0 , M =0 ,E=0;
uint shu ;
uchar code FCT1[7]={0x02,0x03,0x04,0x05,0x07,0x02,0x17};//指令1
uchar code FCT2[7]={0x02,0x03,0x04,0x05,0x07,0x03,0x18};//指令2
#define length 9
volatile unsigned char k ;
volatile unsigned char sbuf[length];
uchar code table[]={
// 0 1 2 3 4 5 6 7 8
0x14,0xD7,0x4C,0x45,0x87,0x25,0x24,0x57,0x04,
// 9 A S t o P E r g 0
0x05,0x06,0x25,0xAC,0xE4,0x0E,0xff,0x2C,0xEE,0x05 ,0x0f
};//共阳极数字编码
//=============================++++++++++++++++++++++++=====================
void main()
{
P1 = 0x0F; //4 3 2 1 - - - - 关闭四位LED显示器
P3_1 = 0; //TX=0让机器人PCB'A进入测试模式
TMOD=0x21; //设置定时器1为模式2;定时器0为模式1
TH0=(65536-46000)/256; //约50MS定时器初值 11.0592 = 4600
TL0=(65536-46000)%256; //约50MS定时器初值
ET0 = 1;
TH1=0xff; //装初值设定波特率//22.1184MHZ=57600
TL1=0xff; //19200=0xfd
TR1=1; //启动定时器 SM0 SM1
SM0=0; //串口通信模式设置 0 0 = 0
SM1=1; // 0 1 = 1
REN=1; //串口允许接收数据 1 0 = 2
// 1 1 = 3
PS=1; //串行口定义为高优先级中断源
//EX0=1; //使能外部中断0中断
//IT0=1; //设为下降沿触发方式
EX1=1; //使能外部中断1中断
IT1=1; //设为下降沿触发方式
ES=1; //开串中断
EA=1; //开总中断
//PCON=0x80; // 波特率不加倍
//若为PCON=0x80波特率加倍(11.0592MHZ=57600)
while(1)
{
if(E==0)
{
display(1,4,0,0); //开机画面显示1400机型
}
else
{
if(M==1 && P3_3==1)
{
delay_1ms(5);
if(M==1 && P3_3==1)
{
l = 1;
P3_1 = 0; //TX=0
shu = 0;
M=0;
P1_0 =1;
P1_0 =1;
TR0 = 0;//开始定时器0
}
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
if(l==0) // M=H TR=H P1.0 & P1.1=H P3.3=L
display(15,bai,shi,ge); //显示时间
else
{
if( P1_0==0 && P1_1==0)
{
if(TR0 ==0 && M==0 && P3_3==1) //如果PASS后经关电则P3.3为高 显示go
{
display(15,15,18,19); //显示go
}
else // M=H TR=L P3.3 P1.0 P1.1=L
{
display(14,10,11,11); //如果PASS后不关电关电则一直显示pass
}
}
else
{
display(15,16,17,17); //显示Err
}
}
beep(); //读return值
adc1(); //读return值
cal(); //缓冲区清零
}
}
}
//========读return值是否为0203040509024F4BB3==============
void beep()
{
if(sbuf[0]+sbuf[1]+sbuf[2]+sbuf[3]+sbuf[4]+sbuf[5]+sbuf[6]+sbuf[7] ==sbuf[8] && sbuf[8] == 0xb3)
{
P1_0=0; //P1_0=~P1_0; //为了方便观察将其取反
}
}
//========读return值是否为0203040508030019============
void adc1()
{
if(sbuf[0]+sbuf[1]+sbuf[2]+sbuf[3]+sbuf[4]+sbuf[5]+sbuf[6] == sbuf[7] && sbuf[7] == 0x19)
{
P1_1=0; //P1_1=~P1_1; //为了方便观察将其取反
}
}
/*/=================scan:02030405070217=====================
void scan1()
{
for(i=0;i<7;i++)
{
ES=0;//进入发送数据时先关闭串行中断
SBUF=FCT1[i];//将数据原样发回?
while(!TI);//等待数据发完
TI=0;
ES=1;//退出再开串行中断
}
}
//==================scan:02030405070318====================
void scan2()
{
for(i=0;i<7;i++)
{
ES=0;//进入发送数据时先关闭串行中断
SBUF=FCT2[i];//将数据原样发回?
while(!TI);//等待数据发完
TI=0;
ES=1;//退出再开串行中断
}
}*/
//++++++ scan:02030405070217 & scan:02030405070318 +++++
//向串口发送一个字符
void send_char_com(uchar ch)
{
SBUF= ch;
while(!TI); //如果TI为0等待
TI = 0;
}
//===========================================================
//向串口发送一个字符串,strlen为该字符串长度
void send(uchar *str,uchar strlen)
{
uchar k=0;
ES=0;
do
{
send_char_com(*(str + k));
k++;
}
while(k < strlen);
ES=1;
}
//================================================
void cal() //缓冲区清零
{ uchar i;
for(i=0;i<8;i++)
{
sbuf[i]=0x00;
}
k=0;
}
/*/=============中断服务程式=============================/
void UART_Interrupt_Receive(void) interrupt 4// using 3
{
if(RI==1)
{
RI=0;
sbuf[k]=SBUF;
++k;
if((k==sbuf[4])||( k>8 ))
k=0;
return;
}
else
{
TI=0;
}
} */
//=============中断服务程式=============================/
void UART_Interrupt_Receive(void) interrupt 4 using 3
{
uchar temp;
ES=0; // 关中断
RI=0; // 清接收标志
temp=SBUF; // 转存
sbuf[k]=temp; // 送数组
k++; // 接收下一个
if((k==sbuf[4])||(k>8)) // x=数据长度
k=0;
ES=1; //开中断
}
/*/==========================================================
//外部中断0子函数
void int_0 () interrupt 0 //using 0
{
EX0=0; //暂时关闭外部中断0中断
P3_4 = ~P3_4; //每中断一次取反一次
if(P3_4)
{
TR0 =0;
M = 0;
P3_3 = 1;
}
EX1=0; //使能外部中断0中断
} */
//==========================================================
//外部中断1子函数
void int_1 () interrupt 2 //using 2
{
EX1=0; //暂时关闭外部中断1中断
E = 1;
TR0 = ~TR0; //每中断一次取反一次
if(TR0==0)
{
shu = 0;
P3_1 = 0; //TX=0
}
if(TR0==1)
{
M=1;
l = 0;
P1_0 =1;
P1_0 =1;
}
EX1=1; //使能外部中断1中断
}
//=========================================================
/*22.1184MHZ时=1.0026MS为单位的延时程序*/
void delay_1ms(uint x)
{
uchar j;
while(x--)
{
for(j=0;j<227;j++)
{;}
}
}
//==========================================================
void InitTimer0(void) interrupt 1 // using 1 //约50ms中断一次
{
TH0=(65536-46000)/256; //约50MS定时器初值 11.0592 = 4600
TL0=(65536-46000)%256; //约50MS定时器初值
a++; //约每50ms A自加一
if(a==40) //如果到了约1s
{
a=0;
shu++;
bai=shu/100;
shi=shu%100/10;
ge=shu%10;
switch(shu)
{
case 1:
{
P3_1 = 1; break; //TX=1
}
case 120: //120S 等待2分钟
{
//scan1();
send(&FCT1[0],7);
break;
}
case 121:
{
if(P1_0==1)
{
shu = 0;
l=1;
TR0=0;
}
break;
}
case 168: //48S 后判忙
{
//scan2();
send(&FCT2[0],7);
break;
}
case 173:
{
if(P1_1==0)
{
P1_1=1;
P1_0=1;
shu = 0;
l=1;
TR0=0;
}
break;
}
case 365: //365 等待4分钟
{
//scan2();
send(&FCT2[0],7);
break;
}
case 380: //20S
{
l=1;
shu = 0;
TR0 = 0;
M = 0;
P3_1 = 0; //TX=0
break; //20s
}
}
}
}
//default:
//////////////////////////////////////////////////////////////
void display(uchar k,uchar b,uchar s,uchar g) //显示函数
{
P1_7 = 0;
P2 = table[k];
P1_4 = 1;
delay_1ms(5);
P2 = table[b];
P1_4 = 0;
P1_5 = 1;
delay_1ms(5);
P2 = table[s];
P1_5 = 0;
P1_6 = 1;
delay_1ms(5);
P2 = table[g];
P1_6 = 0;
P1_7 = 1;
delay_1ms(5);
} |
|