数码管显示课程设计报告.doc

上传人:laozhun 文档编号:4192541 上传时间:2023-04-09 格式:DOC 页数:16 大小:329.50KB
返回 下载 相关 举报
数码管显示课程设计报告.doc_第1页
第1页 / 共16页
数码管显示课程设计报告.doc_第2页
第2页 / 共16页
数码管显示课程设计报告.doc_第3页
第3页 / 共16页
数码管显示课程设计报告.doc_第4页
第4页 / 共16页
数码管显示课程设计报告.doc_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《数码管显示课程设计报告.doc》由会员分享,可在线阅读,更多相关《数码管显示课程设计报告.doc(16页珍藏版)》请在三一办公上搜索。

1、片上系统技术课程设计 题 目: 数码管的显示 学 号: 姓 名: 班 级: 教 师: 日 期: 目录一实验前的准备3二实验目的3三实验设备3四实验内容3五实验原理3六管脚分配4七实验步骤4八实验原理图:5九实验程序代码:6(1)CH452_I2C.h代码6(2)Define.h代码8(3)key.h代码10(4)Key.c代码10(5)Seven_seg.c代码12十结果分析:15十一个人体会与总结:16一实验前的准备打开实验箱开关,连接好JTAG下载线,将开发平台上的MODUL_SEL组合开关的1、2、7拨上,3、4、5、6、8拨下,使两个共阳极数码管显示为C2。二实验目的(1)熟悉并学习运

2、用I2C总线的读写方式。(2)运用CH452芯片的数码管显示功能,熟悉两线制访问CH452芯片的工作原理。三实验设备硬件:PC机GX-CIDE-SOC/SOPC综合创新开发实验平台GX-CIDE-SOC/SOPC综合创新开发实验平台核心板软件:Quartus II 8.0 Nios II 8.0四实验内容用七段数码管前三位显示000-999,计数周期为1s;按F1进行加1操作并用数码管显示。按F2计数停止,并显示当前数。按F3进行减1操作;当数从000-999时再加1变为000;当数从999-000时再减1变为999。五实验原理根据I2C总线时序要求,对CH452进行操作,送地址,送控制字,送

3、数据。数码管显示是以BCD译码方式显示。六管脚分配七实验步骤(1)打开Quartus II 8.0,打开工程cide_c2,进行SOPC操作,裁剪所需要的内容,综合一下再分配管脚。(2)启动Nios II IDE并新建一个空白C/C+工程,命名为smm,在SOPC Builder System中选择之前建立好的硬件系统cide_c2.ptf。(3)转换工程路径,将提供的参考程序seven_seg.c,CH452_I2C.h,define.h加入到建立好的Nios II工程中,修改程序代码符合实验要求。(4)在System Library设置页中,把程序和数据区都指定为sdram。(5)在Qua

4、rtus II中下载文件,编译整个工程,查找语法错误。(6)全速运行程序,按下按键观察数码管的显示。八实验原理图:九实验程序代码:(1)CH452_I2C.h代码#include system.h#include altera_avalon_pio_regs.h#include alt_types.h#include priv/alt_busy_sleep.h#include #include sys/alt_irq.h#include define.hvoid CH452_I2c_Start_2(void) / 操作起始,两线制方式,SDA用做中断输出,使用以下两个函数 IOWR_ALTER

5、A_AVALON_PIO_DIRECTION(SEG_KEY_SDA_BASE, 1); IOWR_ALTERA_AVALON_PIO_DIRECTION(SEG_KEY_SCL_BASE, 1); IOWR_ALTERA_AVALON_PIO_DATA(SEG_KEY_SDA_BASE, 1); IOWR_ALTERA_AVALON_PIO_DATA(SEG_KEY_SCL_BASE, 1); usleep(5); IOWR_ALTERA_AVALON_PIO_DATA(SEG_KEY_SDA_BASE, 0); usleep(5); IOWR_ALTERA_AVALON_PIO_DATA(

6、SEG_KEY_SCL_BASE, 0); /usleep(3);void CH452_I2c_Stop_2(void) / 操作结束 IOWR_ALTERA_AVALON_PIO_DIRECTION(SEG_KEY_SDA_BASE, 1); IOWR_ALTERA_AVALON_PIO_DIRECTION(SEG_KEY_SCL_BASE, 1); IOWR_ALTERA_AVALON_PIO_DATA(SEG_KEY_SDA_BASE, 0); IOWR_ALTERA_AVALON_PIO_DATA(SEG_KEY_SCL_BASE, 1); usleep(5); IOWR_ALTERA

7、_AVALON_PIO_DATA(SEG_KEY_SDA_BASE, 1); usleep(5); IOWR_ALTERA_AVALON_PIO_DATA(SEG_KEY_SCL_BASE, 0) ;void ack()/确认 IOWR_ALTERA_AVALON_PIO_DIRECTION(SEG_KEY_SDA_BASE, 0); IOWR_ALTERA_AVALON_PIO_DIRECTION(SEG_KEY_SCL_BASE, 1); IOWR_ALTERA_AVALON_PIO_DATA(SEG_KEY_SDA_BASE, 0); usleep(5); IOWR_ALTERA_AVA

8、LON_PIO_DATA(SEG_KEY_SCL_BASE, 1); usleep(5); IOWR_ALTERA_AVALON_PIO_DATA(SEG_KEY_SCL_BASE, 0);void CH452_I2c_WrByte(unsigned char dat) /写一个字节数据 unsigned char temp_number; unsigned char i; int delay; IOWR_ALTERA_AVALON_PIO_DIRECTION(SEG_KEY_SDA_BASE, 1); IOWR_ALTERA_AVALON_PIO_DIRECTION(SEG_KEY_SCL_

9、BASE, 1); for(i=0;i7; IOWR_ALTERA_AVALON_PIO_DATA(SEG_KEY_SCL_BASE, 0); usleep(5); IOWR_ALTERA_AVALON_PIO_DATA(SEG_KEY_SDA_BASE, temp_number); for (delay=0;delay5;delay+); IOWR_ALTERA_AVALON_PIO_DATA(SEG_KEY_SCL_BASE, 1); dat=dat1; IOWR_ALTERA_AVALON_PIO_DATA(SEG_KEY_SCL_BASE, 0);unsigned char CH452

10、_I2c_RdByte(void) /读一个字节数据 unsigned char i=8; unsigned char DATA_received=0; int delay; IOWR_ALTERA_AVALON_PIO_DIRECTION(SEG_KEY_SDA_BASE, 0); IOWR_ALTERA_AVALON_PIO_DIRECTION(SEG_KEY_SCL_BASE, 1); while (i-) DATA_received=1; IOWR_ALTERA_AVALON_PIO_DATA(SEG_KEY_SCL_BASE, 0); usleep(5); for(delay=0;d

11、elay7)&CH452_I2C_MASK|CH452_I2C_ADDR0); / CH452的ADDR=0时#else CH452_I2c_WrByte(unsigned char)(cmd7)&CH452_I2C_MASK|CH452_I2C_ADDR1); / CH452的ADDR=1时(默认)#endif ack(); CH452_I2c_WrByte(unsigned char)cmd); /*发送数据*/ ack(); CH452_I2c_Stop_2(); /*结束总线*/ unsigned char CH452_Read(void) /读取按键 unsigned char ke

12、ycode; CH452_I2c_Start_2(); /*启动总线*/ CH452_I2c_WrByte(unsigned char)(CH452_GET_KEY7)&CH452_I2C_MASK|0x01|CH452_I2C_ADDR1); / 若有两个CH452并连,当ADDR=0时,需修改为CH452_I2C_ADDR0 ack(); keycode=CH452_I2c_RdByte(); /*读取数据*/ ack(); CH452_I2c_Stop_2(); /*结束总线*/ return(keycode);(2)Define.h代码#ifndef _DEFINE_H_#define

13、 _DEFINE_H_#endif /_DEFINE_H_#define CH452_NOP 0x0000 / 空操作#define CH452_RESET 0x0201 / 复位#define CH452_LEVEL 0x0100 / 加载光柱值#define CH452_CLR_BIT 0x0180 / 段位清0#define CH452_SET_BIT 0x01C0 / 段位置1#define CH452_SLEEP 0x0202 / 进入睡眠状态#define CH452_LEFTMOV 0x0300 /设置移动方式-作移#define CH452_LEFTCYC 0x0301 /设置

14、移动方式-左循#define CH452_RIGHTMOV 0x0302 /设置移动方式-右移#define CH452_RIGHTCYC 0x0303 /设置移动方式-右循 #define CH452_SELF_BCD 0x0380 /自定义BCD码#define CH452_SYSOFF 0x0400 /关显示、键盘#define CH452_SYSON1 0x0401 /开显示#define CH452_SYSON2 0x0403 /开显示、键盘#define CH452_SYSON2W 0x0423 /开显示、键盘, 真正2线接口#define CH452_DSP 0x0500 /设置

15、默认显示方式#define CH452_BCD 0x0580 /设置BCD译码方式#define CH452_TWINKLE 0x0600 /设置闪烁控制#define CH452_GET_KEY 0x0700 / 获取按键#define CH452_DIG5 0x0d00 / 数码管位5显示,需另加8位数据#define CH452_DIG6 0x0e00 / 数码管位6显示,需另加8位数据#define CH452_DIG7 0x0f00 / 数码管位7显示,需另加8位数据#define CH452_SCL_SET IOWR_ALTERA_AVALON_PIO_DATA(SEG_KEY_S

16、CL_BASE, 1);#define CH452_SCL_CLR IOWR_ALTERA_AVALON_PIO_DATA(SEG_KEY_SCL_BASE, 0);#define CH452_SDA_SET IOWR_ALTERA_AVALON_PIO_DATA(SEG_KEY_SDA_BASE, 1);#define CH452_SDA_CLR IOWR_ALTERA_AVALON_PIO_DATA(SEG_KEY_SCL_BASE, 0);#define CH452_SDA_IN (IORD_ALTERA_AVALON_PIO_DATA(SEG_KEY_SDA_BASE);)#defin

17、e CH452_SDA_D_OUT IOWR_ALTERA_AVALON_PIO_DIRECTION(SEG_KEY_SDA_BASE, 1); / 设置SDA为输出方向,对于双向I/O需切换为输出#define CH452_SDA_D_IN IOWR_ALTERA_AVALON_PIO_DIRECTION(SEG_KEY_SDA_BASE, 0); / 设置SDA为输入方向,对于双向I/O需切换为输入#define CH452_SCL_D_OUT IOWR_ALTERA_AVALON_PIO_DIRECTION(SEG_KEY_SCL_BASE, 1); / 设置SCL为输出方向,对于双向I

18、/O需切换为输出#define CH452_I2C_ADDR1 0x60 / CH452的ADDR=1时的地址,默认值#define CH452_I2C_MASK 0x3E / CH452的2线接口高字节命令掩码alt_u8 flag; /队列放满标志alt_u32 key_value;/存储键盘值(3)key.h代码#ifndef _KEY_H_#define _KEY_H_#include alt_types.h#define KEY1_MASK 0x01/0xfe#define KEY2_MASK 0x02/0xfd#define KEY3_MASK 0x04/0xfb#define K

19、EY4_MASK 0x08/0xf7#define KEY5_MASK 0x10/0xef#define KEY6_MASK 0x20/0xdf#define KEY7_MASK 0x40/0xbf#define KEY8_MASK 0x80/0x7f#define KEY1 1#define KEY2 2#define KEY3 3#define KEY4 4#define KEY5 5#define KEY6 6#define KEY7 7#define KEY8 8#define NO_KEY 0xff#define KEY_TIMEOUT 0xfe extern alt_u32 Key

20、PIOInit(void);extern alt_u8 GetKeyValue(void);extern void KeyIntEnable(void);extern void KeyIntDisable(void);#endif /_KEY_H_(4)Key.c代码#include system.h#include #include altera_avalon_pio_regs.h#include alt_types.h#include sys/alt_irq.h#include key.h#define BUF_SIZE 10alt_u32 done = 0; / 信号量:通知外部中断事件

21、发生static alt_u8 key_value;static void KeyDownISR(void* context, alt_u32 id);static void KeyDownISR(void* context, alt_u32 id) /* clear capture register */ IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE,0); /* Get the key value */ key_value = IORD_ALTERA_AVALON_PIO_DATA(BUTTON_PIO_BASE); done+; alt_

22、u32 KeyPIOInit(void)/initialize the KEY_PIO direction as input IOWR_ALTERA_AVALON_PIO_DIRECTION(BUTTON_PIO_BASE, 0x00); /the direction is inputIOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_PIO_BASE, 0xff); /enable interruptsIOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE, 0x00); /clear capture register/reg

23、ister keydown ISR return alt_irq_register(BUTTON_PIO_IRQ, NULL, KeyDownISR);void KeyIntEnable(void)IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_PIO_BASE, 0xff); /enable interruptsvoid KeyIntDisable(void)IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_PIO_BASE, 0x00); /disable interruptsalt_u8 GetKeyValue(void) alt

24、_u8 value; alt_u8 err; if(0 != done) /* 中断事件数量减1 */ done-; value = key_value; key_value = 0; /clear key_value else value = 0xff; /the highest priority of key is key1 /the lowest priority of key is key8 if(value&KEY1_MASK) = 0) return KEY1; else if(value&KEY2_MASK) = 0) return KEY2; else if(value&KEY

25、3_MASK) = 0) return KEY3; else if(value&KEY4_MASK) = 0) return KEY4; else if(value&KEY5_MASK) = 0) return KEY5; else if(value&KEY6_MASK) = 0) return KEY6; else if(value&KEY7_MASK) = 0) return KEY7; else if(value&KEY8_MASK) = 0) return KEY8; else return NO_KEY;(5)Seven_seg.c代码/*/点亮数码管程序/2007.4.5*/*#i

26、nclude system.h#include altera_avalon_pio_regs.h#include alt_types.h#include priv/alt_busy_sleep.h#include #include sys/alt_irq.h#include define.h#include CH452_I2C.h#include key.h#define SPEED_UP KEY1 /#define SPEED_DOWN KEY2 /#define REVERSE KEY3 /#define STOP_START KEY4 /alt_u8 KeyVlaue;main() Ke

27、yPIOInit(); KeyIntEnable(); int i=0,a=0,b=0,c=0,u=0; while(1) KeyVlaue= GetKeyValue(); switch(KeyVlaue) case SPEED_UP: CH452_Write(CH452_SYSON2); /两线制方式,如果SDA用做按键中断输出,那么命令应该为(0x04,0x23) CH452_Write(CH452_BCD); / BCD译码,8个数码管 while(1) if(u =1000) u = 0; c=u/100; b=u/10-c*10; a=u%10; CH452_Write(CH452_

28、DIG7 | c); CH452_Write(CH452_DIG6 | b); CH452_Write(CH452_DIG5 | a); u+; KeyVlaue= GetKeyValue(); if(KeyVlaue = SPEED_DOWN ) break; alt_busy_sleep(1000000); i=u-1; break; case REVERSE: CH452_Write(CH452_SYSON2); /两线制方式,如果SDA用做按键中断输出,那么命令应该为(0x04,0x23) CH452_Write(CH452_BCD); / BCD译码,8个数码管 while(1) c

29、=i/100; b=i/10-c*10; a=i%10; CH452_Write(CH452_DIG7 | c); CH452_Write(CH452_DIG6 | b); CH452_Write(CH452_DIG5 | a); i-; KeyVlaue= GetKeyValue(); if(KeyVlaue = SPEED_DOWN ) break; if(i = 0) i = 999; alt_busy_sleep(1000000); u=i+1; break; 十结果分析:实验结果:硬件下载完成,软件编译运行后,按F1数字进行加1操作。按F2计数停止,并显示当前数。按F3数字进行减1操

30、作;当数从000-999时再加1变为000;当数从999-000时再减1变为999,实验箱上数码管达到预期结果。十一个人体会与总结:在本次课程设计中,我们通过软、硬件上的动手操作进一步学习跟掌握了片上系统的有关知识,虽然在上学期学习过QuartusII软件和Verilog HDL语言但没有涉及到Nios II软件,通过这学期的实验让我加深了对这些软件的使用,掌握了简单的实验的设计、制作、下载调试的方法。在课程设计的过程中也遇到了很多问题,例如刚开始对Nios II软件操作不熟悉,编译出现问题,运行后不能实现预期结果等,但这些都通过老师和同学的帮助得到了解决,最终达到了实验的要求。通过此次课程设计使我认识到自身知识储备及能力的薄弱,更让我了解了语言的理论学习与实际应用是有很大的差别的。所以,在以后的学习中,我们一定要将理论和实践联系起来,将理论用于实际中,这样才能真正的检验我们所学知识的情况,而且,此次试验为我今后的学习和生活打下良好的基础。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号