请高手解释一下这个单片机流水灯C语言程序,新手~~

请高手解释一下这个单片机流水灯C语言程序,新手~~,第1张

#include

"reg52h"

#include

"intrinsh"

//循环移动函数要用到的头文件

void

Delay(unsigned

int

t)

//延时子程序

{

unsigned

i;

while(t--!=0)

{

for(i=0;i<500;i++)

{;}

}

}

void

main(void)

{

unsigned

char

temp,num1,num2;

P0=0xff;

//LED初始化

起始状态

P2=0xff;

while(1)

//大循环

{

temp=0xfe;

//送给P0口的初值

点亮一侧第一个灯

for(num1=0;num1<8;num1++)

//循环体用于循环左移用

循环8次

{

P0=temp;

//给P0

P2=0xff;

//P2控制的灯灭

Delay(100);

//延时

temp

=

_crol_(temp

,

1);

//执行一次循环就循环左移一位

与汇编的

RL功能相同

}

temp=0x7f;

//送给P0口的初值

点亮另一侧第一个灯

for(num2=0;num2<8;num2++)

{

P0=temp;

P2=0xff;

Delay(100);

temp

=_cror_(temp,1);

//循环右移

同RR

下面的就是控制P2口了

同上面类似

}

//这个程序实现的效果是:先让P0口控制的LED自右向左点亮(只亮一个灯)再自左向右点亮

然后就是P2口

temp=0xfe;

for(num1=0;num1<8;num1++)

{

P2=temp;

P0=0xff;

Delay(100);

temp

=

_crol_(temp

,

1);

}

temp=0x7f;

for(num2=0;num2<8;num2++)

{

P2=temp;

P0=0xff;

Delay(100);

temp

=_cror_(temp,1);

}

}

}

我给你个简单的例子:

#include <AT89X51H> //预处理文件里面定义了特殊寄存器的名称如P1 口定义为P1

void main(void)

{

//定义花样数据

const unsigned char design[32]={0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,

0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF,

0xFF,0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0x0,

0xE7,0xDB,0xBD,0x7E,0xFF};

unsigned int a; //定义循环用的变量

unsigned char b; //在C51 编程中因内存有限尽可能注意变量类型的使用

//尽可能使用少字节的类型,在大型的程序中很

受用

do{

for (b=0; b<32; b++)

{

for(a=0; a<30000; a++); //延时一段时间

P1 = design[b]; //读已定义的花样数据并写花样数据到P1 口

}

}while(1);

}

程序中的花样数据可以自以去定义,因这里我们的LED 要AT89C51 的P1 引脚为低电平才

会点亮,所以我们要向P1 口的各引脚写数据O 对应连接的LED 才会被点亮,P1 口的八个引

脚刚好对应P1 口特殊寄存器的八个二进位,如向P1 口定数据0xFE,转成二进制就是

11111110,最低位D0 为0 这里P10 引脚输出低电平,LED1 被点亮。如此类推,大家不难算

出自己想要做的效果了。

留个邮箱给你发个入门文档

单片机的外部结构:

DIP40双列直插;

P0,P1,P2,P3四个8位准双向I/O引脚;(作为I/O输入时,要先输出高电平)

电源VCC(PIN40)和地线GND(PIN20);

高电平复位RESET(PIN9);(10uF电容接VCC与RESET,即可实现上电复位)

内置振荡电路,外部只要接晶体至X1(PIN18)和X0(PIN19);(频率为主频的12倍)

程序配置EA(PIN31)接高电平VCC;(运行单片机内部ROM中的程序)

P3支持第二功能:RXD、TXD、INT0、INT1、T0、T1

单片机内部I/O部件:(所为学习单片机,实际上就是编程控制以下I/O部件,完成指定任务)

四个8位通用I/O端口,对应引脚P0、P1、P2和P3;

两个16位定时计数器;(TMOD,TCON,TL0,TH0,TL1,TH1)

一个串行通信接口;(SCON,SBUF)

一个中断控制器;(IE,IP)

针对AT89C52单片机,头文件AT89x52h给出了SFR特殊功能寄存器所有端口的定义。教科书的160页给出了针对MCS51系列单片机的C语言扩展变量类型。

C语言编程基础:

十六进制表示字节0x5a:二进制为01011010B;0x6E为01101110。

如果将一个16位二进数赋给一个8位的字节变量,则自动截断为低8位,而丢掉高8位。

++var表示对变量var先增一;var—表示对变量后减一。

x |= 0x0f;表示为 x = x | 0x0f;

TMOD = ( TMOD & 0xf0 ) | 0x05;表示给变量TMOD的低四位赋值0x5,而不改变TMOD的高四位。

While( 1 ); 表示无限执行该语句,即死循环。语句后的分号表示空循环体,也就是{;}

在某引脚输出高电平的编程方法:(比如P13(PIN4)引脚)

#include <AT89x52h> //该头文档中有单片机内部资源的符号化定义,其中包含P13

void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口

{

P1_3 = 1; //给P1_3赋值1,引脚P13就能输出高电平VCC

While( 1 ); //死循环,相当 LOOP: goto LOOP;

}

注意:P0的每个引脚要输出高电平时,必须外接上拉电阻(如4K7)至VCC电源。

在某引脚输出低电平的编程方法:(比如P27引脚)

#include <AT89x52h> //该头文档中有单片机内部资源的符号化定义,其中包含P27

void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口。

{

P2_7 = 0; //给P2_7赋值0,引脚P27就能输出低电平GND

While( 1 ); //死循环,相当 LOOP: goto LOOP;

}

在某引脚输出方波编程方法:(比如P31引脚)

#include <AT89x52h> //该头文档中有单片机内部资源的符号化定义,其中包含P31

void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口

{

While( 1 ) //非零表示真,如果为真则执行下面循环体的语句

{

P3_1 = 1; //给P3_1赋值1,引脚P31就能输出高电平VCC

P3_1 = 0; //给P3_1赋值0,引脚P31就能输出低电平GND

} //由于一直为真,所以不断输出高、低、高、低……,从而形成方波

}

将某引脚的输入电平取反后,从另一个引脚输出:( 比如 P04 = NOT( P11) )

#include <AT89x52h> //该头文档中有单片机内部资源的符号化定义,其中包含P04和P11

void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口

{

P1_1 = 1; //初始化。P11作为输入,必须输出高电平

While( 1 ) //非零表示真,如果为真则执行下面循环体的语句

{

if( P1_1 == 1 ) //读取P11,就是认为P11为输入,如果P11输入高电平VCC

{ P0_4 = 0; } //给P0_4赋值0,引脚P04就能输出低电平GND

else //否则P11输入为低电平GND

//{ P0_4 = 0; } //给P0_4赋值0,引脚P04就能输出低电平GND

{ P0_4 = 1; } //给P0_4赋值1,引脚P04就能输出高电平VCC

} //由于一直为真,所以不断根据P11的输入情况,改变P04的输出电平

}

将某端口8个引脚输入电平,低四位取反后,从另一个端口8个引脚输出:( 比如 P2 = NOT( P3 ) )

#include <AT89x52h> //该头文档中有单片机内部资源的符号化定义,其中包含P2和P3

void main( void ) //void 表示没有输入参数,也没有函数返值,这入单片机运行的复位入口

{

P3 = 0xff; //初始化。P3作为输入,必须输出高电平,同时给P3口的8个引脚输出高电平

While( 1 ) //非零表示真,如果为真则执行下面循环体的语句

{ //取反的方法是异或1,而不取反的方法则是异或0

P2 = P3^0x0f //读取P3,就是认为P3为输入,低四位异或者1,即取反,然后输出

} //由于一直为真,所以不断将P3取反输出到P2

}

注意:一个字节的8位D7、D6至D0,分别输出到P37、P36至P30,比如P3=0x0f,则P37、P36、P35、P34四个引脚都输出低电平,而P33、P32、P31、P30四个引脚都输出高电平。同样,输入一个端口P2,即是将P27、P26至P20,读入到一个字节的8位D7、D6至D0。

#include <reg52h>//包涵51单片机的头文件

#include <intrinsh>//包涵循环、空 *** 作等的头文件

#define uint unsigned int//定义uint为unsigned int无符号整型数据类型

#define uchar unsigned char//定义unchar为unsigned char无符号字符型数据类型

#define led_port P1//定义led_port的控制口P1

void delay_1ms(uchar x)//延时子函数

{

uchar j;//定义2个无符号字符型数据

while(x--)//循环语句,x--=0时跳出

{

for(j=0;j<125;j++)//内循环,当j=125时跳出

{;}

}

}

void main()

{

while(1){

led_port = 0xaa;//led8个灯间隔点亮1010 1010

delay_1ms(200);//延时200毫秒

delay_1ms(200);

delay_1ms(200);

delay_1ms(200);

led_port = 0x55;//led8个灯间隔点亮0101 0101

delay_1ms(200);

delay_1ms(200);

delay_1ms(200);

delay_1ms(200);

}

}

P1=0xff;这个是让P1口的八个灯全灭。

for(j=0;j<3;j++)//灯一盏盏从上往下亮

{

for(x=0;x<8;x++)控制第几个灯亮的;

{

P1>>=1;右移一位第一灯亮了,依次亮

delayxms(500);每个灯亮的时间,延迟函数

if(P1==0x00)如果第八个灯亮了 后;就要重新赋予P1口的值;

{

P1=0xff;P1口从新赋值;

for(x=0;x<8;x++)这个语句和上面的类似,就是顺序反过来了,他是从第八个灯开始亮的;

{

P1<<=1;左移一位第一灯亮了,依次亮

delayxms(500);延迟函数

}

}

}

}大概就是这样了 不明白在问我

这个是1602内部结构决定的,你只需要在初始化的时候先设置三次显示,然后再设置你的其他要求。

芯片厂家推荐的用法:

INT:

MOV

A,#30H

MOV

DATR,#CW_ADD

MOV

R2,#03H

INT1:

MOVX

@DPTR,A

CALL

DELAY

DJNZ

R2,INT1

这上面就是1602对于51单片机推荐的初始化之前加的三次模式设置

#include <reg51h> //51头文件

#include <intrinsh> //包含移位函数_crol_

void Delay10ms(unsigned int c); //延时函数声明

void main(void)

{

unsigned char LED;

LED = 0x01; //一个unsigned char有8位,每一位代表了一个灯,初始点亮第一盏灯

while(1)

{

P0 = LED; //点亮一盏灯

Delay10ms(50); //延时500ms,让其量一会儿

LED = _crol_(LED,1); //向左移位函数,比如 0x01 --> 0x02 --> 0x04 -->0x08 ---> 0x10

}

}

void Delay10ms(unsigned int c) //延时函数

{

unsigned char a, b;

for (;c>0;c--) //三重循环延时,大约延时10ms

{

for (b=38;b>0;b--)

{

for (a=130;a>0;a--);

}

}

}

以上就是关于请高手解释一下这个单片机流水灯C语言程序,新手~~全部的内容,包括:请高手解释一下这个单片机流水灯C语言程序,新手~~、51单片机16路流水灯怎么用C语言写,并求每个步骤的讲解、单片机c语言编程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9758959.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存