电子技术论坛

 找回密码
 快速注册

QQ登录

只需一步,快速开始

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

单片机多任务处理问题

[复制链接]
发表于 2014-6-15 21:47:09 | 显示全部楼层 |阅读模式

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

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

x
大家好:最近开始学习单片机,我写了一个从0-9999 9999 的自加程序,想让单片机数码管在自加的同时,在附加个频率为2HZ的闪灯,但是程序修改来修改去总是影响数码管的显示速度!难道单片机就不能像电脑那样多任务处理吗?
求附加代码!!!
#include<reg52.h>
#include<intrins.h>

#define uchar unsigned char  
#define uint unsigned int
sbit wei=P2^0;//位锁存器锁存端
sbit duan=P2^1;//段锁存器锁存端
  
uchar code EL_duanma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
uchar code EL_weima[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
/*********************************************************/
void delayms(unsigned int i)//延时函数
{
  unsigned int j;
  for(;i>0;i--)
    for(j=15;j>0;j--);
}
/***********************************************************/
void main(void)     
{
  uint j;  
  unsigned long int num;
      
         while(1)      
         {
             j++;
                 if(j==1)
                 {
                  j=0;
                  num++;
                 }
                 if(num==99999999)
                 
                 num=0;



wei=1;//至高电平
P0=EL_weima[0];//取位码
wei=0;//锁存
P0=0x00;//消影
duan=1;//至高电平
P0=EL_duanma[num/10000000];//千万位
duan=0;//锁存
delayms(8);
P0=0xff;//消影


        wei=1;//至高电平
        P0=EL_weima[1];//取位码
        wei=0;//锁存
        P0=0x00;//消影
        duan=1;//至高电平
        P0=EL_duanma[num%10000000/1000000];//百万位
        duan=0;//锁存
        delayms(8);
        P0=0xff;//消影

                        wei=1;//至高电平
                P0=EL_weima[2];//取位码
                wei=0;//锁存
                P0=0x00;//消影
                duan=1;//至高电平
                P0=EL_duanma[num%10000000%1000000/100000];//十万位
                duan=0;//锁存
                delayms(8);
                P0=0xff;//消影
               
               
                wei=1;//至高电平
                P0=EL_weima[3];//取位码
                wei=0;//锁存
                P0=0x00;//消影
                duan=1;//至高电平
                P0=EL_duanma[ num%10000000%1000000%100000/10000];//万位
                duan=0;//锁存
                delayms(8);
                P0=0xff;//消影
                                        wei=1;//至高电平
                        P0=EL_weima[4];//取位码
                        wei=0;//锁存
                        P0=0x00;//消影
                        duan=1;//至高电平
                        P0=EL_duanma[num%10000000%1000000%100000%10000/1000];//千位
                        duan=0;//锁存
                        delayms(8);
                        P0=0xff;//消影
                        
                        
                                wei=1;//至高电平
                                P0=EL_weima[5];//取位码
                                wei=0;//锁存
                                P0=0x00;//消影
                                duan=1;//至高电平
                                P0=EL_duanma[num%10000000%1000000%100000%10000%1000/100];//百位位
                                duan=0;//锁存
                                delayms(8);
                                P0=0xff;//消影
                                                wei=1;//至高电平
                                        P0=EL_weima[6];//取位码
                                        wei=0;//锁存
                                        P0=0x00;//消影
                                        duan=1;//至高电平
                                        P0=EL_duanma[num%10000000%1000000%100000%10000%1000%100/10];//十位
                                        duan=0;//锁存
                                        delayms(8);
                                        P0=0xff;//消影
                                       
                                       
                                                wei=1;//至高电平
                                                P0=EL_weima[7];//取位码
                                                wei=0;//锁存
                                                P0=0x00;//消影
                                                duan=1;//至高电平
                                                P0=EL_duanma[num%10000000%1000000%100000%10000%1000%100%10];//个位
                                                duan=0;//锁存
                                                delayms(8);
                                                P0=0xff;//消影
        



               
          }
}


发表于 2014-6-15 22:01:19 | 显示全部楼层
你用定时器来实现闪灯就完美解决了,启用一个定时器,再写一个定时器中断服务程序,很容易实现你说的功能,不要什么都在主函数里实现
发表于 2014-6-15 22:07:09 | 显示全部楼层
高手在民间啊。学习学习。
 楼主| 发表于 2014-6-16 08:11:19 | 显示全部楼层
H_K_T 发表于 2014-6-15 22:01
你用定时器来实现闪灯就完美解决了,启用一个定时器,再写一个定时器中断服务程序,很容易实现你说的功能, ...

你说的可以实现,但是单片机能多任务处理吗?(并且互不影响彼此的进程!)
发表于 2014-6-18 23:18:41 | 显示全部楼层
复制可以用吗?
发表于 2014-6-19 17:02:37 | 显示全部楼层
路过向楼上学习了。、
 楼主| 发表于 2014-6-21 07:33:33 | 显示全部楼层

允许你复制:要注意的是,单片机P0口作为74HC573锁存器的数据端。P2.0和P2.1分别作为锁存器的位选和段选端。显示内容是0~9999 9999 自加,当然你也可以任意修改!
发表于 2014-6-21 18:14:39 | 显示全部楼层
选用定时器来控制灯一样会影响数码管的显示。只有选用带PWM的单片机来控制,在开始时设置好PWM就可以了。
 楼主| 发表于 2014-6-21 18:31:27 | 显示全部楼层
甲天下家电维修 发表于 2014-6-21 18:14
选用定时器来控制灯一样会影响数码管的显示。只有选用带PWM的单片机来控制,在开始时设置好PWM就可以了。

确实有一种现象:当数码管使用软件延时的时候,数码管8位亮度相同,但是使用定时器中断延时1S后。数码管最后一位总是随数字的变化而忽亮忽暗,51单片机能解决这个问题吗?
发表于 2014-11-30 16:55:52 | 显示全部楼层
你说的问题可以解决 你的称许太繁琐了
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

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

GMT+8, 2024-5-11 22:03 , Processed in 0.078211 second(s), 7 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号

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