一个用C语言做51单片机做流水灯控制向左移动一位,右边补0的一段程序作业.求指教!

作者&投稿:涂逃 (若有异议请与网页底部的电邮联系)
51单片机的c语言 左移右移怎么用?想用来控制流水灯,请帮忙写个完整的c程序,参考下,端口随意~

# include "reg51.h" // 包含头文件
#define uchar unsigned char
void delay02s(void) // 延时0.2s子程序
{
unsigned char i,j,k;
for ( i=2;i>0;i-- )
for (j=200;j>0;j-- )
for (k=250;k>0;k-- );
}

void main (void) // 主函数
{
uchar i,j;
while (1) // 死循环
{
j=0x01; // j初始化为0x01,左移初始值
for(i=0;i<8;i++) // for循环语句,完成8个循环
{
P1= ~ j; // 对变量j 中的值按位取反后,从P1口输出
delay02s( ); // 延时0.2s
j= j<<1; // 左移1位
}
j=0x80; // 设置右移初始值j为0x80
for (i=0;i<8;i++)
{
P1= ~ j;
delay02s( );
j= j>>1; // 右移1位
}
}
}

左移后,可以用pow()函数叠加。假设移了a位,
do
{
P1+=pow(2,a-1);
a--;
}while(a=0);

//右边补0,直接移位就可以temp<,=1; 如果流水灯只有一个亮,下面的程序就是对的,移位之后补1.
#include "reg51.h"
void delay(unsigned char m);
main()
{
unsigned char temp;
temp=0xfe; //temp=1111 1110,使得P1口的某个引脚为低电平(亮)
while(1)
{
P1=temp; //P1口的数据来自temp,而temp的数据是不断变化的
temp=temp<<1 | 0x01;//temp向左移动一位,右边补0
if(temp==0xff)
temp=0xfe; //( 这里就是要填补的空!!!!!!!!!)
delay(20);
}
}
void delay(unsigned char m) //延时子程序
{
unsigned char i,j,k; //定义字符型变量,范围为0至255
for (i=0;i<m;i++)
{
for (j=0;j<100;j++)
{
for (k=0;k<100;k++);
}
}

加一句判断在P1那句下面
temp=temp&0xfe; 判断其他引脚,如果其他引脚有0,那么temp不等于temp&0xfe
if(temp==0xfe)
temp<<1; 只移位不循环,右边自动变0
else
temp=0xfe;
delay(20);

哦,上面无效 - - 题目我看错了,上面的只是单纯判断引脚和左移一位,没流水
流水的话,
if()
temp<<1; 这个只移位,不循环 那if就是temp!=0x00
temp=_crol_(temp,1); 这个是循环的左移 可以省下面else的了 两个temp二选一
else
temp=0xfe;

while (1)
{
delay ();
temp <<= 1;
P1 = temp | 0x01;
if(P1==0x7f)
{
delay ();
P1 = 0xfe;
}
}

延时子程序变量可以定义为unsigned int 型的。就不要写3个FOR了。

1


求一个51单片机用T0做计数器的C语言代码。
\/\/timer0设定为计数器模式1 TMOD &= 0xf0; \/\/清除原来的设定 TMOD |= 0x05; \/\/T0为计数器模式1 TH0 = 0;TL0 = 0; \/\/从0开始计数 TR0 = 1; \/\/使能T\/C0 \/\/ IE |= 0x82; \/\/Timer0中断使能,不需要就注释掉该行 另外执行不了有可能是你的实验板没有连接T0引...

急求简单51单片机控制电路C语言程序
【2011-3-8已更新,有结果吱一下】砖头如下:inlcude <reg51.h> sbit OUT=P2^0;sbit Key=P3^3;define DELAYCONST 50000\/\/ define DELAYCONST2 20\/\/简单的定时参数设定。void Delay(char j){ unsigned int k,l;for(j=0;j<60;j++)for(k=0;k<DELAYCONST2;k++)for(l=0;l<DELAYCO...

51单片机在Keil环境下,用C语言编程,关于片外存储区xdata中存放结构体...
Keil本身对STC单片机缺乏支持,对外部xram没有数据库描述。在器件库中选个带xram的单片机就可以了,比如sst89x516rd.

...可按键调时的数字时钟程序,数码管显示,C语言编写,谢谢。
用户 认证用户 视频作者 日报作者 知道团队 认证团队 合伙人 企业 媒体 政府 其他组织 商城 手机答题 我的 急求一个用51单片机编的可按键调时的数字时钟程序,数码管显示,C语言编写,谢谢。 最好能提供原理图。仿真图。... 最好能提供原理图。仿真图。 展开  我来答 2...

51单片机C语言编程
include<reg51.h> define uchar unsigned char sbit pluse1=P1^0;sbit pluse2=P1^1;uchar t1=0,t2=0;void t0isr() interrupt 1 { TH0=(65536-25000)\/256;TL0=(65536-25000)%256;t1++;if(t1<15)pluse=1;else pluse=0;if(t1>20)t1=0;} void t1isr() interrupt 3 { TH1=(65536...

51单片机C语言编程
\/\/ 51单片机C语言编程,这个时钟+秒表可以参考一下。include<reg51.h> define uchar unsigned char define uint unsigned int sbit qingling=P1^0; \/\/清零 sbit tiaofen=P1^1; \/\/调分 sbit tiaoshi=P1^2; \/\/调时 sbit sounder=P1^7; \/\/naozhong uint a,b;uchar hour,minu,sec, ...

用C语言制作基于单片机的数字温度计设计的原理图好程序 51单片机
x=DQ; \/\/稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay_18B20(20);} \/***ds18b20读一个字节***\/ unsigned char ReadOneChar(void){unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){ DQ = 0; \/\/ 高电平拉成低电平时读周期开始 dat>>=1;DQ = 1;...

51单片机C语言程序
\/\/为你增加了一个按键检测的函数。\/\/下列程序通过了实验测试。\/\/b1输出的周期大约0.9s。\/\/b2输出的周期大约0.6s。\/\/K为触动开关,reg为红灯,bice为绿灯,b1、b2 各为一个方波,\/\/按第一次触动开关时红灯亮、b1输出,\/\/按第二次绿灯亮、为b2输出,\/\/按第三次都关闭.include <reg51.h> d...

51单片机是用汇编简单还是c语言?
笔者认为,主要看你所熟悉的是哪种语言,据我了解还是C比较简单,有些应用接口程序笔者建议使用汇编比较简单!

以51单片机为基体 用C语言设计一个计数器 要求显示数据8位 有复位功 ...
void dis_cnter(void) 显示计数器值子程序开始 {uchar i; 定义字符型局部变量i P3_7=1;P3_6=1; 消隐有效,允许显示 for(i=0;i8;i++) 循环8次 {SBUF=SEG7[cnt];while(!TI);TI=0;} 根据8个单元的计数值查表发送显示 P3_7=0; 关闭消隐,正常显示 } 显示计数器值子程序结束 void ...

扬中市18675249775: 很简的51单片机C语言流水灯程序 -
聊供健骨: #include<reg52.h> #include <intrins.h> #define LED P2void delay(char i);void main() { unsigned char LedVablue=0xFE;while(1) {LedVablue= _crol_(LedVablue,1); //_crol_(x,Y)是<intrins.h> //里面的一个库函数,相当于汇编的带进位循环 LED=LedVablue; delay(100);} }void delay(char i) { char j; for(;i>0;i--) for(j=0;j<250;j++); }

扬中市18675249775: 51单片机用C语言如何写四个数码管的流水灯程序? -
聊供健骨: 用个移位处理就行了 set(void) {static char cnt = 0;P1 = 0x01 << cnt; cnt ++;if (cnt == 4) {cnt = 0; } }

扬中市18675249775: 51单片机c语言定时器控制流水灯 -
聊供健骨: #include //51系列单片机定义文件 #define uchar unsigned char //定义无符号字符 #define uint unsigned int //定义无符号整数 void delay(uint); //声明延时函数 void main(void) { uint i; uchar temp; while(1) { temp=0xFE; for(i=0;i<8;i++) //8个流水灯依...

扬中市18675249775: 51单片机双键控制八位流水灯C程序 -
聊供健骨: #include<reg51.h>#define uchar unsigned char uchar num,flag=0; sbit K1=P1^0; sbit K2=P1^1; void t0isr() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; num++; if(num>=20){num=0;flag=1;} } main() { uchar LED; TMOD=0x...

扬中市18675249775: 求教大婶们~51单片机单个按键控制流水灯C程序 -
聊供健骨: 很简单啊,只提供一个简单思路, 所以只提供简单的程序,自己理解 char flag=0;viod main() { while(1) { if(key==0 ) //假设0 按下按键 { flag=~flag; } if(flag==0) { leds(); //流水灯函数 } } }

扬中市18675249775: 51单片机c语言编写一个流水灯程序,要求如下(不能用数组,8个led指示灯从两边往中间移动,然后再分开) -
聊供健骨: 简单点的,用表格,事先计算好,放到ROM中,用的时候逐行编译输出就可以. 复杂点的,开一个缓冲区,用循环程序,根据花样的不同,每次填充一行,并输出,然后再计算一下行.除非表格太大,不建议这样用. #define len 8 char tablelist[][len] = { "", "", "", "", "", } outline( char * s ) { int i; for(i=0; i{ if ( s[i] == '0' ) { // 对应的灯亮 } else { // 对应的灯灭 } } } main() { for(;;) { outline( tablelist[i]); delay(..); } }

扬中市18675249775: 很简的51单片机C语言流水灯程序
聊供健骨: #include #define LED P2 void delay(char i); void main() { unsigned char LedVablue=0xFE; while(1) { LedVablue= _crol_(LedVablue,1); //_crol_(x,Y)是 //里面的一个库函数,相当于汇编的带进位循环 LED=LedVablue; delay(100); } } void delay(char i) { char j; for(;i>0;i--) for(j=0;j<250;j++); }

扬中市18675249775: 单片机C语言编程:控制流水灯 -
聊供健骨: T0 工作模式2 计时器中断,一次200us,1s流水灯左移或右移一次. k3触发外部中断0,级别高于计时器中断,故暂停. #include <reg52.h> #include <intrins.h> #define uint unsigned int #define uchar unsigned char sbit k1=P1^0; //左循环按钮 ...

扬中市18675249775: 51单片机通过外部按钮控制24LED流水灯变化C程序 -
聊供健骨: /******************************************************* * 程序名称:hc595.c * 程序功能:595的应用文件 * 程序作者:吴鉴鹰 * 创建时间:2014-3-10 * 修改时间: * 程序版本:V0.1 ******************************************************//* * 包含头文件 */#...

扬中市18675249775: 51单片机一个按键多种功能的流水灯C程序 -
聊供健骨: 判断两次按键的时间间隔 如果大于1s就实现一种功能 小于1s实现另外一种功能

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