找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3616|回复: 1
打印 上一主题 下一主题
收起左侧

修改个简单的下位机程序,接收串口发来的数据,出了点问题??

[复制链接]
跳转到指定楼层
楼主
ID:46838 发表于 2012-11-28 20:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

#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口才会有变化,请问程序哪里有问题?

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:43586 发表于 2012-12-6 10:53 | 只看该作者
uchar Buffer[2] = {0}; //从串口接收的数据 你初始化的时候就是赋予0了 在main函数里switch(Buffer[0]) 程序一直进入case 0: Relay00(); break; 所以你发送0是没有用的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表