大家可以看看这个程序,我也语言表达的,呵呵,可以用C 来实现吗?

bkill 2008-01-15 12:15:57
#include "stdio.h"
main()
{ /*这个程序要用到的数据:接受电脑的(定义为datacomputer),键盘扫描得到的(理论上应该是12个,定义为datakeyscan1,datakeyscan2,datakey3,datakey4,datakey5,datakey6,datakey7,datakey8,datakey9,datakey10,datakey11,datakey12,我们为了点亮LED灯要用到的数据“如果是用每条线对应一个灯,其实就到时候付给那条线对应的端口1就行了,但是这个接受的电脑的数据有关,可以给他们定义一个对应关系!!程序里的这个数据就定义为dataacordingcomputer”)*/
get code()/*接受一个电脑发来的数据:这个数据是电脑从条码扫描仪得到的,这个数据很重要,它将决定我们的程序怎么编写,它关系到我们电亮那个LED灯,关系到扫描到什么按键就立即报警,扫描到什么按键继续扫描,以及过多长时间这个按键没有被扫描到要报警*/
keyscan()/*程序应该是从扫描开始的,之前需要加协议吗?我不清楚,待定*/
get datakeyunknowd()/*应该得到一个扫描的数据datakeynuknowd,那这个数据如果是(我感觉老说这个那个的很不爽,好了,回到开头用数字来说吧。)*/
{
if(datakeyunknown=dataacordingcomputer&&timer<30ms)/*这里的datakeyunknown就是不确定的接收到的扫描到的数据*/
程序待嫁/*这里的程序的实际作用就是继续扫描,且保证LED灯还亮着,且记录(可以累加)这个扫描的次数并返回给电脑一个这个数据信号*/
else if(datakeyunknown!=dataacordingcomputer)/*如果接收到的数据不是设定的和电脑给的数据对应的数据,就表示键盘扫描异常,就是有键按下,则要做出点亮报警灯喇叭的反应*/
/*这里的程序就是将和报警灯和喇叭连接的电路置高电平,也就是发送数据1*/
else(datakeyunknown=0x0)/*这个地方就是考虑到这个键盘扫描(也就是红外线电路阻断)没有被执行,这也是一个异常!*/
/*这个地方也要和上面一样对报警灯和喇叭电路进行置高电平操作--既然对他们置高电平出现不止一次,就设置为子程序,可以不停的被调用!!*/
/*最后考虑硬件复位时对程序的保护(通过硬件一定可以实现复位,对程序执行会不会有破坏?需不需要保护程序呢?要请教一下大家。)*/
}
}
...全文
269 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
Treazy 2008-01-19
  • 打赏
  • 举报
回复
我的思路是
把12个端口用一个位域指定
由于你的功能都是统一的
唯一不同的就是指定端口
所以只要写一个函数就oK了
用函数指针去实现会比较简单
sanyuexiaoyu 2008-01-19
  • 打赏
  • 举报
回复
相当的不错
bkill 2008-01-19
  • 打赏
  • 举报
回复
那我指针现在学的不是很好,如果不用指针,有别的方法吗?
Treazy 2008-01-18
  • 打赏
  • 举报
回复
这点功能,程序写的如此复杂!
楼主你真是……
bkill 2008-01-18
  • 打赏
  • 举报
回复
简单点说,给你两根线a,b;一开始你就用电表测。测谁有电,谁没电。如果你测出a有电。好了,你就把a默认成有电,b默认成没电,把a就接上电灯,把b接到一个人手上(假设为36V电不死人,但是时间长了就有坏影响!),然后你还要不停的检测这两根线,如果a有点,好,正常,如果b有电,赶紧告诉这个人。如果离的远,按个喇叭啦,报个警拉,就这个模型。只不过这里线是12根。
我编的程序出错太多。我都快灰心了。希望高手给点指点!
bkill 2008-01-18
  • 打赏
  • 举报
回复
我抽象一下程序,让它简单些。就是我们程序监测12个线上的电平,开始都是高电平,有人要操作了,那他会引起电平变化,他开始引起的12个电平中的1个电平变成低电平,我们默认以后就是这个对应线上的电平可以是低电平,其他的都不可以了,如果其他的变成了低电平就是操作错误。那就报警,喇叭响!


main()
{
nkeynumber==0xFF;/*初始状态没有按键按下,各端口均为高电平(因为I/0口内有上拉电阻,把电平拉高)*/
EX0=1;
EA=1;
Uart_init();/*设置工作方式*/
keyscan();/*开始键盘扫描,这将返回一个数据,决定程序的流向,紧跟程序有12个流向*/
switch(nkeynumber)/*这个switch的作用是用来选出那个I/O上连接的红外线是被设置为默认-(可以被拉低电平但是程序不作出反应)*/
{
case(0x00):key0_handler();break;/*这里面包含的switch语句作用是在默认选出后,如果再有按键按下,程序判断是否为默认,做出反应(如果是默认键按下则不反映,其他键按下则报警,喇叭响!)*/
case(0x01):key1_handler();break;
case(0x02):key2_handler();break;
case(0x03):key3_handler();break;
case(0x04):key4_handler();break;
case(0x05):key5_handler();break;
case(0x06):key6_handler();break;
case(0x07):key7_handler();break;
case(0x08):key8_handler();break;
case(0x09):key9_handler();break;
case(0x0a):key10_handler();break;
case(0x0b):key11_handler();break;
default: keyscan();break;

}

}
bkill 2008-01-18
  • 打赏
  • 举报
回复
因为是12个端口,必须用到分支选择。而每个分支的程序其实大同小异,看的多,其实就是相当于复制了好多份!如果不好看,可以下载到电脑的文档上,把case 都删掉,知道他们的流向就可以了。那应该就好看些,干脆我在这里作了得了!。
bkill 2008-01-18
  • 打赏
  • 举报
回复
}
void key0_handler()/*扫描的数据判断后流向这些程序*/
{
second();//
}
void key1_handler()
{
second();
}
void key2_handler()
{
second();
}
void key3_handler()
{
second();
}
void key4_handler()
{
second();
}
void key5_handler()
{
second();
}
void key6_handler()
{
second();
}
void key7_handler()
{
second();
}
void key8_handler()
{
second();
}
void key9_handler()
{
second();
}
void key10_handler()
{
second();
}
void key11_handler()
{
second();
}


void second()
{
keyscan();/*再进行键盘扫描,如果返回的数据符合,则继续扫描,不符合,报警,喇叭响,这个程序返回一个数据.*/
switch(nkeynumber)
{
case(0x00):key20_handler();break;
case(0x01):key21_handler();break;
case(0x02):key22_handler();break;
case(0x03):key23_handler();break;
case(0x04):key24_handler();break;
case(0x05):key25_handler();break;
case(0x06):key26_handler();break;
case(0x07):key27_handler();break;
case(0x08):key28_handler();break;
case(0x09):key29_handler();break;
case(0x0a):key30_handler();break;
case(0x0b):key31_handler();break;
default: keyscan();break;
}

}


void key20_handler()
{
while(1)
{
switch(nkeynumber)
{
case(0x00):keyscan();break;
case(0x01):light();beep();break;
case(0x02):light();beep();break;
case(0x03):light();beep();break;
case(0x04):light();beep();break;
case(0x05):light();beep();break;
case(0x06):light();beep();break;
case(0x07):light();beep();break;
case(0x08):light();beep();break;
case(0x09):light();beep();break;
case(0x0a):light();beep();break;
case(0x0b):light();beep();break;
default: keyscan();break;
}
}
}
void key21_handler()
{
while(1)
{
switch(nkeynumber)
{
case(0x00):light();beep();break;
case(0x01):keyscan();break;
case(0x02):light();beep();break;
case(0x03):light();beep();break;
case(0x04):light();beep();break;
case(0x05):light();beep();break;
case(0x06):light();beep();break;
case(0x07):light();beep();break;
case(0x08):light();beep();break;
case(0x09):light();beep();break;
case(0x0a):light();beep();break;
case(0x0b):light();beep();break;
default: keyscan();break;
}
}
}
void key22_handler()
{
while(1)
{
switch(nkeynumber)
{
case(0x00):light();beep();break;
case(0x01):light();beep();break;
case(0x02):keyscan();break;
case(0x03):light();beep();break;
case(0x04):light();beep();break;
case(0x05):light();beep();break;
case(0x06):light();beep();break;
case(0x07):light();beep();break;
case(0x08):light();beep();break;
case(0x09):light();beep();break;
case(0x0a):light();beep();break;
case(0x0b):light();beep();break;
default: keyscan();break;
}
}
}
void key23_handler()
{
while(1)
{
switch(nkeynumber)
{
case(0x00):light();beep();break;
case(0x01):light();beep();break;
case(0x02):light();beep();break;
case(0x03):keyscan();break;
case(0x04):light();beep();break;
case(0x05):light();beep();break;
case(0x06):light();beep();break;
case(0x07):light();beep();break;
case(0x08):light();beep();break;
case(0x09):light();beep();break;
case(0x0a):light();beep();break;
case(0x0b):light();beep();break;
default: keyscan();break;
}
}
}
void key24_handler()
{
while(1)
{
switch(nkeynumber)
{
case(0x00):light();beep();break;
case(0x01):light();beep();break;
case(0x02):light();beep();break;
case(0x03):light();beep();break;
case(0x04):keyscan();break;
case(0x05):light();beep();break;
case(0x06):light();beep();break;
case(0x07):light();beep();break;
case(0x08):light();beep();break;
case(0x09):light();beep();break;
case(0x0a):light();beep();break;
case(0x0b):light();beep();break;
default: keyscan();break;
}
}
}
void key25_handler()
{
while(1)
{
switch(nkeynumber)
{
case(0x00):light();beep();break;
case(0x01):light();beep();break;
case(0x02):light();beep();break;
case(0x03):light();beep();break;
case(0x04):light();beep();break;
case(0x05):keyscan();break;
case(0x06):light();beep();break;
case(0x07):light();beep();break;
case(0x08):light();beep();break;
case(0x09):light();beep();break;
case(0x0a):light();beep();break;
case(0x0b):light();beep();break;
default: keyscan();break;
}
}
}
void key26_handler()
{
while(1)
{
switch(nkeynumber)
{
case(0x00):light();beep();break;
case(0x01):light();beep();break;
case(0x02):light();beep();break;
case(0x03):light();beep();break;
case(0x04):light();beep();break;
case(0x05):light();beep();break;
case(0x06):keyscan();break;
case(0x07):light();beep();break;
case(0x08):light();beep();break;
case(0x09):light();beep();break;
case(0x0a):light();beep();break;
case(0x0b):light();beep();break;
default: keyscan();break;
}
}
}
void key27_handler()
{
while(1)
{
switch(nkeynumber)
{
case(0x00):light();beep();break;
case(0x01):light();beep();break;
case(0x02):light();beep();break;
case(0x03):light();beep();break;
case(0x04):light();beep();break;
case(0x05):light();beep();break;
case(0x06):light();beep();break;
case(0x07):keyscan();break;
case(0x08):light();beep();break;
case(0x09):light();beep();break;
case(0x0a):light();beep();break;
case(0x0b):light();beep();break;
default: keyscan();break;
}
}
}
void key28_handler()
{
while(1)
{
switch(nkeynumber)
{
case(0x00):light();beep();break;
case(0x01):light();beep();break;
case(0x02):light();beep();break;
case(0x03):light();beep();break;
case(0x04):light();beep();break;
case(0x05):light();beep();break;
case(0x06):light();beep();break;
case(0x07):light();beep();break;
case(0x08):keyscan();break;
bkill 2008-01-18
  • 打赏
  • 举报
回复
#include"stdio.h"
#define unsigned char uchar
#define unsigned int uint
#define unsigned long ulong
sbit p10=0x90;/*定义的p10-p17和p33-p36共12个端口为按键接受端口*/
sbit p11=0x91;
sbit p12=0x92;
sbit p13=0x93;
sbit p14=0x94;
sbit p15=0x95;
sbit p16=0x97;
sbit p17=0x98;
sbit p33=0x99;
sbit p34=0x9a;
sbit p35=0x9b;
sbit p36=0x9c;
sbit p30=p3^0;/*这个端口我用来接报警灯*/
sbit p31=p3^1;/*这个接喇叭*/
sbit p32=p3^2;/*这个先留着,如果用中断独立按键扫描可能用到*/
main()
{
nkeynumber==0xFF;/*初始状态没有按键按下,各端口均为高电平(因为I/0口内有上拉电阻,把电平拉高)*/
EX0=1;
EA=1;
Uart_init();/*设置工作方式*/
keyscan();/*开始键盘扫描,这将返回一个数据,决定程序的流向,紧跟程序有12个流向*/
switch(nkeynumber)
{
case(0x00):key0_handler();break;
case(0x01):key1_handler();break;
case(0x02):key2_handler();break;
case(0x03):key3_handler();break;
case(0x04):key4_handler();break;
case(0x05):key5_handler();break;
case(0x06):key6_handler();break;
case(0x07):key7_handler();break;
case(0x08):key8_handler();break;
case(0x09):key9_handler();break;
case(0x0a):key10_handler();break;
case(0x0b):key11_handler();break;
default: keyscan();break;

}

}
Uart_Inint()
{
SCON=0x52;
TMOD=0x20;
TCON=0x69;
TH1=0xf3;
}

keyscan()/*键盘扫描程序开始,这个程序将返回给主函数main一个数据*/
{
int a;
for(a=0;a<=5;a++)/*定义扫描的次数为5次*/
{
if(p10==0)/*如果对应p1.0口按键被按下,则其为低电平*/
delay();/*延迟去抖动*/
if(p10==0)/*如果按键还是低电平,证明按键确实被按下*/
return'0x00';/*返回主函数一个值'0x00'*/
if(p11==0) /*下面均一样判断并返回main值*/
delay();
if(p11==0)
return'0x01';
if(p12==0)
delay();
if(p12==0)
return'0x02';
if(p13==0)
delay();
if(p13==0)
return'0x03';
if(p14==0)
delay();
if(p14==0)
return'0x04';
if(p15==0)
delay();
if(p15==0)
return'0x05';
if(p16==0)
delay();
if(p16==0)
return'0x06';
if(p17==0)
delay();
if(p17==0)
return'0x07';
if(p18==0)
delay();
if(p18==0)
return'0x08';
if(p19==0)
delay();
if(p19==0)
return'0x09';
if(p33==0)
delay();
if(p33==0)
return'0x0a';
if(p34==0)
delay();
if(p34==0)
return'0x0b';
}

bkill 2008-01-18
  • 打赏
  • 举报
回复
我就照着这个思路写了一个。但是在KEIL C上调试,报错无数!写的用了很多函数调用都这么长。有460多行,我这是第一次搞研发,高手给看看!
bkill 2008-01-18
  • 打赏
  • 举报
回复
不会网上发图片,还要网址?我就口述一下,
现在功能更简单了,我打算用一个89C2051(15个I/O口来实现),对于我上面的功能删掉了大半,LED灯不用了。和电脑也不需要通信了,只要12个红外线!喇叭,报警灯,和复位按键。我决定用P1.0--P1.7和P3.3-P3.7(没有P3.6)这12个I/O来接红外线!
要求就是,程序前五次扫描的被阻断的红外线对应的端口,被默认为可以阻断,被阻断也不会报警,喇叭响,而其他被阻断了就会报警,喇叭响。
bkill 2008-01-18
  • 打赏
  • 举报
回复
我刚接触C语言不到两个月呀,对不起了,高手指点一下,别光批判。
huangxw000 2008-01-16
  • 打赏
  • 举报
回复
这接口问题还是用汇编搞好点.
suyouxin 2008-01-16
  • 打赏
  • 举报
回复
楼主,先不用去想具体程序的流程,先把程序的功能想好,定义好从哪里来数据,做什么处理,然后传给谁,画一个数据流图出来,有助于帮你理清思路。
suyouxin 2008-01-16
  • 打赏
  • 举报
回复
看楼主的意思,红外是连到单片机上的,作为输入的?

但是这句话告诉我,如果单片机从电脑处接收到1个红外线被正常阻断次数的数据datazuduan.

红外线阻断次数怎么又从电脑来了呢
Treazy 2008-01-16
  • 打赏
  • 举报
回复
总觉得你描述的还不够清楚,可能是因为第一次做系统的关系吧!

简单的说一下。
你的系统基本上可以分成2块
第一块是pc和单片机的串口通讯,协议自定,具体传输的数据内容是阻断哪个红外呢还是阻断红外的次数,我实在没看明白
但是如果光是用这个数据来确定哪个红外应该被阻断,那实际上可以用2个字节的12个位来判断就可以了,也就是协议中真正的
有效数据是2个字节。
第二块是单片机控制外围电路,这里有个问题也还是不明白,你所谓的扫描单片机的端口,是扫描从pc来的数据呢,还是从红外来的
数据?我一直纳闷,你的红外是输出还是输入。

假定我的思路是正确的话,那你的系统应该是这样的。
pc控制单片机对外围的红外进行选择使用,即当pc的发送命令需要对红外进行阻断时,单片机接受到命令,并判断出哪个红外需要被阻断
并设置相应的led和报警,喇叭响这些。这个简单的系统的实现是相当简单的。

#define BUFLEN XXX
char Buf[BUFLEN];
char Flag = 0; /*在串口中断函数中置1,表示有PC有命令传达*/

void main()
{
/* 设置中断优先级,串口通讯参数 */
/* 打开中断 */
...
while(1)
{
if(Flag)
{
Flag = 0;
/* 解析处理接受到的数据 */
/* 根据数据对串口的外围电路进行控制 */
}
}

}

/* 串口中断函数,接受数据不做解析 */




以上是我简单描述的,程序并不难,但是还是很基础的,建议你查完datasheet后,将这些函数和控制程序写出来
其中涉及中断函数的编写,io的控制,寄存器的设置等!
楼主加油!
bkill 2008-01-16
  • 打赏
  • 举报
回复
c语言最低级别,只需要送0或1.
suyouxin 2008-01-15
  • 打赏
  • 举报
回复
晕了,没看明白其它的

/*最后考虑硬件复位时对程序的保护(通过硬件一定可以实现复位,对程序执行会不会有破坏?需不需要保护程序呢?要请教一下大家。)*/
=======》
硬件复位是指什么重新上电?
你这程序是跑在sdram中的么?如果是,而且你也不操作flash,就没啥影响
cangwu_lee 2008-01-15
  • 打赏
  • 举报
回复
這是C語言嗎
goodmrning 2008-01-15
  • 打赏
  • 举报
回复
帮顶
加载更多回复(2)

70,031

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧