dvbbs
收藏本页
联系我们
论坛帮助
dvbbs

睿志音响技术论坛睿志音响论坛睿志音响论坛 → PIC单片机在音响中应用学习(6-20三楼讲解例程2)


  共有5575人关注过本帖树形打印

主题:PIC单片机在音响中应用学习(6-20三楼讲解例程2)

帅哥,在线噢!
audio-gd
  1楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 贴子:25083 积分:133488 威望:0 精华:49 注册:3/26/2005 8:25:45 PM
PIC单片机在音响中应用学习(6-20三楼讲解例程2)  发贴心情 Post By:5/23/2017 10:11:12 AM

首先要安装好软件,配置好编译环境等,之后就可以进行代码的实验了。
用户需要下载以下两个软件,MPLAB_IDE8.92 与HCPIC-PRO 9.8. 先安装MPLAB_IDE8.92 ,完成后再安装HCPIC-PRO 9.8 。
可以到PIC官网下载,或本月内发邮件到 audio-gd@126.com索取。

 


图片点击可在新窗口打开查看此主题相关图片如下:softwarepic.png
图片点击可在新窗口打开查看

 

 

PICkit3与学习板的连接如下图,上面的一个白色箭头是与VPP连接,通常相反方向连接是不会损坏,但最好还是不要连接错误。

 

 


图片点击可在新窗口打开查看此主题相关图片如下:pk3连接目标板1.jpg
图片点击可在新窗口打开查看

 


图片点击可在新窗口打开查看此主题相关图片如下:pk3连接目标.jpg
图片点击可在新窗口打开查看

 


 

连接好PICkit3与学习板后可以打开软件,通常我是直接在工作文件中双击打开,就象word,excel那样操作。双击下图中的两个图标中任意一个就可以。

 

 

 

 


图片点击可在新窗口打开查看此主题相关图片如下:工作文件.png
图片点击可在新窗口打开查看

 

初次使用可能要对平台进行配置,先选择下载器,然后按setting去配置学习板通过PICkit3供电,这就省去额外供电的麻烦。配置好以后,再打开软件,如果显示未连接,可以打开 Programmer 菜单,选择里面的 Connect .不用每次都这样选择。

 

 


图片点击可在新窗口打开查看此主题相关图片如下:连接pk3s.png
图片点击可在新窗口打开查看

 

 


 


图片点击可在新窗口打开查看此主题相关图片如下:设置pk3供电到目标板s.png
图片点击可在新窗口打开查看

 

 

 

然后再选择目标芯片,学习板上用的是PIC16F873A。选择菜单 Configure >Select Device.

 

 


 


图片点击可在新窗口打开查看此主题相关图片如下:选择mcu型号s.jpg
图片点击可在新窗口打开查看

 

 

 

配置芯片的配置位如下图。要变更配置位需要将下图中的红框内的勾去掉再变更。打开方法是 选择菜单 Configure >Configuration  Bit.

 

 

 

 


图片点击可在新窗口打开查看此主题相关图片如下:配置位设置s.png
图片点击可在新窗口打开查看

 

 

这就可以开始进行代码的编译与下载,实验了。例程代码稍后再完成上传。


今天就先做好各方面准备工作,下一次再通过代码进行实践,暂时无需太多理论知识。理论知识是各位将来要深入学习再慢慢自行补充。

 


 


图片点击可在新窗口打开查看此主题相关图片如下:编译与下载代码1.png
图片点击可在新窗口打开查看

 

 

学习板接口定义


 

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:学习板定义.rar



http://www.audio-gd.com

Blog:   http://kingwa.blog.163.com/

支持(0中立(0反对(0回到顶部
帅哥,在线噢!
audio-gd
  2楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 贴子:25083 积分:133488 威望:0 精华:49 注册:3/26/2005 8:25:45 PM
  发贴心情 Post By:5/23/2017 10:11:23 AM

/*
Test 1
本例程是学习设置单片机引脚的输出控制功能。现在可以控制LED,将来就可以控制继电器,或其他功能。
技巧是多用复制与粘贴。
世界那么大,时间那么少,只有呆呆的新手才会愿意全部代码慢慢敲出来的。
*/


//两个斜杠后面的文字代表后面的文字是注释用途,不参加编译。
//如果注释较多,可以用/* 在行首, */在注释最后位置。如本文中上面示范。
//要测试本例程,阁下需要在RA0-2分别接一个LED与一个680R左右电阻到正电源,学习板定义图片已画了一个连接例子。
//包含PIC提供的头文件,必须写在这里
/*******************************************************************************************************************************************************************/

#include <pic.h>    

/*******************************************************************************************************************************************************************/
//将后面的名称用前面的名称代替。如果我们全部人都用身份证号码作为称呼,那大家可能很难记住对方,但用名字代替身份证,大家就容易记得多了。
// define中文就是定义的意思。这是软件内定好的名词,当正常输入后会高亮用蓝色显示,如果输入错了一个字母,编译会通不过。
/*******************************************************************************************************************************************************************/

#define LED1 RA0                 // 将RA0改名字为LED1以方便记住
#define LED2 RA1
#define LED3 RA2

/*******************************************************************************************************************************************************************/
//* unsingned char是关键词,但写起来比较长,难记,
//用uchar代替就方便得多了。
//在C中,默认的基础数据类型均为signed,现在我们以char为例,说明(signed) char与unsigned char之间的区别
//首先在内存中,char与unsigned char没有什么不同,都是一个字节,唯一的区别是,char的最高位为符号位,因此char能表示-128~127, unsigned char没有符号位,因此能表示0~255,
//这个好理解,8个bit,最多256种情况,因此无论如何都能表示256个数字。
//所以简单说就是代表数值范围是0-255.
//通常我们常用的就是 unsigned char 多,以后各位在编写时直接将以下两行代码复制到新文件中就可以。
//关于 unsigned int,简单点说,代表数的范围是0-65535。
//聪明人创造可以懒的办法,各位将来要创建新工程时,不用一步步慢慢去自己创建,直接将已有的工程整个文件夹复制,更改名称就可以在里面打开进行工作。
/*******************************************************************************************************************************************************************/

#define uchar unsigned char       //将unsigned char 改名字为uchar.
#define uint unsigned int


/*******************************************************************************************************************************************************************/
//新手上路,学习浅入深出,以下一行代码的意思是声明一个函数。
//我用通俗的语言说,就是用void 去告诉软件,delay(unit)是一个模块,当软件在主代码中遇到这个模块时,麻烦它自己去找模块内部是怎样的工作的,然后按照模块内部设定去运行。
//这样我们就可以不用反复写同一个模块。
//我们也可以不声明模块,但必须将模块的代码写到主程序前面。出于直观考虑,建议大家现在还是按这个方式去做,声明模块,模块写到主程序后面去。
/*******************************************************************************************************************************************************************/

void delay(uint);              
void initial();


/*******************************************************************************************************************************************************************/
//以下是声明主程序,单片机运行是由这里开始,不在主程序内的都不会进行运行。例如模块,只有在主程序内提及到才会相应运行。
//格式是 void main() {}  , 所有运行的步骤就要写在大括号内。
/*******************************************************************************************************************************************************************/

void main()
{

 initial();                //进入到主程序后,首先要初始化单片机

 LED1= 0;                  //以下三行是将LED设计到开机就是灭的状态,至于为何会灭,大家先想一下。再发表出来看对不对?
 LED2= 0;
    LED3= 0;

 while(1)                  //这是一个循环语句,当while后面括号中的值是1时,单片机运行到这内部时就不停循环,永远不能跳出来运行其他代码,除非特号内的值是0.
 { 
  LED1=1;               //点亮LED1
  delay(50000);         //等大约0.5秒
  LED2=1;               //点亮LED2
  delay(50000);         //等大约0.5秒
  LED3=1;               //点亮LED3
  delay(50000);         //等大约0.5秒
  LED1= 0;              //关闭全部LED
  LED2= 0;
     LED3= 0;
  delay(50000);         //等大约0.5秒
 } 
}

/*******************************************************************************************************************************************************************/
//以下一段是延迟模块,模块的名称可以自己选择不同名词代替,但不能是软件内定的关键字,
//如以下延迟模块,我用delay作为名称,阁下可以改为 Yanchi ,但上面声明时也要对应改相同的名称。
//对于模块的代码,大家可以不必过于根究,只需要知道以下模块是延时用的,括号内写1就是延迟大约10uS,最大可以写66535到括号内。也就是可以延迟大约最大665 mS .
//入门以后大家再去学习模块内的代码的设计,这样入门难度就比较低。
/*******************************************************************************************************************************************************************/

void delay(uint j)
{
    uint i;
    for(i=j;i>0;i--);
}

/*******************************************************************************************************************************************************************/
//以下一段是初始化单片机内部的配置令它可以正常运行本工程,同样地,以后大家如果还不太熟识时,直接复制本工程后修改新工程的代码,下面的一段就直接保留不变,省心省事。
//还可以留些时间出来去听音乐,摩机。
//但当引脚的输出输入功能有变时就要对应变更下面的代码
// TRIS是改变单片机输入输出方向的功能,TRISA意思就是设置RA组的引脚输入还是输出。在本例程中用到的单片机RA只有0-5共6个引脚,但还是用8位二进制去配置,RA0对照的是二进行最右一位。
//RA1对照二进制右二位。如此类推,多余的2位就没功能了。
//           RA5 RA4 RA2 RA2 RA1 RA0
// 0b 0   0   0   0   0   0   0   0
//当设置为1时代表输入,0时代表输出。大家不用苦恼难记,1 = IN中的I, 0 = OUT中的O,这样是不是容易记住 了?
//在本例程中只用到了RA0,RA1,RA2,且全部是输出,所以设置 TRISA=0b00000000;其中未用到的引脚全部设置到输出。
//PORT是设置引脚的电平,简单一些来说,将TRIS的设置二进制直接复制就可以了,至少在新手上路阶段。所以PORTA=0b00000000;假如TRISA=0b00001111,那么PORTA=0b00001111
//二进制数转换十进制知识, 二进制是以0与1组成数字,在10进制中,是以逢10进1,但在二进制中就逢2进1.
//例如  00010001, 如果加上1, 变成了00010010,
//将二进制转换到10进制: 例如 00010001 = 17,其中各二进制位代表10进制数字如下
//  0d 128 64  32  16   8   4   2   1
//  0b  0   0   0   0   0   0   0   0
//  0b  0   0   0   1   0   0   0   1    =  16+1 = 17
//将10进制转换到二进制, 将7转换到二进制, 7= 0b00000111
//  0d 128 64  32  16   8   4   2   1
//  0b  0   0   0   0   0   0   0   0
//  0b  0   0   0   0   0   1   1   1    =  7
//如果还不能明白麻烦各位自行百度,但新手上路,是不需要太深入理解。学习最重要的方法说三次就是,实践!实践!实践!
/*******************************************************************************************************************************************************************/

void initial()
{
 CMCON =0b00000111; 
 ADCON1=0b00000110;
 ADCON0=0b00000000;
 TRISA=0b00000000;
 TRISB=0b00000000;
 TRISC=0b00000000;
 
 PORTA=0b00000000;
 PORTB=0b00000000;
 PORTC=0b01000000;

    INTCON=0b10000000; 
    T1CON=0X00;
}

/*******************************************************************************************************************************************************************/
//大家要学习得快,一定要多练习。可以不学习理论但一定要动手实践。
//理解完本工程代码后,大家要作一个练习,将例程发贴上来,切记去掉所有注释部分,只保留代码。
//练习要实现的功能就是:
// 点亮LED1,延迟300mS关闭LED1,点亮LED2,延迟300mS关闭LED2,点亮LED3,延迟300mS关闭LED3,点亮LED1,如此循环.
//待大家完成后贴上来,再进行下一个工程的示范。
/*******************************************************************************************************************************************************************/

 

 

 下载信息  [文件大小:   下载次数: ]
点击浏览该文件:例程1.rar

 


 


此主题相关图片如下:微信图片_20170524144241.jpg
按此在新窗口浏览图片


http://www.audio-gd.com

Blog:   http://kingwa.blog.163.com/

支持(0中立(0反对(0回到顶部
帅哥,在线噢!
audio-gd
  3楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 贴子:25083 积分:133488 威望:0 精华:49 注册:3/26/2005 8:25:45 PM
  发贴心情 Post By:5/23/2017 10:11:36 AM

//Test 2,通过开关控制LED灯的亮与灭,在音响里就可以通过开关控制继电器吸合或断开,这是相当常用的。

/*******************************************/
#include <pic.h>     //包含PIC提供的头文件,必须写在这里

/*
在硬件上,RB4-6是连接了板上的三个轻触开关,要使用这三个轻触开关可以在代码上直接使用RB4, RB5,RB6 等进行直接操作。
但这样很容易混乱,因此就象上一个练习一样,将这三个开关连接的引脚进行改名。
*/

#define SW_LED1 RB4             // 将RB4改名字为SW_LED1以方便记住
#define SW_LED2 RB5
#define SW_LED3 RB6

#define LED1 RA0                 // 将RA0改名字为LED1以方便记住
#define LED2 RA1
#define LED3 RA2


#define uchar unsigned char
#define uint unsigned int


void delay(uint);              
void initial();
void check_SW();


void main()
{

 initial();
 LED1= 0; 
 LED2= 0;
    LED3= 0;

 while(1)
 { 
  check_SW();      //在主程序里要做的事就是不停检查开关是否有被按下。
 } 
}

/****************************************************************************/
/*
当我们按下轻触开关时,开关会在稳定合上前经过一段时间接触不良的状态,在这个状态时程序可能不停根据开关而进行操作,最终结果可能并不是我们想要的。
例如我们每按一次开关,LED就由亮变灭,或由灭变亮。如果开关在接触不良的时间里有10次接触不良,LED可能是由亮变灭显示正常。
但如果有11次那LED就始终都是在亮的状态,相当于按了开关就没有动作过一样。
另外,有时我们没按下开关但市电的干扰也可造成IC的引脚电压变化象按下了开关一下两下的效果导致LED也会改变显示状态。
要解决这些问题,可以在开关按下的一瞬间开始计时,延迟10mS后再检测开关,如果还是按下,那说明这个开关是我们人为按下的,这个操作是有效的。
*/
void check_SW()

 if (SW_LED1==0)                             // 如果LED1开关是按下状态
 {     
  delay(1000);                            //延迟10mS
  if (SW_LED1==0)                         //如果LED1的开关还是按下状态
  { 
   LED1 = !LED1;                       //那么LED1变改变到相反状态。即如果原来是亮就变成灭,原来是灭就变成亮。 这里的!感叹号代表的是非(不是)。
            // LED1=!LED1 意思是LED1 = 不是LED1, 即是相反状态。
   do{ ; }       // do{} while{|;意思是等待(do)直到(while) , 这里的意思是说等待直到 SW_LED1==0这个条件不成立,即是开关松开了,就跳出这个程序。
   while (SW_LED1==0);
  }
 }
 if (SW_LED2==0)
 { 
    delay(1000);
  
  if (SW_LED2==0)
  { 
   LED2 = !LED2;  
   do{ ; } 
   while (SW_LED2==0); 
  }
 }  
 if (SW_LED3==0)
 { 
  delay(1000);
  if (SW_LED3==0)
  { 
   LED3 = !LED3;  
   do{ ; } 
   while (SW_LED3==0);
   }
  }
}


/****************************************************************************/
void delay(uint j)
{
    uint i;
    for(i=j;i>0;i--);
}

 


/****************************************************************************/
void initial()
{
 CMCON =0b00000111; 
 ADCON1=0b00000110;
 ADCON0=0b00000000;
 TRISA=0b00000000;
 TRISB=0b01110000;                          // 三个开关都是属于输入设备,因此要配置IO的方向是输入方向。
 TRISC=0b00000000;
 
 PORTA=0b00000000;
 PORTB=0b01110000;                          // 并将IO的电平拉高置1, 这样按下开关才会令MCU知道。
 PORTC=0b01000000;

    INTCON=0b10000000; 
    T1CON=0X00;

}

 

 

 

 

 

 下载信息  [文件大小:   下载次数: ]
点击浏览该文件:test2_1.rar



http://www.audio-gd.com

Blog:   http://kingwa.blog.163.com/

支持(0中立(0反对(0回到顶部
帅哥,在线噢!
audio-gd
  4楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 贴子:25083 积分:133488 威望:0 精华:49 注册:3/26/2005 8:25:45 PM
  发贴心情 Post By:5/23/2017 10:11:54 AM

留位。。。。。。。。。。。。。。。。。。。。。。。。。。


http://www.audio-gd.com

Blog:   http://kingwa.blog.163.com/

支持(0中立(0反对(0回到顶部
帅哥,在线噢!
audio-gd
  5楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 贴子:25083 积分:133488 威望:0 精华:49 注册:3/26/2005 8:25:45 PM
  发贴心情 Post By:5/23/2017 10:12:06 AM

留位。。。。。。。。。。。。。。。。。。。。。。。。。。


http://www.audio-gd.com

Blog:   http://kingwa.blog.163.com/

支持(0中立(0反对(0回到顶部
帅哥,在线噢!
audio-gd
  6楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 贴子:25083 积分:133488 威望:0 精华:49 注册:3/26/2005 8:25:45 PM
  发贴心情 Post By:5/23/2017 10:12:18 AM

留位。。。。。。。。。。。。。。。。。。。。。。。。。。


http://www.audio-gd.com

Blog:   http://kingwa.blog.163.com/

支持(0中立(0反对(0回到顶部
帅哥,在线噢!
audio-gd
  7楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 贴子:25083 积分:133488 威望:0 精华:49 注册:3/26/2005 8:25:45 PM
  发贴心情 Post By:5/23/2017 10:12:30 AM

留位。。。。。。。。。。。。。。。。。。。。。。。。。。


http://www.audio-gd.com

Blog:   http://kingwa.blog.163.com/

支持(0中立(0反对(0回到顶部
帅哥,在线噢!
audio-gd
  8楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 贴子:25083 积分:133488 威望:0 精华:49 注册:3/26/2005 8:25:45 PM
  发贴心情 Post By:5/23/2017 10:12:43 AM

留位。。。。。。。。。。。。。。。。。。。。。。。。。。


http://www.audio-gd.com

Blog:   http://kingwa.blog.163.com/

支持(0中立(0反对(0回到顶部
帅哥哟,离线,有人找我吗?
cya103
  9楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:职业侠客 贴子:231 积分:2586 威望:0 精华:0 注册:2/22/2009 12:07:43 PM
  发贴心情 Post By:5/23/2017 8:42:26 PM

我的HCPIC-PRO 9.8软件怎么破解不了,请各位指教!谢谢!!!

支持(0中立(0反对(0回到顶部
帅哥,在线噢!
audio-gd
  10楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 贴子:25083 积分:133488 威望:0 精华:49 注册:3/26/2005 8:25:45 PM
  发贴心情 Post By:5/23/2017 8:50:57 PM

这应该是官网下载无需破解的。


http://www.audio-gd.com

Blog:   http://kingwa.blog.163.com/

支持(0中立(0反对(0回到顶部
帅哥哟,离线,有人找我吗?
cya103
  11楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:职业侠客 贴子:231 积分:2586 威望:0 精华:0 注册:2/22/2009 12:07:43 PM
  发贴心情 Post By:5/23/2017 9:14:41 PM

没找到6位序列号,才认为需要破解,请何老师指导!谢谢!!!

支持(0中立(0反对(0回到顶部
帅哥哟,离线,有人找我吗?
shiwei
  12楼 个性首页 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:蝙蝠侠 贴子:464 积分:3338 威望:0 精华:1 注册:12/11/2010 4:39:39 PM
  发贴心情 Post By:5/23/2017 10:25:15 PM

下载MPLAB_IDE8.92

 

官网 http://www.microchip.com/mplab/mplab-x-ide

 

点击 Download Archive

 

查找MPLAB_IDE8.92

 



做睿志的粉丝,DIY睿志的器材
支持(0中立(0反对(1回到顶部
帅哥哟,离线,有人找我吗?
shiwei
  13楼 个性首页 | QQ | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:蝙蝠侠 贴子:464 积分:3338 威望:0 精华:1 注册:12/11/2010 4:39:39 PM
  发贴心情 Post By:5/23/2017 10:37:51 PM

HCPIC-PRO 9.8不知道在官网怎么找?


做睿志的粉丝,DIY睿志的器材
支持(0中立(0反对(0回到顶部
帅哥,在线噢!
audio-gd
  14楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 贴子:25083 积分:133488 威望:0 精华:49 注册:3/26/2005 8:25:45 PM
  发贴心情 Post By:5/24/2017 8:23:48 AM

原来真是要破解,破解文件已发各位邮箱。

电脑不同平台软件多,忘记了各版本的区别,请见谅。



http://www.audio-gd.com

Blog:   http://kingwa.blog.163.com/

支持(0中立(0反对(0回到顶部
帅哥哟,离线,有人找我吗?
duron_ff
  15楼 个性首页 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:职业侠客 贴子:223 积分:1633 威望:0 精华:0 注册:9/9/2008 11:11:53 PM
  发贴心情 Post By:5/24/2017 10:19:10 AM

热情高涨中

支持(0中立(0反对(0回到顶部
总数 72 1 2 3 4 5 下一页