搜索
bottom↓
楼主: tangwei039

从单片机初学者迈向单片机工程师(一份正真的让你成为工程师的贴子)

  [复制链接]

出0入0汤圆

发表于 2012-11-11 16:32:28 来自手机 | 显示全部楼层
标记下来,说的不错真心不错

出0入0汤圆

发表于 2012-11-10 11:42:37 | 显示全部楼层
向楼主致敬,让我提高了不少;
非常感谢;

出0入0汤圆

发表于 2012-11-4 10:00:52 | 显示全部楼层
用按键和数码管以及单片机定时器实现一个简易的可以调整的时钟,要求如下:
8位数码管显示,显示格式如下
时-分-秒
XX-XX-XX
要求:系统有三个按键,功能分别是调整,加,减。在第一次按下调整键时候,停止走时,显示秒的两位数码管以1 Hz 频率闪烁;如果第二次按下调整键,则分开始闪烁,秒恢复正常显示;如果第三次按下调整键,则时开始闪烁,分恢复正常显示;如果第四次按下调整键,时恢复正常显示,开始走时。在数码管闪烁的时候,按下加或者减键可以调整相应的显示内容。
/*****************************
作者:liyang
日期:2012年10月27日
目标MCU:STC89C51  晶振:11.0592M
******************************/
#include<reg51.h>
typedef unsigned char uint8;
typedef unsigned int uint16;
uint8 LedBitCnt; //LedBitCnt控制数码管的位选
uint8 flagm=0,flagf=0,flags=0;//时分秒闪烁的控制标志位
uint8 ms2_flag; //2ms数码管动态扫描时标消息
uint ms10_flag,ms500_flag;
uint8 ms2_cnt,ms10_cnt,count,s1num;
uint8 dis_buff[8]={0};
uint8 shi=12,fen=23,miao=56;
uint8 code SegTab[]={0x3f,0x06,0x5b,0x4f,
                                        0x66,0x6d,0x7d,0x07,
                                        0x7f,0x6f,0x40,0x00};
sbit ADDR0 = P2^0;//74hc138的输入控制端A
sbit ADDR1 = P2^1;//74hc138的输入控制端B
sbit ADDR2 = P2^2;//74hc138的输入控制端C
sbit adjust=P3^2;
sbit add=P3^3;
sbit sub=P3^4;
void delayms(uint8  z)
{
        uint8 i,j;
        for(i=z;i>0;i--)
                for(j=110;j>0;j--);
}

void disp()
{
        P0=SegTab[dis_buff[LedBitCnt]];
        switch(LedBitCnt)
        {
                case 0:
                ADDR0=0;ADDR1=0;ADDR2=0;
                break;
                case 1:
                ADDR0=1;ADDR1=0;ADDR2=0;
                break;
                case 2:
                ADDR0=0;ADDR1=1;ADDR2=0;
                break;
                case 3:
                ADDR0=1;ADDR1=1;ADDR2=0;
                break;
                case 4:
                ADDR0=0;ADDR1=0;ADDR2=1;
                break;
                case 5:
                ADDR0=1;ADDR1=0;ADDR2=1;
                break;
                case 6:
                ADDR0=0;ADDR1=1;ADDR2=1;
                break;
                case 7:
                ADDR0=1;ADDR1=1;ADDR2=1;
                break;
        }

}
void time_to_disbuff(void)
{
        if(flagm&(!ms500_flag))
        {   
                dis_buff[7]=11;
                dis_buff[6]=11;
          }
          else
        {
                dis_buff[7]=miao%10;
                dis_buff[6]=miao/10;
        }
        dis_buff[5]=10;
        if(flagf&(!ms500_flag))
        {   
                dis_buff[4]=11;
                dis_buff[3]=11;
          }
        else
        {
                dis_buff[4]=fen%10;
                dis_buff[3]=fen/10;
        }
        dis_buff[2]=10;
        if(flags&(!ms500_flag))
        {   
                dis_buff[1]=11;
                dis_buff[0]=11;
          }
        else
        {
                dis_buff[1]=shi%10;
                dis_buff[0]=shi/10;
          }
}
void init()
{
        TMOD=0x11;
        TH1=0xf8;
        TL1=0xcd;
        TH0=0x4c;
        TL0=0x00;
        TR0=1;
        ET0=1;
        TR1=1;
        ET1=1;                       
}
void keyscan()
{
        if(adjust==0)
                {
                        delayms(10);
                        if(adjust==0)
                                {
                                        s1num++;
                                        while(!adjust);
                                        if(s1num==1)
                                        {
                                                flagm=1;
                                                TR0=0;
                                        }
                                }
                }
               
                        if(s1num==2)
                {
                        flagm=0;
                        flagf=1;
                }

         if(s1num==3)
                {
                        flagm=0;
                        flagf=0;
                        flags=1;
                }
        if(s1num==4)
        {
                TR0=1;
                flags=0;
                s1num=0;
        }
        if(adjust!=0)
                {
                        if(add==0)
                        {
                                delayms(10);
                                if(add==0)
                                {
                                        while(!add);
                                        if(s1num==1)
                                        {
                                                miao++;
                                                if(miao==60)
                                                        miao=0;
                                       
                                               
                                               
                                        }
                                        if(s1num==2)
                                        {
                                                fen++;
                                                if(fen==60)
                                                        fen=0;
                                               
                                       
                                        }
                                        if(s1num==3)
                                        {
                                                shi++;
                                                if(shi==24)
                                                        shi=0;
                                               
                                        }
                                }
                        }
                        if(sub==0)
                        {
                                delayms(10);
                                if(sub==0)
                                {
                                        while(!sub);
                                        if(s1num==1)
                                        {
                                       
                                                miao--;
                                                if(miao==-1)
                                                        miao=59;
                                               
                                        }
                                        if(s1num==2)
                                        {
                                                fen--;
                                                if(fen==-1)
                                                        fen=59;
                                       
                                        }
                                        if(s1num==3)
                                        {
                                                shi--;
                                                if(shi==-1)
                                                        shi=23;
                                               
                                        }
                                }
                        }
                }
       
       
}
void main()
{
        init();
        EA=1;
        time_to_disbuff();
        P0=0x00;
        while(1)
        {               
                keyscan();
                if(ms2_flag)
                        {
                                ms2_flag=0;
                            LedBitCnt++;
                                if(LedBitCnt>7)
                                {
                                        LedBitCnt=0;
                                }
                                time_to_disbuff();
                                disp();
                       
                        }       
                if(ms10_flag)
                        {
                                ms10_flag=0;
                        }
       
        }
       
}
void timer0() interrupt 1
{
        TH0=0x4c;
        TL0=0x00;
        count++;
        if(count==20)
        {
                count=0;
                miao++;
                if(miao==60)
                {
                        miao=0;
                        fen++;
                        if(fen==60)
                        {
                                fen=0;
                                shi++;
                                if(shi==24)
                                {
                                        shi=0;
                                }
                        }
                }
        }

}
void timer1() interrupt 3  //定时1ms
{
        TH1=0xf8;
        TL1=0xcd;
        ms2_flag=1;   //用于数码管显示
        ms2_cnt++;
        if(ms2_cnt>=5)
        {
                ms2_cnt=0;  
                ms10_flag=1;//用于键扫描
                if(++ms10_cnt>=50)
                        {
                                ms10_cnt=0;
                                ms500_flag=~ms500_flag;
                        }
        }
}
总结:1 先开辟一个数码管显示的缓冲区,动态扫描函数函数负责从这个缓冲区中取出数据,并扫描显示。而其他函数则可以修改该缓冲区,从而改变显示的内容。
2 要学会标志位的灵活应用
3 按键程序存在不足,使用了延时函数delayms(10),让控制器在这白白等待了10ms的时间,啥也没干。这是不可取的。其次while(!adjust);更是程序设计的大忌(极少的特殊情况例外)。原本是等待按键释放,结果CPU就一直死死的盯住该按键,其他事情都不管了。
4 要处理好按键程序不足,就得学习按键状态机
5 继续学习,完善我的电子时钟,谢谢楼主的分享


出0入0汤圆

发表于 2012-10-30 21:36:06 | 显示全部楼层
讲的很实用,都是工程方面用到的,支持一下,同时谢谢楼主的无私精神!!

出0入0汤圆

发表于 2012-10-29 17:02:18 | 显示全部楼层
多好啊!想不顶都难啊!

出0入0汤圆

发表于 2012-10-28 23:58:40 来自手机 | 显示全部楼层
马克之,写的不错

出0入264汤圆

发表于 2012-10-28 20:58:06 | 显示全部楼层
3年了,这个帖子还不死,没有料到啊。估计是楼最高的技术贴了吧。等到2500贴开更,哈哈。

出0入0汤圆

发表于 2012-10-28 20:23:13 | 显示全部楼层
1024 1024 1024 1024

出0入0汤圆

发表于 2012-10-24 23:05:42 | 显示全部楼层
厉害啊支持

出0入0汤圆

发表于 2012-10-24 22:59:14 | 显示全部楼层
大三学生,学习了

出0入0汤圆

发表于 2012-10-24 22:56:55 | 显示全部楼层
支持一个

出0入0汤圆

发表于 2012-10-24 17:02:42 | 显示全部楼层
不错  MARK了慢慢看

出0入0汤圆

发表于 2012-10-24 08:35:09 | 显示全部楼层
楼主威武!

出0入0汤圆

发表于 2012-10-24 00:19:33 | 显示全部楼层
谢谢楼主分享,我是一个单片机的初学者,今年大三,大一的时候学过单片机,那是感觉好难,而现在数电模电什么的都学了,微机原理也正在学,就单单看开发板上的教程挺简单的,我几乎用了几天时间就学完了,我想问的是,现在我是原理都知道,但让我独自写一个有难度的程序可能会写不出来,比如我做AD转换的时候,把原理弄懂了,程序都是拷贝别人的,虽然我知道IIC协议,但是我独自写不出来,我困惑的是我要不要一步一步独自写程序,做的非常熟练,还是就像现在这样,做的时候,弄懂原理后直接借鉴别人的能做出来就行了,请各位高手给点意见,不胜感激,谢谢了。

出0入0汤圆

发表于 2012-10-23 18:42:18 | 显示全部楼层
支持!

出0入0汤圆

发表于 2012-10-22 22:44:04 | 显示全部楼层
这个在大一的时候看过,还学习过。。

出0入0汤圆

发表于 2012-10-22 18:55:54 | 显示全部楼层
用按键和数码管以及单片机定时器实现一
个简易的可以调整的时钟,要求如下:
8位数码管显示,显示格式如下
时-分-秒
XX-XX-XX
要求:系统有四个按键,功能分别是调整,加,减,确定。在按下调整键时候,显示时的
两位数码管以1 Hz 频率闪烁。如果再次按下调整键,则分开闪烁,依次循环,直到按下确
定键,恢复正常的显示。在数码管闪烁的时候,按下加或者减键可以调整相应的显示内容。
按键支持短按,和长按,即短按时,修改的内容每次增加一或者减小一,长按时候以一定速
率连续增加或者减少。
最近本人在做,请教一下 “按下调整键时候,显示时的两位数码管以1 Hz 频率闪烁”怎么实现呀???

出0入0汤圆

发表于 2012-10-22 18:55:20 | 显示全部楼层
真的好贴,xiexie

出0入0汤圆

发表于 2012-10-22 14:59:06 | 显示全部楼层
真是好文章啊。

出0入0汤圆

发表于 2012-10-21 07:06:47 来自手机 | 显示全部楼层
做个记号

出0入0汤圆

发表于 2012-10-19 19:07:52 | 显示全部楼层
支持楼主

出0入0汤圆

发表于 2012-10-19 16:09:30 | 显示全部楼层
学了两章,接着学,希望楼主继续发帖

出0入0汤圆

发表于 2012-10-19 13:21:41 | 显示全部楼层
很受启发,值得好好研读

出0入0汤圆

发表于 2012-10-19 13:10:19 | 显示全部楼层
很好的帖子,学习了

出0入0汤圆

发表于 2012-10-19 10:31:40 | 显示全部楼层
吸取经验与教训

出0入0汤圆

发表于 2012-10-17 19:48:07 | 显示全部楼层
顶楼主 顶到天上去

出0入0汤圆

发表于 2012-10-16 21:18:21 | 显示全部楼层
期待完整版#谢谢@

出0入0汤圆

发表于 2012-10-16 13:22:17 | 显示全部楼层
顶起,这一系列文章,我个人真的是看过很多遍了,感觉真的是受益匪浅!

望楼主,继续发布,让更多的人学会实实在在的编程思想

出0入0汤圆

发表于 2012-10-14 15:12:52 | 显示全部楼层
谢谢分享~~~~~~~~~~~~~~

出0入0汤圆

发表于 2012-10-14 14:47:00 | 显示全部楼层
谢谢楼主的分享,严重支持!~~~

出0入0汤圆

发表于 2012-10-14 14:34:09 | 显示全部楼层
得记下来慢慢看

出0入0汤圆

发表于 2012-10-10 09:58:43 | 显示全部楼层
学习一下

出0入0汤圆

发表于 2012-10-10 09:57:34 | 显示全部楼层
楼主,继续更新呀,在等待中

出0入0汤圆

发表于 2012-10-9 19:37:03 | 显示全部楼层
不错~mark

出0入0汤圆

发表于 2012-10-6 18:59:00 | 显示全部楼层
把这个看了,有一种醍醐灌顶的感觉。感激啊

出0入0汤圆

发表于 2012-10-3 22:13:57 | 显示全部楼层
顶!! 希望楼主继续!!!

出0入0汤圆

发表于 2012-9-28 14:08:52 | 显示全部楼层
tangwei039 发表于 2010-4-19 21:26
如果大家需要,我把后面也传上来!

KEY篇第一章----按键程序编写的基础

谢谢楼主的分享,感觉很好,能不能发给我一份全的?我的邮箱:wangzhiqing120#163.com

出0入0汤圆

发表于 2012-9-28 14:04:44 | 显示全部楼层
顶,谢谢分享!继续啊lz

出0入0汤圆

发表于 2012-9-28 13:19:51 | 显示全部楼层
给力了,好好学习

出0入0汤圆

发表于 2012-9-27 20:36:13 | 显示全部楼层
sctwp 发表于 2010-4-20 22:05
虽然只看了几行但是一定要顶

写的很精辟,学51的好东西!

出0入0汤圆

发表于 2012-9-27 15:31:16 | 显示全部楼层
不错哦,值得看看!

出0入0汤圆

发表于 2012-9-26 16:47:49 | 显示全部楼层
好长……标记一下漫漫看~

出0入0汤圆

发表于 2012-9-24 16:18:17 | 显示全部楼层
好长好多啊   
能一次发下来该多好哦

出0入0汤圆

发表于 2012-9-22 10:38:08 | 显示全部楼层

地道,收藏,谢谢楼主哥。

出0入0汤圆

发表于 2012-9-14 16:20:34 | 显示全部楼层
学习了,谢谢LZ分享

出0入0汤圆

发表于 2012-9-14 00:37:59 | 显示全部楼层
mark,支持

出0入0汤圆

发表于 2012-9-12 23:55:34 | 显示全部楼层
这篇帖子,对我来说真是醍醐灌顶。谢谢楼主

出0入0汤圆

发表于 2012-9-12 23:15:13 | 显示全部楼层
学习学习

出0入0汤圆

发表于 2012-9-12 16:40:54 | 显示全部楼层
这个我好像没留名。

出0入0汤圆

发表于 2012-9-10 10:00:25 | 显示全部楼层
看之后收益匪浅,谢谢楼主。希望继续有更多的

出0入0汤圆

发表于 2012-9-9 17:25:18 | 显示全部楼层
这个怎么说呢  对于延时的事情不想有太多的口水  不过LZ写得不错

出0入0汤圆

发表于 2012-9-9 15:35:03 | 显示全部楼层
好贴啊..........果断全屏幕截屏

出0入0汤圆

发表于 2012-9-8 22:24:54 | 显示全部楼层
有空再回来看看!

出0入0汤圆

发表于 2012-9-8 22:24:23 | 显示全部楼层
mark               

出0入0汤圆

发表于 2012-9-6 16:54:44 | 显示全部楼层
收藏一下!慢慢拜读!

出0入0汤圆

发表于 2012-8-31 09:46:19 | 显示全部楼层
总结得很好,赞!

出0入0汤圆

发表于 2012-8-30 17:51:42 | 显示全部楼层
顶楼主,这么好的文章真不容易啊

出0入0汤圆

发表于 2012-8-30 15:54:18 | 显示全部楼层
支持楼主哦!

出0入0汤圆

发表于 2012-8-28 21:43:35 | 显示全部楼层
看了前面一段~~ 先顶上,辛苦了~ 学习中

出0入0汤圆

发表于 2012-8-28 17:01:44 | 显示全部楼层
重复包含那句解释还不是很明白,是指包含外部函数,还是头文件啊?

出0入0汤圆

发表于 2012-8-28 11:22:43 | 显示全部楼层
学习!!!!!!!!谢谢!!!!!!!!!!!

出50入0汤圆

发表于 2012-8-27 23:58:55 来自手机 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2012-8-26 11:30:09 | 显示全部楼层
学习了~

出0入0汤圆

发表于 2012-8-25 23:27:23 | 显示全部楼层
版主,没写完吧,后面怎么没了。看过前面的受益颇深,谢谢!

出0入0汤圆

发表于 2012-8-25 22:30:29 | 显示全部楼层
支持版主,这些很受用呀!

出0入0汤圆

发表于 2012-8-21 23:47:51 | 显示全部楼层
楼主是敲上去的,还是COPY的

出0入0汤圆

发表于 2012-8-21 23:44:04 | 显示全部楼层
好东西,说的很对

出0入0汤圆

发表于 2012-8-21 18:00:37 | 显示全部楼层
mark!!!

出0入0汤圆

发表于 2012-8-20 21:49:53 | 显示全部楼层
好东西,什么时候发一个pdf合集吧

出50入0汤圆

发表于 2012-8-20 21:47:23 | 显示全部楼层
mark收藏

出0入0汤圆

发表于 2012-8-20 20:57:54 | 显示全部楼层
真心感谢楼主,学习啦

出0入0汤圆

发表于 2012-8-19 05:55:34 | 显示全部楼层
期待完整版,谢谢!

出0入0汤圆

发表于 2012-8-18 12:23:57 | 显示全部楼层
楼主高义,写得很实在。实用性很高。
               拜谢!!

出0入0汤圆

发表于 2012-8-16 16:59:07 | 显示全部楼层
楼主好人啊!初学PIC遇到这样的文章,太给力了!!!!顶起!

出0入0汤圆

发表于 2012-8-16 13:01:30 | 显示全部楼层
支持 加油 学习单片机的同学们

出0入0汤圆

发表于 2012-8-13 13:07:43 | 显示全部楼层
经典的资料

出0入0汤圆

发表于 2012-8-12 13:13:27 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2012-8-10 18:00:31 | 显示全部楼层
tangwei039 发表于 2010-4-19 21:27
看大家需要了。不然就不费这么大的力气了。呵呵!!!

谢谢楼主!好人啊!

出0入0汤圆

发表于 2012-8-10 11:05:51 | 显示全部楼层
顶顶  谢谢分享

出0入0汤圆

发表于 2012-8-10 11:05:26 | 显示全部楼层
顶顶   

出0入0汤圆

发表于 2012-8-9 20:33:37 | 显示全部楼层
支持个哦

出0入0汤圆

发表于 2012-8-9 09:46:50 | 显示全部楼层
楼主辛苦了,一口气发了5个贴,让我的积分上了50,TKS!

出0入0汤圆

发表于 2012-8-9 09:40:54 | 显示全部楼层
你在哪弄的这个帖子牙

出0入0汤圆

发表于 2012-8-9 09:35:26 | 显示全部楼层
不错你就继续更新吧

出0入0汤圆

发表于 2012-8-9 07:11:40 | 显示全部楼层
这个不顶不行~~~~~~~~~~~~~~~~

出0入0汤圆

发表于 2012-8-9 00:29:55 | 显示全部楼层
实用。支持。

出0入0汤圆

发表于 2012-8-8 23:16:45 | 显示全部楼层
写的真好!

出0入0汤圆

发表于 2012-8-8 20:30:53 | 显示全部楼层
开过好几次头,都没有学下去,就是因为没遇到这么棒的文章,和实践还联系得这么紧。挺LZ。

出0入0汤圆

发表于 2012-8-7 15:15:31 | 显示全部楼层
  MARK先…………

出0入0汤圆

发表于 2012-8-7 12:40:17 | 显示全部楼层
经典啊 顶顶

出0入0汤圆

发表于 2012-8-7 12:19:03 | 显示全部楼层
谢谢楼主,非常有帮助!期待完善!!

出0入0汤圆

发表于 2012-8-7 10:38:07 | 显示全部楼层
不错不错谢谢分享

出0入0汤圆

发表于 2012-8-4 23:18:52 | 显示全部楼层
楼主   要全板

出0入0汤圆

发表于 2012-8-4 11:24:51 | 显示全部楼层
真是厉害,膜拜,向您学习

出0入0汤圆

发表于 2012-8-4 07:55:25 | 显示全部楼层
O(∩_∩)O谢谢

出0入0汤圆

发表于 2012-8-3 21:30:33 | 显示全部楼层
受教了,非常谢谢楼主

出0入0汤圆

发表于 2012-8-3 09:59:51 | 显示全部楼层
文章的格局很大啊。

出5入8汤圆

发表于 2012-8-2 19:57:35 | 显示全部楼层
写的很好啊,对与我这个初学者来说很使用!

出0入0汤圆

发表于 2012-8-2 14:22:16 | 显示全部楼层
mark            

出0入0汤圆

发表于 2012-8-2 13:58:28 | 显示全部楼层
高手高见了,谢谢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-19 04:07

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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