新手学习51单片机第二天 流水灯的一些思路
本帖最后由 yuduoduo 于 2020-9-3 18:41 编辑最近在学校报名了个比赛,让我接触到了单片机,刚开始学确实蛮头疼的,但是也要加油,办法总比困难多。
今天在论坛里看到个老哥发个流水灯的程序,是用sbit的方法写的,但是不适合我这个板子(他只编了P1口,没有编P3),
我把我这个思路给分享出来让小伙伴们参考参考
我这个板子是老师做的,芯片用的是STC89C52RC
这个板子的LED灯一共有14个,其中P1口分了八个,P1^0~P1^7,剩下的是RXD、TXD、D10、D11口
这些口在keil里被分配到P3里,
我要做流水灯刚开始一点思路也没有,全局定义temp分别赋给P1端口以及P3端口,之前我给temp赋值的是0x01,
所以说现在我烧录程序之后发现P1、P3端口灯同时灭了一个,但是这不是我想要的结果(在写这个程序之前我加了延迟)
咨询了老师后,老师说可以通过while循环的方法来解决这个事情,也可以用sbit方法写,这两个方法相比而言,sbit方法简便许多
多一个办法总比少一个办法强
下面是代码:
#include <reg52.h>
#include <intrins.h>
unsigned char temp;//全局定义temp
unsigned char m;//全局定义m
void Delay1000ms() //@11.0592MHz延迟程序
{
unsigned char i, j, k;
_nop_();
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()//主程序
{
m = 0;//m为0时
P1= P3=0x00;//P1=P3为16进制数0x00,0x00为0000 0000
while(1)//循环语句while
{
temp=0x01;//全局定量temp赋值为1
while(m<8)//当m<8时开启循环
{
P1=temp;
temp=_crol_(temp,1);//temp向左移动1
Delay1000ms();//设置延迟为1000ms
m++;//m+1,并查看m是否小于8,m<8继续循环
}
m = 0;//上个循环结束,m赋值为0
P1=0x00;//上个循环结束,P1十六进制赋值为0000 0000
temp=0x01;//temp重新赋值为0000 0001,为下个循环做准备
while(m<4)//当m<4时开启循环
{
P3=temp;
temp=_crol_(temp,1);//temp向左移动1,这里temp赋值给P3,所以P3向左
Delay1000ms();//设置延迟1000ms
m++;//m+1,并查看m是否小于4,m<4继续循环
}
m = 0;//循环结束重新赋值
P3=0x00;//循环结束重新赋值
}
}
下面附上参考图:
希望能给新学单片机的小伙伴们一个思路!我也是一个新手,大家一起努力一起加油!(写的不对的地方希望大佬们帮忙改正改正) 666,我也想学哈哈 本帖最后由 hill_king 于 2020-9-3 20:13 编辑
DS1302不带电源时钟,以前用DS12C887号称10年 不掉电,但是我 2年后打开,时钟就不准了,哈哈哈
上个图看看
https://s1.ax1x.com/2020/09/03/wiPYQS.png 不错,感谢分享。 我也想学单片机,可惜没资源{:1_918:} 以前学单片机,老师不教C,教的是汇编哈哈。 这东西不难,难的自己要懂电子基础,买个面包板玩玩吧 楼主我想问一下,你这段程序没看见在哪打开led的开关啊?? kof888 发表于 2020-9-3 22:26
楼主我想问一下,你这段程序没看见在哪打开led的开关啊??
这个只不过是做一个流水灯而已 开启电源就打开led灯了..刚学到这哈哈 本帖最后由 kof888 于 2020-9-4 10:05 编辑
yuduoduo 发表于 2020-9-4 08:43
这个只不过是做一个流水灯而已 开启电源就打开led灯了..刚学到这哈哈
哦,原理如此,那temp左移这样写可以不?temp<<=1;
还有那个nop函数是干嘛用的?{:1_908:}