单片机类。用c语言写程序!!下列两个程序有什么不同,为什么结果相差那么大??第一个能达到效果。求指点 10
程序一:#include<reg51.h>#defineucharunsignedchar#defineuintunsignedintsbitRED_A=P0^0;//东...
程序一:#include<reg51.h> #define uchar unsigned char #define uint unsigned int sbit RED_A=P0^0; //东西向灯 sbit YELLOW_A=P0^1; sbit GREEN_A=P0^2; sbit RED_B=P0^3; //南北向灯 sbit YELLOW_B=P0^4; sbit GREEN_B=P0^5; uchar Flash_Count=0,Operation_Type=1; // 闪烁次数,操作类型变量 // 延时 void DelayMS(uint x) { uchar i; while(x--) for(i=0;i<120;i++); } // 交通灯切换 void Traffic_Light() { switch(Operation_Type) { case 1: //东西向绿灯与南北向红灯亮 RED_A=1;YELLOW_A=1;GREEN_A=0; RED_B=0;YELLOW_B=1;GREEN_B=1; DelayMS(2000); Operation_Type=2; break; case 2: //东西向黄灯闪烁,绿灯关闭 DelayMS(300); YELLOW_A=~YELLOW_A;GREEN_A=1; if(++Flash_Count!=10) return; //闪烁5 次 Flash_Count=0; Operation_Type=3; break; case 3: //东西向红灯,南北向绿灯亮 RED_A=0;YELLOW_A=1;GREEN_A=1; RED_B=1;YELLOW_B=1;GREEN_B=0; DelayMS(2000); Operation_Type=4; break; case 4: //南北向黄灯闪烁 5 次 DelayMS(300); YELLOW_B=~YELLOW_B;GREEN_B=1; if(++Flash_Count!=10) return; Flash_Count=0; Operation_Type=1; } } // 主程序 void main() { while(1) Traffic_Light(); }
程序二:#include <reg52.h>#define uchar unsigned char#define uint unsigned int //东西走向灯sbit red_a=P0^0;sbit yellow_a=P0^1;sbit green_a=P0^2;//南北走向灯sbit red_b=P0^3;sbit yellow_b=P0^4;sbit green_b=P0^5;
uchar flash_count=0;//闪烁的次数uchar opration_type=1;//操作类型
void delay(uint x){ uchar i; while(x--) for(i=0;i<120;i--);}
void traffic_light(){ switch(opration_type) { case 1: red_a=1;yellow_a=1;green_a=0; red_b=0;yellow_b=1;green_b=1; delay(2000); opration_type=2; break ; case 2: yellow_a=~yellow_a; green_a=1; delay(300); if(++flash_count!=10)return;//黄灯闪烁5次 flash_count=0; opration_type=3; break; case 3: red_a=0;yellow_a=1;green_a=1; red_b=1;yellow_b=1;green_b=0; delay(2000); opration_type=4; break ; case 4: yellow_b=~yellow_b; green_b=1; delay(300); if(++flash_count!=10)return;//黄灯闪烁5次 flash_count=0; opration_type=1; } }
void main(){ while(1) traffic_light();} 展开
程序二:#include <reg52.h>#define uchar unsigned char#define uint unsigned int //东西走向灯sbit red_a=P0^0;sbit yellow_a=P0^1;sbit green_a=P0^2;//南北走向灯sbit red_b=P0^3;sbit yellow_b=P0^4;sbit green_b=P0^5;
uchar flash_count=0;//闪烁的次数uchar opration_type=1;//操作类型
void delay(uint x){ uchar i; while(x--) for(i=0;i<120;i--);}
void traffic_light(){ switch(opration_type) { case 1: red_a=1;yellow_a=1;green_a=0; red_b=0;yellow_b=1;green_b=1; delay(2000); opration_type=2; break ; case 2: yellow_a=~yellow_a; green_a=1; delay(300); if(++flash_count!=10)return;//黄灯闪烁5次 flash_count=0; opration_type=3; break; case 3: red_a=0;yellow_a=1;green_a=1; red_b=1;yellow_b=1;green_b=0; delay(2000); opration_type=4; break ; case 4: yellow_b=~yellow_b; green_b=1; delay(300); if(++flash_count!=10)return;//黄灯闪烁5次 flash_count=0; opration_type=1; } }
void main(){ while(1) traffic_light();} 展开
3个回答
展开全部
chch说的对,你两段代码中唯一不同的,case2 和case4中延时语句的位置不同,这个应该就是你第二段代码出现的结果不同于第一段代码的原因
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
yellow_b=~yellow_b; green_b=1;
delay(300);
实际区别是这两行语句的顺序不一样,程序二是先点亮再延时,程序一是先延时再点亮
delay(300);
实际区别是这两行语句的顺序不一样,程序二是先点亮再延时,程序一是先延时再点亮
追问
这不是关键,我试过
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
用KEIL的调试功能试试,要学会自己解决问题的能力
追问
我是在keil上调试的!!!找到了原因,那便是1ms延时程序的问题,也不知怎么回事,我自己敲进去的就不行,然后复制粘贴的就行。但是输入发法都是在英文状态下输入,真搞不懂!!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询