打印
[51单片机]

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

[复制链接]
楼主: jianhong_wu
手机看帖
扫描二维码
随时随地手机跟帖
241
很有用,可以从中学习。非常感谢

使用特权

评论回复
242
renwocai| | 2014-4-28 22:03 | 只看该作者
吴工你好,非常感谢你能这么无私的交流,有个问题,能否把你使用的硬件平台的原理图帖出来?哪怕是PDF的也行,在有些教程中没有原理图,只能靠猜了。

使用特权

评论回复
243
jianhong_wu|  楼主 | 2014-4-28 23:45 | 只看该作者
本帖最后由 jianhong_wu 于 2014-5-22 12:10 编辑

根据你的要求,以下是你所需的朱兆祺学习板原理图。第二版是最新版。
朱兆祺51单片机原理图(第二版本).pdf (1.86 MB)

朱兆祺51学习板的原理图.pdf

2.2 MB

使用特权

评论回复
244
renwocai| | 2014-4-29 13:01 | 只看该作者
非常感谢

使用特权

评论回复
245
Emision| | 2014-4-29 15:59 | 只看该作者
我也来一个支持,刚从也单片机编程行业,很多东西需要去接触和学习,加油

使用特权

评论回复
246
jianhong_wu|  楼主 | 2014-5-3 08:28 | 只看该作者
本帖最后由 jianhong_wu 于 2014-7-21 00:10 编辑

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

开场白:
根据上一节的预告,本来这一节内容打算讲“利用AT24C02进行掉电后的数据保存”的,但是由于网友“261854681”强烈建议我讲一个完整的串口收发程序实例,因此我决定再花两节篇幅讲讲这方面的内容。
实际上在大部分的项目中,串口都需要“一收一应答”的握手协议,上位机作为主机,单片机作为从机,主机先发一串数据,从机收到数据后进行校验判断,如果校验正确则返回正确应答指令,如果校验错误则返回错误应答指令,主机收到应答指令后,如果发现是正确应答指令则继续发送其它的新数据,如果发现是错误应答指令,或者超时没有接收到任何应答指令,则继续重发,如果连续重发三次都是错误应答或者无应答,主机就进行报错处理。
这节先讲从机的收发端程序实例。要教会大家三个知识点:
第一个:为了保证串口中断接收的数据不丢失,在初始化时必须设置IP = 0x10,相当于把串口中断设置为最高优先级,这个时候,串口中断可以打断任何其他的中断服务函数,实现中断嵌套。
第二个:从机端的收发端程序框架。
第三个:从机的状态指示程序框架。可以指示待机,通讯中,超时出错三种状态。

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

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

(2)实现功能:
显示和独立按键部分根据第29节的程序来改编,用朱兆祺51单片机学习板中的S1,S5,S9,S13作为独立按键。
      一共有4个窗口。每个窗口显示一个参数。有两种更改参数的方式:
第一种:按键更改参数:
    第8,7,6,5位数码管显示当前窗口,P-1代表第1个窗口,P-2代表第2个窗口,P-3代表第3个窗口,P-4代表第1个窗口。
    第4,3,2,1位数码管显示当前窗口被设置的参数。范围是从0到9999。S1是加按键,按下此按键会依次增加当前窗口的参数。S5是减按键,按下此按键会依次减少当前窗口的参数。S9是切换窗口按键,按下此按键会依次循环切换不同的窗口。S13是复位按键,当通讯超时蜂鸣器报警时,可以按下此键清除报警。

第二种:通过串口来更改参数:
     波特率是:9600.
通讯协议:EB 00 55  GG 00 02 XX XX  CY
其中第1,2,3位EB 00 55就是数据头
其中第4位GG就是数据类型。01代表更改参数1,02代表更改参数2,03代表更改参数3,04代表更改参数4,
其中第5,6位00 02就是有效数据长度。高位在左,低位在右。
其中从第7,8位XX XX是被更改的参数。高位在左,低位在右。
第9位CY是累加和,前面所有字节的累加。
一个完整的通讯必须接收完4串数据,每串数据之间的间隔时间不能超过10秒钟,否则认为通讯超时出错引发蜂鸣器报警。如果接收到得数据校验正确,
则返回校验正确应答:eb 00        55 f5 00 00 35,
否则返回校验出错应答::eb 00        55 fa 00 00 3a。
   系统处于待机状态时,LED灯一直亮,
   系统处于非待机状态时,LED灯闪烁,
   系统处于通讯超时出错状态时,LED灯闪烁,并且蜂鸣器间歇鸣叫报警。


通过电脑的串口助手,依次发送以下测试数据,将会分别更改参数1,参数2,参数3,参数4。注意,每串数据之间的时间最大不能超过10秒,否则系统认为通讯超时报警。
把参数1更改为十进制的1:   eb 00 55 01 00 02 00 01 44
把参数2更改为十进制的12:  eb 00 55 02 00 02 00 0c 50
把参数3更改为十进制的123: eb 00 55 03 00 02 00 7b c0
把参数4更改为十进制的1234:eb 00 55 04 00 02 04 d2 1c

(3)源代码讲解如下:
第四十四节源代码讲解.rar (6.84 KB)

总结陈词:
   这节详细讲了从机收发端的程序框架,而主机端的程序则用电脑的串口助手来模拟。实际上,主机端的程序也有很多内容,它包括依次发送每一串数据,根据返回的应答来决定是否需要重发数据,重发三次如果没反应则进行报错,以及超时没接收到数据等等内容。主机收发端的程序框架是什么样的?欲知详情,请听下回分解-----主机的串口收发综合程序框架
  
(未完待续,下节更精彩,不要走开哦)

使用特权

评论回复
247
yk910127| | 2014-5-3 10:40 | 只看该作者
非常感谢

使用特权

评论回复
248
ming_10| | 2014-5-3 13:07 | 只看该作者
很有用,可以从中学习。非常感谢

使用特权

评论回复
249
飞龙在你| | 2014-5-3 14:30 | 只看该作者
顶一下  以后我肯定能用到  

使用特权

评论回复
250
hww5408| | 2014-5-4 11:23 | 只看该作者
强烈顶一下,每节我都在看,楼主功底确实不错。
俺认为,程序里的方法、思路、编程习惯,,虽然不可堪称完美,但是,无论新手或老手,其实都有可以学习到地方。

使用特权

评论回复
251
riddickwoo| | 2014-5-4 11:51 | 只看该作者
亲,进度快点吧,等不及。

使用特权

评论回复
252
jianhong_wu|  楼主 | 2014-5-4 13:33 | 只看该作者
hww5408 发表于 2014-5-4 11:23
强烈顶一下,每节我都在看,楼主功底确实不错。
俺认为,程序里的方法、思路、编程习惯,,虽然不可堪称完美 ...

感谢你的精彩点评。

使用特权

评论回复
253
intermec| | 2014-5-6 00:26 | 只看该作者
进度有点慢了

使用特权

评论回复
254
jianhong_wu|  楼主 | 2014-5-6 00:36 | 只看该作者
本帖最后由 jianhong_wu 于 2014-7-21 00:12 编辑

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

开场白:
在大部分的项目中,串口都需要“一收一应答”的握手协议,主机先发一串数据,从机收到数据后进行校验判断,如果校验正确则返回正确应答指令,如果校验错误则返回错误应答指令,主机收到应答指令后,如果发现是正确应答指令则继续发送其它的新数据,如果发现是错误应答指令,或者超时没有接收到任何应答指令,则继续重发,如果连续重发三次都是错误应答或者无应答,主机就进行报错处理。
     上一节已经讲了从机,这节就讲主机的收发端程序实例。要教会大家四个知识点:

第一个:为了保证串口中断接收的数据不丢失,在初始化时必须设置IP = 0x10,相当于把串口中断设置为最高优先级,这个时候,串口中断可以打断任何其他的中断服务函数,实现中断嵌套。
第二个:主机端的收发端程序框架。包括重发,超时检测等等。
第三个:主机的状态指示程序框架。可以指示待机,通讯中,超时出错三种状态。
第四个:其实上一节的LED灯闪烁的时间里,我忘了加原子锁,不加原子锁的后果是,闪烁的时间有时候会不一致,所以这节多增加一个原子锁变量ucLedLock,再次感谢“红金龙吸味”关于原子锁的建议,真的很好用。

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

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

(2)实现功能:
显示和独立按键部分根据第29节的程序来改编,用朱兆祺51单片机学习板中的S1,S5,S9,S13作为独立按键。
      一共有4个窗口。每个窗口显示一个参数。串口可以把当前设置的4个数据发送给从机。从机端可以用电脑的串口助手来模拟。
第一:按键更改参数:
    第8,7,6,5位数码管显示当前窗口,P-1代表第1个窗口,P-2代表第2个窗口,P-3代表第3个窗口,P-4代表第1个窗口。
    第4,3,2,1位数码管显示当前窗口被设置的参数。范围是从0到9999。S1是加按键,按下此按键会依次增加当前窗口的参数。S5是减按键,按下此按键会依次减少当前窗口的参数。S9是切换窗口按键,按下此按键会依次循环切换不同的窗口。S13是启动发送数据和复位按键,当系统处于待机状态时,按下此按键会启动发送数据;当通讯超时蜂鸣器报警时,可以按下此键清除报警,返回到待机的状态。

第二:通过串口把更改的参数发送给从机。
波特率是:9600.
通讯协议:EB 00 55  GG 00 02 XX XX  CY
其中第1,2,3位EB 00 55就是数据头
其中第4位GG就是数据类型。01代表更改参数1,02代表更改参数2,03代表更改参数3,04代表更改参数4,
其中第5,6位00 02就是有效数据长度。高位在左,低位在右。
其中从第7,8位XX XX是被更改的参数。高位在左,低位在右。
第9位CY是累加和,前面所有字节的累加。
一个完整的通讯必须发送完4串数据,每串数据之间的间隔时间不能超过10秒钟,否则认为通讯超时主机会重发数据,如果连续三次都没有返回,则引发蜂鸣器报警。如果接收到得数据校验正确,主机继续发送新的一串数据,直到把4串数据发送完毕为止。

   系统处于待机状态时,LED灯一直亮,
   系统处于非待机状态时,LED灯闪烁,
   系统处于出错状态时,LED灯闪烁,并且蜂鸣器间歇鸣叫报警。

通过电脑的串口助手来模拟从机,返回不同的应答
从机返回校验正确应答:eb 00 55 f5 00 00 35
从机返回校验出错应答:eb 00 55 fa 00 00 3a

(3)源代码讲解如下:
第四十五节源代码讲解.rar (7.4 KB)
总结陈词:
前面花了大量篇幅详细地讲解了串口收发数据的程序框架,从下一节开始我讲解单片机掉电后数据保存的内容,欲知详情,请听下回分解-----利用AT24C02进行掉电后的数据保存。
  
(未完待续,下节更精彩,不要走开哦)

使用特权

评论回复
评分
参与人数 2威望 +2 收起 理由
冰水有温度 + 1 很给力!
a511569143 + 1 赞一个!
255
xuexidsp| | 2014-5-6 12:12 | 只看该作者
赞个,且看且学。

使用特权

评论回复
256
309976659| | 2014-5-6 14:51 | 只看该作者
mark,好贴

使用特权

评论回复
257
huaihebian| | 2014-5-7 09:24 | 只看该作者
强烈建议楼主把资料整理出来,出版书籍,这样第一能提高内容质量,第二也方便读者阅读,目前市场上单片机的书籍多入牛毛, 但精品不多啊;  希望楼主能把内容整理好,配上视频教材,这样才完美

使用特权

评论回复
258
jianhong_wu|  楼主 | 2014-5-7 12:35 | 只看该作者
huaihebian 发表于 2014-5-7 09:24
强烈建议楼主把资料整理出来,出版书籍,这样第一能提高内容质量,第二也方便读者阅读,目前市场上单片机的 ...

感谢你的支持,近期内暂时不考虑写书,以后有时间再考虑。

使用特权

评论回复
259
moxue10| | 2014-5-7 15:43 | 只看该作者
void T0_time() interrupt 1
{
  TF0=0;  //清除中断标志
  TR0=0; //关中断

  if(uiTimeCnt<0xffff)  //设定这个条件,防止uiTimeCnt超范围。
  {
      uiTimeCnt++;  //累加定时中断的次数,
  }

TH0=0xf8;   //重装初始值(65535-2000)=63535=0xf82f
TL0=0x2f;
TR0=1;  //开中断
}

哥  为什么有先关中断后开中断啊  而且TF0=0是什么意思啊

使用特权

评论回复
260
void_chen| | 2014-5-7 20:00 | 只看该作者
很不错的一个串口收发程序教程。自己最近也在开发一个抽油烟机控制器,分为电源板和按键板,通过串口通信控制。很不错,字字珠玑,呵呵。

使用特权

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

本版积分规则