本帖最后由 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方法简便许多
多一个办法总比少一个办法强
下面是代码:
[C] 纯文本查看 复制代码
#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;//循环结束重新赋值
}
}
下面附上参考图:
希望能给新学单片机的小伙伴们一个思路!我也是一个新手,大家一起努力一起加油!(写的不对的地方希望大佬们帮忙改正改正) |