打印
[51单片机]

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

[复制链接]
楼主: jianhong_wu
手机看帖
扫描二维码
随时随地手机跟帖
221
谢谢分享

使用特权

评论回复
222
igoonline| | 2014-4-24 19:25 | 只看该作者
MARK

使用特权

评论回复
223
电子宜宾| | 2014-4-24 23:31 | 只看该作者
确实是个哥,不错哈 顶你

使用特权

评论回复
224
jianhong_wu|  楼主 | 2014-4-25 00:06 | 只看该作者
tanyuxin 发表于 2014-4-23 11:25
坚鸿哥:你简直就是我们这些懂一点硬件,但是苦于在软件那方面难以入门,只是停留在让灯亮灭水平的人的偶像 ...

"不要怕误导我们,我们不怕误导,怕的是没有老师指导。"有你这句话,我备受鼓舞,知己呀。

使用特权

评论回复
225
jianhong_wu|  楼主 | 2014-4-25 00:08 | 只看该作者
woairgzn 发表于 2014-4-23 22:01
好,好。高手就别喷啦,可以绕道。咱刚入门的新手喜欢这样的。

感谢感谢。不单单是新手,其实很多老手也喜欢。

使用特权

评论回复
226
jianhong_wu|  楼主 | 2014-4-25 00:11 | 只看该作者
tgz_58 发表于 2014-4-23 13:56
新来的菜鸟,“ucKeyLock1=0; //按键触发后自锁的变量标志”。
问为何在“else if(ucKeyLock1==0)//有按键 ...

其实热心网友“abbccc308”已经回复你了。要明白它的意思,首先你要明白C语言语法中
if(条件)
{}
else(条件)
{}
它们是一个组合,不能拆开来看。它们二者只选其一。

使用特权

评论回复
227
jianhong_wu|  楼主 | 2014-4-25 10:45 | 只看该作者
本帖最后由 jianhong_wu 于 2014-4-26 10:18 编辑

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

开场白:
上一节讲了通过串口用delay延时方式发送一串数据,这种方式要求发送一串数据的时候一气呵成,期间不能执行其它任务,由于delay(400)这个时间还不算很长,所以可以应用在很多简单任务的系统中。但是在某些任务量很多的系统中,实时运行的主任务不允许被长时间和经常性地中断,这个时候就需要用计数延时来替代delay延时。本节要教会大家两个知识点:
第一个:用计数延时方式发送一串数据的程序框架。
第二个:环形消息队列的程序框架。

具体内容,请看源代码讲解。

(1)硬件平台:
    基于朱兆祺51单片机学习板。

(2)实现功能:
     波特率是:9600.
用朱兆祺51单片机学习板中的S1,S5,S9,S13作为独立按键。
    按一次按键S1,发送EB 00 55 01 00 00 00 00 41
按一次按键S5,发送EB 00 55 02 00 00 00 00 42
按一次按键S9,发送EB 00 55 03 00 00 00 00 43
按一次按键S13,发送EB 00 55 04 00 00 00 00 44
(3)源代码讲解如下:
第四十三节源代码讲解.rar (4.16 KB)
总结陈词:
       前面几个章节中,每个章节要么独立地讲解串口收数据,要么独立地讲解发数据,实际上在大部分的项目中,串口都需要“一收一应答”的握手协议,上位机作为主机,单片机作为从机,主机先发一串数据,从机收到数据后进行校验判断,如果校验正确则返回正确应答指令,如果校验错误则返回错误应答指令,主机收到应答指令后,如果发现是正确应答指令则继续发送其它的新数据,如果发现是错误应答指令,或者超时没有接收到任何应答指令,则继续重发,如果连续重发三次都是错误应答或者无应答,主机就进行报错处理。读者只要把我的串口收发程序结合起来,就很容易实现这样的功能,我就不再详细讲解了。从下一节开始我讲解单片机掉电后数据保存的内容,欲知详情,请听下回分解-----利用AT24C02进行掉电后的数据保存。

(未完待续,下节更精彩,不要走开哦)

使用特权

评论回复
228
yk910127| | 2014-4-25 20:46 | 只看该作者
很期待 ,一直关注

使用特权

评论回复
229
mrjackyu| | 2014-4-26 17:39 | 只看该作者
很实在!
鸿哥,请问一下,我学习的一个项目,用51单片机P2^6口0/1占空比驱动三极管再驱动mosfet,使灯可按开关调节亮度,现在有一个问题,启动的时候灯会猛亮一下,小于0.1秒;我估计是P2^6口上电的时候输出是1,到程序开始把它写0有0.0004S的时间,造成mosfet导通状态,请问如何写能在上电的时候给P2^6写个0,或者其他办法解决这个问题?谢谢
我把程序精简成这样还是会有闪一下~,证明是上电那一下造成的吧!
#include<reg51.h>
sbit driver=P2^6;
/***************************/
void main()
{
        init();
}
/***************************/
void init()
{

        driver=0;
}
/***************************/

使用特权

评论回复
230
czq624589971| | 2014-4-26 19:18 | 只看该作者
mark,继续学习中

使用特权

评论回复
231
jianhong_wu|  楼主 | 2014-4-26 19:29 | 只看该作者
本帖最后由 jianhong_wu 于 2014-4-26 19:40 编辑
mrjackyu 发表于 2014-4-26 17:39
很实在!
鸿哥,请问一下,我学习的一个项目,用51单片机P2^6口0/1占空比驱动三极管再驱动mosfet,使灯可按 ...

第一种方法:
软件初始化里:driver=0;
硬件上在电阻R3的左端加一个5.1K的下拉电阻。
如果这种方法还不行,请试我第二种方法。

第二种方法:
软件初始化里:driver=1;
硬件上在电阻R3的左端另外多增加两个5.1K的电阻和一个PNP三极管,电路图如下:


使用特权

评论回复
232
mrjackyu| | 2014-4-26 22:16 | 只看该作者
jianhong_wu 发表于 2014-4-26 19:29
第一种方法:
软件初始化里:driver=0;
硬件上在电阻R3的左端加一个5.1K的下拉电阻。

第一方法不行;
第二个方式实际是,原来高电平触发,改成低电平触发,这个电路相当于一个取反,可行;
我也想到了一个,R3左端接VCC,Q2 E极接弹片机,实现低电平有效;程序改成低电平有效;


谢谢

使用特权

评论回复
233
jianhong_wu|  楼主 | 2014-4-26 22:36 | 只看该作者
mrjackyu 发表于 2014-4-26 22:16
第一方法不行;
第二个方式实际是,原来高电平触发,改成低电平触发,这个电路相当于一个取反,可行;
我 ...

没错,你的方法也行,而且电路更加简单。我两年前曾经用你的方法做串口通讯的5V与3.3V的电平兼容转换,效果很好。

使用特权

评论回复
234
mrjackyu| | 2014-4-27 00:48 | 只看该作者
jianhong_wu 发表于 2014-4-26 22:36
没错,你的方法也行,而且电路更加简单。我两年前曾经用你的方法做串口通讯的5V与3.3V的电平兼容转换,效 ...

:handshake

使用特权

评论回复
235
cjseng| | 2014-4-27 00:52 | 只看该作者
jianhong_wu 发表于 2014-4-26 22:36
没错,你的方法也行,而且电路更加简单。我两年前曾经用你的方法做串口通讯的5V与3.3V的电平兼容转换,效 ...

5V与3.3V的电平兼容,串个电阻就可以了吧,何必搞得这么复杂?

使用特权

评论回复
236
jianhong_wu|  楼主 | 2014-4-27 01:12 | 只看该作者
cjseng 发表于 2014-4-27 00:52
5V与3.3V的电平兼容,串个电阻就可以了吧,何必搞得这么复杂?

我曾经在5V的单片机和3.3V的CPLD之间是直接串一个470欧的电阻就可以了。但是有一些新项目,我是第一次接触,又没有参考样品,为了保险起见一次通过,我就用了三极管进行电平转换。

使用特权

评论回复
237
keytst| | 2014-4-27 20:10 | 只看该作者
谢谢分享,期待后面的帖子。。

使用特权

评论回复
238
lux3333| | 2014-4-27 23:35 | 只看该作者
记号,记号,日后再看

使用特权

评论回复
239
cjseng| | 2014-4-28 00:11 | 只看该作者
mrjackyu 发表于 2014-4-26 22:16
第一方法不行;
第二个方式实际是,原来高电平触发,改成低电平触发,这个电路相当于一个取反,可行;
我 ...

你试试:不断上下电,看看你的电路是否正常。

使用特权

评论回复
240
wqx0532| | 2014-4-28 15:29 | 只看该作者
不错 整理个pdf 上传就好了

使用特权

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

本版积分规则