#include<reg52.h> #include<math.h> #define uchar unsigned char #define uint unsigned int sbit Cntl0 = P2^0; sbit Cntl1 = P2^1; uchar Buffer[2] = {0}; //从串口接收的数据 uint i,j,r0=1,r1=1; /******************************************************************** * 名称 : Delay_1ms() * 功能 : 延时子程序,延时时间为 1ms * x * 输入 : x (延时一毫秒的个数) * 输出 : 无 ***********************************************************************/ void Delay_1ms(uint i)//1ms延时 { uchar x,j; for(j=0;j<i;j++) for(x=0;x<=148;x++); } /******************************************************************** * 名称 : Com_Int() * 功能 : 串口中断子函数 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void Com_Int(void) interrupt 4 {
EA = 0; if(RI == 1) //当硬件接收到一个数据时,RI会置位 { Buffer[0] = SBUF - 48; //这里减去48是因为从电脑中发送过来的数据是该字符的ASCII码,0的ASCII是48。 RI = 0; } EA = 1; } /******************************************************************** * 名称 : Com_Init() * 功能 : 串口初始化,晶振11.0592,波特率9600,使能了串口中断 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void Com_Init(void) { TMOD = 0x20; PCON = 0x00; SCON = 0x50; TH1 = 0xFd; //设置波特率 9600 TL1 = 0xFd; TR1 = 1; //启动定时器1 ES = 1; //开串口中断 EA = 1; //开总中断 } /******************************************************************** * 名称 : Relay00() * 功能 : 控制P2^0管脚电平,实现点奇数次为高,偶数次为低 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void Relay00() { r0++; Cntl0=r0%2; //r0用于记调用本Relay()函数的次数,将次数除以2的余数赋给对应管脚 Delay_1ms(100); } /******************************************************************** * 名称 :Relay01() * 功能 : 控制P2^1管脚电平,实现点奇数次为高,偶数次为低 * 输入 : 无 * 输出 : 无 ***********************************************************************/ void Relay01() { r1++; Cntl1=r1%2; //r1用于记调用本Relay()函数的次数,将次数除以2的余数赋给对应管脚 Delay_1ms(100); }
void main() { Delay_1ms(100); Com_Init();//串口初始化 while(1) { switch(Buffer[0]) //括号里面的值为ASCII-48的值,减后即为从上位机发过来的十进制数? { case 0: Relay00(); break; case 1: Relay01(); break; default:break; } } }
想实现的功能是:电脑上位机软件会发送0或1到单片机串口,当发送奇数次0时p2^0端口输出低电平,偶数次是输出高电平;上位机发送1时同理控制p2^1端口; 上面这个程序编译没问题,只是烧进单片机后,单片机一上电,p2^0端口就不断的低高低高低高重复变化,用上位机发送0,对单片机p2^0端电平无影响,直到上位机发送1后,p2^0口才会有变化,请问程序哪里有问题? |