51单片机C语言实现循环8个流水灯左移三次,后右移三次。
例程:
#include<reg51h> //51单片机头文件#include <intrinsh> //包含有左右循环移位子函数的库
#define uint unsigned int //宏定义
#define uchar unsigned char //宏定义
sbit beep=P2^3;
void delay(uint z) //延时函数,z的取值为这个函数的延时ms数,如delay(200);大约延时200ms
{ //delay(500);大约延时500ms
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main() //主函数
{
uchar a,i,j;
while(1) //大循环
{
a=0xfe; //赋初值
for(j=0;j<3;j++) for(i=0;i<8;i++) //左移三次
{
P1=a; //点亮小灯
beep=0; //开启蜂鸣器
delay(50); //延时50毫秒
beep=1; //关闭蜂鸣器
delay(50); //再延时50毫秒
a=_crol_(a,1); //将a变量循环左移一位
}
a=0x7f;
for(j=0;j<3;j++) for(i=0;i<8;i++) //右移三次
{
P1=a; //点亮小灯
beep=0; //开启蜂鸣器
delay(50); //延时50毫秒
beep=1; //关闭蜂鸣器
delay(50); //再延时50毫秒
a=_cror_(a,1); //将a变量循环右移一位
}
}
}
51单片机是对所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8031单片机,后来随着Flash rom技术的发展,8031单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。很多公司都有51系列的兼容机型推出,今后很长的一段时间内将占有大量市场。51单片机是基础入门的一个单片机,还是应用最广泛的一种。
可以实现,首先随便连接一个I/O口,P1/P2/P0均可,然后赋予一初值,然后使用本征函数_cror_(循环变量,循环次数)循环右移,或者循环左移实现。左移只需改掉本征函数,同时亮灭可以先给全1,然后给全0,中间加延时,自然得到需要的功能。
#include <reg51h> //包含头文件
#include <INTRINSH> //包含本征函数头文件
#define uint unsigned int //定义uint
#define uchar unsigned char //定义uchar
void delayms(uint n) //延时,n为多少延时多少ms
{
uint i;
for(;n>0;n--) //延时nms
for(i=121;i>0;i--) //12M晶振而言,延时1ms;
}
void main() //主程序
{
uint w=0xfe; //定义变量w为第一个灯点亮
while(1)
{
P0=w%256; //取出变量w的低八位89%10=9,89/10=8,2^8=256
delayms(500); //延时500ms
w=_irol_(w,1); //对双字节变量w循环左移1位
}
}
开始学习单片机的同学们写注意了,在运行程序后,现象不正确的时候,不要首先就找软件的错误,我的经验是从源头开始找问题,首先你得确定你的平台是正确的,
你说是按键没效果,先用万用表测试一下你的引脚的电平,是否被拉低了
如果按键没问题,你就检查_crol_(P0,1);这句,查一下头文件是否被包含,我个人建议自己作个移位函数
虽然程序中还有别的问题,但不会造成你一在按键没效果的现象!
如果你是想学硬件的人,你可以这么玩下去,如果你是想编程,建议你先写段时间(可能是很长时间)的C语言,至少能写个画形动画或是图书馆管理程序出来后再去学单片机吧,不然真心觉得你会学得很慢,而且进步很慢
先说第一个问题:
比如用查表法将结果保存到变量i中,查表变量为x,则i=table[x],记住c语言里面数组是从0开始的,比如说上面的0x01就是table[0],0x02是table[1],以此类推。
再说第二个问题:
比如说从p10口发送出去,则可以写为
sbitout=p1^0;//定义out为p10口,这样今后好写程序
chari;
for(i=0;i<8;i++)
{
out=data&0x80;//因为高位在前,将它写成二进制就明白了
data<<=1;
}
上面的程序就能搞定了;
应该是所有的单片机都有cy位(不知道浮点dsp有没有);
c语言中左移和右移之后低位或高位自动补零,cy位也保持为零(视编译器而定,这个得看编译器手册),有些编译器提供了循环移位的函数;
还有什么不明白的补充问题就是
C51单片机的循环左移函数是,_crol_(变量名,n),循环右移函数是,_cror_(变量名,n),函数中的“循环”是指变量的8位二进制数依次向左移一位,或向右移一位。
你比如的,取8位数,让1111 1110循环左移一位,就是在1111 1110、1111 1101、1111 1011、1111 0111、1110 1111,等等,每移位一次,8位数向左或向右移一位。继续移位,就会循环重复的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)