51单片机C语言程序改错。程序功能是单键实现对5种亮灯方式的选择,却被陷入死循环中无法操作,望改正,谢谢

作者&投稿:陆脉 (若有异议请与网页底部的电邮联系)
单片机c语言,改错后发代码谢谢~

你这是仿真,还是实物开发板?
单片机的晶振频率是11.0592M吗?
上位机用什么软件向单片机发送1234,是用串口调试助手吗?
那发送的1234是字符,还是十六进制数?
这些问题,都关系到写程序的。
你的程序差多了,要修改,等于是重新写一样的。

uchar是不是拼错了,你有自定义过uchuar么?
另外你array数组越界了。

一楼说的很清楚了,还有一种方法就是用return,break是跳出循环,return是跳出函数,你可以直接在你的while(1)里面加入return,不过这样就达不到你的要求,所以你的这个方法还是用for循环把你的程序简单的修改下就是:
#include<reg52.h>
sbit key = P2^0;
unsigned char a;
unsigned char count = 0;
void Delay_ms(int i)
{
int x,y;
for(x=110;x>0;x--)
for(y=t;y>0;y--);
}
void Keyscan_Func()
{
unsigned char i=0;
if(key==0)
{
Delay_ms(5);
while(!key);
count++;
if(count==5)count=0;
switch(count)
case 0:

P0=0xff;break;

case 1:

P0=0x87;break;

case2:

a=0x08;
for(i=0;i<lednumber;i++) //lednumber指的是灯循环几次
{
a=a<<1;
if(a==0x80)
a=0x08;
P0=~a;
Delay_ms(300);
}
break;

case3:
//后面跟前面一样
}
}

int main()
{
while(1)
{
Keyscan_Func();
}
return 0;
}

我想说的是 你的play2那个函数里面就已经是while(1)——是个死循环了,肯定你的板子 但你按下第二下的时候就会一直执行play2的命令。至于你后面的啥break 都不起作用了,我刚刚试过了的,问题应该就是你要把按键里面的那个while给改了 不然程序跳不出来

对,PLAY2死循环


c51单片机c语言交通灯的程序
接下来,我将详细解释如何为C51单片机使用C语言编写交通灯控制程序。首先,我们需要了解C51单片机的基本结构和资源,包括其I\/O端口、定时器\/计数器等。通常,交通灯系统需要控制红、黄、绿三种颜色的灯的亮灭,每种颜色的灯对应一个I\/O端口。此外,我们还需要使用定时器来设置交通灯的切换时间。在编写程...

求一单片机C语言程序:两个按键控制两个LED KEY1按一下LED1亮 再按一...
void Delay(unsigned int x){ unsigned int i, j;for(i = 0; i < x; i++) for(j = 0; j <= 148; j++);} \/\/KEY1按一下LED1亮 再按一下LED1灭 \/\/KEY2按下LED2亮 LED1灭 main(){ while(1) { if (!key2) { led1 = 1; led2 = 0;} else { if(!key1) { ...

求:如何将C语言程序弄进51单片机?
C语言是人能用的文字语言,单片机只能用由0和1组成的机器语言,要想单片机运行C语言,拢共要三步:1)写C语言程序。2)用编译软件编译C程序并生成hex代码。3)用下载线或烧录器将hex代码写入单片机。

谁能帮我写一下单片机C语言程序?
sbit LED=P1^0;sbit K1=P1^1;sbit K2=P1^2;void delay(int ms){ unsigned char i;while(ms--)for(i=0;i<120;i++);} void t0isr(void) interrupt 1 { TH0=(65536-10000)\/256;TL0=(65536-10000)%256;LED=~LED;} main(){ TMOD=0x01;TH0=(65536-10000)\/256;TL0=(65536-10000...

单片机C语言一程序问题
DataPort=dofly_DuanMa[i];就说这里吧 第一次i=0,因为松手检测 后面的i++了 当你按键放开了后 你的i假设++到了5 那么这里就是DataPort=dofly_DuanMa[5];但是这是随机的 因为谁也不知道你什么时候松手 你不松手 那么i就一直++ 然后到8 变为零 说白了 就是你的松手检测和显示没做...

c51单片机c语言交通灯的程序
\/\/主程序 void main(){ TMOD=0X01;TH0=0XD8;TL0=0XF0;EA=1;ET0=1;TR0=1;EX0=1;EX1=1;logo();P2=0Xc3;\/\/ 开始默认状态,东西绿灯,南北黄灯 sec_nb=sec_dx+5;while(1){ key(); \/\/调用按键扫描程序 display(); \/\/调用显示程序 Buzzer();} } \/\/函数的定义部分 void key()...

单片机C语言程序
define uint unsigned int\/\/是宏定义,这样定义以后,在接下来的程序当中就能用uint 代替unsigned int了,void DelayMS(uint x)\/\/是一个子函数,当调用时,就直接执行大括号里面的语句,while(x--)\/\/是循环语句,当X--=0时,就不满足条件,跳出循环。它整个的功能就是一个延时,等待单片机处理完其它任务...

求各位大神解决单片机程序C语言代码跟解释
11.程序如下:include<reg52.h> \/\/包含单片机寄存器的头文件 include<intrins.h> define uchar unsigned char \/\/定义一下方便使用 define uint unsigned int \/\/定义一下方便使用 uchar num,num1;uchar code table[]={ \/\/数字编码0~9 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90...

求一个1ms的单片机C语言延时程序
void delay(char x){ unsigned char a,b,c;for(c=x;c>0;c--)for(b=38;b>0;b--)for(a=130;a>0;a--);} 学过标准C就知道了,char 和 int 是可以相互转换的,char的取值范围是-128~+127 unsigned char 的是0~255 可以用unsigned int啊,我一般都是用char的,用unsigned int的话...

编写简单的单片机c语言程序 1、指定数组找最大值 2、排序
max=ar[0];\/\/假定第一个数为最大值 min=ar[0];\/\/同时假定也第一个数为最大值 \/*从第二个数开始比较查找最值*\/ for(i=1;i<NR;i++){ if(ar[i]>max)\/\/最大值 { max=ar[i];} if(ar[i]<min)\/\/最小值,不能使用elseif,否则会跳过比较 { min=ar[i];} } fprintf(stdout...

江北区13798867916: 51单片机C语言程序改错.程序功能是单键实现对5种亮灯方式的选择,却被陷入死循环中无法操作,望改正,谢谢 -
常贫启文: 一楼说的很清楚了,还有一种方法就是用return,break是跳出循环,return是跳出函数,你可以直接在你的while(1)里面加入return,不过这样就达不到你的要求,所以你的这个方法还是用for循环把你的程序简单的修改下就是:#include<reg52.h> ...

江北区13798867916: 51 单片机 c语言 ,求大神改错! -
常贫启文: void keyscan() { if(s1==0) //按键1调整时间 { delayms(5); //消抖 if(s1==0) { while(!s1); //等待松手 s1num++; //记按键次数 //di();if(s1num==1) //秒 { TR0=0; write_cmd(0xc0+10); //光标显示 write_cmd(0x0f); //开显示,光标及启用闪烁 } if(s1...

江北区13798867916: 单片机程序改错题,指出错误语句,并改正~! -
常贫启文: #include <reg52.h>#include <intrins.h>#define ulong unsigned long#define uchar unsigned char uchar temp; void delay(uint); void main() {temp=0xfe; //初始状态,点亮第一个LED P1=temp; while(1) { temp=_crol_(temp,1); //库函数_crol_用来控制...

江北区13798867916: 51单片机倒计时+串口通讯程序溢出改错(C语言)急! -
常贫启文: signed char time=10;改成 unsigned char time=10; 再看看.time是从SBUF里读来的数.若定义成有符号数,最高位就当符号位了,跟SBUF里原来预想的数是不一样的.

江北区13798867916: 我C语言写了一个C51单片机的流水灯定时一秒的程序,有如下问题,求助高手改错 -
常贫启文: 1.单片机启动时,端口为高电平即P1 = 0xff,时间比较的短,则会刚开始运行时八个灯全都亮.2.可以50ms定时20次,即TH0 = 0x3c,TL0 = 0xb0,这样误差会小一点.3.因为a为int型,16位的,而P1为8位的,所以第一遍和第二遍相差约8秒;将int a 改为 unsigned char a;就不会出现这样的情况了.呵呵,希望对你有帮助,祝你顺利!

江北区13798867916: 求一个51单片机简单的中断C语言程序 -
常贫启文: #include //头文件#define uint unsigned int //宏定义,如果你不嫌麻烦可以直接省略#define uchar unsigned char void delay(uint); //字程序声明 sbit D1=P1^0 ; //位定义 第一盏灯 sbit D2=P1^1 ; //第二盏,同上 sbit D3=P1^2 ; // 3 sbit D4=P1^3 ; ...

江北区13798867916: 急求C程序!!51单片机怎么在外部中断程序中关闭外部中断. -
常贫启文: 您好: 你的程序中关不到外部中断的原因是你的主函数中有一句 EX1=1; ,你在中断中关了中断,但一进入主函数又开了,所以等于没有关.解决的方法为:在主函数里加一句程序,如下:main() { EA=1;EX1=1;TCON=0x04;while(1); }希望可以帮到您.

江北区13798867916: 51单片机中断程序怎么写? -
常贫启文: //unsigned char a; void main(void)//主函数{TCON=0x01;EX0=1; //外部中断允许 EA=1;//开总中断while(1){//其他程序}} void int0(void) interrupt 0 //外部中断0 中断子程序{//这里面可以写中断子程序/*a++;if(a==2) a=0;while(!zd)if(a) TR0=1; //开关...

江北区13798867916: 51单片机C程序出现这个错误,求教怎么改 -
常贫启文: TMOD这个寄存器没有定义,建议这样处理:1、查一下你的程序开头有没有加入单片机的.h头文件2、如果加了,进入这个头文件查找是不是有CMOD的定义3、如果查找不到CMOD,建议查找单片机数据手册,找到CMOD对应的地址,再回到.h头文件中查找这个地址是不是已经被定义,它定义的是什么你就用什么.上面的办法比较麻烦,最简单的是,重新找一个靠谱的单片机头文件换上.

江北区13798867916: 修改一个51单片机C语言程序问题,要求实现数码管灯动态闪烁. -
常贫启文: #include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit dula=P2^6; sbit wela=P2^7; uchar i,wei,ge,shi; uint temp=23; uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90 ,0x88,0x83, 0xc6, 0xa1,0x86, 0x8e};...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网