单片机及应用上机手册(1)PDF_第1页
单片机及应用上机手册(1)PDF_第2页
单片机及应用上机手册(1)PDF_第3页
单片机及应用上机手册(1)PDF_第4页
单片机及应用上机手册(1)PDF_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、. . 单片机及应用上机手册v0.91 psoc试验板psoc 试 验 板 核 心 是 一 颗psoc微 控 制 器 , 型 号 为cy8c24794-24lfxi。cy8c24794-24lfxi ,56 脚 qnf 封装,拥有50 个 i/o 管脚,其内部拥有4 个数字模块,6个模拟模块以及一个全速的usb 接口。试验板在cy8c24794 外围扩展了八段数码管扫描电路、 44 键盘阵列电路、rs232 接口、 usb 接口、蜂鸣器、ad 采样等电路。并引出了24个单片机管脚信号, 使用者可以利用它们来搭建其他应用。图 1是试验板 cy8c24794-24lfxi的 56 个管脚信号定义。

2、试验板直接使用烧写接口的5v 供电,也可以通过usb 接口提供的5v 电源供电。 使用 usb 接口直接供电时,还可以通过跳接开工选择将5v 电源转换成3.3v做为试验板的供电电源。图 1 cy8c24794 信号、编程接口及usb 接口电路图. . 2 八段数码管动态显示例程试验板配备了4 个共阳型数码管,每个数码管的阳极由一个pnp 三极管控制供电,微控制器的p40、p41、p42、p43四个管脚控制4 个三极管的状态。p3 端口组的 8 个管脚组成一个数据总线共同来控制每个数码管的8 个阴极。另外 mcu 的 p46、p47、p12 、p13管脚可以单独控制一个led 灯,使用前请短接

3、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 导通,相

4、应的字段发亮。这样,若干个led 导通,就构成一个字符。在共阳极数码管中,要使某个led 亮,则该 led 的控制管脚要接低电平,否则接高电平。共阴极数码管则刚好相反。因此我们可以排列出共阳型数码管的字形码,如表 1 所示。表 1 共阳型数码管字形码字形0 1 2 3 4 5 6 7 8 字形码03h 9fh 25h 0dh 99h 49h 41h 1fh 01h 字形9 a b c d e f 。全灭字形码09h 11h c1h 63h 85h 61h 71h 01h ffh 多个数码管组成的显示电路中,我们一般采用动态扫描的方式进行显示,单片机定时地对数码管扫描, 即逐个地循环地点亮各位数

5、码管。在这种方式中, 数码管分时工作,每次只能有一个数码管显示内容。不同位显示的时间间隔可以通过定时中断完成。这样虽然在任一时刻只有一位数码管被点亮,但是由于人眼具有视觉残留效应,只要保证每个数码管的刷新率在 50hz 左右,则动态刷新数码管显示看起来与全部数码管持续点亮效果是完全一样。为了实现数码管地动态扫描,除了要给数码管提供段(字形代码)的输入之外,还要对各个数码管之间添加位的控制,也就是通常所说的段控和位控。因此, 这里数码管接口电路需要有 2 个输出口, 其中一个用于输出8 条段控线, 另一个用于输出位控线,位控线的数目等于数码管的个数(本实验为4个) 。本实验中,段控线连到p3.0

6、p3.7 口,分别对应数码管的dp、g、f、e、d、c、b、a 段。位控线连到p4.0p4.3 口,分别用来选择所要点亮的数码管。试验实现一个秒表的功能,显示内容每5 毫秒刷新一次,显示内容到1/10 秒。2.2 硬件模块设选择与配置1创建一个新工程,在该工程的器件编辑器(device editor)中选择定时器模块,然后将其按要求放置,如图4 所示。. . 图 4 定时器模块放置图2配置全局资源。单击参数内容方框里的下拉箭头,选择合适的参数值,便可以更改工程中默认的全局资源。此实验配置的全局资源如图8-5 所示。图 8-5 全局资源配置按图 6 配置 timer8 定时器模块的参数。. .

7、图 6 定时器模块的参数配置4按图 7 配置管脚驱动模式。图 7 管脚驱动模式的参数配置5在 timer8_1int.asm 文件的 _timer8_1_isr 函数内添加如下代码,实现中断程序跳转:ljmp _timer1_isr 2.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

8、 display data . . #define sel prt4dr /control port for pnp transisitor #define led1 0b11111110 #define led2 0b11111101 #define led3 0b11111011 #define led4 0b11110111 #define dp 0b11111110 unsigned char reg=0 x03,0 x9f,0 x25,0 x0d,0 x99,0 x49,0 x41,0 x1f,0 x01,0 x09,0 x11,0 xc1,0 x63, 0 x85,0 x61,0

9、x71,0 xff; 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+

10、= 9) led2_dig = 0; if(led1_dig+ = 5) led1_dig = 0; switch(led_count) case 1: sel=0 xff&led1; if(led_dp=1) . . data=regled1_dig&dp; else data=regled1_dig; break; case 2: sel=0 xff&led2; if(led_dp=2) data=regled2_dig&dp; else data=regled2_dig; break; case 3: sel=0 xff&led3; if(led_

11、dp=3) data=regled3_dig&dp; else data=regled3_dig; break; case 4: sel=0 xff&led4; if(led_dp=4) data=regled4_dig&dp; else data=regled4_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

12、convert )的功能是把模拟量转换成数字量,以便于利用计算机进行处理。 psoc 试验板将微控制器的p01 管脚连接到一个可调电位器的滑动端,用于给使用者验证 psoc 的模数转换模块功能。本例程使用psoc sar6 模数转换模块对模拟量进行采集和转换,并将结果显示在数码管。试验过程中通过改变电位器(本质上是一个可调电阻)改变模拟量的输入,观察显示结果的变化,并与万用表测试的结果相比较。试验原理框图如图8所示。电位器引脚p01pga用户模块sar6用户模块cy8c24794led显示结果图 8 实验原理框图3.1 硬件模块选择与配置1.创建一个新工程,在该工程的器件编辑器(device

13、editor )中选择pga 用户模块和 sar6 用户模块,然后将pga 用户模块和sar6 用户模块按要求放置。其中,pga 占用一个连续时间基本模块(acb ) ,sar6 占用一个开关电容模拟模块(asc) 。图 9 全局资源配置. . 2. 全局资源。单击参数内容方框里的下拉箭头,选择合适的参数值,便可以更改工程的全局资源。此实验配置的全局资源如图9 所示。3. 连接用户模块。pga 用户模块的输出作为sar6 用户模块的输入信号源。4. 按以下步骤选择模拟列时钟:1)单击 analogcolumn_clock_x多路选择器;2)从菜单里选择一个值(此处选择vc1) 。5. 按以下步

14、骤配置模拟列输入多路复用器:1)单击 analogcolumn_inputmux _x多路选择器;2).从菜单里选择一个端口(此处选择port_0_1) 。6. 按图 10 配置 pga 用户模块参数。图 10 pga用户模块参数7. 按图 11 配置 sar6 用户模块参数。图 11 sar6 用户模块参数8. 数码管显示部分的配置,由于在led 显示实验处有详细介绍,此处不再重复叙述。请参考 led 显示实验。以上步骤,9. 通过以上步骤,最后得到如图12 所示的资源配置图。10. 在 timer8_1int.asm 文件的 _timer8_1_isr 中断服务子程序里加入以下一行代码:j

15、mp _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

16、 0b11111101 #define led3 0b11111011 #define led4 0b11110111 #define dp 0b11111110 /unsigned char reg=0 xc0,0 xf9,0 xa4,0 xb0,0 x99,0 x92,0 x82,0 xf8,0 x80,0 x90,0 x88,0 x83,0 xc6 ,0 xa1,0 x86,0 x8e,0 xff; unsigned char reg=0 x03,0 x9f,0 x25,0 x0d,0 x99,0 x49,0 x41,0 x1f,0 x01,0 x09,0 x11,0 xc1,0 x63

17、, 0 x85,0 x61,0 x71,0 xff; 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

18、) led_count=1; switch(led_count) case 1: sel=0 xff&led1; if(led_dp=1) data=regled1_dig&dp; else data=regled1_dig; break; case 2: sel=0 xff&led2; if(led_dp=2) data=regled2_dig&dp; else data=regled2_dig; break; case 3: sel=0 xff&led3; if(led_dp=3) data=regled3_dig&dp; . . else

19、data=regled3_dig; break; case 4: sel=0 xff&led4; if(led_dp=4) data=regled4_dig&dp; else data=regled4_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

20、timer8_1_start(); timer8_1_enableint(); m8c_enablegint; while(1) / sar6 模数转换结果范围在-32,31 ,加 32,转换为无符号数0,63 iresult = sar6_1_cgetsample() + 32; display(iresult); . . 4 pwm 控制蜂鸣器例程pwm 模块是用来产生一定频率、一定占空比的周期方波,给蜂鸣器施加不同频率和占空比的方波,它就会发出不同的声音。试验板使用的蜂鸣器需要4khz,占空比为50的方波驱动。试验电路图如图13 所示, p03管脚配置成pwm 模块的输出。图 13 实验

21、电路图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_0 。6.将 p03管脚连接到glob

22、alouteven3 事件上,配置结果如图16 所示。图 16 资源配置总图7. 短接 spk_sel 跳帽。4.2 软件设计/- / 文件名: main.c /- #include / part specific constants and macros #include psocapi.h / psoc api definitions for all user modules byte byte_period,byte_duty; void delay() byte tmp1,tmp2; . . for(tmp1=0;tmp1255;tmp1+) for(tmp2=0;tmp2255;tm

23、p2+); 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)即通用串行总线是一种简单易行的标准接口,能最大限度的节省计算机的软硬件资源。学习板支持us

24、b1.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

25、模块,然后单击右键,选择usb setup wizard ,对描述符表进行如表2 所示的配置。表 2 usb 描述符表vendor id product id 04b4 e001 endpoint number direction transfer type max packet size ep1 in bulk 64 ep2 out bulk 64 3. 数码管显示部分资源配置参见数码管显示例程。5.2 软件设计/- / 文件名: main.c /- #include / part specific constants and macros #include psocapi.h / psoc

26、 api definitions for all user modules #include main.h /led void display(unsigned char k); #define data prt3dr #define sel prt4dr #define led1 0b11111110 #define led2 0b11111101 #define led3 0b11111011 #define led4 0b11110111 unsigned char num17 = 0 x03,0 x9f,0 x25,0 x0d,0 x99,0 x49,0 x41,0 x1f,0 x01

27、,0 x09,0 x11,0 xc1,0 x63,0 x85,0 x61,0 x71,0 xff; / - globals unsigned char cep1count = 0; unsigned char cep2count = 0; unsigned char abuf64; . . word wcount; byte bcount; #define ep1sz 0 x40 void display(unsigned char k) sel = led2; data = numk; void main() unsigned char cindx; unsigned char cindx2

28、; unsigned char conce; data=0 xff; sel=0 x0f; m8c_enablegint; usbfs_start(0,usb_5v_operation); / start device to 5v / wait for it to enumerate while(!usbfs_bgetconfiguration(); abuf0 = 9 ; / enable the out endpoint to recieve data usbfs_enableoutep(usb_ep2); conce = 0; cindx = 0; while (1) if (0 = c

29、once) conce = 1; / enable ep interrupts usbfs_int_reg |= usbfs_int_ep1_mask | usbfs_int_ep2_mask ; /while(!usbfs_bgetepackstate(1) usbfs_loadinep(usb_ep1, &abuf0,1, usb_toggle); / ep1sz prime ep1 . . if (cep2count) wcount = usbfs_wgetepcount(usb_ep2); bcount = usbfs_breadoutep(usb_ep2, &abuf

30、0, wcount); display(abuf0); usbfs_loadinep(usb_ep1, &abuf0,1, usb_toggle); cep2count = 0; usbfs_enableoutep(usb_ep2); / forever while 6 串口收发数据串口常用于一些低速设备和电脑进行数据交换。学习板上有一个串口,寄存器位置符合16c550 工业标准,内置波特率发生器。在使用串口与上位机pc 通信时,需要一个rs232转换电路,如max3232 。6.1 硬件模块选择与配置1.添加 uart 用户模块;配置全局资源与串口资源以确定合适的波特率,资源设置如表

31、3 和表 4 所示,可知串口的时钟源为vc3,因此其波特率为vc3/8 。表 3 全局资源配置表vc3 source sysclk/1 vc3 divider 156 由上表可知,vc3 的里时钟源是系统时钟,所以vc3 的时钟频率为:sysclk/156 hz 。表 4 串口资源配置表clock vc3 rx_input row_0_input_3 tx_output row_0_output_0 2.配置串口的接收与发送管脚,管理配置如表5 所示。表 5 管脚配置列表name select drive 说明port_1_3 stdcpu strong 用于控制 led3 的点亮port_7

32、_0 globaloutodd_0 strong 串口的输出管脚port_7_7 globalinodd_7 high z 串口的输入管脚. . 6.2软件设计本实验要用到串口助手,读者可在网上下载(推荐周立功easyarm的串口助手),串口的波特率为19200. 。连续收到 11 个字符,即 hello world 时, led3将会闪一下 ,并将字符串到串口助手的接收窗口。#include #include psocapi.h #define n 11 / 要接收的字符个数byte crecedatan; / 接收缓冲byte icount; / 接收计数器bool brxcomplete

33、d; / 判断是否接收完成#pragma interrupt_handler uart_1_rx_isr / 中断函数声明void delayns(word dly) / 功能是进行时间延时,dly 是要延时的时间长度 word i, j; for(i=0;idly;i+) for(j=0;j1000;j+); /*/ void ledflash() / 功能是让led4 亮一下 prt1dr =0 x08; delayns(40); prt1dr =0 x00; delayns(40); /*/ void uart_1_rx_isr() /接收中断,每接收到一个字符,中断一次,并存储该字符

34、crecedataicount = uart_1_breadrxdata(); / 存储接收到的字符icount+; . . if(icount=n) / 判断是否接收已完成 brxcompleted = 1; icount = 0; /*/ void main() byte i; uart_1_start(uart_parity_none); / 使能 uart uart_1_intcntl(uart_1_enable_rx_int); uart_1_cputstring(uart example); / 发送例子字符串uart_1_putcrlf(); / 发送回车m8c_enablegi

35、nt; / 全局中断使能brxcompleted = 0; icount = 0; while (1) if(brxcompleted) / 若接收完成 ledflash(); / 闪 led 灯for(i=0;in;i+) / 在串口助手上显示该字符串uart_1_putchar(crecedatai); brxcompleted = 0; 7 键盘本实验的矩阵键盘为3x4 键盘,行线分别连到p5.4p5.7 口,列线连到p5.0p5.2 口,设有 10 个数字键( 09)和 2 个备用键。原理图如图18 所示。. . 图 18 试验板矩阵键盘原理图7.1矩阵式键盘扫描控制原理矩阵式键盘,也

36、即通常所讲的行列式键盘,由行线和列线组成。按键位于行、列的交叉点上,行、列分别连接到按键开关的两端,行线通过上拉电阻接到高电平。无按键动作时,行线处于高电平状态;有按键按下时, 交点的行线和列线接通,行线电平状态将由与此行线相连的列线电平决定。列线电平如果低,则行线电平为低;列线电平如果高,则行线电平也为高。 这一点是识别矩阵键盘按键是否被按下的关键所在。由于矩阵键盘中行、列线为多键公用, 各按键均影响该键所在的行和列的电平,所以必须将行、 列线信号配合起来作适当的处理,才能确定闭合键所在的位置。矩阵式键盘节省了好多的i/o 口,适用于按键数量较多的场合。通过行列键盘扫描的方法可获取键盘输入的

37、键值,从而得知按下的是哪个按键,具体过程如下:1、查询是否有键按下。单片机向列扫描口输出全为“0”的扫描码,然后从行检测口检测信号,只要有一行信号不为“1” ,则表示有键按下,且不为“1”的行即对应为按下的键所在的行。2、查询按下键所在的行、列位置。前面已经取得了按下的键的行号,接下来要确定键所在的列,这需要进行逐列扫描。单片机首先使第1 列为“ 0” ,其余各列为“ 1” ,接着进行行检测,若为全“1” ,表示不在第1 列,否则即在第1 列;然后使第2 列为“ 0” ,其余各列为“ 1” ,再进行行检测,若为全“1” ,表示不在第2 列,否则即在第2 列;这样逐列检测,. . 直到找到按下键

38、所在的列。当各列都扫描以后仍没有找到,则放弃扫描, 认为是键的误动作。3、对得到的行号和列号译码,得到键值。在扫描键盘过程中,应注意以下问题:1、当操作者按下或松开按键时,按键会产生机械抖动。这种抖动经常发生在按下或松开的瞬间, 一般持续几到十几毫秒,抖动时间随按键的结构不同而不同。在扫描键盘过程中,必须想办法消除按键抖动,否则会引起错误。消除按键抖动可以用硬件电路来实现,例如,利用r-s 触发器来锁定按键状态,以消除抖动的影响。 较为简单的方法是用软件延时方法来消除按键的抖动,也就是说, 一旦发现有键按下,就延时20ms 以后再测按键的状态。这样就避开按键发生抖动的那一段时间,使cpu 能可

39、靠地读按键状态。在编制键盘扫描程序时,只要发现按键状态有变化,即无论是按下还是松开,程序都应延时20ms以后再进行其他操作。2、在键盘扫描中,应防止按一次键而有多个对应键值输入的情况。这种情况的发生是由于键扫描速度和键处理速度较快,当某一个按下的键还未松开时,键扫描程序和键处理程序已执行了多遍。 这样,由于程序执行和按键动作不同步而造成按一次键有多个键值输入的错误状态。为避免发生这种情况,必须保证按一次键,cpu 只对该键作一次处理。7.2 硬件模块选择与配置1.本例程实现34 矩阵键盘扫描功能,将按下键的键值显示在数码管上。相应的按键管脚配置如图19 如示。图 19 按键管脚配置2.控制数码

40、管显示的管脚配置参见图7。3.在 psocgpioint.asm 文件中的全局外部中断函数中添加函数跳转语句:ljmp _keyscan 7.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*/ unsigned char num17 = 0 x0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论