文章目录
1 烧写程序
2 LCD1602
3 PCF8591
4 独立按键
5 直流电机
6 小灯
7 DS1302
8 DS18B20
9 蜂鸣器
10 数码管
11 光敏电阻
12 串口发数据
13 EEPROM AT24C02
14 矩阵键盘
15 红外遥控器
16 如何为某个节点添加上拉电阻
基础操作需要看一下以下的博客,跟着走一遍。 安装MPLAB V4.05+XC8 V1.41,老师不会管你用什么版本,别的版本bug多,老版本反而好用: https://blog.csdn.net/x1131230123/article/details/100907773 安装proteus 8.9: https://blog.csdn.net/x1131230123/article/details/106951776 做一个基础实验(想改写到MPLAB V5+XC8 V2也看这里的博客6.3 移植操作指南): https://blog.csdn.net/x1131230123/article/details/108757436
实物连接指南(持续更新): https://blog.csdn.net/x1131230123/article/details/108780168
多机仿真需要额外学习这个链接的内容(当题目需要用到多块单片机): https://blog.csdn.net/x1131230123/article/details/108934292
1 烧写程序
前面我们已经利用MPLAB生成了hex文件,并把hex文件弄到proteus进行单片机仿真了。 这一节关注的就是怎么把hex文件弄到单片机实物上去运行。 这个就看《 单片机原理及应用(PIC 单片机)实验指导书》实验里第四章节内容。
2 LCD1602
仿真图里只关心数据线,电源线无所谓,所以可以看到下图里LCD1602就7根线好好接到了单片机,而别的引脚都可以不接。但在实物中需要关注得更多。 实物样子: 实物电路图: 从电路图就可以看到LCD1602很多引脚都是在PCB里连接了的:比如3号引脚就是接了一个滑动变阻器R40的,在实物图中也可以看到R40(蓝色的那个,可以用螺丝刀扭它),这个滑动变阻器作用就是调节LCD显示对比度的,在后面下载了程序缺看不到显示,就能看到很多黑色格子,这时调节一下这个动变阻器改变对比度或许是有用的。 此外应该关注到,J10跳线应该短接,这样VCC电源才能和LCD1602-VCC节点连接,相当于这是给LCD1602供电的设置,如果不短接,相当于电源断路,LCD1602不会工作。 关注了上面2点后,我们就可以关注到信号线了,我们应该像仿真图里的连接那样,将7根信号线连接好。 为什么我们没用仿真图里LCD1602的D0 D1 D2 D3信号线呢? 专注下面几个点:LCD1602可以8线控制,D0到D7都连接;我们这种接法是4线接法,只用连接D4 D5 D6 D7;4线接法比8线更加节省单片机引脚,利于资源充分利用;教科书上用的4线接法,有现成程序;我有试过8线控制,结果是仿真能好好运行,实物却不工作,这个时候需要调试时序;我手里没有PIC板子,所以不可能调试时序;4线和8线的程序不一样的。
或许你并不认同我对于单片机程序的看法,认为会被问一些更为刁钻古怪的问题自己答不上来,我建议这个时候就直接回答程序是在网上抄的,自己没有重复造轮子。当然你也可以选择学习更多内容,去体验一下硬件的原始魅力,我这边提供了一个视频链接,有需求也可以点进去学习。我对于基础程序都不会自己写,更多的时候是使用别人写好的程序直接调用,将更多的时间和精力放在上层的程序上,比如我要写一个电子时钟的程序,我的注意点不会放在时间模块儿的读取时间和写入时间这种基础程序上,我会将更多关注点放在如何使用按键修改时间,如何在屏幕上显示出时间等等更多问题上。注意:我给的学习链接可能并不是这一款单片机的,但其实各类单片机都是通用的,一通百通,举一反三,看视频只需要将更多的关注点放在了解这个模块和操作这个模块上就好。 [如果你想学习LCD1602更多,请点我]
LCD1602的程序为啥那么写?能解释一下吗?个人看法 是教科书的程序,想要深入研究可以百度一下LCD1602的用户手册;我们更关心怎么用它,想要它显示字符需要做2件事,第一件事就是调用函数LCD_CSH()初始化它,第二件事就是想要在第0列第1行的位置上显示字符串hello就应该这么写:LcdWriteString( 0, 1, "hello" ); 这类底层程序是非常基础的程序,不需要重复造轮子,百度一下现成程序知道怎么用就好。举个例子,下面这个函数,无非就是让单片机引脚依照LCD1602控制时序改变引脚高低电平,懂得深与浅又能怎么样呢,下次你想自己写个程序的时候,第一时间还是去复制粘贴上次写的,而不是翻着手册把下面这个函数再写一遍。
/* LCD写命令 */
void LCD_WRITE( unsigned char R1, unsigned char FLAG )
{
unsigned char R2;
LCD_BUSY();
LCD_RW = 0; NOP();
LCD_RS = FLAG;
R2 = (R1 >> 4) & 0x0F;
PORTD &= 0xF0; NOP