实验一 数码管实验
一、实验目的
掌握数码管的使用,了解数码管扫描的原理。
二、实验内容
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
#define CONT1_dir DDRK_DDRK3 #define CONT2_dir DDRK_DDRK2 #define CONT3_dir DDRK_DDRK1 #define CONT4_dir DDRK_DDRK0 #define DATA PTP
#define DATA_dir DDRP #define LEDCPU PORTK_PK4
#define LEDCPU_dir DDRK_DDRK4 #define BUS_CLOCK 32000000 //总线频率 #define OSC_CLOCK 16000000 //晶振频率
byte shuma[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后加小数点对应的段码 unsigned int i;
/*************************************************************/ /* 初始化锁相环 */ /*************************************************************/ void INIT_PLL(void) {
CLKSEL &= 0x7f; //set OSCCLK as sysclk PLLCTL &= 0x8F; //Disable PLL circuit 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; //Enable PLL circuit
asm NOP; asm NOP;
while(!(CRGFLG&0x08)); //PLLCLK is Locked already CLKSEL |= 0x80; //set PLLCLK as sysclk }
/*************************************************************/ /* 初始化端口 */ /*************************************************************/ void INIT_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; }
/*************************************************************/ /* 延时函数 */ /*************************************************************/ void delay(void) {
unsigned int i,j; for(j=0;j<100;j++) for(i=0;i<60000;i++); }
/*************************************************************/ /* 主函数 */ /*************************************************************/ void main(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(); } } }
五、实验流程图
开始 初始化端口 选位端口 计数变量i初始化 i<10? 输出table表中10-i无素 变量增益1 延时
六、总结
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转换的数值。
三、 实验原理图