本帖最后由 friend0720 于 2016-2-25 19:30 编辑
小结 001
学习AVR已经有一个多月的时光了,最初简陋的开发板现在已经初具规模了。不知道诸位的收获如何?你们自己的开发板现在又是什么样?我的开发板基本上会定格于此,今后不会再有什么大的变化了。今后实验中用到的硬件将不再焊接在开发板上,我们将使用飞线的方式引出MCU的管脚,这也是为什么在一开始的设计中,我们使用双排针跳线帽连接的原因。只要拔掉跳线帽就能断开板子上现有器件与MCU管脚的连接。
回顾过去的一个月,我们主要学习了如下内容:
.IO口控制
.中断控制
.定时器控制
.74hc595驱动
.数码管动态显示
.矩阵键盘扫描
.红外解码
.时钟芯片DS1302驱动
.温度传感器DS18B20驱动
.异步串行通信
上面只是看的到的内容,如果你按照教程一步一步做到这里,相信你学到的远不只这些。那些你通过亲自动手获取的经验远比我教给你的知识宝贵。也许很多人不以为然,认为这些功能太常见、太简单因此提不起兴趣。然而事实却并非如此,在不使用操作系统的情况下,你能让板子上现有的所有功能一同运行而互不干扰吗?相信论坛里很多自以为是的大神都做不到。单单就读取DS18B20温度值而不让动态数码管出现闪烁这一条就能难倒许多所谓的大神。更何况还要响应按键扫描,红外解码,读取时间,再加上与上位机通信等等,绝对可以难倒一大批自以为是的人。在这里我可以肯定的告诉你,板子上的所有功能可以很好的一同工作。之所以这么肯定,是因为它们正很好的一同工作在我的开发板上。
在实现了每个基本功能之后,本人将上面提到的所有功能整合到了一个工程中,实现了一个完整的带温度显示的电子钟功能。时间和温度显示每隔10秒转换一次,当然也可以通过遥控器的“Mode”键切换到纯粹的时间或者温度显示。时间值也可以通过遥控器来设定。并且可以将开发板上的当前时间与温度值通过串口发送到上位机。
整合过程中使用了:
.两个硬件定时器中断,用硬件延时代替原来的软件Delay()。
.一个输入捕获中断,用来实现红外解码
.两个串口中断,实现与上位机的异步串行通信。
在While(1)循环中实现了9个任务,分别是
.DS18B20温度读取任务(每500毫秒读取一次温度值)
.数码管显示任务(每5毫秒刷新一次数码管)
.红外解码按键服务任务(随机响应红外按键)
.软定时器任务0 (10秒软定时器,实现温度、时间显示切换)
.软定时器任务1 (50毫秒软定时器,实现每250毫秒读取一次时间,每250毫秒向上位机发送一次数据)
.软定时器任务2 (500毫秒软定时器,实现每隔500毫秒启动一次温度读取任务)
.按键扫描任务 (检查当前按键)
.按键服务任务 (随机响应当前矩阵按键)
.蜂鸣器任务 (有矩阵按键,或遥控按键按下时蜂鸣器短响)
.空闲任务 (在这里我让调试用LED每隔500毫秒闪烁一次)
下面是上位机显示画面,上位机显示每250毫秒刷新一次。对于我们这个温度时钟来讲这个刷新频率已经足够了。串口波特率 115200 帧格式 8,n, 1 。
自定义通信协议:
每次串行通信8字节,只接收不应答(因为没必要),格式如下
0xF5 + 秒+ 分钟 + 小时+ 温度 + 0 + 校验和 + 0xF5
示例代码如下:
//发送数据到上位机
buf[0]=0xF5;
buf[1]=ucSecond;
buf[2]=ucMinute;
buf[3]=ucHour;
buf[4]=(U8)g_cT; //当前温度
buf[5]=0;
buf[6]=buf[1]^buf[2]^buf[3]^buf[4]^buf[5]; //计算校验和
buf[7]=0xF5;
UART_SendData(buf,8);
这是用串口助手收到的数据
之前用惯了VC6.0,这次改用VS2005写上位机着实难为了本人一番,前后用时居然达到了3天时间。呵呵!现在都VS2012了,这可咋办?哥的电脑还在跑32位的XP是不是太落伍了?就到这吧,祝各位玩的愉快,还是那句老话:
“勿在浮沙筑高台”
遥远的海
(待续)