打印
[51单片机]

从业将近十年!手把手教你单片机程序框架(连载)

[复制链接]
277920|913
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
jianhong_wu|  楼主 | 2014-3-5 21:49 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 jianhong_wu 于 2015-11-28 01:41 编辑

      大家好,我叫吴坚鸿,从事单片机项目开发已经有快十年了。现在借21IC这个平台把我认为最有价值的东西分享给大家。我这个技术贴每个星期更新一两篇,直到我江郎才尽为止。再次感谢21IC给我们提供这个交流分享的平台。

第一节:吴坚鸿谈初学单片机的误区。

第二节:delay()延时实现LED灯的闪烁。

第三节:累计主循环次数使LED灯闪烁。

第四节:累计定时中断次数使LED灯闪烁。

第五节:蜂鸣器的驱动程序。

第六节:在主函数中利用累计主循环次数来实现独立按键的检测。

第七节:在主函数中利用累计定时中断的次数来实现独立按键的检测。

第八节:在定时中断函数里执行独立按键的扫描程序。

第九节:独立按键的双击按键触发。

第十节:两个独立按键的组合按键触发。

第十一节:同一个按键短按与长按的区别触发。

第十二节:按住一个独立按键不松手的连续步进触发。

第十三节:按住一个独立按键不松手的加速匀速触发。

第十四节:矩阵键盘的单个触发。

第十五节:矩阵键盘单个触发的压缩代码编程。

第十六节:矩阵键盘的组合按键触发。

第十七节:两片联级74HC595驱动16个LED灯的基本驱动程序。

.第十八节:把74HC595驱动程序翻译成类似单片机IO口直接驱动的方式。

第十九节:依次逐个点亮LED之后,再依次逐个熄灭LED的跑马灯程序。

第二十节:依次逐个亮灯并且每次只能亮一个灯的跑马灯程序。

第二十一节:多任务并行处理两路跑马灯。

第二十二节:独立按键控制跑马灯的方向。

第二十三节:独立按键控制跑马灯的速度。

第二十四节:独立按键控制跑马灯的启动和暂停。

第二十五节:用LED灯和按键来模拟工业自动化设备的运动控制。

第二十六节:在主函数while循环中驱动数码管的动态扫描程序。

第二十七节:在定时中断里动态扫描数码管的程序。

第二十八节:数码管通过切换窗口来设置参数。

第二十九节:数码管通过切换窗口来设置参数,并且不显示为0的高位。

第三十节:数码管通过闪烁来设置数据。

第三十一节:数码管通过一二级菜单来设置数据的综合程序。  

第三十二节:数码管中的倒计时程序。

第三十三节:能设置速度档位的数码管倒计时程序。

第三十四节:在数码管中实现iphone4S开机密码锁的程序。

第三十五节:带数码管显示的象棋比赛专用计时器。

第三十六节:带数码管显示的加法简易计算器。

第三十七节:数码管作为仪表盘显示跑马灯的方向,速度和运行状态。

第三十八节:判断数据尾来接收一串数据的串口通用程序框架。

第三十九节:判断数据头来接收一串数据的串口通用程序框架。

第四十节:常用的自定义串口通讯协议。

第四十一节:在串口接收中断里即时解析数据头的特殊程序框架。

第四十二节:通过串口用delay延时方式发送一串数据。

第四十三节:通过串口用计数延时方式发送一串数据。

第四十四节:从机的串口收发综合程序框架

第四十五节:主机的串口收发综合程序框架

第四十六节:利用AT24C02进行掉电后的数据保存。

第四十七节:操作AT24C02时,利用“一气呵成的定时器延时”改善数码管的闪烁现象。

第四十八节:利用DS1302做一个实时时钟  。

第四十九节:利用DS18B20做一个温控器  。

第五十节:利用ADC0832采集电压信号,用平均法和区间法进行软件滤波处理。

第五十一节:利用ADC0832采集电压信号,用连续N次一致性的方法进行滤波处理。

第五十二节:程序后续升级修改的利器,return语句鲜为人知的用法。

第五十三节:指针的第一大好处,让一个函数可以封装多个相当于return语句返回的参数。

第五十四节:指针的第二大好处,指针作为数组在函数中的输入接口。

第五十五节:指针的第三大好处,指针作为数组在函数中的输出接口。

第五十六节:指针的第四大好处,指针作为数组在函数中的输入输出接口。

第五十七节:为指针加上紧箍咒const,避免意外修改了只做输入接口的数据。

第五十八节:指针的第五大好处,指针在众多数组中的中转站作用。

第五十九节:串口程序第40,44,45节中存在一个bug,特此紧急公告。

第六十节:用关中断和互斥量来保护多线程共享的全局变量。

第六十一节:组合BCD码,非组合BCD码,以及数值三者之间的相互转换和关系。

第六十二节:大数据的加法运算。

第六十三节:大数据的减法运算。

第六十四节:大数据的乘法运算。

第六十五节:大数据的除法运算。

第六十六节:单片机外部中断的基础。

第六十七节:利用外部中断实现模拟串口数据的收发。

第六十八节:单片机C语言的多文件编程技巧。

第六十九节:使用static关键字可以减少全局变量的使用。

第七十节:深入讲解液晶屏的构字过程。

第七十一节:液晶屏的字符,16点阵,24点阵和32点阵的显示程序。

第七十二节:在液晶屏中把字体顺时针旋转90度显示的算法程序。

第七十三节:在液晶屏中把字体镜像显示的算法程序。

第七十四节:在液晶屏中让字体可以跨区域无缝对接显示的算法程序。

第七十五节:在12864液晶屏中让字体以1个点阵为单位进行移动显示的算法程序。

第七十六节:如何把一个任意数值的变量显示在液晶屏上。

第七十七节:在1个窗口里通过移动光标来设置不同参数的液晶屏菜单程序。

第七十八节:在多个窗口里通过移动光标来设置不同参数的液晶屏菜单程序。

第七十九节:通过主菜单移动光标来进入子菜单窗口的液晶屏程序。

第八十节:调用液晶屏内部字库来显示汉字或字符的坐标体系和本质。

第八十一节:液晶屏显示串口发送过来的任意汉字和字符。

第八十二节:如何通过调用液晶屏内部字库把一个任意数值的变量显示出来。

第八十三节:矩阵键盘输入任意数字或小数点的液晶屏显示程序。

第八十四节:实时同步把键盘输入的BCD码数组转换成数值的液晶屏显示程序。

第八十五节:实时同步把加减按键输入的数值转换成BCD码数组的液晶屏显示程序。

第八十六节:数字键盘与液晶菜单的综合程序。

第八十七节:郑文显捐赠的工控项目源代码。

第八十八节:电子称连续不断从串口对外发送数据,单片机靠关键字快速截取有效数据串。

第八十九节:用单片机内部定时器做一个时钟。

第九十节:针对行程开关感应器,分享一种既能及时响应,又能抗干扰处理的识别思路。















评论
玥月 2021-7-12 08:03 回复TA
谢谢分享 
icecut 2014-3-6 09:50 回复TA
哈哈.注意不要带广告.年年发一次.真专业 
评分
参与人数 12威望 +16 收起 理由
dianzi1987 + 1 很给力!
wzqdz + 1
cov0xt + 1 很给力!
幻影之殇 + 1 很给力!
tianm + 1 不错 跟 红楼梦 一样长

查看全部评分

相关帖子

883
zwsam| | 2022-8-3 09:11 | 只看该作者

使用特权

评论回复
882
molismart| | 2022-6-21 11:08 | 只看该作者
MARK,赞楼主

使用特权

评论回复
881
gim008| | 2022-6-20 13:27 | 只看该作者
先点赞,后面持续学习

使用特权

评论回复
880
qxZHOU123| | 2022-6-6 18:52 | 只看该作者
点赞。谢谢分享

使用特权

评论回复
879
nwjjdwx| | 2022-4-23 17:48 | 只看该作者
谢谢分享

使用特权

评论回复
878
xianglin| | 2022-2-14 19:44 | 只看该作者
#技术资源# Dianzan.

使用特权

评论回复
877
sdpylee| | 2022-2-14 15:37 | 只看该作者
讲的太好了
谢谢

使用特权

评论回复
876
kqgdlz123| | 2021-6-23 10:55 | 只看该作者
jianhong_wu 发表于 2015-11-28 01:39
第九十节:针对行程开关感应器,分享一种既能及时响应,又能抗干扰处理的识别思路。         我今天在做数 ...

看完了,感谢鸿哥,真是感概良多啊,在看到鸿哥的资料前,我蹉跎了进10年,这么好的教材,卖视频的做不错,学校做不出,偏偏鸿哥免费提供,大恩不言谢,好人会有好报。

使用特权

评论回复
875
kqgdlz123| | 2021-6-2 15:32 | 只看该作者
鸿个,写的太好了

使用特权

评论回复
874
开溜123| | 2021-4-5 12:28 | 只看该作者
谢谢鸿哥

使用特权

评论回复
873
wfw69| | 2020-11-27 13:48 | 只看该作者
现在回头看看,还是入门的好教材!

使用特权

评论回复
872
yanwu5| | 2020-10-9 14:02 | 只看该作者
  要是有讲解视频就好了;

使用特权

评论回复
871
116956018| | 2020-6-18 22:22 | 只看该作者
看了鸿哥的收益良多,能把自己学的分享出来可见鸿哥是心胸宽广之人,希望鸿哥身体健康

使用特权

评论回复
870
chnycdj| | 2019-10-26 14:13 | 只看该作者
不错不错,学习了!

使用特权

评论回复
869
GSerendipity| | 2019-10-14 16:02 | 只看该作者
这个后面还有更新吗

使用特权

评论回复
868
dianzi1987| | 2019-9-26 15:26 | 只看该作者
这帖子实在太棒了,虽然这么多年头了,对于我这个初学者有很大帮助,感谢

使用特权

评论回复
867
li123ds| | 2019-9-26 12:04 | 只看该作者

//红外反射开关,接收头HS0038B,发射管用pnp三极管驱动
//第一次上电,灯亮1秒后熄灭,
//手挡一次开,再挡一次关,如此循环
//实验板测试手挡一次开,再挡一次关 开关正常;
//但是有一个问题,如果手一直挡在前面,LED会不停的亮--灭        -- 亮--灭
//请大神们看下,怎样才能做到手挡在前面不移开,保持一种状态
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int

sbit ir=P2^4;    //红外发射
sbit ir_in=P3^2; //红外接收
sbit led=P1^1;        //

uint cont,cont1;
bit flag_key;         //按键按下标志
bit key_lock=0;


void delay(uint z)           //ms
{
        uint x,y;
        for(x=z; x>0; x--)
                for(y=114; y>0; y--);
}


void fa_38k()          //38k 载波                         //接收头前面有滤光片,发射管要用黑色热缩套管套起来
{                                  //不是很准,没有逻辑分析仪,搞不准,现在的反射距离在60厘米左右(发射管串100欧电阻)
        ir=0;                  
        _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
        
        ir=1;
        _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
        _nop_();//_nop_();
}

void main()
{
        TMOD |= 0X01;                          //T0定时器,模式1, 16位计数
        TH0 = (65536-1000)/256;  //1ms初值 @12MHz晶振
        TL0 = (65536-1000)%256;
        

        ET0=1;
        TR0=1;
        led=0;
        delay(500);
        led=1;
        while(1)
        {
                if(flag==0 )
                {
                        fa_38k();  //发38K
                }
                else ir=1;           //停止发射
           
               




        if(ir_in==0)          //手挡住
        {
                flag_key=1;
                cont1++;
                key_lock=1;       
        }
        else flag_key=0; //手移开
       
        if(flag_key==1 && cont1==100)
        {         
                 ir=1;
                 cont1=0;
                 led = !led;
                 delay(1000);

        }

       
        if(ir_in==1) cont1=0;        //这句抗干扰很好,遥控器对着按,都没反应                       



        }
}

void timer0() interrupt 1
{
        TH0 = (65536-1000)/256;  //重装1ms初值
        TL0 = (65536-1000)%256;
                cont++;
        if(cont==100)  
        {        
                cont=0;
                flag=!flag;         //发100ms 38K,停100ms

        }

}

使用特权

评论回复
866
李不走寻常路| | 2019-9-23 08:33 | 只看该作者
cabot168 发表于 2019-9-21 22:27
第十三节按键长按加速执行里面,
else if(uiKeyTimeCnt1

哪里看不懂了? 需要清晰地指出来

使用特权

评论回复
865
cabot168| | 2019-9-21 22:27 | 只看该作者
第十三节按键长按加速执行里面,
else if(uiKeyTimeCnt1<const_time_1s) //按住累加到1秒
  {
     uiKeyTimeCnt1++;
  }
这句看不懂,哪位大神帮解释下

使用特权

评论回复
864
李不走寻常路| | 2019-9-20 08:55 | 只看该作者
leejack 发表于 2018-11-26 15:46
if(key_sr1==1)//IO是高电平,说明按键没有被按下,这时要及时清零一些标志位
  {
     ucKeyLock1=0;  ...

if(key_sr1==1)
else if(ucKeyLock1==0)
以上两条都不满足的时候,就会执行else if(uiKeyTimeCnt1<const_time_1s) ,你要充分理解if  else语句的执行原理就好理解了。总之!if 的条件不成立  就会执行else 后的语句。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

465

帖子

533

粉丝