吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3575|回复: 22
收起左侧

[学习记录] 新手学习51单片机第二天 流水灯的一些思路

[复制链接]
yuduoduo 发表于 2020-9-3 18:40
本帖最后由 yuduoduo 于 2020-9-3 18:41 编辑

最近在学校报名了个比赛,让我接触到了单片机,刚开始学确实蛮头疼的,但是也要加油,办法总比困难多。
今天在论坛里看到个老哥发个流水灯的程序,是用sbit的方法写的,但是不适合我这个板子(他只编了P1口,没有编P3),
251633e45378a90be763b410642444e.jpg
我把我这个思路给分享出来让小伙伴们参考参考
我这个板子是老师做的,芯片用的是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;//循环结束重新赋值
        }
                        
}


下面附上参考图:
c077747e3f7736ef34b7d804b1e4b2a.jpg
希望能给新学单片机的小伙伴们一个思路!我也是一个新手,大家一起努力一起加油!(写的不对的地方希望大佬们帮忙改正改正)

免费评分

参与人数 3吾爱币 +6 热心值 +3 收起 理由
騇钚得离去 + 1 厉害
fenz + 1 + 1 支持,想起以前的电工电子实习
苏紫方璇 + 5 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

qq06314488 发表于 2020-9-3 20:04
666,我也想学哈哈
hill_king 发表于 2020-9-3 20:09
本帖最后由 hill_king 于 2020-9-3 20:13 编辑

DS1302不带电源时钟,以前用DS12C887号称10年 不掉电,但是我 2年后打开,时钟就不准了,哈哈哈
上个图看看
jzw12345 发表于 2020-9-3 20:39
北上飞 发表于 2020-9-3 21:27
我也想学单片机,可惜没资源
zn1996 发表于 2020-9-3 21:36
以前学单片机,老师不教C,教的是汇编  哈哈。
silverkey 发表于 2020-9-3 21:38
这东西不难,难的自己要懂电子基础,买个面包板玩玩吧
kof888 发表于 2020-9-3 22:26
楼主我想问一下,你这段程序没看见在哪打开led的开关啊??
 楼主| yuduoduo 发表于 2020-9-4 08:43
kof888 发表于 2020-9-3 22:26
楼主我想问一下,你这段程序没看见在哪打开led的开关啊??

这个只不过是做一个流水灯而已   开启电源就打开led灯了..刚学到这哈哈
kof888 发表于 2020-9-4 10:04
本帖最后由 kof888 于 2020-9-4 10:05 编辑
yuduoduo 发表于 2020-9-4 08:43
这个只不过是做一个流水灯而已   开启电源就打开led灯了..刚学到这哈哈

哦,原理如此,那temp左移这样写可以不?temp<<=1;
还有那个nop函数是干嘛用的?
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 06:04

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表