怎样学好C语言编程--我要把这个编程改成一个开关控制一个灯要怎么改

欢迎加入我们,一同切磋技术 &
用户名: &&&
密 码: &
共有 3840 人关注过本帖
标题:用C语言编写一个三个灯循环的跑马灯
等 级:新手上路
&&已结贴√
&&问题点数:20&&回复次数:4&&&
用C语言编写一个三个灯循环的跑马灯
跪求大神帮忙啊!!!
搜索更多相关主题的帖子:
来 自:中国
等 级:业余侠客
帖 子:301
专家分:292
你在玩单片机吧
做一名健壮的技术青年,如果未来无法用代码去改变世界,还可以考虑去搬砖。
等 级:论坛游民
帖 子:49
专家分:34
我们之前也在用单片机玩跑马灯
学习!!!
等 级:贵宾
威 望:26
帖 子:735
专家分:3478
直接,简单的
sbit led1=0x80;//高电平点亮
sbit led2=0x81;
sbit led3=0x82;
void delay(int interval)
&&&for(;interval&0;interval--)
&&& { for(i=0;i&124;i++)
&&&&&& {;}
void main()
&{ while(1)
&&& {led3=0;led2=0;led1=1;delay(500);
&&&&&led3=0;led2=1;led1=0;delay(500);
&&&&&led3=1;led2=0;led1=0;delay(500);
等 级:版主
威 望:48
帖 子:1158
专家分:1015
单片机点亮不用访问端口的么
其实我就是改变社会风气,提高少女素质,刺激电影市道,提高年轻人内涵,玉树临风,风度翩翩的整蛊专家,我名叫古晶,英文名叫JingKoo!
版权所有,并保留所有权利。
Powered by , Processed in 0.031318 second(s), 8 queries.
Copyright&, BCCN.NET, All Rights Reserved#include &reg52.h& // 引用52包文件 可以理解为命名空间
sbit P1_0 = P1^0; &&// 定义P1管脚0
void main()&&&&&&&&&&&& // 主程序 C语言所必需要有的{P1_0 = 0; & & & & & & &// 点亮P1第0管脚连接的LED}
===============以下非程序代码===================
上面的程序,首先引用reg52.h,这里有对操作单片机相关数据的封装,方便用户使用
接着,用P1_0这个sbit类型的变量,引用P1口的第1个引脚(P1^0)
接着,主程序开始
将P1口的第1个引脚置为低电平(亮)
在reg52.h上右键菜单(Keil中)open document&reg52.h&可以打开reg52单元,发现P1的定义:sfr P1&= 0x90;什么意思呢?
sfr 是用于定义特殊寄存器(Special Function Register)的关键字,是单片计算机中的一组特殊的临时存储区域,用于动态存放计算机运行过程的一些状态信息、并依此做相应的控制。51系列单片机中,通常每个寄存器也就一个字节,这个字节是P1(通用寄存器1)P1有8个位,但0x91~0x97与P1毫无关系,同理其他3个寄存器P0, P2, P3也是这个道理。MCS-51单片机就设有18个专用寄存器,P0-P3端口,定时/计数器T0、T1,TMOD、TCON、PCON、SCON 、PSW、IE、A、B、IP等等。SFR越多,编和控制功能越强、越灵活,但需要硬资源,所以系统设计时会根据需要来确定。
sbit(Set Bit)与sfr用法类似,只是sbit是位操作,用于将某个sfr中具体位赋值给一个变量,这样后面程序就可用通过该变量为该位清0或置1。
1.sfr和sbit的含意,特殊功能寄存器的含意
2.如何用位控制引脚
阅读(...) 评论()博客访问: 2053628
博文数量: 163
博客积分: 0
博客等级: 民兵
技术积分: 4982
注册时间:
认证徽章:
qq:,小程序学习群:,
分类: 嵌入式 20:34:27
一、说明:本程序与之前例程不同,采用c语言完成,实现四个方向的直走和左转车辆控制,采用51定时器精确计时
二、原理图:
三、基本设计思想:
1、硬件部分。七段数码管显示时间,采用共阳数码管,与P0口连接。根据51单片机的特性,P0口作为输出时,若要输出1,则必须外接上拉电阻。东西方向有直行红黄绿灯,左转红黄绿灯,共6个接口,分别接在P1.0~P1.5,显示时间的2位数码管位选开关接P1.6,P1.7。南北方向有直行红黄绿灯,左转红黄绿灯,共6个接口,分别接在P2.0~P2.5,显示时间的2位数码管位选开关接P2.6,P2.7。
2、软件部分。直行绿灯亮27s,数码管从30s倒计时,接着直行黄灯亮3秒,数码管闪烁倒计时3s。左转方向绿灯亮17s,数码管从20s倒计时,接着左转黄灯亮3s,数码管闪烁倒计时3s。开机东西直行绿灯27s,直行黄灯3s,左转绿灯17s,左转黄灯3s,此时南北方向一直红灯,倒计时50s。接着南北直行绿灯27s,直行黄灯3s,左转绿灯17s,左转黄灯3s,此时东西方向一直红灯,倒计时50s。
四、源代码:
uint unsigned int
uchar unsigned char
//定义灯泡开关
sbit ew_zx_red = P1^0;
& //东西直行红黄绿
sbit ew_zx_yellow = P1^1;
sbit ew_zx_green = P1^2;
sbit ew_zz_red = P1^3;
& //东西左转红黄绿
sbit ew_zz_yellow = P1^4;
sbit ew_zz_green = P1^5;
sbit sn_zx_red = P2^0;
& //南北直行红黄绿
sbit sn_zx_yellow = P2^1;
sbit sn_zx_green = P2^2;
sbit sn_zz_red = P2^3;
& //南北左转红黄绿
sbit sn_zz_yellow = P2^4;
sbit sn_zz_green = P2^5;
sbit seg_1 = P1^6;
&//东西数码管位选开关
seg_2 = P1^7;
sbit seg_3 = P2^6;
&//南北数码管位选开关
seg_4 = P2^7;
int time = 0;
int count = 0;
unsigned char SEG_CA[10] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};
unsigned char SEG_CC[10] = {0x3f, 0x06, 0x5b, 0x1f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
void delay()
for(i = 0; i < 10; i++);
void display_ew(unsigned int num)
&//东西数字显示
& &P0 = SEG_CA[num/10];
& //点亮数字高位
& & seg_1 = ON;
& & seg_1 = OFF;
& & P0 = SEG_CA[num%10];
& //点亮数字低位
seg_2 = ON;
& & seg_2 = OFF;
void display_sn(unsigned int num)
&//南北数字显示
& &P0 = SEG_CA[num/10];
&//点亮数字高位
& & seg_3 = ON;
& & seg_3 = OFF;
& & P0 = SEG_CA[num%10];
&//点亮数字低位
seg_4 = ON;
& & seg_4 = OFF;
void display_ew_shan(unsigned int num)
&//东西3s 倒计时闪烁显示
if(count < 2000)
display_ew(num);
seg_1 = OFF;
seg_2 = OFF;
void display_sn_shan(unsigned int num)
&//南北3s倒计时闪烁显示
if(count < 2000)
display_sn(num);
seg_3 = OFF;
seg_4 = OFF;
void init()
P0 = 0x00;
P1 = 0x00;
P2 = 0x00;
//关总中断
//开定时器0中断
TMOD = 0x02;
//定时器0工作方式2
//定时250us
& //开总中断
&//开始定时
void main()
& & init();
& & while(1)
/*************************************************************
开始东西直行绿灯亮,东西左转红灯亮27s,显示绿灯倒计时30s
南北直行、左转红灯亮50s,显示红灯倒计时50s
*************************************************************/
while(time%100 < 27)
& ew_zx_green = ON;
&//东西直行绿灯亮,显示27s
& ew_zx_yellow = OFF;
& ew_zx_red = OFF;
& display_ew(30 - time);
& ew_zz_red = ON;
&//东西左转红灯亮
& ew_zz_green = OFF;
& ew_zz_yellow = OFF;
& sn_zx_red = ON;
&//南北直行红灯亮,显示时间50s
& sn_zx_yellow = OFF;
& sn_zx_green = OFF;
& display_sn(50 - time);
& sn_zz_red = ON;
&//南北左转红灯亮,显示时间50s
& sn_zz_yellow = OFF;
& sn_zx_green = OFF;
/*************************************************************
东西直行黄灯亮3s, 倒计时开始闪烁
东西左转,南北方向不变
*************************************************************/
while(time%100 >= 27 && time%100 < 30)
& ew_zx_yellow = ON;
&//东西直行黄灯亮 ,显示时间3s
& ew_zx_red = OFF;
& ew_zx_green = OFF;
& display_ew_shan(30 - time);
& display_sn(50 - time);
/*************************************************************
东西左转绿灯亮17s,直行红灯亮 ,显示绿灯倒计时20s
南北方向不变
*************************************************************/
while(time%100 >= 30 && time%100 < 47)
& ew_zz_green = ON;
//东西左转绿灯亮,显示时间17s
& ew_zz_red = OFF;
& ew_zz_yellow = OFF;
& display_ew(50-time);
& ew_zx_red = ON;
&//东西直行红灯亮
& ew_zx_yellow =OFF;
& ew_zx_green = OFF;
& display_sn(50-time);
&//南北继续显示倒计时
/*************************************************************
东西左转黄灯亮3s, 倒计时开始闪烁 3s
东西直行,南北方向不变
*************************************************************/
while(time%100 >= 47 && time%100 < 50)
& ew_zz_yellow = ON;
//东西左转黄灯亮,显示时间3s
& ew_zz_red = OFF;
& ew_zz_green = OFF;
& display_ew_shan(50-time);
& display_sn(50-time);
&//南北继续显示倒计时
/*************************************************************
东西左转红灯亮50s,直行不变,显示倒计时50s
南北直行绿灯亮27,左转不变,显示绿灯倒计时30s
*************************************************************/
while(time%100 >=50 && time%100 < 77)
sn_zx_green = ON;
//南北直行绿灯亮,显示时间27s
sn_zx_yellow = OFF;
sn_zx_red = OFF;
display_sn(80 - time);
ew_zz_red = ON;
& //东西左转红灯亮,显示时间50s
ew_zz_yellow = OFF;
ew_zz_green = OFF;
display_ew(100 - time);
/*************************************************************
南北直行黄灯亮3s,左转不变,显示黄灯闪烁倒计时3s
*************************************************************/
while(time%100 >= 77 && time%100 < 80)
sn_zx_yellow = ON;
//南北直行黄灯亮,显示时间3s
sn_zx_red = OFF;
sn_zx_green = OFF;
display_sn_shan(80 - time);
display_ew(100 - time);
/*************************************************************
南北左转绿灯亮17s,直行不变,显示绿灯倒计时20s
*************************************************************/
while(time%100 >=80 && time%100 <97)
sn_zz_green = ON;
&//南北左转绿灯亮, 显示17s
sn_zz_red = OFF;
sn_zz_yellow = OFF;
display_sn(100-time);
sn_zx_red = ON;
//南北直行红灯亮
sn_zx_yellow = OFF;
sn_zx_green = OFF;
display_ew(100 - time);
//东西继续倒计时
/*************************************************************
南北左转黄灯亮17s,直行不变,显示黄灯闪烁倒计时3s
*************************************************************/
while(time%100 >= 97 && time<=100)
sn_zz_yellow = ON;
//南北左转黄灯亮, 显示时间3s
sn_zz_red = OFF;
sn_zz_green = OFF;
display_sn_shan(100 - time);
display_ew(100 - time);
//东西继续倒计时
void timer0() interrupt 1
if(count == 4000)
count = 0;
if(time > 100)
阅读(14762) | 评论(0) | 转发(4) |
给主人留下些什么吧!~~
请登录后评论。51CTO旗下网站
用C语言实现开关控制流水灯
《简简单单学通51单片机开发》第2章从I/O端口开始学51单片机,本章将详细讲解程序语言,会更深入地学习Proteus绘制电路图的方法,并介绍一些软件方面应该注意的知识。希望读者除了努力学习之外,还应该多多地练习。本节为大家介绍用C语言实现开关控制流水灯。
作者:王晋凯来源:清华大学出版社| 15:48
2.4.5& 用C语言实现开关控制流水灯
1.判断语句
汇编语言有汇编的判断语句,而C语言同样也有自己的判断语句,而且更简单,更容易理解。在这里我们介绍一种判断语句&&if语句。
If语句有同样也有3种表达方法。
(1)第一种形式:
if(表达式)&语句;&
if(表达式){语句}&
其语义是:如果表达式的值为真,则执行其后的语句,否则不执行该语句。其执行过程如图2-71所示。在这里补充一点,在C语言中&=&表示赋值,而&==&则表示等于。在将要给出的程序中if(P1.0==1),则是判断P1.0是否等于1。
(2)第二种形式为:if-else语句,其使用方法如下所示。
if(表达式)&& &&&&语句1;&& &&else&& &&&&语句2;&
其语义是:如果表达式的值为真,则执行语句1,否则执行语句2。其执行过程如图2-72所示。
(3)第三种形式为if-else-if。
前两种形式的if语句一般都用于两个分支的情况。当有多个分支选择时,可采用if-else-if语句,其使用方法为:
if(表达式1) &&&&&&&&&语句1; &&&&&else&&if(表达式2)&& &&&&&&&&&语句2; &&&&&else&&if(表达式3)&& &&&&&&&&&语句3; &&&&&&&&&&&& &&&&&else&&if(表达式m)&& &&&&&&&&&语句m; &&&&&else& &&&&&&&&&语句n;&
其语义是:依次判断表达式的值,当出现某个值为真时,则执行其对应的语句,然后跳到整个if语句之外继续执行程序。如果所有的表达式均为假,则执行语句n,然后继续执行后续程序。 if-else-if语句的执行过程,如图2-73所示。
2.完整的程序
同样,我们也在原有的流水灯C语言程序的基础上进行修改,就可实现要求的功能。完整的C语言程序如下所示。
#include&&&& &void&Delay500ms();&&&&& &main()&&&&&&&&&&&&&&&& &{ &while(1)&&&&&&&&&&&&&& &{&&& &if(P0_0==1)&&&&&&&&&&&//判断端口P0.0的状态 &{&&&&&&&&&&&& &P1=0XFE;&&&&&&&&&&&&&&&//给P1赋值 &Delay500ms();&&&&&&&&&&//调用延时子程序 &P1=0XFD; &Delay500ms(); &P1=0XFB; &Delay500ms(); &P1=0XF7; &Delay500ms(); &P1=0XEF; &Delay500ms(); &P1=0XDF; &Delay500ms(); &P1=0XBF; &Delay500ms(); &P1=0X7F; &Delay500ms(); &&} &} &} &void&Delay500ms()&&&&&//延时子程序位置 &{ &unsigned&char&i,j,k; &for(i=200;i0;i--) &for(j=20;j0;j--) &for(k=250;k0;k--); &}&
在这里我们用的是if语句的第一种形式,在本例中如果运用if语句的另外两种形式就显得画蛇添足了,所以在这里我们就不再讨论其他两种形式。
程序完成后该进行仿真了。在流水灯的C项目中进行修改,并且编译,就可以在Proteus中仿真了。
和汇编语言遇到了一样的问题,默认将开关拨到接地这一端,然后单击仿真按钮,LED小灯是不执行流水的。当拨动开关打到接电源这一端时,流水灯就开始执行了,在流水灯运行的过程中,将开关拨到接地这一端时无法停止流水,只是进行完这次流水后就不再循环。
喜欢的朋友可以添加我们的微信账号:
51CTO读书频道二维码
51CTO读书频道活动讨论群:
【责任编辑: TEL:(010)】&&&&&&
大家都在看猜你喜欢
热点热点头条头条热点
24H热文一周话题本月最赞
讲师:90644人学习过
讲师:15445人学习过
讲师:16222人学习过
精选博文论坛热帖下载排行
精选目前国内外最流行的程序设计语言――Java作为本书的选题,并以丰富的内容来解决读者学习该语言时可能遇到的各种问题。以专业的论坛为基...
订阅51CTO邮刊【图文】1、用C语言控制灯的亮灭_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&100W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
1、用C语言控制灯的亮灭
阅读已结束,下载本文到电脑
定制HR最喜欢的简历
你可能喜欢}

我要回帖

更多关于 c语言编程软件 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信