电子技术论坛

 找回密码
 快速注册

QQ登录

只需一步,快速开始

搜索
下载方法|用单线程|避免多扣帖子规范|求助必读|发帖建议积分策略|勋章介绍|新人必读获取金币|推广论坛|出售帖子基本礼节|致会员信|版规总则
禁涉政治|反对低俗|举报专帖征集相片|留下足迹|推荐精华上传附件|制作分卷|使用网盘禁发qq群|恶意灌水|纯表情帖加入团队|监督机制|安全上网
查看: 9254|回复: 21

学了几天单片机编程

[复制链接]
发表于 2018-2-19 20:40:01 | 显示全部楼层 |阅读模式

注册家电维修技术论坛,与同行畅聊维修技术,享更多技术论坛功能。

您需要 登录 才可以下载或查看,没有帐号?快速注册

x
    本人利用春节放假,在家自学了几天51单片机编程,今天白天为了验证学习效果,给自己出了一个小题目,就是利用80C52的P1端口控制8个LED做流水移动效果,10秒后8个LED停止闪烁并熄灭,两秒后P2.3口输出低电平驱动蜂鸣器报警3声,间隔时间为200ms,最后由P0口驱动6位数码管显示6个0,同时关闭定时器,程序结束。
    程序中使用的是单片机内部T0定时器,两个573锁存器分别控制数码管的段选与位选,春节放假这几天几乎每天都在看书,看视频,做实验,懂了一些基础的东西,但还是有许多基础的东西不是很懂,晒出我编写的C程序麻烦师傅们帮我找找错,指点指点我,另外我还有个小疑问,我这个程序使用了左移命令来完成8个流水灯的循环,那么如何能做到只让3个LED循环点亮呢,我知道用软件的while与for延时可以做到,但是那样太占用CPU资源,我只想使用定时器来完成延时,如何能做到呢?真心请教大家,谢谢了!

#include<reg52.h>
#include<intrins.h>//
#define uint unsigned int
uint LED;
sbit DU=P2^6;//数码管段选锁存器IO口定义
sbit WE=P2^7;//数码管位选锁存器IO口定义
sbit FM=P2^3;//定义蜂鸣器IO口
void main()
{       
        uint a=0,b=0;
        TMOD=0x01;
        ET0=1;
        EA=1;
        TR0=1;
        DU=0;
        WE=0;//初始化位锁存器位选控制端为0
        LED=0xfe;
        P1=LED;
       
        while(1)
        {
        if(TF0==1)
        {
                TF0=0;
                TH0=0xB8;
                TL0=0x00;
                a++;b++;
               
                if(a>=10)
                {        a=0;
                        LED=_crol_(LED,1);
                        P1=LED;
                }               
                if(b>=500)
               
                P1=0xff;
               
                if(b>=600)
                                                {FM=0;}
                if(b>=610)
                                                {FM=1;}
                if(b>=620)
                                                {FM=0;}
                if(b>=630)
                                                {FM=1;}
                if(b>=640)
                                                {FM=0;}
                if(b>=650)
                                                {FM=1;}
                if(b>=660)
                                                {DU=1;
                                                P0=0x3f;
                                                DU=0;
                                                WE=1;
                                                P0=0x00;
                                                TR0=0;//关闭定时器0
}
}
  }
        }
发表于 2018-2-19 21:08:23 | 显示全部楼层
不会!没事下了几天的器
发表于 2018-2-19 21:22:29 | 显示全部楼层
你这程序啥意思
a流水灯,b然后蜂鸣器鸣叫
 楼主| 发表于 2018-2-19 21:37:58 | 显示全部楼层
hwpg 发表于 2018-2-19 21:22
你这程序啥意思
a流水灯,b然后蜂鸣器鸣叫

a和b是定义的两个变量,定时器初值设定为20ms,用变量a做加法运算,循环到10次,也就是200ms的时间间隔作为流水灯的流动速度,变量b做500次循环,也就是10秒时间作为流水灯流动的总时间。
 楼主| 发表于 2018-2-19 21:38:06 | 显示全部楼层
hwpg 发表于 2018-2-19 21:22
你这程序啥意思
a流水灯,b然后蜂鸣器鸣叫

a和b是定义的两个变量,定时器初值设定为20ms,用变量a做加法运算,循环到10次,也就是200ms的时间间隔作为流水灯的流动速度,变量b做500次循环,也就是10秒时间作为流水灯流动的总时间。
发表于 2018-2-19 22:09:33 | 显示全部楼层
本帖最后由 hwpg 于 2018-2-20 00:59 编辑

打个比喻
你要做个电子产品首先
插件工插好件-------焊接工过锡炉-------剪脚工检掉脚-------测试工测试主板-------包装工打包
状态机也就是流程化了,每个步骤都有专门的人来做,相当于大公司
阻塞程序,让一个人做全部的步骤,相当于小作坊
插件工插好件-------插件工过锡炉-------插件工检掉脚-------插件工测试主板-------插件工打包
开始不懂的话,慢慢习惯了也就明白了
单片机想要学好,做产品的话,急不来的,肯定很花功夫的
如果你业余玩玩,那么用阻塞的也无所谓了

发表于 2018-2-19 22:16:16 | 显示全部楼层
灯先从右往做左
然后Led_COM[]数组,设置灯的流速
每完成一次,灯的速度变慢
在从左往右
发表于 2018-2-19 22:42:26 | 显示全部楼层
本帖最后由 hwpg 于 2018-2-19 22:57 编辑

不单单流水灯,任何程序都适用
要实现程序并行功能,用状态机
分步骤进行,每次完成一个步骤

捕7.PNG
 楼主| 发表于 2018-2-19 22:48:21 | 显示全部楼层
hwpg 发表于 2018-2-19 22:16
灯先从右往做左
然后Led_COM[]数组,设置灯的流速
每完成一次,灯的速度变慢

谢谢啊,我看看!
发表于 2018-2-19 23:57:29 | 显示全部楼层
我说出我的看法:
最开始学不用去考虑效率和硬件成本,只要实现功能就行,之后会有更好的方法改进,我一般很少用定时器,除了喂狗,我都是用延时,毕竟所做的小程序对时间要求不高。程序也不复杂,都是流水程序一步一步来。你的程序对IF的理解不深,还得多看基础。我有点不明白的是:你只定义了两个数码管位,能控制6位7段数码管的显示?
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|家电维修技术论坛 ( 鄂ICP备09003585号-2 )

GMT+8, 2024-11-21 20:17 , Processed in 0.065939 second(s), 4 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

CopyRight © 电子技术论坛
电子邮箱:8794149@qq.com | 联系 QQ:3081868839 | 官方网址:www.dzdu.com

Qiji. All Rights Reserved


服务条款 | 站长声明

Wuhan Qiji Technology Co., Ltd.武汉奇迹科技有限公司版权所有


鄂ICP备09003585号-2鄂公网安备42010602000420号

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