ARM课程设计数码管显示
基于ARM微处理器的数码管驱动设计
专业课程设计任务书学生姓名专业班级学号题目基于ARM微处理器的数码管驱动设计课题性质 A 课题来源 D 指导教师同组姓名主要内容1. 利用ARM微处理器实现数码管显示驱动;2. 能够显示0 1 2 3 4 5 6 7 8 9等数字,且循环显示;3. 通过按键改变循环显示速度。
任务要求1. 设计出具体电路,列出所用器件及布线图;2. 画出程序流程图,画出子程序或中断流程图;3. 说明系统工作原理,对系统进行调试;4. 写出课程设计报告。
参考文献1. 嵌入式系统有关教材;2. 电路设计手册;3. 其他资料。
审查意见指导教师签字:教研室主任签字:年月日基于ARM微处理器的数码管驱动设计一、设计要求1、利用ARM微处理器实现数码管显示驱动;2、能够显示0 1 2 3 4 5 6 7 8 9等数字,且循环显示;3、通过按键改变循环显示速度;二、设计方案本次试验选用的芯片为PXA270,使用的是PXA270集成试验箱。
基于Intel XScale架构的PXA270处理器,集成了存储单元控制器、时钟和电源控制器、DMA 控制器、LCD控制器、AC97控制器、I2S控制器、快速红外线通信 (FIR)控制器等外围控制器,可以实现丰富的外围接口功能。
其低电源运行模式以及动态电源管理技术可以有效的降低电源的功耗。
使用试验箱上的4X4的矩阵键盘作为输入,用来控制数码管显示的快慢速度,将需要输出的各个数码管状态从两个数码管中输出。
三、设计原理1、数码管结构七段数码管由8个发光二极管排列组成(包括小数点位)如下图所示:这8个独立的二极管通常被命名:a.b.c.d.e.f.g.h。
h表示小数点。
利用7段数码管能显示所有数字以及部分英文字母。
数码管有2种不同的形式:一种是8个发光二极管的阳极都连一起,成为共阳极8段数码管如图所示:共阳极8段数码管的8个发光二极管的正极一起接VCC,要控制数码管中的某一段亮,比如A段,只须要控制数码管的A脚为低电平就可以了,反之熄灭A段就控制A脚为高电平。
5_ARM实验报告
实验五数码管显示实验实验目的:通过实验掌握 LED 的显示控制方法;掌握对存储区进行访问的方法。
一.实验内容:编写程序使实验板上八段数码管循环显示0到9字符。
二.实验原理:1.八段数码管的结构八段数码管由八个发光二极管组成,其中七个长条形的发光管排列成“日”字形,右下角一个点形的发光管作为显示小数点用,八段数码管能显示所有数字及部份英文字母。
见图5-1-2。
图5-1-2 八段数码管的结构2八段数码管的硬件电路原理EMBEST ARM EDUKIT II教学电路中,使用的是共阳极八段数码管,数码管的控制通过芯片ZLG7290 控制,各段的控制信号是芯片ZLG7290 的SEGA ~SEG G 引脚控制,需要显示的段码通过IIC 总线传送到该芯片。
如图5-1-1、图5-1-2、图5-1-3所示。
图5-1-1 八段数码管控制电路图5-1-2 八段数码管控制电路3.八段数码管的类型八段数码管有两种不同的形式:一种是八个发光二极管的阳极都连在一起的,称之为共阳极八段数码管;另一种是八个发光二极管的阴极都连在一起的,称之为共阴极八段数码管。
工作原理以共阳极八段数码管为例,当控制某段发光二极管的信号为低电平时,对应的发光二极点亮,当需要显示某字符时,就将该字符对应的所有二极管点亮;共阴极二极管则相反,制信号为高电平时点亮。
电平信号按照dp→g→f→e……a的顺序组合形成的数据字称为该字符对应的段码,常用字的段码表如下:4.八段数码管的显示方式有两种,分别是静态显示和动态显示。
静态显示是指当八段数码管显示一个字符时,该字符对应段的发光二极管控制信号一直保持有效。
动态显示是指当八段数码管显示一个字符时,该字符对应段的发光二极管是轮流点亮的,即控制信号按一定周期有效,在轮流点亮的过程中,点亮时间是极为短暂的(约1ms),由于人的视觉暂留现象及发光二极管的余辉效应,数码管的显示依然是非常稳定的。
三.实验工具:硬件:Embest Arm EduKit II 实验平台,Embest ARM标准/增强型仿真器套件,PC机;软件:Embest IDE Pro 2004集成开发环境,Windows 98/2000/NT/XP操作系统。
西电ARM单片机实验报告
}
伴*************************************************************************
/* Function name :循环延时子程序
/* Description :循环'time'次
/* Return type : void
/* Argume nt
/* Function name :循环延时子程序
/* Description :循环'time'次
/* Return type : void
/* Argume nt
:循环延时计数器
/****************************************************************************/
结果:在六个数码管上依次显示“ HELLO ”,不可分辨出轮流显示 *4. 在每个数码管上递增显示 0-9。步骤同上。
程序如下:
******* /*/ * /*实验现象:数码管依次显示出 0、1,2、
******* */
void Test4_Seg7(void) { int i;
for(;;) {
本实验中,数码管采用共阳极类型,所以是给 0 亮,操作时,先给地址 0x20007000 的某位给 0,让指定的某位亮,然后给地址 0x20006000 送入编码好 的数据,即 seg7table 以此来实现让数码管显示指定的数。
实验二键盘输入实验
一、 实验目的
1、 学习键盘驱动原理; 2、掌握通过 CPU 的 I/O 扩展键盘的方法。
*((u8*)0x20006000)=seg7table[18]; delay(8000); *((u8*)0x20007000)=0x3e; *((u8*)0x20006000)=seg7table[19]; delay(8000); } }/**************************************************************************
数码管显示课程设计报告
目录一.实验前的准备 (2)二.实验目的 (2)三.实验设备 (2)四.实验内容 (3)五.实验原理 (3)六.管脚分配 (4)七.实验步骤 (4)八.实验原理图: (5)九.实验程序代码: (6)(1)CH452_I2C.h代码 (6)(2)Define.h代码 (8)(3)key.h代码 (9)(4)Key.c代码 (10)(5)Seven_seg.c代码 (12)十.结果分析: (15)十一.个人体会与总结: (16)一.实验前的准备打开实验箱开关,连接好JTAG下载线,将开发平台上的MODUL_SEL组合开关的1、2、7拨上,3、4、5、6、8拨下,使两个共阳极数码管显示为C2。
二.实验目的(1)熟悉并学习运用I2C总线的读写方式。
(2)运用CH452芯片的数码管显示功能,熟悉两线制访问CH452芯片的工作原理。
三.实验设备硬件:PC机GX-CIDE-SOC/SOPC综合创新开发实验平台GX-CIDE-SOC/SOPC综合创新开发实验平台核心板软件:Quartus II 8.0Nios II 8.0四.实验内容用七段数码管前三位显示000-999,计数周期为1s;按F1进行加1操作并用数码管显示。
按F2计数停止,并显示当前数。
按F3进行减1操作;当数从000-999时再加1变为000;当数从999-000时再减1变为999。
五.实验原理根据I2C总线时序要求,对CH452进行操作,送地址,送控制字,送数据。
数码管显示是以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工程中,修改程序代码符合实验要求。
arm的lcd课程设计
arm的lcd课程设计一、课程目标知识目标:1. 让学生掌握ARM架构中LCD控制器的基本原理及其在嵌入式系统中的应用。
2. 了解LCD显示原理,包括分辨率、像素、色彩等基本概念。
3. 掌握LCD接口技术,包括并行接口、串行接口及其通信协议。
技能目标:1. 培养学生运用所学知识,进行ARM平台LCD驱动程序编写的能力。
2. 能够分析和解决LCD显示过程中出现的问题,如显示异常、刷新率不足等。
3. 培养学生进行团队协作、沟通交流,共同完成项目任务。
情感态度价值观目标:1. 培养学生对嵌入式系统及LCD技术的兴趣,激发学习热情。
2. 培养学生具备良好的问题解决能力和创新思维,树立自信心。
3. 培养学生关注行业发展,了解国家战略需求,树立正确的价值观。
课程性质:本课程为实践性较强的课程,旨在让学生在掌握理论知识的基础上,提高实际操作能力。
学生特点:学生具备一定的嵌入式系统基础知识,对LCD技术有一定了解,但实际操作能力有待提高。
教学要求:结合课程性质、学生特点,注重理论与实践相结合,以项目为导向,培养学生的实际操作能力和团队协作能力。
通过课程目标的分解,将知识、技能、情感态度价值观目标融入教学过程中,实现学生全面、持续、和谐发展。
二、教学内容1. LCD基本原理:介绍LCD显示原理,包括液晶材料特性、像素结构、背光系统等,对应教材第3章。
2. ARM架构LCD控制器:讲解ARM架构中LCD控制器的结构、功能及工作原理,对应教材第4章。
3. LCD接口技术:介绍并行接口、串行接口(如SPI、I2C)等LCD接口技术及其通信协议,对应教材第5章。
4. LCD驱动程序编写:以实际项目为例,教授如何编写ARM平台下的LCD驱动程序,包括初始化、配置、刷新等,对应教材第6章。
5. LCD显示问题分析与解决:分析常见LCD显示问题,如显示异常、刷新率不足等,提供解决方案,对应教材第7章。
6. 项目实践:分组进行项目实践,让学生动手编写LCD驱动程序,解决实际问题,巩固所学知识。
单片机课程设计报告-4X4键盘两位数码管显示行与列
单片机及DSP课程设计报告专业:班级:姓名:学号:指导教师:时间:2012-06-11~24通信与电子工程学院一、单片机课程设计目的及内容通过本次课程设计进一步加强对所学单片机理论知识的运用,在设计过程中也对数字电路、模拟电路等课程的理论知识进行了复习。
此次课程设计可以使我们初步了解单片机系统设计的基本流程,即分析需求、设计原理图、选用元器件、布线、编程,最后进行调试。
另外在设计过程中通过对keil及PROTEUS等软件的使用,巩固了使用C语言进行编程的能力,以及对程序与单片机硬件系统的整合能力,使程序能够发挥其应有的控制作用。
总之,本次课程设计为我们提供了一次动手实践能力,使我们对系统开发有了大体了解,为将来工作增添了经验。
在本次课程设计中我选择了设计并实现4x4键盘接口,并在两位数码管上显示键盘所在行与列的题目。
使用4X4键盘与单片机I/O口进行连接,通过键盘扫描程序,识别是哪个键按下,并将其编码送入单片机,最终通过数码管进行显示。
二、硬件电路方案设计1、4X4键盘设计4x4键盘工作原理:每个按键都有它的行值和列值,行值和列值的组合就是识别这个按键的编码。
矩阵的行线和列线分别通过两并行接口和CPU通信。
键盘的一端(列线)通过电阻接VCC,而接地是通过程序输出数字“0”实现的。
键盘处理程序的任务是:确定有无键按下,判断哪一个键按下,键的功能是什么?还要消除按键在闭合或断开时的抖动。
两个并行口中,一个输出扫描码,使按键逐行动态接地;另一个并行口输入按键状态,由行扫描值和回馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。
2、数码管显示电路设计数码管显示原理:动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。
这样一来,就没有必要每一位数码管配一个锁存器,从而大大地简化了硬件电路。
选亮数码管采用动态扫描显示。
所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。
ARM课程设计报告(数字温度计的设计)
ARM课程设计报告(数字温度计的设计) 《嵌入式系统》课程设计报告题目:数字温度计的设计院(系):信息科学与工程学院专业班级:通信工程班学生姓名:詹文魁学号:指导教师:刘丽、韩洁老师2021年 05 月 26 日至2021 年 06 月 06 日华中科技大学武昌分校制嵌入式系统课程设计任务书一、设计(调查报告/论文)题目课题:数字温度计的设计二、设计(调查报告/论文)主要内容掌握DS18B20器件的读/写方法,把读写的温度通过串口传到PC机用超级终端(或串口助手)显示,把读取的温度用数码管显示或者点阵或者液晶屏进行显示。
三、原始资料开发板的原理图和实验参考程序,参考实验讲义和课设讲义。
四、要求的设计(调查/论文)成果 ? 使用实验板和温度传感器,实现一个数字温度计; ? 根据原理图完成实验方案的设计; ? 实时显示温度信息。
利用串口发送到上位机显示和利用数码管显示 ? 显示功能:①把读写的数据通过串口传到PC机用超级终端(或串口助手)显示,要求显示班级、姓名和学号;②如果用ARM7的开发板,要求把读取的温度值用数码管显示,其中能力强的同学可以通用点阵显示班级和学号;③如果用ARM9的开发板,要求用液晶屏显示班级姓名和学号,以及读取的温度值。
? 在实验完成的基础上完成课程设计报告的撰写,按照模板的格式书写,要求有软件流程图和调试过程。
五、进程安排时间 15周周一上午 15周周一下午 15周周二至周三内容课题讲解、选题软硬件准备、清理 11-602 实验楼402,403 地点课题分析、收集资料、完成设实验楼402,403,图书计方案馆实验楼402,403 实验楼402,403 实验楼402,403 15周周四至周五 16周周一至周三 16周周四 16周周五六、主要参考资料详细设计,编写代码系统调试成果验收整理文档,撰写提交课设报告实验楼402,403 [1] 下发的课程设计资料 [2] 刘彦文.嵌入式系统原理及接口技术 .北京:清华大学出版社,2021. 指导教师(签名): 20 年月日1 硬件资料Micro2440Micro2440 开发板由核心板Micro2440 和底板Micro2440SDK 组成,采用6层板设计,并用等长布线以满足电路信号完整性要求;为了方便拔插和引出更多的CPU 信号脚,采用“U”型排列插针,故我们也经常把它简称为“U”型核心板-U2440。
单片机课设数码管同时循环显示0-9
电子信息工程学院电子设计应用软件训练任务【训练任务】:1、熟练掌握PROTEUS软件的使用;2、按照设计要求绘制电路原理图;3、能够按要求对所设计的电路进行仿真;【基本要求及说明】:1、按照设计要求自行定义电路图纸尺寸;2、设计任务如下:利用51单片机、BCD译码芯片和两位LED构成一个数码管扫描显示系统,两个数码管同时循环显示0~9。
3、按照设计任务在Proteus 6 Professional中绘制电路原理图;4、根据设计任务的要求编写程序,在Proteus下进行仿真,实现相应功能。
【按照要求撰写总结报告】指导教师年月日负责教师年月日学生签字年月日成绩评定表摘要该专业是前沿学科,现代社会的各个领域及人们日常生活等都与电子信息技术有着紧密的联系。
全国各地从事电子技术产品的生产、开发、销售和应用的企事业单位很多,随着改革步伐的加快,这样的企事业单位会越来越多。
为促进市场经济的发展,培养一大批具有大专层次学历,能综合运用所学知识和技能,适应现代电子技术发展的要求,从事企事业单位与本专业相关的产品及设备的生产、安装调试、运行维护、销售及售后服务、新产品技术开发等应用型技术人才和管理人才是社会发展和经济建设的客观需要,市场对该类人才的需求越来越大。
为此电子信息工程专业的人才有着广泛的就业前景,毕业生可从事电子设备、信息系统和通信系统的研究、设计、制造、应用和开发工作。
目录一、任务说明 (1)1.1 专业介绍 (1)1.2 专业背景与市场预测 (1)1.3 本课题分析 (1)二、绘制原理图 (2)2.1 Proteus软件介绍 (2)2.2 原理图绘制说明 (2)2.3 原理图绘制步骤 (3)三、程序编译说明及程序流程图 (6)3.1 Main程序说明 (6)3.2 初始化子程序说明 (6)3.3 display(uchar tmp)子程序说明 (7)3.4 延时子程序说明 (8)3.5 中断子程序说明 (9)四、Proteus仿真说明 (11)4.1 导入仿真文件 (11)4.2 进行仿真 (12)五、课程设计体会及合理化建议 (14)致谢 (16)一、任务说明1.1专业介绍电子信息工程是一门应用计算机等现代化技术进行电子信息控制和信息处理的学科,主要研究信息的获取与处理,电子设备与信息系统的设计、开发、应用和集成。
(单片机实验教学资料)5.数码管动态显示
实验效果上,学生能够通过实际操作掌握数码管动态显示 的方法,提高对单片机的应用能力。在实验过程中,需要 注意避免数码管亮度过高导致视觉疲劳,以及保证程序的 稳定性,避免出现闪烁或乱码现象。
展望
技术发展与新应用
教学改进与新方法
个人能力提升与拓展
随着技术的不断发展,数码管动态显 示技术将会有更多的应用领域。例如 ,在智能家居、物联网等领域中,数 码管动态显示可以作为人机交互界面 ,实现更加直观、高效的信息展示。
或字符。
数码管内部通常有8个LED段, 分别表示数字0-9和字母A-F。
当给某个LED段加上正向电压时, 该段点亮;反之,则熄灭。
动态显示与静态显示的区别
静态显示
每个数码管在某一时刻只显示一 个字符,需要使用多路复用技术 来控制多个数码管。
动态显示
通过轮流点亮不同的数码管,使 多个数码管同时显示不同的字符 ,实现多位显示。
实验结果展示
结果1
数码管成功显示数字或字母,无闪烁 或错位现象。
结果2
数码管显示效果不理想,存在闪烁或 错位现象。
结果分析
分析1
程序编写正确,数码管连接无误,因此数码管能够正确显示数字或字母。
分析2
程序中存在延时函数设置不当或数码管连接存在问题,导致数码管显示效果不 理想。
05
总结与展望
总结
发送控制信号
02
根据需要显示的内容,编写程序代码以向数码管发送相应的控
制信号。
刷新显示
03
在需要动态显示的情况下,编写程序代码以实现数码管的刷新
显示。
数码管驱动程序的编写
确定驱动程序功能
根据实际需求,确定驱动程序应具备的功能,如显示数字、字母 或自定义字符等。
数码管显示课程设计
数码管显示课程设计一、课程目标知识目标:1. 理解数码管的基本结构、工作原理及显示方式;2. 学会使用编程语言控制数码管显示数字及简单字符;3. 掌握数码管的电路连接方法及其与微控制器的接口技术;4. 了解数码管在现实生活中的应用。
技能目标:1. 能够独立完成数码管的电路搭建及编程控制;2. 培养学生动手实践能力,提高解决实际问题的能力;3. 学会查阅相关资料,培养学生的自学能力和团队协作精神。
情感态度价值观目标:1. 培养学生对电子技术及编程的兴趣,激发学习热情;2. 增强学生对科技创新的认识,提高创新意识;3. 树立正确的价值观,认识到科技发展对社会进步的重要性;4. 培养学生严谨、细致的学习态度,养成良好的学习习惯。
课程性质:本课程属于电子技术与编程相结合的实践课程,注重理论知识与实践操作的结合。
学生特点:学生具备基本的电子技术知识,对编程有一定了解,具有较强的动手实践能力。
教学要求:教师应注重引导学生主动参与,激发学生的学习兴趣,注重培养学生的实际操作能力,提高学生的综合素养。
在教学过程中,将课程目标分解为具体的学习成果,以便进行有效的教学设计和评估。
二、教学内容1. 数码管基础知识:介绍数码管的结构、工作原理、种类及其显示方式,对应教材第3章第1节内容;- 结构与原理:数码管的内部构造、发光二极管的工作原理;- 显示方式:共阴极、共阳极数码管的显示原理及区别。
2. 数码管编程控制:学习使用编程语言(如Arduino)控制数码管显示数字和简单字符,对应教材第4章第2节内容;- 编程基础:了解编程环境,学会编写基本程序;- 数码管控制:掌握数码管的动态扫描显示方法,实现数字和简单字符的显示。
3. 数码管电路连接与接口技术:学习数码管与微控制器(如Arduino)的连接方法,对应教材第3章第2节内容;- 电路连接:掌握数码管与电源、微控制器之间的电路连接方法;- 接口技术:了解数码管的驱动电路设计,掌握I/O口的控制方法。
ARM7的万年历的设计
万年历的设计一.项目要求:在ARM7(ARM7TDMI-S)的的核心板上实现“万年历”的的数码管显示。
二.开发工具:1.使用ADS1.2编写硬件程序,并联合AXD进行调试2.H-JTAG烧写程序(笔记本用JLINK烧写调试程序)三.功能要求:基本功能:1.在数码管上显示年,月,日,周,时,分,秒2.整点提示功能3.时间可调(相应闪烁)扩展功能:四,功能分析:1,数码管显示年,月,日,周,时,分,秒a)显示部分,采用数码管的动态扫描,开发板上只有一个4位一体的数码管,所以要实现时间的切换,因开发板上ARM7和74HC595之间进行(SPI)通信,把数据传到数码管上显示。
b)按键处理部分,采用中断的方式,只用当有按键按下时才去扫描按键c)时钟使用RTC模块,2,整点提示功能:a)只需设置ARM7内部的RTC模块的相关Reg即可3,时间可调:在时间的相应位置闪烁,并实现可调功能,采用TIME0五,总体框架:六,程序清单;/*****************************************************文件名:万年历(用数码管显示)*编写人:霍小波*完成时间:2011-3-14-15-00*摘要:在一个四位一体的数码管上能显示年,月,日,周,时,分,秒,具有整点报铃,调时(并在相应的位闪烁)****************************************************/#include"whole.h"#include"delay.h"#include"OFF_Beep.h"#include"RTC.h"//------外部函数的声明----extern void HC595_Init(void);//HC595的初始化extern uint8 HC595_SendData(uint8 data);//发送数据extern void SMG_Init(void);//数码管初始化extern void Display(uint32 data,uint8 i);//数码管的显示extern void Key_Init(void); //按键初始化extern Key_Scan(void); //按键扫描//------变量的声明-------uint8 i;uint32 dat;uint8 num=0; //记录按键按下的次数,来显示不同的时间TIME a,b; //定义时钟结构体uint8 flag8=0;//第1,2个数码管的闪烁;(在显示的地方处理)uint8 flag9=0;//第3,4个数码管的闪烁;uint8 flag7=0;//选择是高位闪烁还是低位闪烁uint8 num1=0; //选择哪个数码管闪uint8 dot=0; //选择数码管的小数点位置uint8 flag5=0; //上电运行分,秒uint8 flag6=0; //有键按下,并一直显示相应的数值uint32 dat; //在数码管上待显示的数据/********************************************************** *名称:void __irq EXINT0_IRQ(void)*功能:外部中断1的中断服务程序,用来扫描按键*入口参数:无*出口参数:无**********************************************************/ void __irq EXINT0_IRQ(void){i=Key_Scan();while((EXTINT & 0x01) != 0){EXTINT = 0x01;}VICV ectAddr = 0;}/********************************************************** *名称:void __irq TIME0_IRQ(void)*功能:定时器0的中断服务程序,用来闪烁相应的位*入口参数:无*出口参数:无**********************************************************/void __irq TIME0_IRQ(void){if(flag7==1) //闪烁第3,4个数码管{flag8=0;flag9=~flag9;}if(flag7==2) //闪烁第1,2个数码管{flag9=0;flag8=~flag8;}T0IR = 0x01;VICV ectAddr = 0;}/*********************************************************名称:void TIME0_Init(void)*功能:定时器0的初始化(并未开启定时器),在调时时才开启,提高CPU的速度*入口参数:无*出口参数:无********************************************************/void TIME0_Init(void){T0TC = 0; //定时计数器设置为0T0PR = 0; //时钟不分频T0MCR = 0x03; //复位,并产生中断T0MR0 = Fpclk*0.4; //时间为1秒T0IR = 0x01; //清除中断标志// T0TCR = 0x01; //启动定时器VICIntSelect = 0x000000; //设置所有中断为IRQ向量中断VICV ectCntl1 = 0x20 | 4; //定时器0的VICV ectAddr1 = (uint32)TIME0_IRQ;VICIntEnable = 0x00004010;}/************************************************名称:void __irq RTC_IRQ(void) //RTC中断服务程序*功能: 整点报铃,当每一次小时加1,报警一次*入口参数:无*出口参数:无***********************************************/void __irq RTC_IRQ(void) //RTC中断服务程序{if((CIIR & 0x04) != 0){Beep_ON();DelayMs(100);Beep_OFF(); //关闭BEEP}while((ILR&0x01) !=0)ILR=0x01; //清除中断标志VICV ectAddr = 0;}/**************************************************名称:void RTC_Init(void) //RTC初始化*功能:RTC的初始化*入口参数:无*出口参数:无*************************************************/void RTC_Init(void) //RTC初始化{PREINT = Fpclk /32768 - 1; //设置基准时钟分频器PREFRAC = Fpclk - (Fpclk /32768) * 32768;AMR=0xff; //屏蔽报警CIIR = 0x04; //设置分增加1产生一次中断ILR = 0x03; //清除中断VICIntSelect = 0x000000; //设置所有中断为IRQ向量中断VICV ectCntl5 = 0x20| 13; //VICV ectCntl0 = 0x20 | 14; //外部中断0VICV ectAddr5 = (uint32)RTC_IRQ; //设置计数器增加中断入口地址VICV ectAddr0 = (uint32)EXINT0_IRQ; //外部中断的地址VICIntEnable = VICIntEnable | (1<<13); //使能中断VICIntEnable = 0x00004000;}/*******************************************************名称:uint32 Show(void)*功能:显示时钟,*入口参数:无*出口参数: 在数码管上待显示的时钟数据******************************************************/uint32 Show(void){if(i==1){flag5=1; //当键按下时,flag5=1;每次显示按键值所对应的数据标志位CCR=0x00; //有键按下,关闭RTCi=0; //num++; //记录按键按下的次数,来显示不同的时间if(num==1){flag6=1;flag7=1;//flag6=1;显示分,秒,flag7=1;调时闪烁后两位标志}else if(num==2){flag6=2;flag7=1;//显示周,小时}else if(num==3){flag6=3;flag7=1;//显示月,日}else if(num==4){flag6=4;flag7=1;//显示年}else if(num==5){flag6=5;flag7=1;//取消闪烁num=0;T0TCR = 0x00; //关闭定时器flag8=0;flag9=0; //取消闪烁}}GetTime(&a);//获得时间的数据if(flag6==1){dat = (a.min*100)+a.sec;dot=3;}if(flag6==2){dat = (a.dow*100)+a.hour;dot=3;}if(flag6==3){dat = (a.mon*100)+a.day;dot=3;}if(flag6==4){dat = a.year;dot=0;}if((flag6==5)||(flag5==0)){CCR=0x01;dat = (a.min*100)+a.sec;dot=3;}else if(i==2){DelayMs(5);if(i==2){i=0;num1++;DelayMs(5);if(num1==1){if(num!=0){flag7=1;T0TCR = 0x01;//启动定时器0,开始闪烁(后两位)}}else if(num1==2){if(num!=0){flag7=2;T0TCR = 0x01;//启动定时器0,开始闪烁(前两位)}}else if(num1==3){num1=0;T0TCR = 0x00; //关闭定时器,停止闪烁flag8=0;flag9=0;}}}else if(i==3) //调时,设置时间(+){DelayMs(10);if(i==3){i=0;if((num==1)&&(num1==1)){GetTime(&a);a.sec++;if(a.sec==60) a.sec=0;Set_Time(&a);}else if((num==1)&&(num1==2)){GetTime(&a);a.min++;if(a.min==60) a.min=0;Set_Time(&a);}else if((num==2)&&(num1==1)){GetTime(&a);a.hour++;if(a.hour==24) a.hour=0;Set_Time(&a);}else if((num==2)&&(num1==2)){GetTime(&a);a.dow++;if(a.dow==8) a.dow=1;Set_Time(&a);}else if((num==3)&&(num1==1)){GetTime(&a);a.day++;if(a.day==32) a.day=1;Set_Time(&a);}else if((num==3)&&(num1==2)){GetTime(&a);a.mon++;if(a.mon==13) a.mon=1;Set_Time(&a);}else if((num==4)&&(num1==1)){GetTime(&a);a.year++;Set_Time(&a);}else if((num==4)&&(num1==2)){GetTime(&a);a.year=a.year+100;Set_Time(&a);}}}else if(i==4) //调时,设置时间(-){DelayMs(10);if(i==4){i=0;if((num==1)&&(num1==1)){GetTime(&a);a.sec--;if(a.sec==-1) a.sec=59;Set_Time(&a);}else if((num==1)&&(num1==2)) {GetTime(&a);a.min--;if(a.min==0) a.min=59;Set_Time(&a);}else if((num==2)&&(num1==1)) {GetTime(&a);a.hour--;if(a.hour==-1) a.hour=23;Set_Time(&a);}else if((num==2)&&(num1==2)) {GetTime(&a);a.dow--;if(a.dow==0) a.dow=7;Set_Time(&a);}else if((num==3)&&(num1==1)) {GetTime(&a);a.day--;if(a.day==0) a.day=31;Set_Time(&a);}else if((num==3)&&(num1==2)) {GetTime(&a);a.mon--;if(a.mon==0) a.mon=12;Set_Time(&a);}else if((num==4)&&(num1==1)) {GetTime(&a);a.year--;if(a.year==0) a.year=99;Set_Time(&a);}else if((num==4)&&(num1==2)){GetTime(&a);a.year=a.year-100;if(a.year==0) a.year=900;Set_Time(&a);}}}return(dat);}int main(void){uint32 data;HC595_Init();SMG_Init();RTC_Init();Key_Init();TIME0_Init();Beep_Init(); //初始化BEEPBeep_OFF(); //关闭BEEPb.year = 2011;b.mon = 3;b.day = 14;b.dow = 1;b.hour = 15;b.min = 59;b.sec = 55;Set_Time(&b); //设置时钟while(1){data=Show(); //取出要显示的数据Display(data,dot); //在数码管上显示时间}return(0);}#include "whole.h"#include"OFF_Beep.h"#define BEEP (1<<24)void Beep_Init(void) //初始化BEEP{PINSEL2=PINSEL2&0xfffffff7;IO1DIR=IO1DIR|BEEP;}void Beep_OFF(void) //关闭BEEP{IO1SET=IO1SET|BEEP;}void Beep_ON(void){IO1CLR=IO1CLR|BEEP;}#include"whole.h"#include"delay.h"void DelayMs(uint32 dly){uint32 i;for(;dly>0;dly--)for(i=0;i<220;i++);}#include"whole.h"//#include"74HC595.h"#define HC595_nCS (1<<28) //HC595的选通信号为P3.28#define HC595_RCK (1<<16) //时钟P1.16/******************************************************* **函数名:HC595_Init()**函数功能:对74HC595及SPI0的初始化**入口参数:无**出口参数:无*******************************************************/void HC595_Init(void){//------------初始化引脚------PINSEL0=(PINSEL0&0xffff00ff)|0x00005500;//设置P0.4 P0.5 P0.6为SPI0引脚PINSEL2=PINSEL2&0xffffff7f; //设置为GPIOPINSEL2=PINSEL2&0xfffffff7; //设置为GPIO//-----------设置引脚为输出------------IO3DIR=IO3DIR|HC595_nCS;IO1DIR=IO1DIR|HC595_RCK;IO3CLR=HC595_nCS; //选中HC595为从机//-------------SPI寄存器的初始化-----------S0PCCR=0x64; //设置SPI时钟的分频值为0x64,即SPI时钟=Fpclk/100S0PCR=0x30; //设置SPI为主模式,CPOL=1,CPHA=1;}/*******************************************************名称:uint8 HC595_SendData(uint8 data)**功能:向74HC595发送一字节数据**入口参数:data**出口参数:S0PDR****************************************************/uint8 HC595_SendData(uint8 data){IO1CLR=HC595_RCK; //先将RCK拉低S0PDR=data; //准备数据,while((S0PSR&0x80)==0); //等待SPIF置位,完成数据的传输IO1SET=HC595_RCK; //控制HC595将数据并行输出return(S0PDR);}#include"whole.h"#include"delay.h"#define smgA1 (1<<22) //P2.22#define smgA2 (1<<23) //P0.23#define smgA3 (1<<19) //P1.19#define smgA4 (1<<24) //P0.24extern uint8 flag8;extern uint8 flag9;extern uint8 HC595_SendData(uint8 data);//发送数据//--------数字0--9的共阳段码-------------uint8 const TAB[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98};//---------数码管的初始化---------------void SMG_Init(void){IO2DIR=IO2DIR|smgA1;IO0DIR=IO0DIR|smgA2|smgA4;IO1DIR=IO1DIR|smgA3;}void NumbTube_Bit(uint8 data){if((data & 0x01) != 0) IO2CLR = smgA1; // 控制smgA1else IO2SET = smgA1;if((data & 0x02) != 0) IO0CLR = smgA2; // 控制smgA2else IO0SET = smgA2;if((data & 0x04) != 0) IO1CLR = smgA3; // 控制smgA3else IO1SET = smgA3;if((data & 0x08) != 0) IO0CLR = smgA4; // 控制smgA4else IO0SET = smgA4;}//---------数码管的显示------------------/*void Display(uint32 data,uint8 i){uint16 j;uint16 qian,bai,shi,ge;qian=data/1000;bai=data%1000/100;shi=data%100/10;ge=data%10;IO2CLR=IO2CLR|smgA1;IO0SET=IO0SET|smgA2;IO1SET=IO1SET|smgA3;IO0SET=IO0SET|smgA4;if(i==4)HC595_SendData(TAB[qian]&0x0f);elseHC595_SendData(TAB[qian]);//DelayMs(3);for(j=0;j<350;j++);IO2SET=IO2SET|smgA1;IO0CLR=IO0CLR|smgA2;IO2SET=IO2SET|smgA1;IO1SET=IO1SET|smgA3;IO0SET=IO0SET|smgA4;if(i==3)HC595_SendData(TAB[bai] &0x7f);elseHC595_SendData(TAB[bai]);// DelayMs(3);for(j=0;j<350;j++);IO0SET=IO0SET|smgA2;IO1CLR=IO1CLR|smgA3;IO0SET=IO0SET|smgA2;IO2SET=IO2SET|smgA1;IO0SET=IO0SET|smgA4;if(i==2)HC595_SendData(TAB[shi]&0x7f);elseHC595_SendData(TAB[shi]);// DelayMs(3);for(j=0;j<350;j++);IO1SET=IO1SET|smgA3;IO0CLR=IO0CLR|smgA4;IO1SET=IO1SET|smgA3;IO0SET=IO0SET|smgA2;IO2SET=IO2SET|smgA1;HC595_SendData(TAB[ge]);//DelayMs(3);for(j=0;j<350;j++);IO0SET=IO0SET|smgA4;}*/void Display(uint32 data,uint8 radix_point){ uint32 j,one,ten,hundred,thousand; //个,十,百,千,的变量声明thousand = data / 1000; //计算千位if(thousand != 0) data -= thousand*1000;hundred = data / 100; //计算百位if(hundred != 0) data -= hundred*100;ten = data / 10; //计算十位if(ten != 0) data -= ten*10;one = data % 10; //计算个位//-------------------显示千位数据----------------if(radix_point==4) HC595_SendData(TAB[thousand] & 0x7f);else HC595_SendData(TAB[thousand]);if(flag8==0){NumbTube_Bit(0x01); //打开显示千位的位选端for(j=0;j<500;j++); //小段延时NumbTube_Bit(0x00); //关闭显示}//-------------------显示百位数据----------------if(radix_point==3) HC595_SendData(TAB[hundred] & 0x7f);else HC595_SendData(TAB[hundred]);if(flag8==0){NumbTube_Bit(0x02);for(j=0;j<500;j++);NumbTube_Bit(0x00); //关闭显示}//-------------------显示十位数据----------------if(radix_point==2) HC595_SendData(TAB[ten] & 0x7f);else HC595_SendData(TAB[ten]);if(flag9==0){NumbTube_Bit(0x04);for(j=0;j<500;j++);NumbTube_Bit(0x00); //关闭显示}//-------------------显示个位数据----------------HC595_SendData(TAB[one]);if(flag9==0){NumbTube_Bit(0x08);for(j=0;j<500;j++);NumbTube_Bit(0x00); //关闭显示}}#include"whole.h"#include"OFF_Beep.h"#include"delay.h"extern Key_Scan(void);//-------定义一个时间结构体-------typedef struct{uint16 year;//年uint16 mon; //月uint16 day; //日uint16 dow; //星期uint16 hour; //时uint16 min; //分uint16 sec; //秒}TIME;/***********************************************名称:Set_Time(TIME *time)*功能:设置时间(初始化时间)*入口参数:time指针用来指向结构体中的时间*出口参数:无**********************************************/void Set_Time(TIME *time){CCR = 0x00; //时间计数器被禁止,可对时间进行初始化YEAR = time->year;MONTH = time->mon;DOM = time->day;DOW = time->dow;HOUR = time->hour;MIN = time->min;SEC = time->sec;// CCR=0x01; //启动RTC}/************************************************名称:GetTime(TIME *t)*功能:读取RTC时钟值*入口参数:t 保存日期的TIME结构体变量的指针*出口参数:无***********************************************/void GetTime(TIME *t){t->year = YEAR;t->mon = MONTH;t->day = DOM;t->dow = DOW;t->hour = HOUR;t->min = MIN;t->sec = SEC;}#include"whole.h"#include"delay.h"#define ROW1 (1<<21) //P2.21#define ROW2 (1<<20) //P2.20#define ROW3 (1<<19) //P2.19#define ROW4 (1<<18) //P2.18#define COL1 (1<<17) //P2.17#define COL2 (1<<16) //P2.16#define COL3 (1<<21) //P1.21#define COL4 (1<<22) //P1.22void Key_Init(void){//-------定义为GPIO--------// PINSEL2=PINSEL2&0xffffffcf;// PINSEL2=PINSEL2&0xfffffff7;//-------方向-------------IO2DIR=(IO2DIR&(~ROW1)&(~ROW2)&(~ROW3)&(~ROW4)|COL1|COL2);IO1DIR=IO1DIR|COL3|COL4;//IO2CLR=COL1|COL2;//IO1CLR=COL3|COL4;}uint8 Key_Scan(void){uint8 key=0;//--------扫描第一列-------IO2CLR=COL1;IO2SET=COL2;IO1SET=COL3|COL4;if((IO2PIN&ROW1)==0){DelayMs(5);if((IO2PIN&ROW1)==0)key=1;}if((IO2PIN&ROW2)==0){DelayMs(5);if((IO2PIN&ROW2)==0)key=2;}if((IO2PIN&ROW3)==0){DelayMs(5);if((IO2PIN&ROW3)==0)key=3;}if((IO2PIN&ROW4)==0){DelayMs(5);if((IO2PIN&ROW4)==0)key=4;}//--------扫描第二列-------IO2CLR=COL2;IO2SET=COL1;IO1SET=COL3|COL4;if((IO2PIN&ROW1)==0){DelayMs(5);if((IO2PIN&ROW1)==0)key=5;}if((IO2PIN&ROW2)==0){DelayMs(5);if((IO2PIN&ROW2)==0)key=6;}if((IO2PIN&ROW3)==0){DelayMs(5);if((IO2PIN&ROW3)==0)key=7;}if((IO2PIN&ROW4)==0) {DelayMs(5);if((IO2PIN&ROW4)==0)key=8;}//--------扫描第三列-------IO1CLR=COL3;IO2SET=COL1|COL2;IO1SET=COL4;if((IO2PIN&ROW1)==0) {DelayMs(5);if((IO2PIN&ROW1)==0)key=9;}if((IO2PIN&ROW2)==0) {DelayMs(5);if((IO2PIN&ROW2)==0)key=10;}if((IO2PIN&ROW3)==0) {DelayMs(5);if((IO2PIN&ROW3)==0)key=11;}if((IO2PIN&ROW4)==0) {DelayMs(5);if((IO2PIN&ROW4)==0)key=12;}//--------扫描第四列-------IO1CLR=COL4;IO2SET=COL1|COL2;IO1SET=COL3;if((IO2PIN&ROW1)==0){DelayMs(5);if((IO2PIN&ROW1)==0)key=13;}if((IO2PIN&ROW2)==0){DelayMs(5);if((IO2PIN&ROW2)==0)key=14;}if((IO2PIN&ROW3)==0){DelayMs(5);if((IO2PIN&ROW3)==0)key=15;}if((IO2PIN&ROW4)==0){DelayMs(5);if((IO2PIN&ROW4)==0)key=0;}IO1CLR=COL3|COL4;IO2CLR=COL1|COL2;return(key);}#ifndef __RTC_H__#define __RTC_H__typedef struct{uint16 year;//年uint16 mon; //月uint16 day; //日uint16 dow; //星期uint16 hour; //时uint16 min; //分uint16 sec; //秒}TIME;extern void Set_Time(TIME *time);extern void RTC_Init(void); //RTC初始化] extern void GetTime(TIME *t);#endif。
ARM课程设计数码管显示
八段数码管控制电路八段数码管控制电路Main:/****************************************************************************** **************** File:main.c* Author: embest* Desc:c main entry* History:****************************************************************************** ***************/#include "44blib.h"#include "44b.h"/*------------------------------------------------------------------------------------------*//* extern function*//*------------------------------------------------------------------------------------------*/extern void led8_test();/*------------------------------------------------------------------------------------------*//* function declare*//*------------------------------------------------------------------------------------------*/void Main(void);/****************************************************************************** **************** name: main* func: c code entry* para: none* ret: none* modify:* comment:****************************************************************************** ***************/void Main(void){sys_init(); /* Initial 44B0X's Interrupt,Port and UART */uart_printf("\n\r Embest Arm EduKit II Evaluation Board");uart_printf("\n\r 8-segment Digit LED Test Example (Please look at LED)\n");led8_test();while(1);}Iic:/****************************************************************************** **************** File:iic.c* Author: embest* Desc:iic source code* History:****************************************************************************** ***************/#include "44b.h"#include "44blib.h"#include "def.h"#include "iic.h"/*------------------------------------------------------------------------------------------*//* global variables*//*------------------------------------------------------------------------------------------*/int f_nGetACK;/*------------------------------------------------------------------------------------------*//* function declare*//*------------------------------------------------------------------------------------------*/void iic_int(void);void iic_init(void);void iic_write(UINT32T unSlaveAddr, UINT32T unAddr, UINT8T ucData);void iic_read(UINT32T unSlaveAddr, UINT32T unAddr, UINT8T *pData);/****************************************************************************** **************** name: iic_init* func: initialize iic* para: none* ret: none* modify:* comment:****************************************************************************** **************/void iic_init(void){f_nGetACK = 0;// Enable interruptrINTMOD = 0x0;rINTCON = 0x1;rINTMSK = rINTMSK & (~(BIT_GLOBAL|BIT_IIC));pISR_IIC= (unsigned)iic_int;// Initialize iicrIICADD = 0x10; // S3C44B0X slave addressrIICCON = 0xe5; // Enable ACK, interrupt,IICCLK=MCLK/512, Enable ACK//64Mhz/512/(15+1) = 8KhzrIICSTAT= 0x10; // Enable TX/RX}/****************************************************************************** **************** name: iic_write* func: write data to iic* para: unSlaveAddr --- input, chip slave address* unAddr --- input, data address* ucData --- input, data value* ret: none* modify:* comment:****************************************************************************** **************/void iic_write(UINT32T unSlaveAddr,UINT32T unAddr,UINT8T ucData){f_nGetACK = 0;// Send control byterIICDS = unSlaveAddr; // 0xa0rIICSTAT = 0xf0; // Master Tx,Startwhile(f_nGetACK == 0); // Wait ACKf_nGetACK = 0;// Send addressrIICDS = unAddr;rIICCON = 0xe5; // Resumes IIC operation.while(f_nGetACK == 0); // Wait ACKf_nGetACK = 0;// Send datarIICDS = ucData;rIICCON = 0xe5; // Resumes IIC operation.while(f_nGetACK == 0); // Wait ACKf_nGetACK = 0;// End sendrIICSTAT = 0xd0; // Stop Master Tx conditionrIICCON = 0xe5; // Resumes IIC operation.while(rIICSTAT & 0x20 == 1); // Wait until stop condtion is in effect.}/****************************************************************************** **************** name: iic_read* func: read data from iic* para: unSlaveAddr --- input, chip slave address* unAddr --- input, data address* pData --- output, data pointer* ret: none* modify:* comment:****************************************************************************** **************/void iic_read(UINT32T unSlaveAddr,UINT32T unAddr,UINT8T *pData){char cRecvByte;f_nGetACK = 0;// Send control byterIICDS = unSlaveAddr; // Write slave address to IICDSrIICSTAT = 0xf0; // Master Tx,Startwhile(f_nGetACK == 0); // Wait ACKf_nGetACK = 0;// Send addressrIICDS = unAddr;rIICCON = 0xe5; // Resumes IIC operation.while(f_nGetACK == 0); // Wait ACKf_nGetACK = 0;// Send control byterIICDS = unSlaveAddr; // 0xa0rIICSTAT = 0xb0; // Master Rx,StartrIICCON = 0xe5; // Resumes IIC operation.while(f_nGetACK == 0); // Wait ACKf_nGetACK = 0;// Get datarIICCON = 0x65;while(f_nGetACK == 0); // Wait ACKf_nGetACK = 0;cRecvByte = rIICDS;/* End receive */rIICSTAT = 0x90; // Stop Master Rx conditionrIICCON = 0xe5; // Resumes IIC operation.while(rIICSTAT & 0x20 == 1); // Wait until stop condtion is in effect.*pData = cRecvByte;}/****************************************************************************** **************** name: iic_int* func: IIC interrupt handler* para: none* ret: none* modify:* comment:****************************************************************************** **************/void iic_int(void){rI_ISPC=BIT_IIC;f_nGetACK = 1;}8led:/****************************************************************************** **************** File:8led.c* Author: embest* Desc:8-segment digit LED control functions* History:****************************************************************************** ***************/#include "44b.h"#include "44blib.h"#include "def.h"#include "iic.h"/*------------------------------------------------------------------------------------------*//* global variables*//*------------------------------------------------------------------------------------------*/unsigned char f_szDigital[10] ={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6}; // 0 ~ 9/*------------------------------------------------------------------------------------------*//* function declare*//*------------------------------------------------------------------------------------------*/void led8_test(void);/****************************************************************************** **************** name: led8_test* func: test 8led* para: none* ret: none* modify:* comment:****************************************************************************** **************/void led8_test(void){int i, j, k;iic_init();for(;;){for(j=0; j<10; j++){for(i=0; i<8; i++){k = 9-(i+j)%10;iic_write(0x70, 0x10+i, f_szDigital[k]);}delay(1000);ORG 0000HLJMP STARTORG 000BHLJMP ZM0;*****************************; 主程序;*****************************START: MOV TMOD,#11H ;设置定时器为0工作方试1 MOV TL0,#0B0HMOV TH0,#3CH ;设置定时器0为50msSETB EA ;开总中断SETB ET0 ;开定时器0中断MOV DPTR,#TAB ;表格地址MOV 20H,#0FFH ;设置闪烁位MOV 40H,#00H ;秒个位MOV 41H,#00H ;秒十位MOV 42H,#00H ;分个位MOV 43H,#00H ;分十位MOV 44H,#00H ;时个位MOV 45H,#00H ;时十位MOV 50H,#0C0H ;秒个位显示码MOV 51H,#0C0H ;秒十位显示码MOV 52H,#0C0H ;分个位显示码MOV 53H,#0C0H ;分十位显示码MOV 54H,#0C0H ;时个位显示码MOV 55H,#0C0H ;时十位显示码MOV R2,#20 ;计数用,20*50ms为一秒SETB TR0 ;定时器0开始计时MAIN: ACALL DISPLAY ;显示JB P0.6,MAIN ;调整键按下ACALL DISP ;除抖JB P0.6,MAINACALL SETTIME ;进入调时SJMP MAIN;****************************; 计时中断0;****************************ZM0: PUSH ACC ;保护现场PUSH PSWCLR ET0 ;关闭总中断CLR TR0 ;关计时器0中断MOV A,#0B7H ;中断响应时间同步修正ADD A,TL0MOV TL0,AMOV TH0,#3DHSETB TR0 ;开计时器0DEC R2 ;闪烁位每0.5秒闪烁一次MOV A,R2MOV b,#10DIV ABMOV A,BCJNE A,#0,NEXT ;到0.5秒了吗CPL 06h ;闪烁位取反NEXT: CJNE R2,#0,OUT ;到一秒钟对40H至45H各位进行调整MOV R2,#20MOV R0,#40H ;秒数减一ACALL DEC1MOV R3,41HCJNE R3,#255,OUTACALL CLSMOV R0,#42HACALL DEC1 ;秒数数到0时,分数减一MOV R3,43HCJNE R3,#255,OUTACALL CLSMOV R0,#44H ;分数减到0时,小时数减一ACALL DEC1MOV R3,45HCJNE R3,#255,OUTMOV 40H,#00H ;秒个位归0MOV 41H,#00H ;秒十位归0MOV 42H,#00H ;分个位归0MOV 43H,#00H ;分十位归0MOV 44H,#00H ;时个位归0MOV 45H,#00H ;时十位归0MOV 20H,#0BFHACALL OUT1 ;BCD码化为显示码CLR TR0CLR TR0 ;关闭计时器0SJMP MAIN ;都减为0时,程序结果,等待下一次设置时间OUT: MOV R5,#6;将40H至45H的BCD码译为相应的显示码存放在50H至55H中MOV R0,#45HMOV R1,#55HBIAN: MOV A,@R0MOVC A,@A+DPTRMOV @R1,ADEC R0DEC R1DJNZ R5,BIANPOP ACCPOP PSWSETB ET0RETI;**************************; 减一程序;**************************DEC1: CJNE @R0,#0,OUTT ;对相应的十位与个位进行减一处理MOV @R0,#9INC R0DEC @R0DEC R0RETOUTT: DEC @R0RET;**************************; 归位程序;**************************CLS: MOV @R0,#9INC R0MOV @R0,#5RET;***************************; BCD码化为显示码程序;***************************OUT1: MOV R5,#6 ;将40H至45H的BCD码译为相应的显示码存放在50H至55H中MOV R0,#45HMOV R1,#55HBIAN1: MOV A,@R0MOVC A,@A+DPTRMOV @R1,ADEC R0DEC R1DJNZ R5,BIAN1RET;**********************************; 设置计时数程序;**********************************SETTIME:CLR TR0 ;关闭计时器ACALL DISPLAYMOV 40H,#00H ;秒个位归0MOV 41H,#00H ;秒十位归0MOV 42H,#00H ;分个位归0MOV 43H,#00H ;分十位归0MOV 44H,#00H ;时个位归0MOV 45H,#00H ;时十位归0MOV 20H,#0BFHACALL OUT1 ;BCD码化为显示码ACALL DISP ;除抖JB P0.6,REI1SELF: JNB P0.6,SELF ;等待键释放PUSH ACC ;保护现场PUSH PSWMOV TL0,#0B0H ;重置计数器MOV TH0,#3CHWAIT: ACALL DISPLAY ;等待设置健按下MOV A,P0CPL AJZ WAITACALL DISP ;除抖MOV A,P0CPL AJZ WAITMOV B,A ;保存数据SELF1: MOV A,P0 ;等待健释放CJNE A,#0FFH,SELF1MOV A,B ;计算是哪个键按下,对相应的内存加一MOV R1,#3FHCLR CAGAIN: RRC AINC R1JNC AGAININC @R1MOV B,R1ACALL SETTIME0 ;对时间数据作相应的调整ACALL OUT1 ;BCD码化为显示码MOV R1,BCJNE R1,#46H,W AIT ;p0.6再次为0时,开始计时REI1: POP ACCPOP PSWSETB TR0RET ;返回;*********************************; 调整程序;**********************************SETTIME0:MOV A,40H ;秒个位满10归0CJNE A,#10,SET1MOV 40H,#0SET1: MOV A,41H ;秒十位满6归0 CJNE A,#6,SET2MOV 41H,#0SET2: MOV A,42H ;分个位满10归0 CJNE A,#10,SET3MOV 42H,#0SET3: MOV A,43H ;分十位满6归0 CJNE A,#6,SET4MOV 43H,#0SET4: MOV A,44H ;时个位满4归0 CJNE A,#4,SET5MOV 44H,#0SET5: MOV A,45H ;时十位满3归0 CJNE A,#3,SET6MOV 45H,#0SET6: RET;**********************************; 显示程序;**********************************DISPLAY:MOV P1,50H ;显示秒个位MOV P3,#0ACALL DISPMOV P1,#0FFHMOV P1,51H ;显示秒十位MOV P3,#8ACALL DISPMOV P1,#0FFHMOV P1,20H ;显示闪烁位MOV P3,#16ACALL DISPMOV P1,#0FFHMOV P1,52H ;显示分个位MOV P3,#24ACALL DISPMOV P1,#0FFHMOV P1,53H ;显示分十位MOV P3,#32ACALL DISPMOV P1,#0FFHMOV P1,20H ;显示闪烁位MOV P3,#40ACALL DISPMOV P1,#0FFHMOV P1,54H ;显示时个位MOV P3,#48ACALL DISPMOV P1,#0FFHMOV P1,55H ;显示时十位MOV P3,#56ACALL DISPMOV P1,#0FFHRET;*******************************; 0.5ms延时程序;*******************************DISP: MOV 30H,#5DD: MOV 31H,#50DJNZ 31H,$DJNZ 30H,DDRET;*************************************; 表格;*************************************TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;0至9的共阳显示码END}}}。
单片机控制8位数码管显示秒表课程设计
长沙学院《单片机原理及应用》课程设计说明书题目 LED数码管显示电子秒表设计系(部) **系专业(班级) *************姓名邹部长9931学号******指导教师***起止日期 2016.12.19—2016.12.24《单片机原理及应用》课程设计任务书1系(部):**系专业:******长沙学院课程设计鉴定表目录摘要 (5)第一章概述 (6)1.1电子秒表的设计要求 (6)1.2电子秒表的电路图 (6)1.3电子秒表的设计原理及方案 (7)第二章电子秒表的程序设计 (8)2.1 程序设计流程图 (8)2.2程序设计源代码 (10)第三章程序的调试 (16)第四章设计总结 (17)参考文献 (18)摘要随着经济与社会的发展对智能化和信息化技术要求的不断提高,单片机作为智能控制的核心,逐渐渗透到社会生产和生活的各个方面。
而本文则主要阐述基于单片机设计的数码管秒表,这次设计所采用的的单片机为stc89c52单片机,数码管则是使用2个4位共阴LED数码管组成的8位。
为减少I/O口,而使用了SM74HC138 和74HCT573这2片芯片实现数码管显示8位数据。
利用单片机内部定时器实现计时功能,分别显示为:分—秒—0.01秒。
控制则是使用一键控制,可实现计时开始,计时暂停,计时清零3个功能的循环。
本次的程序设计采用C语言编写,包括显示程序,定时中断服务程序,延时程序。
最后在单片机电路板来观察工作状态。
第一章概述1.1电子秒表的设计要求○1显示要求在初始状态显示的是00—00—00,最左边的2位显示分钟,中间2位显示秒,左边2位显示十分之一秒和百分之一秒,还有个2个LED数码管只显示中间那一段,用作间隔符。
○2然后还的有一个键用来控制秒表,要求按第一下开始计时,按第二下暂停计时,按第三下清零,以此往复循环控制。
○3使用单片机T0方式实现计时0.01秒。
1.2电子秒表的电路图1.3电子秒表的设计原理及方案设计原理根据单片机本身的定时计数器实现1秒的计时。
单片机实验报告二-数码管显示实验
单片机实验报告二-数码管显示实验摘要:本实验使用单片机控制数码管的显示,在实验过程中通过学习单片机的GPIO口的编程,调试程序、调节电路来达到正确的显示效果。
最终按照要求实现了单片机控制数码管的计数器。
关键词:单片机、数码管、GPIO口、计数器一、实验介绍数码管是一种介于机械仪表和液晶显示器之间的电子显示器件,广泛应用于计时器、计数器、仪表等电子产品中。
本实验旨在通过单片机控制数码管的显示来加深对GPIO口的使用和调试程序的理解,同时了解数码管的原理。
本实验主要分为两部分:数码管显示基础实验和数码管控制开关实验。
通过这两部分的实验可以了解数码管的工作原理和单片机的基本控制方式。
二、实验原理2.1 数码管的基本原理数码管显示器将数字显示为一组符号,例如“0”到“9”。
表示不同数字的符号被编码成一个数字码。
七段数码管用一个七段数码字母来表示数字,如下表所示:| 数字 | a | b | c | d | e | f | g || ---- | - | - | - | - | - | - | - || 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 || 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 || 2 | 1 | 1 | 0 | 1 | 1 | 0 | 1 || 3 | 1 | 1 | 1 | 1 | 0 | 0 | 1 || 4 | 0 | 1 | 1 | 0 | 0 | 1 | 1 || 5 | 1 | 0 | 1 | 1 | 0 | 1 | 1 || 6 | 0 | 0 | 1 | 1 | 1 | 1 | 1 || 7 | 1 | 1 | 1 | 0 | 0 | 0 | 0 || 8 | 1 | 1 | 1 | 1 | 1 | 1 | 1 || 9 | 1 | 1 | 1 | 1 | 0 | 1 | 1 |通过控制数码管的七个LED灯的亮灭,可以实现不同符号显示。
动态数码管显示课程设计
动态数码管显示课程设计一、课程目标知识目标:1. 理解动态数码管显示原理,掌握其基本结构和工作方式;2. 学会使用编程语言控制动态数码管显示,并能正确编写程序代码;3. 了解动态数码管在不同应用场景中的使用方法。
技能目标:1. 培养学生动手实践能力,能够独立完成动态数码管的硬件连接和程序编写;2. 提高学生问题解决能力,能够运用所学知识解决动态数码管显示过程中遇到的问题;3. 培养学生团队协作能力,通过小组合作完成课程项目。
情感态度价值观目标:1. 培养学生对电子技术的兴趣和热情,激发学生主动探索的精神;2. 培养学生严谨的科学态度,注重实验过程和结果的分析;3. 增强学生的环保意识,认识到电子废弃物对环境的影响,提倡绿色环保。
课程性质分析:本课程为电子技术相关课程,以实践操作为主,注重理论知识与实际应用相结合。
学生特点分析:学生年级为初中或高中,对电子技术有一定了解,具备基本的编程能力和动手能力。
教学要求:结合课程性质和学生特点,将课程目标分解为具体的学习成果,以便教学设计和评估。
在教学过程中,注重理论与实践相结合,充分调动学生的主观能动性,培养其创新思维和实际操作能力。
二、教学内容1. 动态数码管基本概念:介绍动态数码管的结构、工作原理及分类;2. 动态数码管硬件连接:讲解动态数码管的引脚功能,指导学生完成硬件电路的搭建;3. 动态数码管编程控制:结合课本知识,教授如何使用编程语言(如Arduino、Micro:bit等)控制动态数码管显示;4. 动态数码管显示实例:分析并实践动态数码管在不同场景下的应用,如计时器、温度计等;5. 课程项目:分组进行项目实践,要求学生自主设计并实现一个具有实际应用价值的动态数码管显示系统。
教学大纲安排:第一课时:动态数码管基本概念及硬件连接;第二课时:动态数码管编程控制基础;第三课时:动态数码管显示实例分析;第四课时:课程项目实践及成果展示。
教学内容关联教材章节:第一章:电子元件基础;第二章:数字电路基础;第三章:编程基础;第四章:电子项目实践。
数码管流动显示12345678
学号天津城建大学嵌入式系统及应用课程设计设计说明书数码管流动显示12345678起止日期:2015 年11月15日至2015 年11月27 日学生姓名班级成绩指导教师(签字)计算机与信息工程学院2015年11 月27 日课程设计报告书题目: 数码管流动显示12345678学生姓名:学生学号:院名:专业:任课教师:目录摘要.................................................................................................................................... 第一章课设总述. (1)1.1单片机概述 (1)1.3课题研究的目的和意义 (1)1。
4课题的主要研究工作 (1)第二章系统硬件介绍及设计 (2)2。
1AT89C51简介 (2)1.2数码管7SEG-COM-AN-BLUE介绍(7段数码管) (3)2。
2硬件电路图 (4)2。
3元件清单 (4)第三章系统软件设计 (5)3。
1程序描述 (6)3.2程序流程图 (6)第四章系统调试 (7)4。
1在PROTEUS中仿真 (7)参考文献 (7)摘要1.内容:利用动态扫描让八位数码管稳定的显示1、2、3、4、5、6、7、82。
目标:(1)掌握单片机控制八位数码管的动态扫描技术,包括程序设计和电路设计,本任务的效果是让八位数码管稳定的显示12345678。
(2)用PROTEUS进行电路设计和实时仿真3.知识点链接(1)数码管动态扫描 (动态扫描的定义以及与静态显示的区别)动态显示的特点是将所有位数码管的段选线s一位数码管有效。
选亮数码管采用动态扫描显示。
所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。
(2)总线的应用元器件与总线的连线P0口的接线采用总线方式,详细如电路图1所示。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录一、设计内容 (2)1.1实验目的 (2)1.2实验设备 (2)二、设计原理 (2)2.1 八段数码管 (2)2.2 电路原理 (3)三、操作步骤 (4)四、程序代码 (5)五、心得体会 (12)ARM数码管显示一、设计内容1.1实验目的掌握LED 的显示控制方法。
巩固对存储区进行访问的方法。
1.2实验设备硬件:Embest Arm EduKit II实验平台,Embest ARM标准/增强型仿真器套件,PC机。
软件:Embest IDE Pro 2004集成开发环境,Windows 98/2000/NT/XP。
二、设计原理2.1 八段数码管嵌入式系统中,经常使用八段数码管来显示数字或符号,由于它具有显示清晰、亮度高、使用电压低、寿命长的特点,因此使用非常广泛。
结构:八段数码管由八个发光二极管组成,其中七个长条形的发光管排列成“日”字形,右下角一个点形的发光管作为显示小数用,八段数码管能显示所有数字及部份英文字母。
见图类型:八段数码管有两种不同的形式:一种是八个发光二极管的阳极都连在一起的,称之为共阳极八段数码管;另一种是八个发光二极管的阴极都连在一起的,称之为共阴极八段数码管。
工作原理:以共阳极八段数码管为例,当控制某段发光二极管的信号为低电平时,对应的发光二极管点亮,当需要显示某字符时,就将该字符对应的所有二极管点亮;共阴极二极管则相反,控制信号为高电平时点亮。
显示方式:八段数码管的显示方式有两种,分别是静态显示和动态显示。
静态显示是指当八段数码管显示一个字符时,该字符对应段的发光二极管控制信号一直保持有效。
动态显示是指当八段数码管显示一个字符时,该字符对应段的发光二极管是轮流点亮的,即控制信号按一定周期有效,在轮流点亮的过程中,点亮时间是极为短暂的(约1ms),由于人的视觉暂留现象及发光二极管的余辉效应,数码管的显示依然是非常稳定的。
2.2 电路原理EMBEST ARM EDUKIT II教学电路中,使用的是共阳极八段数码管,数码管的控制通过芯片ZLG7290控制,各段的控制信号是芯片ZLG7290的SEGA~SEGG引脚控制,需要显示的段码通过IIC总线传送到该芯片,见图。
八段数码管控制电路八段数码管控制电路三、操作步骤1.准备实验环境使用Embest仿真器连接目标板,使用Embest Arm EduKit II实验板附带的串口线,连接实验板上的UART0和PC机的串口。
2.串口接收设置在PC机上运行windows自带的超级终端串口通信程序(波特率115200、1位停止位、无校验位、无硬件流控制);或者使用其它串口通信程序。
3.打开实验例程1)使用Embest IDE通过Embest JTAG仿真器连接实验板,打开实验例程目录4.6_8led_test子目录下的8led_test.ews例程,编译链接工程成功;2)点击IDE的Debug菜单,选择Remote Connect项或F8键,远程连接目标板;3)点击IDE的Debug菜单,选择Download下载调试代码到目标系统的RAM中;4)在“8LED_test ();”设置断点后,点击Debug菜单的Go或F5键运行程序。
4.观察实验结果1).在PC机上观察超级终端程序主窗口,可以看到如下界面:Embest Arm EduKit II Evaluation Board8-segment Digit LED Test Example (Please look at LED)2).实验系统八段数码管循环显示0 ~ F字符。
四、程序代码Main:/****************************************************************************** **************** File:main.c* Author: embest* Desc:c main entry* History:****************************************************************************** ***************/#include "44blib.h"#include "44b.h"/*------------------------------------------------------------------------------------------*//* extern function*//*------------------------------------------------------------------------------------------*/extern void led8_test();/*------------------------------------------------------------------------------------------*//* function declare*//*------------------------------------------------------------------------------------------*/void Main(void);/****************************************************************************** **************** name: main* func: c code entry* para: none* ret: none* modify:* comment:****************************************************************************** ***************/void Main(void){sys_init(); /* Initial 44B0X's Interrupt,Port and UART */uart_printf("\n\r Embest Arm EduKit II Evaluation Board");uart_printf("\n\r 8-segment Digit LED Test Example (Please look at LED)\n");led8_test();while(1);}Iic:/****************************************************************************** **************** File:iic.c* Author: embest* Desc:iic source code* History:****************************************************************************** ***************/#include "44b.h"#include "44blib.h"#include "def.h"#include "iic.h"/*------------------------------------------------------------------------------------------*//* global variables*//*------------------------------------------------------------------------------------------*/int f_nGetACK;/*------------------------------------------------------------------------------------------*//* function declare*//*------------------------------------------------------------------------------------------*/void iic_int(void);void iic_init(void);void iic_write(UINT32T unSlaveAddr, UINT32T unAddr, UINT8T ucData);void iic_read(UINT32T unSlaveAddr, UINT32T unAddr, UINT8T *pData);/****************************************************************************** **************** name: iic_init* func: initialize iic* para: none* ret: none* modify:* comment:****************************************************************************** **************/void iic_init(void){f_nGetACK = 0;// Enable interruptrINTMOD = 0x0;rINTCON = 0x1;rINTMSK = rINTMSK & (~(BIT_GLOBAL|BIT_IIC));pISR_IIC= (unsigned)iic_int;// Initialize iicrIICADD = 0x10; // S3C44B0X slave addressrIICCON = 0xe5; // Enable ACK, interrupt,IICCLK=MCLK/512, Enable ACK//64Mhz/512/(15+1) = 8KhzrIICSTAT= 0x10; // Enable TX/RX}/****************************************************************************** **************** name: iic_write* func: write data to iic* para: unSlaveAddr --- input, chip slave address* unAddr --- input, data address* ucData --- input, data value* ret: none* modify:* comment:****************************************************************************** **************/void iic_write(UINT32T unSlaveAddr,UINT32T unAddr,UINT8T ucData){f_nGetACK = 0;// Send control byterIICDS = unSlaveAddr; // 0xa0rIICSTAT = 0xf0; // Master Tx,Startwhile(f_nGetACK == 0); // Wait ACKf_nGetACK = 0;// Send addressrIICDS = unAddr;rIICCON = 0xe5; // Resumes IIC operation.while(f_nGetACK == 0); // Wait ACKf_nGetACK = 0;// Send datarIICDS = ucData;rIICCON = 0xe5; // Resumes IIC operation.while(f_nGetACK == 0); // Wait ACKf_nGetACK = 0;// End sendrIICSTAT = 0xd0; // Stop Master Tx conditionrIICCON = 0xe5; // Resumes IIC operation.while(rIICSTAT & 0x20 == 1); // Wait until stop condtion is in effect.}/****************************************************************************** **************** name: iic_read* func: read data from iic* para: unSlaveAddr --- input, chip slave address* unAddr --- input, data address* pData --- output, data pointer* ret: none* modify:* comment:****************************************************************************** **************/void iic_read(UINT32T unSlaveAddr,UINT32T unAddr,UINT8T *pData){char cRecvByte;f_nGetACK = 0;// Send control byterIICDS = unSlaveAddr; // Write slave address to IICDSrIICSTAT = 0xf0; // Master Tx,Startwhile(f_nGetACK == 0); // Wait ACKf_nGetACK = 0;// Send addressrIICDS = unAddr;rIICCON = 0xe5; // Resumes IIC operation.while(f_nGetACK == 0); // Wait ACKf_nGetACK = 0;// Send control byterIICDS = unSlaveAddr; // 0xa0rIICSTAT = 0xb0; // Master Rx,StartrIICCON = 0xe5; // Resumes IIC operation.while(f_nGetACK == 0); // Wait ACKf_nGetACK = 0;// Get datarIICCON = 0x65;while(f_nGetACK == 0); // Wait ACKf_nGetACK = 0;cRecvByte = rIICDS;/* End receive */rIICSTAT = 0x90; // Stop Master Rx conditionrIICCON = 0xe5; // Resumes IIC operation.while(rIICSTAT & 0x20 == 1); // Wait until stop condtion is in effect.*pData = cRecvByte;}/****************************************************************************** **************** name: iic_int* func: IIC interrupt handler* para: none* ret: none* modify:* comment:****************************************************************************** **************/void iic_int(void){rI_ISPC=BIT_IIC;f_nGetACK = 1;}8led:/****************************************************************************** **************** File:8led.c* Author: embest* Desc:8-segment digit LED control functions* History:****************************************************************************** ***************/#include "44b.h"#include "44blib.h"#include "def.h"#include "iic.h"/*------------------------------------------------------------------------------------------*//* global variables*//*------------------------------------------------------------------------------------------*/unsigned char f_szDigital[10] ={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6}; // 0 ~ 9/*------------------------------------------------------------------------------------------*//* function declare*//*------------------------------------------------------------------------------------------*/void led8_test(void);/****************************************************************************** **************** name: led8_test* func: test 8led* para: none* ret: none* modify:* comment:****************************************************************************** **************/void led8_test(void){int i, j, k;iic_init();for(;;){for(j=0; j<10; j++){for(i=0; i<8; i++){k = 9-(i+j)%10;iic_write(0x70, 0x10+i, f_szDigital[k]);}delay(1000);}}}五、心得体会回顾此次课程设计,让我感慨颇多,从理论到实践,我学到了很多很多的东西,不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的内容。