版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
单片机实验报告姓名:班级:学号:实验一数码管实验一、实验目的1.了解数码管的显示原理;2.掌握JXARM9-2440中数码管显示编程方法。二、实验仪器JXARM9-2440教学实验箱、ADT1000仿真器和ADTIDE集成开发环境、PC机。三、实验原理7段LED由7个发光二极管按“日”字形排列,所有发光二极管的阳极连在一起称共阳极接法,阴极连在一起称为共阴极接法。LED显示器的接口一般有静态显示与动态显示接口两种方式。本实验中采用的是动态显示接口,其中数码管扫描控制地址为0x20007000,位0-位5每位分别对应一个数码管,将其中某位清0来选择相应的数码管,地址0x20006000为数码管的数据寄存器。数码管采用共阳方式,向该地址写一个数据就可以控制LED的显示,其原理图如图所示。四、实验内容及步骤1、六个数码管同时正向显示0-F,然后反向显示F-0。1)参照模板工程led(modules\led\led.apj),新建一个工程led,添加相应的文件,并修改led的工程设置;2)创建led.c并加入到工程led中;3)编写LED显示函数voidled_display(void),正向显示0-F然后反向显示F-0,并循环执行以上动作,在每次显示之间延时一段时间;4)编译led,成功后,下载并运行,观察结果。2、在六个数码管上依次显示“HELLO”,可分辨出轮流显示。步骤同上。3、在六个数码管上依次显示“HELLO”,分辨不出轮流显示。步骤同上。*4、在每个数码管上递增显示0-9。步骤同上。五、实验程序/****************************************************************************//*文件名称:LEDSEG7.C*//*实验现象:数码管依次显示出0、1,2、……9、a、b、C、d、E、F*//****************************************************************************/#defineU8unsignedcharunsignedcharseg7table[16]={/*01234567*/0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,/*89ABCDEF*/0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,};voidDelay(inttime);/****************************************************************************//*函数说明:JXARM9-24107段构共阳数码管测试*//*功能描述:依次在7段数码管上显示0123456789ABCDEF*//*返回代码:无*//*参数说明:无*//****************************************************************************/voidTest_Seg7(void){ inti; *((U8*)0x20007000)=0x00; for(;;) { for(i=0;i<0x10;i++) { *((U8*)0x20006000)=seg7table[i]; Delay(10000); } for(i=0xf;i>=0x0;i--) { *((U8*)0x20006000)=seg7table[i]; Delay(10000); } } //TODO}/****************************************************************************//*Functionname:循环延时子程序*//*Description:循环'time'次*//*Returntype:void*//*Argument:循环延时计数器*//****************************************************************************/voidDelay(inttime){inti; intdelayLoopCount=10000;for(;time>0;time--); for(i=0;i<delayLoopCount;i++);}voidTest_Seg7(void){ inti; for(;;) { *((U8*)0x20007000)=0x3E; *((U8*)0x20006000)=seg7table[5]; Delay(10000); *((U8*)0x20007000)=0x3D; *((U8*)0x20006000)=seg7table[4]; Delay(10000); *((U8*)0x20007000)=0x3B; *((U8*)0x20006000)=seg7table[3]; Delay(10000); *((U8*)0x20007000)=0x37; *((U8*)0x20006000)=seg7table[2]; Delay(10000); *((U8*)0x20007000)=0x2F; *((U8*)0x20006000)=seg7table[1]; Delay(10000); } //TODO}六、结果及分析。我们了解了数码管的显示原理,基本掌握了JXARM9-2440中数码管显示编程方法,用数码管显示出了,字母和数字。实验二键盘输入与I/O实验一、实验目的1、学习键盘驱动原理;2、掌握通过CPU的I/O扩展键盘的方法二、实验仪器JXARM9-2440教学实验箱、ADT1000仿真器和ADTIDE集成开发环境、PC机、串口连接线。三、实验原理键盘实现方案:采用专门的芯片实现键盘扫描采用软件实现键盘扫描软键盘实现方案:当开关打开时,通过处理器的I/O口的一个上拉电阻提供逻辑1;当开关闭合时,处理器的I/O口的输入将被拉低到逻辑0。开关并不完善,因为当它们被按下或者被释放时,并不能够产生一个明确的1或者0。尽管触点可能看起来稳定而且很快地闭合,但与微处理器快速的运行速度相比,这种动作是比较慢的。当触点闭合时,其弹起就像一个球。弹起效果将产生如下图所示的好几个脉冲。弹起的持续时间通常将维持在5ms~30ms之间。JXARM9-2440的键盘模块四、实验内容及步骤(一)学习与分析例程中的各个程序以及主要函数,以进一步理解键盘的工作原理。(二)获取按键值,在串口显示。(三)使按键按照如图的顺序显示出来。(四)将键盘按键值在数码管上显示。或自行开发。步骤:1)参照模板工程key(modules\key\key.apj),新建一个工程key,添加相应的文件,并修改key的工程设置;2)创建main.c并加入到工程key中;3)按照实验内容编写相应程序;4)编译key;5)下载程序并运行,按键看串口是否有显示;看数码管是否输出相应键值。五、实验程序。Keyboard.c#include<string.h>#include"2410addr.h"#include"2410lib.h"#include"timer.h"#include"interrupt.h"#defineRECV_CMD_MAX_BUF2048charrecv_buf[RECV_CMD_MAX_BUF];intrecv_read=0;intrecv_write=0;charkey_recv_buf[RECV_CMD_MAX_BUF];intkey_recv_read=0;intkey_recv_write=0;//键盘扫描inttimer1_count=0;enumKEYBOARD_SCAN_STATUS{KEYBOARD_SCAN_FIRST,KEYBOARD_SCAN_SECOND,KEYBOARD_SCAN_THIRD,KEYBOARD_SCAN_FOURTH};introw=0;externunsignedcharoutput_0x10000000;unsignedchar ascii_key,input_key[4],input_key1[4],key_mask=0x0F;unsignedchar* keyboard_port_scan=(unsignedchar*)0x2000C000;unsignedchar* keyboard_port_value=(unsignedchar*)0x2000C000;intkeyboard_scan_status[4]={ KEYBOARD_SCAN_FIRST, KEYBOARD_SCAN_FIRST, KEYBOARD_SCAN_FIRST, KEYBOARD_SCAN_FIRST };charkey_get_char(introw,intcol){ charkey=0; switch(row) {case0: if((col&0x01)==0)key='F'; elseif((col&0x02)==0)key='E'; elseif((col&0x04)==0)key='D'; elseif((col&0x08)==0)key='C'; break; case1: if((col&0x01)==0)key='B'; elseif((col&0x02)==0)key='9'; elseif((col&0x04)==0)key='6'; elseif((col&0x08)==0)key='3'; break; case2: if((col&0x01)==0)key='A'; elseif((col&0x02)==0)key='8'; elseif((col&0x04)==0)key='5'; elseif((col&0x08)==0)key='2'; break; case3: if((col&0x01)==0)key='0'; elseif((col&0x02)==0)key='7'; elseif((col&0x04)==0)key='4'; elseif((col&0x08)==0)key='1'; break; default: break;} returnkey;}/********************************************************************//Functionname :recv_key//Description :将获取的键值加入按键缓冲区//Returntype :void//Argument:intkey*********************************************************************/voidrecv_key(intkey){key_recv_buf[key_recv_write]=key; key_recv_write++; if(key_recv_write>=RECV_CMD_MAX_BUF) key_recv_write=0; if(key_recv_write==key_recv_read) {//缓冲区以满 key_recv_read++; if(key_recv_read>=RECV_CMD_MAX_BUF) key_recv_read=0; }}/********************************************************************//Functionname :Kbd_Scan//Description :定时器1中断服务程序,用于扫描键盘,每隔10ms一次中断//Returntype :void//Argument:void*********************************************************************/voidKbd_Scan(void){intloopcnt=row,bexit=0; inttemp; //键盘扫描 for(loopcnt=row;loopcnt<row+4;loopcnt++) {if(loopcnt>=4) temp=loopcnt-4; else temp=loopcnt; switch(keyboard_scan_status[temp]) {caseKEYBOARD_SCAN_FIRST: *keyboard_port_scan=output_0x10000000&(~(0x00000001<<temp));/*将row列置低电平 */ keyboard_scan_status[temp]=KEYBOARD_SCAN_SECOND; bexit=1; break; caseKEYBOARD_SCAN_SECOND: input_key[temp]=(*keyboard_port_value)&key_mask; /*并获取第一次扫描值*/ if(input_key[temp]==key_mask) keyboard_scan_status[temp]=KEYBOARD_SCAN_FIRST; /*没有按键,回到开始状态 */ else { keyboard_scan_status[temp]=KEYBOARD_SCAN_THIRD; /*有按键 */ bexit=1; } break; caseKEYBOARD_SCAN_THIRD: if(((*keyboard_port_value)&key_mask)!=input_key[temp]) keyboard_scan_status[temp]=KEYBOARD_SCAN_FIRST; else { ascii_key=key_get_char(temp,input_key[temp]); keyboard_scan_status[temp]=KEYBOARD_SCAN_FOURTH; *keyboard_port_scan=output_0x10000000&(~(0x00000001<<temp));/*将row列置低电平 */ bexit=1; } break; caseKEYBOARD_SCAN_FOURTH: input_key1[temp]=(*keyboard_port_value)&key_mask; /*并获取第一次扫描值*/ if(input_key1[temp]==key_mask) { //getakey recv_key(ascii_key); keyboard_scan_status[temp]=KEYBOARD_SCAN_FIRST; }else { *keyboard_port_scan=output_0x10000000&(~(0x00000001<<temp));/*将row列置低电平 */ bexit=1; } break;} if(bexit) break;} row=temp; }/********************************************************************//Functionname :Key_GetKey//Description :如果有键按下返回键,否则返回0//Returntype :char//Argument:*********************************************************************/charKey_GetKey(){ charch; if(key_recv_write==key_recv_read) {/*nokeyfound*/ ch=0;}else { ch=key_recv_buf[key_recv_read]; key_recv_read++; if(key_recv_read>=RECV_CMD_MAX_BUF) key_recv_read=0;} returnch;}/********************************************************************//Functionname :Key_GetKeyPoll(查询方式)//Description :如果有键按下返回键,否则返回0//Returntype :char//Argument:*********************************************************************/charKey_GetKeyPoll(){ introw; unsignedchar ascii_key,input_key,input_key1,key_mask=0x0F; for(row=0;row<4;row++) {*keyboard_port_scan=output_0x10000000&(~(0x00000001<<row));/*将row列置低电平 */ Delay(3); /*延时 */ input_key=(*keyboard_port_value)&key_mask; /*并获取第一次扫描值*/ if(input_key==key_mask) continue; /*没有按键 */ /*延时,再次获取扫描值,如果两次的值不等,则认为是一个干扰 */ Delay(3); if(((*keyboard_port_value)&key_mask)!=input_key)continue; //等待按键松开 while(1) { *keyboard_port_scan=output_0x10000000&(~(0x00000001<<row));/*将row列置低电平 */ Delay(3); input_key1=(*keyboard_port_value)&key_mask; /*并获取第一次扫描值*/ if(input_key1==key_mask) break; /*没有按键 */} ascii_key=key_get_char(row,input_key); /*查表 */ returnascii_key; /*显示结果 */}return0;}六、结果及分析。成功将键盘输入与要求的图上对应。实验三中断实验一、实验目的1、了解中断的作用;2、掌握嵌入式系统中断的处理流程;3、掌握ARM中断编程。二、实验仪器JXARM9-2440教学实验箱、ADT1000仿真器和ADTIDE集成开发环境、PC机。三、实验原理当CPU进行主程序操作时,外设的数据已存入输入端口的数据寄存器;或端口的数据输出寄存器已空,由外设通过接口电路向CPU发出中断请求信号,CPU在满足一定的条件下,暂停执行当前正在执行的主程序,转入执行相应能够进行输入/输出操作的子程序,待输入/输出操作执行完毕之后CPU再返回并继续执行原来被中断的主程序。这样CPU就避免了把大量时间耗费在等待、查询状态信号的操作上,使其工作效率得以大大地提高。四、实验内容及步骤(一)学习例程,对其关键程序与设置进行分析。(二)编写中断处理程序,处理外部中断2,3,控制LED灯闪烁或数码管显示。1、当外部中断2发生时,使8个LED在亮灭间切换;2、当外部中断3发生时,使8个LED等依次亮一下。*3、当中断发生时,控制数码管显示。步骤:1)参照模板工程,新建一个工程interrupt,添加相应的文件,并修改interrupt的工程设置;2)加入如下文件到interrupt中:common\2440lib.c、;asm\2440init.s、asm\2440slib.s和common\interrupt.c。3)根据实验内容编写外部中断2,3的中断处理程序,并保存为main.c文件,将该文件加入到工程中;4)编译、下载并运行程序烁。五、实验程序1、当外部中断2发生时,使8个LED在亮灭间切换。/*包含文件*/#include"def.h"#include"2410lib.h"#include"option.h"#include"2410addr.h"#include"interrupt.h"/*functions*/voideint2_isr(void)__attribute__((interrupt("IRQ")));;voideint3_isr(void)__attribute__((interrupt("IRQ")));;voiddelay();/*variables*/intdither_count2=0;intdither_count3=0;staticintnLed=0;/*****************************************************************************//Functionname :Main//Description :JXARM9-2410中断实验主程序//完成功能://外部中断按键引发中断//Returntype :void//Argument:void*****************************************************************************/voidMain(void){ /*配置系统时钟*/ChangeClockDivider(2,1);U32mpll_val=0;mpll_val=(92<<12)|(1<<4)|(1);ChangeMPllValue((mpll_val>>12)&0xff,(mpll_val>>4)&0x3f,mpll_val&3); /*中断初始化*/Isr_Init();/*初始化端口*/Port_Init();/*初始化串口*/Uart_Init(0,115200);Uart_Select(0);/*打印提示信息*/ PRINTF("\n---外部中断测试程序---\n"); PRINTF("\n请将UART0与PC串口进行连接,然后启动超级终端程序(115200,8,N,1)\n"); PRINTF("\n外部中断测试开始\n"); /*请求中断*/ Irq_Request(IRQ_EINT2,eint2_isr);/*使能中断*/Irq_Enable(IRQ_EINT2);dither_count2=0;dither_count3=0;while(1){ delay(); dither_count2++; dither_count3++;}}/*****************************************************************************//Functionname :eint2_isr//Description :EINT2中断处理程序//Returntype :int//Argument:void*****************************************************************************/voideint2_isr(void){ Irq_Clear(IRQ_EINT2);if(dither_count2>10){ dither_count2=0; /*8个灯亮灭*/ unsignedcharoutput_0x10000000=0xff; while(1) { output_0x10000000=0xff; *((unsignedchar*)0x20005000)=output_0x10000000; delay(); output_0x10000000=0x00; *((unsignedchar*)0x20005000)=output_0x10000000; delay(); } }}/*****************************************************************************//Functionname :eint3_isr//Description :EINT3中断处理程序//Returntype :int//Argument:void*****************************************************************************/voideint3_isr(void){ Irq_Clear(IRQ_EINT3);if(dither_count3>10){ dither_count3=0; /*8个依次亮灭*/ unsignedcharoutput_0x10000000=0xff; while(1) { inti; output_0x10000000=0x01; *((unsignedchar*)0x20005000)=output_0x10000000; delay(); for(i=1;i<8;i++) { output_0x10000000=output_0x10000000<<1; *((unsignedchar*)0x20005000)=output_0x10000000; delay(); } }}}voiddelay(){ intindex=0; for(index=0;index<50000;index++);}2、当外部中断3发生时,使8个LED等依次亮一下。只需将中断请求和使能中断的端口改为EINT3,即可调用中断三,其余程序不变/*请求中断*/ Irq_Request(IRQ_EINT3,eint3_isr);/*使能中断*/Irq_Enable(IRQ_EINT3);3、当中断发生时,控制数码管显示。只需任选一个中断(以中断三为例),将中断处理程序的内容改为数码管显示即可。#defineU8unsignedcharunsignedcharseg8table[16]={/*01234567*/0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,/*89ABCDEF*/0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,};/*段码组*//*****************************************************************************//Functionname :eint3_isr//Description :EINT3中断处理程序//Returntype :int//Argument:void*****************************************************************************/voideint3_isr(void){ Irq_Clear(IRQ_EINT3);if(dither_count3>10){ dither_count3=0;/*数码管*/inti; *((U8*)0x20007000)=0x00;for(;;){for(i=0;i<0x10;i++){*((U8*)0x20006000)=seg8table[i];Delay(100);}for(i=0xf;i>=0x0;i--){*((U8*)0x20006000)=seg8table[i];Delay(100);}}}}voiddelay(){ intindex=0; for(index=0;index<50000;index++);}/*****************************************************************************//*Functionname:循环延时子程序/*Description:循环'time'次/*Returntype:void/*Argument:循环延时计数器*//****************************************************************************/voidDelay(inttime){inti; intdelayLoopCount=1000;for(;time>0;time--); for(i=0;i<delayLoopCount;i++);}六、结果及分析当外部中断2发生时,使8个LED在亮灭间切换;当外部中断3发生时,使8个LED等依次亮一下。当中断发生时,控制数码管显示。七、实验总结通过对中断的合理处理,这样CPU就避免了把大量时间耗费在等待、查询状态信号的操作上,使其工作效率得以大大地提高。实验四A/D实验一、实验目的1、了解模数转换的基本原理;2、掌握模数转换的编程方法。二、实验仪器JXARM9-2440教学实验箱、ADT1000仿真器和ADTIDE集成开发环境、PC机、串口连接线。三、实验原理要将模拟量转换成数字信号需经采样——>量化——>编码三个基本过程(数字化过程)。采样:按采样定理对模拟信号进行等时间间隔采样,将得到的一系列时域上的样值去代替u=f(t),即用u0、u1、…un代替u=f(t)。这些样值在时间上是离散的值,但在幅度上仍然是连续模拟量。 量化:在幅值上再用离散值来表示。方法是用一个量化因子Q去度量u0、u1、…,便得到整量化的数字量。 u0=2.4Q2Q u1=4.0Q4Q u2=5.2Q5Q u3=5.8Q5Q编码:将整量化后的数字量进行编码,以便读入和识别;编码仅是对数字量的一种处理方法。例如:Q=0.5V/格,设用三位(二进编码)通道0和通道1的模拟输入信号可通过实验箱的可调电阻AIN0、AIN1调节。四、实验内容及步骤(一)学习例程,对其关键程序与设置进行分析。(二)1、通过可变电阻改变模拟量输入,补充程序将模拟输入进行采集和转换,观查显示结果(在串口显示);2、将转换后的电压值结果显示在LED上和串口上。3、*自行开发。步骤:1)参照模板工程ad(modules\ad\ad.apj),新建一个工程ad,添加相应的文件,并修改ad的工程设置;创建main.c并加入到工程ad中;2)根据内容编程;3)编译、链接、调试、运行。五、实验程序/*包含文件*/#include"def.h"#include"2410lib.h"#include"option.h"#include"2410addr.h"#include"interrupt.h"#defineU8unsignedcharunsignedcharseg7table1[16]={/*01234567*/0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,/*89dpBCDEF*/0x80,0x90,0x7f,0x83,0xc6,0xa1,0x86,0x8e,};/********************************************************************//Functionname :Main//Description :JXARM9-2410A/D采样实验主程序//实现功能://实现JXRAM9-2410的模数转换//JXARM9-2410UART0<==>PCCOM//Returntype :void//Argument:void*********************************************************************/voidMain(void){ /*配置系统时钟*/ChangeClockDivider(2,1);U32mpll_val=0;mpll_val=(92<<12)|(1<<4)|(1);ChangeMPllValue((mpll_val>>12)&0xff,(mpll_val>>4)&0x3f,mpll_val&3);/*初始化端口*/Port_Init();/*初始化串口*/Uart_Init(0,115200);Uart_Select(0);/*打印提示信息*/ PRINTF("\n---AD采样程序---\n"); PRINTF("\n请将UART0与PC串口进行连接,然后启动超级终端程序(115200,8,N,1)\n"); PRINTF("\n从现在开始您将在超级终端上看到采样值,旋动旋钮AIN2和AIN3改变模拟输入\n"); /*开始测试*/Test_Adc(); while(1) { }}#defineADC_FREQ2500000intReadAdc(intch); //Returntypeisint,DeclarePrototypefunction//==================================================================================voidTest_Adc(void){inti;inta0=0,a1=0,a2=0,a3=0,a4=0,a5=0,a6=0,a7=0;//InitializevariablesPRINTF("----------AD测试--------\n");PRINTF("旋动AIN0,AIN1旋钮改变模拟输入,任意键退出\n");while(1){ //TODOa0=Adc_Get_Data(0,2500000);a1=Adc_Get_Data(1,2500000);floatb,A0;intc;inta[6];b=a0*3.3/(1024);A0=b;b=b*100000;for(i=0;i<6;i++){c=(int)b%10;a[i]=c;b=b/10;}*((U8*)0x20007000)=0x3E; *((U8*)0x20006000)=seg7table1[a[0]]; Delay1(1); *((U8*)0x20007000)=0x3D; *((U8*)0x20006000)=seg7table1[a[1]]; Delay1(1); *((U8*)0x20007000)=0x3B; *((U8*)0x20006000)=seg7table1[a[2]]; Delay1(1); *((U8*)0x20007000)=0x37; *((U8*)0x20006000)=seg7table1[a[3]]; Delay1(1); *((U8*)0x20007000)=0x2F; *((U8*)0x20006000)=seg7table1[a[4]]; Delay1(1); *((U8*)0x20007000)=0x1f; *((U8*)0x20006000)=seg7table1[a[5]]&0x7f; Delay(1);PRINTF("\rAIN0:%04dAIN1:%04d",a0,a1); PRINTF("\rvoltage-->AIN0:%05f",A0);}rADCCON=(0<<14)|(19<<6)|(7<<3)|(1<<2);//standbymodetoreducepowerconsumption PRINTF("\n");PRINTF("--------AD测试结束------\n\n");}voidDelay1(inttime){inti; intdelayLoopCount=1000;for(;time>0;time--); for(i=0;i<delayLoopCount;i++);}五、结果分析:通过对模拟AD的变化结构在串口和LED上显示。六、实验总结:通过AD转化实验,可以有效地对一下变量进行采集,分析和处理。实验五S3C2440A的实时时钟实验目的了解实时时钟在嵌入式系统中的作用;掌握实时时钟的使用。实验原理在一个嵌入式系统中,实时时钟单元可以提供可靠的时钟,包括时分秒和年月日;即使在系统处于关机状态下它也能够正常工作(通常采用后备电池供电)。实验内容及步骤(一)学习与分析实验例程,学习时钟寄存器的设置;(二)1、补充程序,设置与修改当前的日期和时间;实现闹钟告警功能(设05S时报警),使能秒时钟告警;2、将时分秒在数码管上显示出来。3、自行开发。步骤:参照模板工程rtc(modules\rtc\rtc.apj),新建一个工程rtc,添加相应的文件,并修改rtc的工程设置;创建main.c并加入到工程rtc中;根据内容编程。编译rtc,下载程序并运行,通过超级终端和数码管看输出结果。实验程序/*包含文件*/#include"def.h"#include"2410lib.h"#include"option.h"#include"2410addr.h"#include"interrupt.h"/*表示日期、时间的数据结构*/typedefstructST_DATE{ short year;//年 char mon;//月 char day;//日 char week_day;//星期 char hour;//时 char min;//分 char sec;//秒}st_date;/*全局变量*/intled_index=0;intext0_count=0;/*functions*/voidrtc_tick_isr(void)__attribute__((interrupt("IRQ")));;voidrtc_int_isr(void)__attribute__((interrupt("IRQ")));;/*****************************************************************************//Functionname :rtc_set_date//Description :修改实时时钟当前时间、日期//Returntype :void//Argument:p_date,待设置的日期*****************************************************************************/voidrtc_set_date(st_date*p_date){rRTCCON=0x01; rBCDYEAR=p_date->year;rBCDMON=p_date->mon;rBCDDAY=p_date->day;rBCDDATE=p_date->week_day;rBCDHOUR=p_date->hour;rBCDMIN=p_date->min;rBCDSEC=p_date->sec;rRTCCON=0x00; }/*****************************************************************************//Functionname :rtc_get_date//Description :获取实时时钟当前时间、日期//Returntype :void//Argument:p_date,返回日期的指针*****************************************************************************/voidrtc_get_date(st_date*p_date){rRTCCON=0x01; p_date->year = rBCDYEAR;p_date->mon = rBCDMON;p_date->day = rBCDDAY;p_date->week_day= rBCDDATE;p_date->hour = rBCDHOUR;p_date->min = rBCDMIN;p_date->sec = rBCDSEC;rRTCCON=0x00; }/*****************************************************************************//Functionname :rtc_tick_init//Description :初始化S3C2410的TICK定时器//Returntype :void//Argument:tick,设置的TICK频率(时钟滴答的周期为(1+tick)/128秒)*****************************************************************************/voidrtc_tick_init(chartick){Irq_Request(IRQ_TICK,rtc_tick_isr);rRTCCON=0x0;//Noreset[3],MergeBCDcounters[2],BCDclockselectXTAL[1],RTCControldisable[0]rTICNT=(tick&0x7f)|0x80; /*TICK中断使能,周期为(1+tick)/128秒*/Irq_Enable(IRQ_TICK);}/*****************************************************************************//Functionname :rtc_alarm_set//Description :设置S3C2410的告警时间以及方式//Returntype :void//Argument:p_date,告警的时间//mode,告警模式*****************************************************************************/voidrtc_alarm_set(st_date*p_date,unsignedcharmode){Irq_Request(IRQ_RTC,rtc_int_isr);rRTCCON=0x01; rALMYEAR=p_date->year;rALMMON=p_date->mon;rALMDATE=p_date->day;rALMHOUR=p_date->hour;rALMMIN=p_date->min;rALMSEC=p_date->sec;rRTCALM=mode;rRTCCON=0x00; Irq_Enable(IRQ_RTC);}voiddelay(inttime){inti; intdelayLoopCount=1000;for(;time>0;time--); for(i=0;i<delayLoopCount;i++);}unsignedcharseg70table[16]={/*01234567*/0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,/*89ABCDEF*/0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,};/*****************************************************************************//Functionname :Main//Description :JXARM9-2410实时时钟实验主程序//完成功能://时钟滴答:每秒钟刷新数码管显示//设置当前日期、时间//动态刷新当前日期、时间,通过串口打印出来//时间告警功能:每分钟的第5秒告警,并进行跑马灯显示//Returntype :void//Argument:void*****************************************************************************/voidMain(void){ intold_index; st_datem_date; /*配置系统时钟*/ChangeClockDivider(2,1);U32mpll_val=0;mpll_val=(92<<12)|(1<<4)|(1);ChangeMPllValue((mpll_val>>12)&0xff,(mpll_val>>4)&0x3f,mpll_val&3); /*中断初始化*/Isr_Init();/*初始化端口*/Port_Init();/*初始化串口*/Uart_Init(0,115200);Uart_Select(0);/*打印提示信息*/ PRINTF("\n---实时时钟测试程序---\n"); PRINTF("\n请将UART0与PC串口进行连接,然后启动超级终端程序(115200,8,N,1)\n"); PRINTF("\n实时时钟测试开始\n"); /*采用BCD编码,如2004年需要设置的值为0x2004*/ //TODO m_date.year=0x2015; m_date.mon=0x05; m_date.day=0x07; m_date.week_day=0x03; m_date.hour=0x18; m_date.min=0x12; m_date.sec=0x02; /*修改当前日期和时间*/rtc_set_date(&m_date);m_date.sec = 0x05; //TODO rtc_alarm_set(&m_date,0x41);/*设置告警的时间及方式,0x41表示使能RTC告警,以及使能秒时钟告警*/ rtc_tick_init(127); old_index=led_index; PRINTF("\r\n\r\n"); while(1){ if(old_index!=led_index) /*每隔一秒更新一次数据 */ { rtc_get_date(&m_date); // old_index=led_index; PRINTF( /*时钟数据为BCD码格式,以16进制显示*/ "\b\b\b\b\b\b\b\b%02x:%02x:%02x",m_date.hour,m_date.min,m_date.sec); delay(10); *((unsignedchar*)0x20007000)=0xdf; *((unsignedchar*)0x20006000)=seg70table[m_date.hour/16]; delay(10); *((unsignedchar*)0x20007000)=0xef; *((unsignedchar*)0x20006000)=seg70table[m_date.hour%16]; delay(10); *((unsignedchar*)0x20007000)=0xf7; *((unsignedchar*)0x20006000)=seg70table[m_date.min/16]; delay(10); *((unsignedchar*)0x20007000)=0xfb; *((unsignedchar*)0x20006000)=seg70table[m_date.min%16]; delay(10); *((unsignedchar*)0x20007000)=0xfd; *((unsignedchar*)0x20006000)=seg70table[m_date.sec/16]; delay(10); *((unsignedchar*)0x20007000)=0xfe; *((unsignedchar*)0x20006000)=seg70table[m_date.sec%16]; delay(10); if(m_date.sec%16==0){ *((unsignedchar*)0x20005000)=0xff; delay(1000); *((unsignedchar*)0x20005000)=0x00; delay(1000); } } };}/*****************************************************************************//Functionname :rtc_tick_isr//Description :TICK中断处理程序,程序中设置每秒钟引发一次中断//Returntype :int//Argument:void*****************************************************************************/voidrtc_tick_isr(void){ Irq_Clear(IRQ_TICK);/*清除TICK中断*/// *((unsignedchar*)0x02000006)=0x00; // *(unsignedchar*)0x02000004=seg7table[led_index%10]; led_index++;}/*****************************************************************************//Functionname :rtc_int_isr//Description :rtc中断处理程序,程序中设置每分钟的第5秒引发该中断//Returntype :int//Argument:void*****************************************************************************/voidrtc_int_isr(void){ Irq_Clear(IRQ_RTC);/*清除RTC中断 *///if(ext0_count&1) // *(unsignedchar*)0x2000000=0x0f;// else// *(unsignedchar*)0x2000000=0xff; ext0_count++; PRINTF("\r\nAlarm\r\n");}结果及分析面板晶体管由于个数的限制只能显示时分秒,实验总结采用S3C2440A中提供的RTC时间节拍中断,让它在规定时间中断一次,每次中断读取时间,刷新一次实时时钟,实现RTC的实时控制。并通过应用程序的编写充分利用S3C2440A芯片实时时钟单元资源,提高整个系统的性能,为在需要时钟作为参考的工作环境提供了便利。实验六PWM实验一、实验目的1、了解PWM的基本原理;2、掌握PWM控制的编程方法。二、实验仪器JXARM9-2440教学实验箱、ADT1000仿真器和ADTIDE集成开发环境、PC机。三、实验原理PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。许多微控制器内部都包含PWM控制器。一般都可以选择接通时间和周期。占空比是接通时间与周期之比;调制频率为周期的倒数。设置提供调制方波的片上定时器/计数器的周期;在PWM控制寄存器中设置接通时间;启动定时器。四、实验内容及步骤(一)学习与分析例程;(二)1、编写程序对PWM控制器输出8000Hz2/3占空比的数字信号控制峰鸣器;2、编写程序改变PWM控制器输出频率,如频率从4000HZ到14000HZ,使用2/3的占空比;3、编写程序改变PWM控制器输出占空比,如频率1000HZ,使用1/100-95/100的占空比。4、编写程序实现一句音乐。步骤:1)新建一个工程,添加相应的文件,并修改相应的工程设置;2)创建main.c文件,将该文件加入到工程中;3)根据内容编写程序输出到蜂鸣器;4)编译、下载、运行、调试程序、听蜂鸣器输出结果;五、实验程序/*包含文件*/#include"def.h"#include"2410lib.h"#include"option.h"#include"2410addr.h"#include"interrupt.h"/*函数声明*/voidtest_pwm();/********************************************************************//Functionname :Main//Description :JXARM9-2410PWM实验主程序//实现功能://实现JXARM9-2410PWM方式控制蜂鸣器//Returntype :void//Argument:void*********************************************************************/voidMain(void){ unsignedchardata[6]={0,1,2,3,4,5}; /*配置系统时钟*/ChangeClockDivider(2,1);U32mpll_val=0;mpll_val=(92<<12)|(1<<4)|(1);ChangeMPllValue((mpll_val>>12)&0xff,(mpll_val>
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年初中生物教师资格学科知识模拟试卷附答案
- 2025年最-新全国通信专业技术人员职业水平考试试题和答案
- 2025下教资小学综合素质真题及答案解析
- 2026事业单位工勤技能-新疆-新疆广播电视天线工一级(高级技师)历年参考题库含答案详解
- 2026事业单位工勤技能-广西-广西水土保持工三级(高级工)历年参考题库含答案详解
- 国际贷款合同(范本)
- 2026事业单位工勤技能-广东-广东有线广播电视机务员三级(高级工)历年参考题库含答案详解
- 2026事业单位工勤技能-山西-山西食品检验工四级(中级工)历年参考题库含答案详解
- 2026事业单位工勤技能-山东-山东堤灌维护工二级(技师)历年参考题库含答案详解
- 2026事业单位工勤技能-宁夏-宁夏林木种苗工三级(高级工)历年参考题库含答案详解
- 2026年河南省中考真题语文试卷和答案
- 2026云南中医药大学招聘第二批科研助理岗位工作人员(事业编制外)25人笔试参考题库及答案详解
- 体育与健康九年级人教版背越式跳高教案
- 2026保密教育线上培训考试试题(附完整答案及解析)
- 安徽宣城市绩溪皖能抽水蓄能发电有限公司招聘笔试题库2026
- 2026四川成都交通投资集团有限公司第一批次校园招聘15人笔试历年常考点试题专练附带答案详解
- 江西省2026年重点学校初一新生入学分班考试试题及答案
- (正式版)T∕CFA 0199-2025 大型一体化压铸模具技术规范
- 小升初学科思维转型培养家长会课件
- 美容师职业技能培训教材(标准版)
- 纤维检验员测试验证考核试卷含答案
评论
0/150
提交评论