#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语言编程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)