51单片机串口通信程序实现外部中断与串口通讯结合,比如按下按键就发送一个字母‘a',这样写出来的代码错在哪里?

您所在位置: &
&nbsp&&nbsp
单片机原理与接口技术习题答案.doc66页
本文档一共被下载:
次 ,您可免费全文在线阅读后下载本文档
文档加载中...广告还剩秒
需要金币:50 &&
你可能关注的文档:
··········
··········
单片机原理与接口技术习题答案
1-1?微型计算机通常由哪些部分组成?各有哪些功能?
答:微型计算机通常由控制器、运算器、存储器、输入/输出接口电路、输入设备和输出设备组成。控制器的功能是负责从内部存储器中取出指令并对指令进行分析、判断、并根据指令发出控制信号,使计算机有条不紊的协调工作;运算器主要完成算数运算和逻辑运算;存储器用于存储程序和数据;输入/输出接口电路完成CPU与外设之间相连;输入和输出设备用于和计算机进行信息交流的输入和输出。
1-2?单片微型计算机与一般微型计算机相比较有哪些区别?有哪些特点?
答:与通用微型计算机相比,单片机的硬件上,具有严格分工的存储器ROM和RAM和I/O端口引脚具有复用功能;软件上,采用面向控制的指令系统和硬件功能具有广泛的通用性,以及品种规格的系列化。单片机还具备体积小、价格低、性能强大、速度快、用途广、灵活性强、可靠性高等特点。
1-3?简述计算机的工作过程。
答:计算机的工作是由微处理器以一定的时序来不断的取指令、指令译码和执行指令的过程。
1-4?单片机的几个重要指标的定义。
答:单片机的重要指标包括位数、存储器、I/O口、速度、工作电压、功耗和温度。
1-5?单片微型计算机主要应用在哪些方面?
答:单片机的主要应用领域有智能化产品、智能化仪表、智能化测控系统、智能化接口等方面。
1-6?为什么说单片微型计算机有较高的性能价格比和抗干扰能力?
答:因为单片微型计算机主要面向特定应用而设计,设计者在硬件和软件上都高效率地设计,量体裁衣、去除冗余,力争在同样的硅片面积上实现更高的性能,具备较高的性能、价格比;单片机嵌入式系统中的软
正在加载中,请稍后...51单片机串口通讯_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
51单片机串口通讯
上传于||文档简介
&&串​口​通​讯​对​单​片​机​而​言​意​义​重​大​,​不​但​可​以​实​现​将​单​片​机​的​数​据​传​输​到​电​脑​端​,​而​且​也​能​实​现​电​脑​对​单​片​机​的​控​制​,​比​如​你​可​以​把​写​入​单​片​机​的​数​据​码​显​示​在​电​脑​上​,​如​可​以​使​用​一​个​按​键​,​当​按​下​它​时​使​某​一​个​字​母​如​:​A​A​,​通​过​单​片​机​的​串​口​将​它​发​送​到​电​脑​上​显​示​,​起​到​仿​真​器​的​某​些​功​效​。
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
下载文档到电脑,查找使用更方便
还剩2页未读,继续阅读
你可能喜欢51单片机中如何通过一个按键实现暂停与恢复?需要一个编程的思想_百度知道
51单片机中如何通过一个按键实现暂停与恢复?需要一个编程的思想
这个键的功能就是,我那十二个任务不论执行到什么地方。有很多循环,那么程序原地踏步。现在我需要一个按键,只要暂停建按下背景是这样的,按其他键都不管用,再按暂停键恢复到原来的地方:我采用矩阵式键盘,有十二个键执行不同的任务
提问者采纳
3。这样需要按键能触发cpu工作,如“暂停”。当按键按第一次时间。2,再让它变为“恢复”说明当前已经执行了恢复有以下几种情况。反之亦然,也即EA=0(最好先用个变量记住EA。不跳出该层循环。若想反复暂停和恢复,进入第二层循环查询语句内部。所以,需要按键接到外部中断上面,继续查询按键,记住按键的状态,是“暂停”就执行“恢复”。当第二次按下时间。在中断中再判断是否要让cpu掉电与否?还是用外部中断,然后就一直在中断中等待该按键第二次按下再恢复EA,方便恢复).用一个标志变量,进入第一层循环查询语句内部。循环结束。初始化为个值,执行暂停,关掉所有其他的中断,反复执行其内部的两层循环查询语句,按键之后检查标志变量。此按键触发中断后,执行恢复,最后退出中断。中断后可以恢复CPU工作。 不知道这种方法你能接受不,就在外面再加一层while(1)类似的死循环.循环查询按键:1.掉电暂停
谢谢大侠,你给的答案最全面。我考虑了一下,适合我用的只能是方式三了。请问,掉电模式和空闲模式有何区别?暂停后如何恢复?一个按键如何具体操作?
空闲模式是指CPU不再执行程序,但是片内的外围电路(如定时/计数器,中断控制电路,串口)仍然工作。掉电模式是指当进入掉电模式时,执行最后一条指令后,振荡器停止,cpu不工作了,可以将电压降低到2V,片内RAM和SFR的值保持原值。终止空闲模式有两种方法:a.任何使能的中断,程序自动从中断服务程序处恢复。b.硬件复位。终止掉电模式:要先将电压恢复至cpu正常工作电压,再进行下列方法:A.硬件复位,这种复位不像正常复位一样RAM,SFR的值都恢复为默认值,而是能保存RAM掉电前的值,SFR就不能了。B. 外部中断0或1被触发,前提是他们要被使能,并且为电平触发。中断服务中不能有其他语句,直接返回(汇编RETI指令),cpu就恢复执行掉电执行指令后的下一条指令。具体怎么控制,你看PCON寄存器吧,很容易。PD=1,进入掉电模式,IDL=1进入空闲模式。按照你的意思,要使用外部中断恢复比较好。那个按键就接到外部中断上面吧。外部中断终止掉电模式,RAM与SFR都能保存的。硬件复位是只能保存RAM。
试了几次,发现PCON寄存器不能进行位操作哦~~~如何每次给PD取反?若是不能这样那就不能用一个按键控制了呀
给你说PD与IDL位,并不是让你进行位寻址啊。它的地址是0x87,不可以进行位寻址的。设置方法:1.比如想让第n位置1,可以写PCON=PCON|(1&&n);//要置位的位与1相或,其他不变的与0相或。若置位第三位,与0x40相或,即二进制2.若是想把第n位清零,可以写PCON=PCON&(~(1&&n));//要清零的位与0相与,其他不变的与1相与。若清第三位,则与0xFB相与,即二进制3.若是想检测PD的值,PCON&0x02就是PD的值了;判断它是1还是0,然后做相应操作。取反也就是,是1清零,是0置1。
暂停的问题我解决了,但是还是不能用一个键处理,用的两个键~~~两个外部中断源一个用来进入掉电模式,一个用来唤醒单片机恢复工作。部分程序如下:void int_0() interrupt 0 using 0{ PCON=0x02; _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); }void int_1() interrupt 2 using 1{ ; }还是没能一个键处理,您看有改进的余地么?
void int0() interrupt 0{ IE0=0;//我用的是电平触发,需要软件清中断标志 delay();//简单的防抖动方式,你自己随便定义就行,对于普通按键能延迟100ms-300ms为好if(pp==0x02){pp=0;//清零,为唤醒时防止再次进入掉电做准备PCON|=0x02;//进入掉电}else pp=0x02;//为下次进入掉电做准备}/*pp定义为全局变量编程思想:掉电仍能保持RAM,那就用个值来记录是此次中断是该掉电还是的唤醒。毕竟掉电与唤醒都是中断,所以要分清楚。它定义为全局变量就可以了。*/
提问者评价
十分感谢,果然成功了。有点不稳定,是延时的问题。延时调好了就稳定了。再次加分感谢~能加你的qq么?
其他类似问题
为您推荐:
您可能关注的推广
51单片机的相关知识
其他4条回答
推荐暂停 用 掉电模式
嗯,谢谢大侠。答案很好。有人也这么给我说过。只是我以前还没用过掉电模式,请问具体操作?而且,用掉电模式一个键能处理的来么?我怎么想都需要两个键哦...
你看下PCON这个寄存器
其实很简单
写个数据就行了
至于一个按键 你用一个全局整型变量 每次按键中断取反即可
我刚刚看了下关于掉电模式工作的资料,似乎有点问题,因为掉电了之后(PCON口的PD位置1)要退出掉电方式的唯一方法是由硬件复位,复位后所有寄存器的内容都初始化了呀~~~不能满足我的要求哦~~~但是空闲工作方式似乎又可以。大侠能否看看我补充的问题给出解决方法?
我刚试了一下
外部中断可以退出掉电模式
你试试 空闲模式也行 只是定时器不会停止
我试了一天,外部中断没办法跳出掉电模式啊。大侠能把你的中断程序给我看看么?
测试附带的是数码管
方式可能和你不同
你参考下#include&reg52.h&sbit duan=P2^6;sbit wei=P2^7;code char table[]={0x3f,0x6,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};char bai,shi,ge,m;void delayms(int k){ int i,j; for(i=k;i&0;i--)
for(j=110;j&0;j--) ;}void main(){ TMOD=0x01; TH0=0; TL0=0; EA=1; EX0=1; EX1=1; IT0=1; IT1=1; ET0=1; TR0=1; while(1) {
P0=table[bai];
delayms(5);
P0=table[shi];
delayms(5);wei=1;
P0=table[ge];
delayms(5);
if(ge==7){ge=0ET0=0;PCON=0x02;}
}}void gfds() interrupt 1{ m++; if(m==10){m=0; bai=num/100; shi=num%100/10; ge=num%10;
num++; if(num==1000)num=0;
}}void adsa() interrupt 0{}void sfff() interrupt 2{}
你说的暂停是指的,程序不执行其他操作?若是,请接着看设定一个标志,当程序始终停滞在这个位置,或者是不执行其他程序,这个标志设为1时,此时执行空语句;当按键时,触发中断,把标志清零。
谢谢大侠的回答。我的暂停是:程序在执行其他任何动作的时候,只要一按这个键,自动停住原地踏步。再按,返回到原程序继续执行。你给的答案暂时应该不能解决这个问题哦
就是使用51的中断就可以了!你的其他12个按键也可以使用中断来处理,只是把那个暂停键设为级别最高,不管什么情况下改建按下就到该键的子程序运行(注意此时要关闭中断功能、只是判断该暂停键是否第二次按下),若按下就跳到原来暂停前的位置即可,并开启中断!看是这个意思吗!
可以参考:C语言的也有,在空间里面找找即可。
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁后使用快捷导航没有帐号?
查看: 2459|回复: 8
按键去抖问题【结合 中断、串口通讯等】
在线时间3 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 20, 距离下一级还需 180 积分
一粒金砂(中级), 积分 20, 距离下一级还需 180 积分
/******************************************************************************
XWWK-CC2530A模块外部中断测试程序+XWWK-CC2530A模块串口测试程序+IO测试程序
Filename:& &&&CC2530EXINTest.c
Target:& && & cc2530
Revised:& && &日
Revision:& &&&1.0
Description:
& &通过按键P1.2中断方式,改变指示灯的状态。 按一下,LED等显示为方式二,再按一下为方式一,然后循环,但是有时按一下按键状态改变2次,不知是不是按键去抖没做好?
源程序只有串口通讯功能,中断按键什么的都是自己加的,估计是什么地方没有考虑到吧,请各位前辈多多指点【大家只要看蓝色部分就行了,其他地方要是需要的话再看】
******************************************************************************/
#include &ioCC2530.h&
#include &string.h&
#define uint&&unsigned int
#define uchar unsigned char
//定义控制灯的端口
#define RLED& &P1_0& && && & //定义LED1为P10口控制
#define YLED& &P1_1& && && & //定义LED2为P11口控制
#define KEY1& &P1_2& && & //定义按键为P01口控制
//函数声明
void Delay(uint);& && && && && & //延时函数声明
void Initial(void);& && && && && & //初始化函数声明
void InitKey(void);& && && && & //初始化按键函数声明
uchar KeyScan(void);& && && && &//按键扫描函数声明
uchar Keyvalue = 0 ;& && && && && & //定义变量记录按键动作
uint&&KeyTouchtimes = 0 ;& && && &&&//定义变量记录按键次数
uint flag=1;
void initUARTSEND(void);
void UartTX_Send_String(char *Data,int len);
char Txdata[25]=&按键控制串口测试-然\n1\n&;
/****************************
*****************************/
void Delay(uint n)
& && &&&for(i = 0;i&n;i++);
& && &&&for(i = 0;i&n;i++);
& && &&&for(i = 0;i&n;i++);
& && &&&for(i = 0;i&n;i++);
& && &&&for(i = 0;i&n;i++);
/****************************************************************
& &串口初始化函数& && && && && && && && && && &&&
****************************************************************/
void initUARTSEND(void)
& & CLKCONCMD &= ~0x40;& && && && && && && && &&&//设置系统时钟源为32MHZ晶振
& & while(CLKCONSTA & 0x40);& && && && && && && &//等待晶振稳定
& & CLKCONCMD &= ~0x47;& && && && && && && && &&&//设置系统主时钟频率为32MHZ
& & PERCFG = 0x00;& && && && && && && && && && &&&//位置1 P0口
& & P0SEL = 0x3c;& && && && && && && && && && &&&//P0_2,P0_3,P0_4,P0_5用作串口
& & P2DIR &= ~0XC0;& && && && && && && && && &&&//P0优先作为UART0
& & U0CSR |= 0x80;& && && && && && && && && && &&&//UART方式
& & U0GCR |= 9;& && && && && && && && && && && && && &
& & U0BAUD |= 59;& && && && && && && && && && &&&//波特率设为19200
& & UTX0IF = 0;& && && && && && && && && && && &//UART0 TX中断标志初始置位0
/****************************
//初始化按键为中断输入方式
*****************************/
void InitKeyINT(void)
&&P1INP |= 0x04; //上拉& &
&&P1IEN |= 0X04;& &//P12设置为中断方式
&&PICTL |= 0X01;& &//下降沿触发
&&IEN2 |= 0X10;& &// P1设置为中断方式;
&&P1IFG |= 0x00;& &//初始化中断标志位
&&EA = 1; //使能总的中断
/****************************************************************
串口发送字符串函数& && && && && && && && &
****************************************************************/
void UartTX_Send_String(char *Data,int len)
&&for(j=0;j&j++)
& & U0DBUF = *Data++;
& & while(UTX0IF == 0);
& & UTX0IF = 0;
/****************************
//初始化程序,将P10、P11 定义为输出口,并将LED灯初始化为灭
*****************************/
void InitIO(void)
& & P1DIR |= 0x03; //P10、P11、P14定义为输出
& & RLED = 0;
& & YLED = 0;& && &&&//LED灯初始化为灭
/****************************
//中断处理函数
*****************************/
#pragma vector = P1INT_VECTOR
__interrupt void P1_ISR(void)
& &if(P1IFG&0)& && && && &//按键中断 SFR(&&P1IFG& &&&,&&0x8A&&)& &/*&&Port 1 Interrupt Status Flag& && && && && && && &&&*/
& &&&P1IFG = 0;
& &&&Delay(100);&&
& &&&if(P1IFG==0)& && && &//按键中断
& && & Delay(100);
& && & KeyTouchtimes=!KeyT
//& && & for(i=0;i&30;i++)Txdata=' ';& &//【加上此句串口只显示“方式1”& & 】
& && & if(KeyTouchtimes)
& && && &strcpy(Txdata,&方式1\n &);& && & //将UART0 TX test赋给T
& && && &flag=2;
& && && &UartTX_Send_String(Txdata,strlen(Txdata)); //串口发送数据
& && & else
& && & //&&for(i=0;i&30;i++)Txdata=' ';
& && && &strcpy(Txdata,&方式2\n&);& && & //将UART0 TX test赋给T
& && && &flag=1;&&//每次中断发生时记录按键次数加1
& && && &UartTX_Send_String(Txdata,strlen(Txdata)); //串口发送数据
& &}& && &
& &P1IF = 0;& && && && & //清中断标志
/***************************
***************************/
void main(void)
&&InitIO();& && &&&
&&InitKeyINT();& && && && && &//调用初始化函数
&&initUARTSEND();
&&UartTX_Send_String(Txdata,25);& && && && && & //
&&for(i=0;i&30;i++)Txdata=' ';
&&while(1)
& & if(flag == 1)& && & //按键设置为 LED2,LED1流水闪烁&&使用flag做标志位
& && &YLED = !YLED;& && && &&&
& && &Delay(20000);& && && && &
& && &RLED = !RLED;& && && &&&
& && &Delay(20000);
& && &//KeyTouchtimes++;& && &&&
& & if(2 == flag)
& && &YLED = !YLED;& && && &&&
& && &//Delay(20000);& && && && &
& && &RLED = !RLED;& && && &&&
& && &Delay(20000);
& && && && &YLED = !YLED;& && && &&&
& && &//Delay(20000);& && && && &
& && &RLED = !RLED;& && && &&&
& && &Delay(20000);
& && && && &YLED = !YLED;& && && &&&
& && &//Delay(20000);& && && && &
& && &RLED = !RLED;& && && &&&
& && &Delay(20000);
& &&&// KeyTouchtimes = 0;& &
[ 本帖最后由 嘤鸣求友 于
09:24 编辑 ]
在线时间1238 小时
威望6070 分
芯币18117 枚
E金币300 枚
TA的帖子TA的资源
既然有串口了,把按键值发出来看看就知道了
前辈你好!
不知阁下说的 发出键值 是如何操作的?使用串口输出?我 Go to definition of P1_2得到以下结果:
在线时间0 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
看现象肯定是去抖的问题吧。。。
但是这段程序是我从另外一个 教程代码copy过来的,应该很好呀,难道与串口按键“不兼容”?&
在线时间0 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
这么长的代码,估计没几个人认真看吧。。。。
感谢阁下的提醒,我已经把主要部分加为蓝色了~&
在线时间3 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 20, 距离下一级还需 180 积分
一粒金砂(中级), 积分 20, 距离下一级还需 180 积分
回复 沙发 huo_hu 的帖子
前辈你好!
不知阁下说的 发出键值 是如何操作的?使用串口输出?我 Go to definition of P1_2得到以下结果:
/* Port 1& && && && && && && && && && && && && && && && && && && && && && && && && &*/
SFRBIT( P1& && &,&&0x90, P1_7, P1_6, P1_5, P1_4, P1_3, P1_2, P1_1, P1_0 )
SFR(&&RFIRQF1& &,&&0x91&&)& &/*&&RF Interrupt Flags MSB& && && && && && && && && &&&*/
SFR(&&DPS& && & ,&&0x92&&)& &/*&&Data Pointer Select& && && && && && && && && && &&&*/
SFR(&&MPAGE& &&&,&&0x93&&)& &/*&&Memory Page Select& && && && && && && && && && && &*/
SFR(&&T2CTRL& & ,&&0x94&&)& &/*&&Timer2 Control Register& && && && && && && && && & */
SFR(&&ST0& && & ,&&0x95&&)& &/*&&Sleep Timer 0& && && && && && && && && && && && &&&*/
SFR(&&ST1& && & ,&&0x96&&)& &/*&&Sleep Timer 1& && && && && && && && && && && && &&&*/
SFR(&&ST2& && & ,&&0x97&&)& &/*&&Sleep Timer 2& && && && && && && && && && && && &&&*/
如何操作呢?
我的意思是说你在按键中断里放一个串口发送,如果按一下收到多个数据那肯定是消抖得问题了.翻转led也行.
if(P1IFG==0)
//按键中断
Delay(100);
这段很糟,在中断服务里空等什么也做&
在线时间3 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 20, 距离下一级还需 180 积分
一粒金砂(中级), 积分 20, 距离下一级还需 180 积分
回复 板凳 电源模块 的帖子
但是这段程序是我从另外一个 教程代码copy过来的,应该很好呀,难道与串口按键“不兼容”?
在线时间3 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 20, 距离下一级还需 180 积分
一粒金砂(中级), 积分 20, 距离下一级还需 180 积分
回复 4楼 电源模块 的帖子
感谢阁下的提醒,我已经把主要部分加为蓝色了~
在线时间1238 小时
威望6070 分
芯币18117 枚
E金币300 枚
TA的帖子TA的资源
回复 5楼 嘤鸣求友 的帖子
我的意思是说你在按键中断里放一个串口发送,如果按一下收到多个数据那肯定是消抖得问题了.翻转led也行.
& &&&if(P1IFG==0)& && && &//按键中断
& && & Delay(100);
这段很糟,在中断服务里空等什么也做不了.
还是那句话delay消抖是个很菜的方法
在线时间228 小时
威望3062 分
芯币4946 枚
E金币280 枚
TA的帖子TA的资源
五彩晶圆(初级), 积分 3062, 距离下一级还需 438 积分
五彩晶圆(初级), 积分 3062, 距离下一级还需 438 积分
在中断中消耗过多甚至是无谓的时间实在不是一个好方法。
Powered by
逛了这许久,何不进去瞧瞧?

我要回帖

更多关于 单片机串口通信程序 的文章

 

随机推荐