求51单片机串口程序,单片机与PC互通讯,C语言

电路图如图。程序:(方便的话,给加上注解,谢谢)1、串口助手上发送指令L10,LED1常亮,串口助手上显示LED1ON;发送指令L11,LED1灭,串口助手上显示LED1... 电路图如图。
程序:(方便的话,给加上注解,谢谢)
1、串口助手上发送指令 L10 ,LED1常亮,串口助手上显示 LED1 ON;
发送指令 L11 ,LED1灭,串口助手上显示 LED1 OFF。
2、串口助手上发送指令 L30 ,LED3常亮,串口助手上显示 LED3 ON;
发送指令 L31 ,LED3灭,串口助手上显示 LED3 OFF。
3、按一下 SW1, LED2 亮,串口助手上显示 LED2 ON;
再按一下 SW1, LED2 灭,串口助手上显示 LED2 OFF。
4、按住 SW2, LED4 亮,串口助手上显示 LED4 ON;
放开 SW2, LED4 灭,串口助手上显示 LED4 OFF。
晶振11.0592,波特率9600 谢谢
展开
 我来答
lishimin1972
推荐于2016-03-10 · TA获得超过741个赞
知道小有建树答主
回答量:391
采纳率:0%
帮助的人:451万
展开全部
#include <AT89X51.H>
#include <string.h>
#include "com_0.h"

sbit led1=P1^0;
sbit led2=P1^6;
sbit led3=P2^5;
sbit led4=P2^0;
sbit sw1=P3^6;
sbit sw2=P3^7;  //接到XTAL1不对

void SetupTimer0()
{
TMOD &= 0XF0; //仅保留T1信息
TMOD |= 0X02; //设置T0: 定时功能,方式2,自动重载8位定时器/计数器
TH0 = 256-250;//定时每0.25ms中断一次
TL0 = 256-250;
TR0 = 1;   //开启定时器
ET0 = 1;   //定时器0中断打开
}

data unsigned char us250;
data unsigned int ms;
void Timer0_ISR() interrupt 1 //定时中断服务程序,为按键消抖服务
{
if (++us250<4) return;
us250=0; ++ms;
}

data unsigned int k1t, k2t;
bit k1s,k2s;
//按键扫描(含消抖) ,无键盘事件返回0
//按下sw1, 返回1  抬起, 返回2
//按下sw2, 返回3  抬起, 返回4
unsigned char key()
{
data unsigned int t;
t =    ms-k1t;
if (t>1000)   k1t=ms-1000;
if (sw1==1 && k1s==0 && t>10)
{k1s=1;   k1t=ms; return 2;}
if (sw1==0 && k1s==1 && t>10)
{k1s=0;   k1t=ms; return 1;}
if (sw1==k1s) k1t=ms;

t =    ms-k2t;
if (t>1000)   k2t=ms-1000;
if (sw2==1 && k2s==0 && t>10)
{k2s=1;   k2t=ms; return 4;}
if (sw2==0 && k2s==1 && t>10)
{k2s=0;   k2t=ms; return 3;}
if (sw2==k2s) k2t=ms;

return 0;
}

void main()
{
data unsigned char ch;
data char buf[16];
data unsigned char bufp;
bit LED2;  //用以记住当前led2的状态
us250=ms=bufp=0;
k1t=k2t=0;
sw1=sw2=1=k1s=k2s=1;
SetupTimer0();
Com0Init();
EA = 1;   //全局中断打开
Com0PutStr("Start...\n");
while(1)
{
ch=key();
switch(ch)
{
case 1:
led2=LED2; LED2^=1;
Com0PutStr(LED2?"LED2 ON\n":"LED2 OFF\n");
break;
case 3:
led4=0; Com0PutStr("LED4 ON\n");
break;
case 4:
led4=1; Com0PutStr("LED4 OFF\n");
break;
}

if (Com0Ready()==0) continue;

ch=Com0Getch();
if (ch=='\n'||ch=='\r') ch=0;
//下面一行防止非法按键造成缓冲溢出
if (bufp>=15) {memmove(buf, buf+1, 15); bufp=14;}
buf[bufp++]=ch;
if (ch) continue;
 if (strcmp("L10",buf)==0) {led1=0;Com0PutStr("LED1 ON\n"); }
else if (strcmp("L11",buf)==0) {led1=1;Com0PutStr("LED1 OFF\n");}
else if (strcmp("L30",buf)==0) {led3=0;Com0PutStr("LED3 ON\n"); }
else if (strcmp("L31",buf)==0) {led3=1;Com0PutStr("LED3 OFF\n");}
else { Com0PutStr("Bad command.\n");}
bufp=0;//命令处理完毕,则清除缓冲
}
}


更多追问追答
追问

你好,报错这个呢。我已把COM_0.h 加上了

追答
65行错了,sw1=sw2=1=k1s=k2s=1;该为  sw1=sw2=k1s=k2s=1;
hobbye501
2014-05-19 · TA获得超过247个赞
知道小有建树答主
回答量:709
采纳率:100%
帮助的人:241万
展开全部
这个超简单的吧 自己写个协议就好
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式