实验报告10.docx
《实验报告10.docx》由会员分享,可在线阅读,更多相关《实验报告10.docx(27页珍藏版)》请在冰点文库上搜索。
![实验报告10.docx](https://file1.bingdoc.com/fileroot1/2023-6/2/ed801ad6-5611-4ee5-b5d8-8110bb7ccfa7/ed801ad6-5611-4ee5-b5d8-8110bb7ccfa71.gif)
实验报告10
实验一数码管实验
一、实验目的
掌握数码管的使用,了解数码管扫描的原理。
二、实验内容
1、实验原理
开发板设计了一个四位八段共阴极数码管。
P0~P7分别连接数码管的阳极,K0~K3分别连接四位的控制端。
由于四位数码管公用相同的阳极,要实现数码管每一位显示不同的数字,则必须通过扫描的方式来实现,也就是说某个时刻只有一个数码管处于点亮状态,由于人眼的视觉暂留,看到的效果是是四位数码管都是同时点亮的。
扫描的具体方法是:
P口输出第一位数码的段码,K口控制第一位导通其它三位不导通,延时5ms后,P口输出第二位数码管的段码,K口控制第二位导通其它三位不导通,如此直到扫描完第四位后,继续扫描第一位。
2、实验步骤
(1)用跳线帽将JP2的(QH~P7)、(QG~P6)、(QF~P5)、(QD~P3)、(QC~P2)、(QB~P1)、(QA~P0)插针短接,将BDM下载器连接到开发板上,打开开发板电源。
(2)打开光盘文件中的“演示代码\数码管扫描\BBIT_LED2.mcp”。
(3)点击(Debug)按钮,将源代码下载到单片机中,进入调试窗口。
(4)点击调试窗口的(Start)按钮,程序开始执行。
(5)观察实验现象,数码管显示“0000”延时一会之后,显示“1111”直到显示“9999”。
延时一会儿之后显示“0.0.0.0.”,延时显示“1.1.1.1.”直至“9.9.9.9.”,如此循环。
三、实验原理图
四、实验所用源程序(下划线部分为改动部分)
#include/*commondefinesandmacros*/
#include"derivative.h"/*derivative-specificdefinitions*/
#defineCONT1PORTK_PK3
#defineCONT2PORTK_PK2
#defineCONT3PORTK_PK1
#defineCONT4PORTK_PK0
#defineCONT1_dirDDRK_DDRK3
#defineCONT2_dirDDRK_DDRK2
#defineCONT3_dirDDRK_DDRK1
#defineCONT4_dirDDRK_DDRK0
#defineDATAPTP
#defineDATA_dirDDRP
#defineLEDCPUPORTK_PK4
#defineLEDCPU_dirDDRK_DDRK4
#defineBUS_CLOCK32000000//总线频率
#defineOSC_CLOCK16000000//晶振频率
byteshuma[20]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,//0~9对应的段码
0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//0~9后加小数点对应的段码
unsignedinti;
/*************************************************************/
/*初始化锁相环*/
/*************************************************************/
voidINIT_PLL(void)
{
CLKSEL&=0x7f;//setOSCCLKassysclk
PLLCTL&=0x8F;//DisablePLLcircuit
CRGINT&=0xDF;
#if(BUS_CLOCK==40000000)
SYNR=0x44;
#elif(BUS_CLOCK==32000000)
SYNR=0x43;
#elif(BUS_CLOCK==24000000)
SYNR=0x42;
#endif
REFDV=0x81;//PLLCLK=2×OSCCLK×(SYNDIV+1)/(REFDIV+1)=64MHz,fbus=32M
PLLCTL=PLLCTL|0x70;//EnablePLLcircuit
asmNOP;
asmNOP;
while(!
(CRGFLG&0x08));//PLLCLKisLockedalready
CLKSEL|=0x80;//setPLLCLKassysclk
}
/*************************************************************/
/*初始化端口*/
/*************************************************************/
voidINIT_port(void)
{
CONT1_dir=1;
CONT2_dir=1;
CONT3_dir=1;
CONT4_dir=1;
CONT1=0;
CONT2=0;
CONT3=0;
CONT4=0;
DATA_dir=0xff;
DATA=0x00;
}
/*************************************************************/
/*延时函数*/
/*************************************************************/
voiddelay(void)
{
unsignedinti,j;
for(j=0;j<100;j++)
for(i=0;i<60000;i++);
}
/*************************************************************/
/*主函数*/
/*************************************************************/
voidmain(void){
DisableInterrupts;
INIT_PLL();
INIT_port();
LEDCPU_dir=1;
LEDCPU=0;
EnableInterrupts;
CONT1=1;//使能数码管的第一位
for(;;)
{
for(i=0;i<10;i++)
{
DATA=shuma[10-i];//循环显示数字
delay();
}
}
}
五、实验流程图
六、总结
1)了解了实验芯片的基本构造,实验板的电路。
2)学习了锁相环的倍频功能和实现方式
3)对于数码管显示的基本硬件原理作掌握并应用,将循环显示,改写为倒计时表
实验二ATD实验
一、实验目的
掌握XS128单片机模数转换(ATD)模块的使用。
二、实验内容
1、在调试窗口的DATA:
1窗口中显示了AD_in0和AD_in1两个AD输入通道的值,单击
AD_in0和AD_in1可以显示电压的实时值。
2、用螺丝刀转动滑动变阻器R45和R48,并单击AD_in0和AD_in1,则值会发生变化。
3、用万用表测量电路板上的测试点AD0和AD1的电压值并与AD_in0和AD_in1的值进行对比。
数值与电压的对应关系为:
ATDDR=(255*U)/5
其中U为测量的电压值,ATDDR为AD转换的数值。
三、实验原理图
四、实验所用源程序
#include/*commondefinesandmacros*/
#include"derivative.h"/*derivative-specificdefinitions*/
#defineLEDCPUPORTK_PK4
#defineLEDCPU_dirDDRK_DDRK4
unsignedcharAD_in1,AD_in0;
/*************************************************************/
/*初始化AD模块*/
/*************************************************************/
voidINIT_AD(void)
{
ATD0CTL2=0x40;//启动A/D模块,快速清零,禁止中断
ATD0CTL1_SRES=0;//选用8位模数转换
ATD0CTL3=0x88;//每次只转换一个通道
ATD0CTL4=0x01;//AD模块时钟频率为2MHz
}
/*************************************************************/
/*起动AD转换*/
/*************************************************************/
unsignedcharAD_capture(unsignedchars)
{
unsignedcharAD_data;
switch(s)
{
case1:
ATD0CTL5=0x01;//转换AD01
while(!
ATD0STAT2_CCF0);
AD_data=ATD0DR0L;
break;
case2:
ATD0CTL5=0x00;//转换AD00
while(!
ATD0STAT2_CCF0);
AD_data=ATD0DR0L;
break;
}
return(AD_data);
}
/*************************************************************/
/*延时函数*/
/*************************************************************/
/*************************************************************/
/*主函数*/
/*************************************************************/
voidmain(void){
DisableInterrupts;
LEDCPU_dir=1;
INIT_AD();
EnableInterrupts;
LEDCPU=0;
for(;;)
{
AD_in1=AD_capture
(1);
AD_in0=AD_capture
(2);
if(AD_in1>AD_in0)
for(;;)
{
LEDCPU=0;
delay();
LEDCPU=1;
delay();
}
else
LEDCPU=1;
}
}
五、实验流程图
六、总结
1)掌握AD转换的基本原理。
将输入电压信号同标定信号作二分式比较,如8位就是进行8次二分比较
2)对通道进行选择控制,对转换位数可选,对转换量进行比较,并通过led的亮灯情况输出比较结果,实现人的观察。
实验三液晶显示实验
一、实验目的
掌握12864液晶模块的使用。
二、实验内容
1、实验原理
XS128开发板上设计了一个带文字库的12864汉显液晶模块。
本开发板上的液晶模块有并口和IIC串口操作两种模式。
本实验对12864液晶模块进行了并口和模拟IIC串口的操作。
2、实验步骤
2.1并口操作液晶
(1)将液晶模块插到电路板上的J_LCD1接口上。
将BDM下载器连接到开发板上,打开开发板电源。
(2)打开光盘文件中的“演示代码\并口液晶\IO_LCD.mcp”。
(3)点击Debug按钮,将源代码下载到单片机中,进入调试窗口,将原程序进行一定的修改。
(4)点击调试窗口的Start按钮,程序开始执行。
(5)观察实验现象,液晶屏上显示出《三字经》部分内容,按下按键“KEY1”文字上翻,按下按键“KEY2”文字下翻。
2.2模拟IIC串口操作液晶
(1)将液晶模块插到电路板上的J_LCD1接口上。
将BDM下载器连接到开发板上,打开开发板电源。
(2)打开光盘文件中的“演示代码\并口液晶\IIC_LCD.mcp”。
(3)点击Debug按钮,将源代码下载到单片机中,进入调试窗口,将原程序进行一定的修改。
(4)点击调试窗口的Start按钮,程序开始执行。
(5)观察实验现象,液晶屏上显示出《三字经》部分内容,按下按键“KEY1”文字上翻,按下按键“KEY2”文字下翻。
三、实验原理图
四、实验所用源程序(下划线部分为改动部分)
}#include/*commondefinesandmacros*/
#include"derivative.h"/*derivative-specificdefinitions*/
#include"LCD.h"
#defineLEDCPUPORTK_PK4
#defineLEDCPU_dirDDRK_DDRK4
#defineKEY1PTIH_PTIH3
#defineKEY2PTIH_PTIH2
#defineKEY1_dirDDRH_DDRH3
#defineKEY2_dirDDRH_DDRH2
#defineBUS_CLOCK32000000//总线频率
#defineOSC_CLOCK16000000//晶振频率
char*poem[11]={
"人之初",
"性本善",
"性相近",
"习相远",
"苟不教",
"性乃迁",
"教之道",
"贵以专",
"昔孟母",
"择邻处",
"",
};
unsignedcharsingle=0;//液晶翻页的标志符
/*************************************************************/
/*初始化锁相环*/
/*************************************************************/
/************************************************************/
/*初始化ECT模块*/
/************************************************************/
/*************************************************************/
/*初始化按键*/
/*************************************************************/
voidinit_key(void)
{
KEY1_dir=0;//设置为输入
KEY2_dir=0;
PPSH=0x00;//极性选择寄存器,选择下降沿;
PIFH=0x0C;//对PIFH的每一位写1来清除标志位;
PIEH=0x0C;//中断使能寄存器;
}
/*************************************************************/
/*按键中断函数*/
/*************************************************************/
#pragmaCODE_SEG__NEAR_SEGNON_BANKED
interruptvoidPTH_inter(void)
{
if(PIFH!
=0)//判断中断标志
{
PIFH=0xff;//清除中断标志
if(KEY2==0)
{
delay1ms(5);
if(KEY2==0)
{
if(single<=0)
single=3;
elsesingle-=1
}
}
if(KEY1==0)
{
delay1ms(5);
if(KEY1==0)
{
if(single>=3)
single=0;
elsesingle+=1;
}
}
lcd_clear();
lcd_string(0,7,poem[single]);
lcd_string(0,6,poem[single+1]);
lcd_string(0,5,poem[single+2]);
lcd_string(0,4,poem[single+3]);
lcd_string(0,3,poem[single+4]);
lcd_string(0,2,poem[single+5]);
lcd_string(0,1,poem[single+6]);
lcd_string(0,0,poem[single+7]);
}
}
#pragmaCODE_SEGDEFAULT
/*************************************************************/
/*主函数*/
/*************************************************************/
voidmain(void)
{
DisableInterrupts;
INIT_PLL();
initialize_ect();
init_key();
INIT_PORT();
LEDCPU_dir=1;
LEDCPU=0;
EnableInterrupts;
delay1ms(100);
lcd_clear();
lcd_string(0,7,poem[0]);
lcd_string(0,6,poem[1]);
lcd_string(0,5,poem[2]);
lcd_string(0,4,poem[3]);
lcd_string(0,3,poem[4]);
lcd_string(0,2,poem[5]);
lcd_string(0,1,poem[6]);
lcd_string(0,0,poem[7]);
for(;;){
}
}
LCD.H改动、实现竖屏自右向左显示
/***************************************************************************/
/*向LCD发送字符串*/
/***************************************************************************/
voidlcd_string(unsignedcharrow,unsignedcharcol,char*data1)//row为写入数据所在的行数,col为写入数据所在的列数,*data1为写入的数据
{
for(;row<4&&(*data1)!
=0;row++)
{
for(;col<8&&(*data1)!
=0;col++)
{
write_command(adress_table[row*8+col]);
delay20us(4);//延时80us
write_Data(*data1++);
delay20us(4);//延时80us
write_Data(*data1++);
delay20us(4);//延时80us
}
col=0;
}
}
五、实验流程图
六、总结
1、学习LCD点阵字符原理,LCD集成化,能带字库为编程大大简化,利于在电脑编程,对字符显示分块在读懂后进行修改设计,对行列循环进行交换,实现三字经的显示,对于按键中断和翻页功能,继承其功能并对于三字经的简化特点,利用计数变量实现对字符翻动的实现避免了大段的枚举。
2、从实验中感悟到查芯片资料,解决问题的思想方法,面对不同问题,改动程序反复观察结果,反推思考代码。
实验四电子节气门半实物仿真
一、实验目的
以节气门为例,学习并掌握利用单片机进行半实物仿真的原理与方法。
二、实验内容
3、主板的P0/P1接驱动板IN1/IN2
4、上层板的VRM0接主板的AD2
5、节气门的4接主板的AD3
6、节气门的2接主板VCC
7、节气门的6接主板GND
8、节气门的电机线3/5接驱动板OUT1/2
三、实验原理图
控制框图
四、实验所用源程序
#include/*commondefinesandmacros*/
#include"derivative.h"/*derivative-specificdefinitions*/
#include
#include
#include
#include"LCD.h"
#defineBUS_CLOCK32000000//总线频率,改变总线频率直接在此处修改
#defineOSC_CLOCK16000000//晶振频率
#defineLEDCPUPORTK_PK4
#defineLEDCPU_dirDDRK_DDRK4
#defineDEGREE_MAX225
#defineDEGREE_MIN16
unsignedcharAD_in2,AD_in3;
charAD2Disp[20],AD3Disp[20],Degreestr[20];
//xiebinadd
#defineLEDPORTB
#defineLED_dirDDRB
/*************************************************************/
/*初始化锁相环*/
/*************************************************************/
/************************************************************/
/*初始化ECT模块*/
/************************************************************/
/****************************************