文档详情

单片机及应用上机手册(1)

仙***
实名认证
店铺
DOC
364KB
约27页
文档ID:152619038
单片机及应用上机手册(1)_第1页
1/27

《单片机与应用》上机手册V0.91 PSoC试验板 PSoC试验板核心是一颗PSoC微控制器,型号为CY8C24794-24LFXICY8C24794-24LFXI,56脚QNF封装,拥有50个I/O管脚,其部拥有4个数字模块,6个模拟模块以与一个全速的USB接口试验板在CY8C24794外围扩展了八段数码管扫描电路、4×4键盘阵列电路、RS232接口、USB接口、蜂鸣器、AD采样等电路并引出了24个单片机管脚信号,使用者可以利用它们来搭建其他应用图1是试验板CY8C24794-24LFXI的56个管脚信号定义试验板直接使用烧写接口的5V供电,也可以通过USB接口提供的5V电源供电使用USB接口直接供电时,还可以通过跳接开工选择将5V电源转换成3.3V做为试验板的供电电源图1CY8C24794信号、编程接口与USB接口电路图2 八段数码管动态显示例程试验板配备了4个共阳型数码管,每个数码管的阳极由一个PNP三极管控制供电,微控制器的P4[0]、P4[1]、P4[2]、P4[3]四个管脚控制4个三极管的状态P3端口组的8个管脚组成一个数据总线共同来控制每个数码管的8个阴极 另外MCU的P4[6]、P4[7]、P1[2]、P1[3]管脚可以单独控制一个LED灯,使用前请短接LED JMP跳帽。

如图2所示图2试验板八段数码管与LED扩展电路2.1 八段数码管扫描控制原理八段数码管(以下简称数码管)由8个发光二极管LED组成,其中包括7个细长型的LED和1个小数点型的LED,每个LED称为一字段,分别为a、b、c、d、e、f、g、dp共8段,其中dp为小数点,如图3所示图3八段数码管部字段和引脚分布数码管模块通常有10根管脚,每一段有一根管脚,另外两根管脚是数码管的公共端数码管有共阳极(其中LED的阳极都连接在一起)和共阴极(其中LED的阴极都连接在一起)两种结构形式当数码管中的某个LED导通,相应的字段发亮这样,若干个LED导通,就构成一个字符在共阳极数码管中,要使某个LED亮,则该LED的控制管脚要接低电平,否则接高电平共阴极数码管则刚好相反因此我们可以排列出共阳型数码管的字形码,如表1所示表1 共阳型数码管字形码字形012345678字形码03H9fH25H0dH99H49H41H1fH01H字形9AbCdEF全灭字形码09H11Hc1H63H85H61H71H01HffH多个数码管组成的显示电路中,我们一般采用动态扫描的方式进行显示,单片机定时地对数码管扫描,即逐个地循环地点亮各位数码管。

在这种方式中,数码管分时工作,每次只能有一个数码管显示容不同位显示的时间间隔可以通过定时中断完成这样虽然在任一时刻只有一位数码管被点亮,但是由于人眼具有视觉残留效应,只要保证每个数码管的刷新率在50Hz左右,则动态刷新数码管显示看起来与全部数码管持续点亮效果是完全一样为了实现数码管地动态扫描,除了要给数码管提供段(字形代码)的输入之外,还要对各个数码管之间添加位的控制,也就是通常所说的段控和位控因此,这里数码管接口电路需要有2个输出口,其中一个用于输出8条段控线,另一个用于输出位控线,位控线的数目等于数码管的个数(本实验为4个)本实验中,段控线连到P3.0~P3.7口,分别对应数码管的dp、g、f、e、d、c、b、a段位控线连到P4.0~P4.3口,分别用来选择所要点亮的数码管试验实现一个秒表的功能,显示容每5毫秒刷新一次,显示容到1/10秒2.2硬件模块设选择与配置1.创建一个新工程,在该工程的器件编辑器(Device Editor)中选择定时器模块,然后将其按要求放置,如图4所示图4定时器模块放置图2.配置全局资源单击参数容方框里的下拉箭头,选择合适的参数值,便可以更改工程中默认的全局资源。

此实验配置的全局资源如图8-5所示图8-5全局资源配置3.按图6配置Timer8定时器模块的参数图6 定时器模块的参数配置4.按图7配置管脚驱动模式图7管脚驱动模式的参数配置5.在timer8_1int.asm文件的_Timer8_1_ISR函数添加如下代码,实现中断程序跳转:ljmp _timer1_ISR2.3软件设计#include // part specific constants and macros#include "PSoCAPI.h" // PSoC API definitions for all User Modules#pragma interrupt_handler timer1_ISR#define DATA PRT3DR //port for display data #define SEL PRT4DR //control port for PNP transisitor#define LED1 0b11111110#define LED2 0b11111101#define LED3 0b11111011#define LED4 0b11110111#define dp 0b11111110unsigned char reg[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0x11,0xc1,0x63, 0x85,0x61,0x71,0xff};unsigned char led1_dig=0,led2_dig=0,led3_dig=0,led4_dig=0;unsigned char led_count=1;unsigned char led_dp=0;unsigned char count = 0;/**********************************************************************/void timer1_ISR(){ if(led_count==5) led_count=1; if(count++ == 1) { count = 0; if(led4_dig++ == 9) { led4_dig = 0; if(led3_dig++ == 9) { led3_dig = 0; if(led2_dig++ == 9) { led2_dig = 0; if(led1_dig++ == 5) led1_dig = 0; } } } } switch(led_count) { case 1: SEL=0xff&LED1; if(led_dp==1) DATA=reg[led1_dig]&dp; else DATA=reg[led1_dig]; break; case 2: SEL=0xff&LED2; if(led_dp==2) DATA=reg[led2_dig]&dp; else DATA=reg[led2_dig]; break; case 3: SEL=0xff&LED3; if(led_dp==3) DATA=reg[led3_dig]&dp; else DATA=reg[led3_dig]; break; case 4: SEL=0xff&LED4; if(led_dp==4) DATA=reg[led4_dig]&dp; else DATA=reg[led4_dig]; break; default: break; } ++led_count;}/**********************************************************************/void main(){ Timer8_1_EnableInt(); M8C_EnableGInt; Timer8_1_Start(); led_dp=2; while(1);}3 AD采样例程模数转换器(A/D Convert)的功能是把模拟量转换成数字量,以便于利用计算机进行处理。

PSoC试验板将微控制器的P0[1]管脚连接到一个可调电位器的滑动端,用于给使用者验证PSoC的模数转换模块功能本例程使用PSoC SAR6模数转换模块对模拟量进行采集和转换,并将结果显示在数码管试验过程过改变电位器(本质上是一个可调电阻)改变模拟量的输入,观察显示结果的变化,并与万用表测试的结果相比较试验原理框图如图8所示图8实验原理框图3.1 硬件模块选择与配置1. 创建一个新工程,在该工程的器件编辑器(Device Editor)中选择PGA用户模块和SAR6用户模块,然后将PGA用户模块和SAR6用户模块按要求放置其中,PGA占用一个连续时间基本模块(ACB),SAR6占用一个开关电容模拟模块(ASC)图9全局资源配置2. 全局资源单击参数容方框里的下拉箭头,选择合适的参数值,便可以更改工程的全局资源此实验配置的全局资源如图9所示3. 连接用户模块PGA用户模块的输出作为SAR6用户模块的输入信号源4. 按以下步骤选择模拟列时钟:1) 单击AnalogColumn_Clock_x多路选择器;2) 从菜单里选择一个值(此处选择VC1)5. 按以下步骤配置模拟列输入多路复用器:1) 单击AnalogColumn_InputMUX _x多路选择器;2) .从菜单里选择一个端口(此处选择Port_0_1)。

6. 按图10配置PGA用户模块参数图10PGA用户模块参数7. 按图11配置SAR6用户模块参数图11SAR6用户模块参数8. 数码管显示部分的配置,由于在LED显示实验处有详细介绍,此处不再重复叙述请参考LED显示实验以上步骤,9. 通过以上步骤,最后得到如图12所示的资源配置图10. 在Timer8_1INT.asm文件的_Timer8_1_ISR中断服务子程序里加入以下一行代码:jmp_timer1_ISR;11. 编写应用程序程序代码见附录图12模拟资源配置总图3.2软件设计//----------------------------------------------------------------------------//文件名:main.c//---------------------------------------------------------------------------#include // part specific constants and macros#include "PSoCAPI.h" // PSoC API definitions for all User Modules#pragma interrupt_handler timer1_ISR#define DATA PRT3DR#define SEL PRT4DR#define LED1 0b11111110#define LED2 0b11111101#define LED3 0b11111011#define LED4 0b11110111#define dp 0b11111110//unsignedchar reg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};unsigned char reg[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0x11,0xc1,0x63,0x85,0x61,0x71,0xff};unsigned char led1_dig=0,led2_dig=0,led3_dig=0,led4_dig=0;unsigned char led_count=1;unsigned char led_dp=0;int iResult;void display(int num){ led1_dig = num/1000; led2_dig = (num%1000)/100; led3_dig = (num%100)/10; led4_dig = num%10; }void timer1_ISR(){ if(led_count==5) led_count=1; switch(led_count) { case 1: SEL=0xff&LED1; if(led_dp==1) DATA=reg[led1_dig]&dp; else DATA=reg[led1_dig]; break; case 2: SEL=0xff&LED2; if(led_dp==2) DATA=reg[led2_dig]&dp; else DATA=reg[led2_dig]; break; case 3: SEL=0xff&LED3; if(led_dp==3) DATA=reg[led3_dig]&dp; else DATA=reg[led3_dig]; break; case 4: SEL=0xff&LED4; if(led_dp==4) DATA=reg[led4_dig]&dp; else DATA=reg[led4_dig]; break; default: break; } ++led_count;}void main(){ // Insert your main routine code here. PGA_1_Start(PGA_1_MEDPOWER); // Turn on PGA power SAR6_1_Start(SAR6_1_MEDPOWER); // Turn on SAR6 power Timer8_1_Start(); Timer8_1_EnableInt(); M8C_EnableGInt; while(1){ //SAR6模数转换结果围在 [-32,31],加32,转换为无符号数[0,63 ] iResult = SAR6_1_cGetSample() + 32; display(iResult); } }4PWM控制蜂鸣器例程PWM模块是用来产生一定频率、一定占空比的周期方波,给蜂鸣器施加不同频率和占空比的方波,它就会发出不同的声音。

试验板使用的蜂鸣器需要4KHz,占空比为50%的方波驱动试验电路图如图13所示,P0[3]管脚配置成PWM模块的输出图13实验电路图4.1硬件模块选择与配置1. 创建一个新工程,在该工程的器件编辑器(Device Editor)中选择PWM8用户模块,然后将PWM8用户模块按要求放置2. 配置全局资源单击参数容方框里的下拉箭头,选择合适的参数值,便可以更改工程的全局资源此实验的数字时钟资源如图14配置图14 数字时钟资源配置3. 图15配置PWM8用户模块参数图15 PWM8用户模块参数4. 将PWM8的CompareOut输出连接到Row_O_Output_3总线5. 使能Row_O_Output_3_Driver_06. 将P0[3]管脚连接到GlobalOutEven3事件上,配置结果如图16所示图16资源配置总图7. 短接SPK_SEL跳帽4.2 软件设计//----------------------------------------------------------------------------//文件名:main.c//---------------------------------------------------------------------------#include // part specific constants and macros#include "PSoCAPI.h" // PSoC API definitions for all User ModulesBYTE byte_Period,byte_Duty;void delay(){ BYTE tmp1,tmp2; for(tmp1=0;tmp1<255;tmp1++) for(tmp2=0;tmp2<255;tmp2++);}void main(){byte_Period = 99; byte_Duty = 50; PWM8_1_WritePeriod(byte_Period); PWM8_1_WritePulseWidth(byte_Duty); while(1) { PWM8_1_Start(); delay(); PWM8_1_Stop(); delay(); }}尝试修改一下byte_Period,byte_Duty两个变量的值,看有什么效果。

5 USB通讯例程Universal Serial Bus(USB)即通用串行总线是一种简单易行的标准接口,能最大限度的节省计算机的软硬件资源学习板支持USB1.1协议,最大传输速度可以达12Mb/S,同时支持同步传输、批量传输、控制传输、中断传输 例程中PC机的通讯程序从USB EP2端口发送数据,微控制器接收到数据后通过数码管显示出来,并存储到USB EP1的缓存区中;当PC机的通讯程序从USB EP1端口读取数据,微控制器就从EP1端口的缓存区取出数据并发送给PC机向USB EP2端口写数据将数据读到数组缓存中将数组缓存中的数据发送给EP1从EP1缓存中读数据在LED显示图17 USB例程读写流程8.5.1 硬件模块选择与配置1. 添加USB用户模块2. 对USB描述符进行配置:选中USB模块,然后单击右键,选择USB Setup Wizard ,对描述符表进行如表2所示的配置表2 USB描述符表Vendor IDProduct ID04b4E001EndpointNumberDirectionTransferTypeMax Packet SizeEp1InBulk64Ep2OutBulk643. 数码管显示部分资源配置参见数码管显示例程。

5.2 软件设计//----------------------------------------------------------------------------//文件名:main.c//----------------------------------------------------------------------------#include // part specific constants and macros#include "PSoCAPI.h" // PSoC API definitions for all User Modules#include "main.h"//ledvoid Display(unsigned char k);#define DATA PRT3DR#define SEL PRT4DR#define LED1 0b11111110#define LED2 0b11111101#define LED3 0b11111011#define LED4 0b11110111unsigned char num[17] ={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0x11,0xc1,0x63,0x85,0x61,0x71,0xff};// -- Globalsunsigned char cEp1Count = 0;unsigned char cEp2Count = 0;unsigned char aBuf[64];WORD wCount;BYTE bCount;#define EP1SZ 0x40void Display(unsigned char k) { SEL = LED2; DATA = num[k];}void main(){ unsigned char cIndx; unsigned char cIndx2; unsigned char cOnce; DATA=0xff; SEL=0x0f; M8C_EnableGInt; USBFS_Start(0,USB_5V_OPERATION); // start device to 5V// Wait for it to enumerate while(!USBFS_bGetConfiguration()); aBuf[0] = 9 ; // Enable the Out Endpoint to recieve data USBFS_EnableOutEP(USB_EP2); cOnce = 0; cIndx = 0; while (1) {if (0 == cOnce){cOnce = 1;// Enable EP interrupts USBFS_INT_REG |= USBFS_INT_EP1_MASK | USBFS_INT_EP2_MASK ;//while(!USBFS_bGetEPAckState(1))USBFS_LoadInEP(USB_EP1, &aBuf[0],1, USB_TOGGLE); // EP1SZ prime EP1}if (cEp2Count){wCount = USBFS_wGetEPCount(USB_EP2);bCount = USBFS_bReadOutEP(USB_EP2, &aBuf[0], wCount);Display(aBuf[0]);USBFS_LoadInEP(USB_EP1, &aBuf[0],1, USB_TOGGLE);cEp2Count = 0; USBFS_EnableOutEP(USB_EP2); } } // forever while }6串口收发数据串口常用于一些低速设备和电脑进行数据交换。

学习板上有一个串口,寄存器位置符合16C550工业标准,置波特率发生器在使用串口与上位机PC通信时,需要一个RS232转换电路,如MAX32326.1 硬件模块选择与配置1. 添加UART用户模块;配置全局资源与串口资源以确定合适的波特率,资源设置如表3和表4所示,可知串口的时钟源为VC3,因此其波特率为VC3/8表3 全局资源配置表VC3 SourceSysClk/1VC3 Divider156由上表可知,VC3的里时钟源是系统时钟,所以VC3的时钟频率为:SysClk/156 Hz表4 串口资源配置表ClockVC3Rx_InputRow_0_Input_3Tx_OutputRow_0_Output_02. 配置串口的接收与发送管脚,管理配置如表5所示表5 管脚配置列表NameSelectDrive说明Port_1_3StdCPUStrong用于控制LED3的点亮Port_7_0GlobalOutOdd_0Strong串口的输出管脚Port_7_7GlobalInOdd_7High Z串口的输入管脚6.2软件设计本实验要用到串口助手,读者可在网上下载(推荐周立功easyARM的串口助手),串口的波特率为19200.。

连续收到11个字符,即"Hello World"时,LED3将会闪一下,并将字符串到串口助手的接收窗口include #include "PSoCAPI.h" #define N 11 // 要接收的字符个数BYTE cReceData[N]; // 接收缓冲BYTE iCount; // 接收计数器BOOL bRxCompleted; // 判断是否接收完成#pragma interrupt_handler UART_1_Rx_ISR // 中断函数声明void DelayNs(WORD dly) // 功能是进行时间延时,dly是要延时的时间长度{ WORD i, j; for(i=0;i

原理图如图18所示图18 试验板矩阵键盘原理图7.1矩阵式键盘扫描控制原理矩阵式键盘,也即通常所讲的行列式键盘,由行线和列线组成按键位于行、列的交叉点上,行、列分别连接到按键开关的两端,行线通过上拉电阻接到高电平无按键动作时,行线处于高电平状态;有按键按下时,交点的行线和列线接通,行线电平状态将由与此行线相连的列线电平决定列线电平如果低,则行线电平为低;列线电平如果高,则行线电平也为高这一点是识别矩阵键盘按键是否被按下的关键所在由于矩阵键盘中行、列线为多键公用,各按键均影响该键所在的行和列的电平,所以必须将行、列线信号配合起来作适当的处理,才能确定闭合键所在的位置矩阵式键盘节省了好多的I/O口,适用于按键数量较多的场合通过行列键盘扫描的方法可获取键盘输入的键值,从而得知按下的是哪个按键,具体过程如下:1、查询是否有键按下单片机向列扫描口输出全为“0”的扫描码,然后从行检测口检测信号,只要有一行信号不为“1”,则表示有键按下,且不为“1”的行即对应为按下的键所在的行2、查询按下键所在的行、列位置前面已经取得了按下的键的行号,接下来要确定键所在的列,这需要进行逐列扫描单片机首先使第1列为“0”,其余各列为“1”,接着进行行检测,若为全“1”,表示不在第1列,否则即在第1列;然后使第2列为“0”,其余各列为“1”,再进行行检测,若为全“1”,表示不在第2列,否则即在第2列;这样逐列检测,直到找到按下键所在的列。

当各列都扫描以后仍没有找到,则放弃扫描,认为是键的误动作3、对得到的行号和列号译码,得到键值在扫描键盘过程中,应注意以下问题:1、当操作者按下或松开按键时,按键会产生机械抖动这种抖动经常发生在按下或松开的瞬间,一般持续几到十几毫秒,抖动时间随按键的结构不同而不同在扫描键盘过程中,必须想办法消除按键抖动,否则会引起错误消除按键抖动可以用硬件电路来实现,例如,利用R-S触发器来锁定按键状态,以消除抖动的影响较为简单的方法是用软件延时方法来消除按键的抖动,也就是说,一旦发现有键按下,就延时20ms以后再测按键的状态这样就避开按键发生抖动的那一段时间,使CPU能可靠地读按键状态在编制键盘扫描程序时,只要发现按键状态有变化,即无论是按下还是松开,程序都应延时20ms以后再进行其他操作2、在键盘扫描中,应防止按一次键而有多个对应键值输入的情况这种情况的发生是由于键扫描速度和键处理速度较快,当某一个按下的键还未松开时,键扫描程序和键处理程序已执行了多遍这样,由于程序执行和按键动作不同步而造成按一次键有多个键值输入的错误状态为避免发生这种情况,必须保证按一次键,CPU只对该键作一次处理7.2 硬件模块选择与配置1. 本例程实现3×4矩阵键盘扫描功能,将按下键的键值显示在数码管上。

相应的按键管脚配置如图19如示图19按键管脚配置2. 控制数码管显示的管脚配置参见图73. 在psocgpioint.asm文件中的全局外部中断函数中添加函数跳转语句:ljmp _KeyScan7.3软件设计//----------------------------------------------------------------------------//文件名:main.c//----------------------------------------------------------------------------#include // part specific constants and macros#include "PSoCAPI.h" // PSoC API definitions for all User Modules#pragma interrupt_handler KeyScan//void KeyScan();void delay10ms(unsigned char time);void Dispaly(unsigned char k);unsigned char key=0,temp;#define DATA PRT3DR#define SEL PRT4DR#define LED1 0b11111110#define LED2 0b11111101#define LED3 0b11111011#define LED4 0b11110111/*common anode LED,therefore the LED will light when the pin is low*/unsignedcharnum[17]= {0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0x11,0xc1,0x63,0x85,0x61,0x71,0xff};void KeyScan() //键盘中断程序{PRT5DR=0b11111110;//assign p5[0]=0temp=PRT5DR;temp&=0xF0; //if(temp !=0xF0) { delay10ms(1); temp=PRT5DR; temp&=0xF0;if(temp !=0xF0){ temp=PRT5DR; temp&=0xF0; switch(temp){ case 0X70: key=7;break; case 0XB0:key=4;break; case 0XD0: key=1;break; case 0XE0:key=0; break; }}}PRT5DR=0b11111101;//assign p5[1]=0temp=PRT5DR;temp&=0xF0;if(temp !=0xF0){delay10ms(1); temp=PRT5DR; temp&=0xF0; if(temp !=0xF0) {temp=PRT5DR; temp&=0xF0;switch(temp) { case 0x70:key=8;break; case 0b10110000: key=5; break; case 0b11010000: key=2; break; case 0b11100000: key=10; break; } }}PRT5DR=0b11111011;//assign p5[2]=0temp=PRT5DR;temp&=0xF0;if(temp !=0xF0){ delay10ms(1); temp=PRT5DR; temp&=0xF0; if(temp !=0xF0) { temp=PRT5DR; temp&=0xF0; switch(temp) {case 0x70: key=9; break; case 0b10110000: key=6; break; case 0b11010000:key=3; break; case 0b11100000: key=11; break;}}}PRT5DR=0xf0;} void delay10ms( unsigned char time)//延时函数{ unsigned char a,b,c; for(a=0;a

下载提示
相关文档
正为您匹配相似的精品文档