嵌入式实验报告
更新时间:2023-03-08 17:00:47 阅读量: 综合文库 文档下载
ARM 实验报告
姓名: 学号: 专业: 学院: 指导老师:
一、GPIO输出与按键控制实验——按键控制流水灯实验 实验原内容:
通过数组认为定义流水灯花样; 一个按键控制一种流水灯花色;
实验电路图:
源程序:
#include \#include \
/* 名称:DelayNS() 功能:长软件延时 入口参数:dly 延时参数,值越大,延时越久**/
void DelayNS(uint32 dly) { uint32 i;
for(; dly>0; dly--)
for(i=0; i<50000; i++);}
/** 函数名称:main() 函数功能:GPIO输出测试,花样流水灯。*/
const uint32 LED_TBL[8][10] = { 花样流水灯,注意调用时候用了取反操作 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF}, // 全部点亮 {0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0xFF}, // 依次逐个点亮
{0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF, 0xFF}, // 依次逐个叠加 {0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01, 0x00, 0xFF}, // 依次逐个递减 {0x00, 0x81, 0x42, 0x24, 0x18, 0x18, 0x24, 0x42, 0x81, 0xFF}, // 两个靠拢后分开 {0x00, 0x81, 0xC3, 0xE7, 0xFF, 0xFF, 0xE7, 0xC3, 0x81, 0xFF}, // 从两边叠加后递减 {0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xFF, 0xFF}, {0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF} };
/** 函数名称:keyscan() 函数功能:按键扫描,每按一次键对相应的LED进行取反*/ void keyscan(void) { uint32 i,j,k,m;
PINSEL0 = 0x00000000;
// 设置管脚连接GPIO IO0DIR = 0x000000ff; k=IO0PIN;
if((k&keycon)!=keycon)
{ for(j=0; j<50000; j++);//延时去抖 k=IO0PIN;
if((k&keycon)!=keycon) { i=(k&keycon)|(~keycon); i=~i; switch(i) { case KEY1 :for(m=0;m<10;m++){IO0SET=~((LED_TBL[0][m]));DelayNS(3);IO0CLR = ((LED_TBL[0][m]));DelayNS(3);} break; case
KEY2 :for(m=0;m<10;m++){IO0SET=~((LED_TBL[1][m]));DelayNS(3);IO0CLR = ((LED_TBL[1][m]));DelayNS(3);} break; case
KEY3 :for(m=0;m<10;m++){IO0SET=~((LED_TBL[2][m]));DelayNS(3);IO0CLR = ((LED_TBL[2][m]));DelayNS(3);} break; case
KEY4 :for(m=0;m<10;m++){IO0SET=~((LED_TBL[3][m]));DelayNS(3);IO0CLR = ((LED_TBL[3][m]));DelayNS(3);} break; case
KEY5 :for(m=0;m<10;m++){IO0SET=~((LED_TBL[4][m]));DelayNS(3);IO0CLR = ((LED_TBL[4][m]));DelayNS(3);} break; case
KEY6 :for(m=0;m<10;m++){IO0SET=~((LED_TBL[5][m]));DelayNS(3);IO0CLR = ((LED_TBL[5][m]));DelayNS(3);} beak; case
KEY7 :for(m=0;m<10;m++){IO0SET=~((LED_TBL[6][m]));DelayNS(3);IO0CLR = ((LED_TBL[6][m]));DelayNS(3);} break;
case
KEY8 :for(m=0;m<10;m++){IO0SET=~((LED_TBL[7][m]));DelayNS(3);IO0CLR = ((LED_TBL[7][m]));DelayNS(3);} break; } } while((k&keycon)!=keycon) k=IO0PIN; } }
/* 函数名称:main()
* 函数功能:每按一次键,对相应LED的状态取反*/
int main(void) {
TargetResetInit();
PINSEL0 =0x00000000; // 设置所
有管脚连接GPIO
PINSEL1 =0x00000000;
IO0DIR = 0x000000ff; // 设
置P0.0-P0.7为输出,其余为输入 IO0CLR = 0xffffffff; while(1)
{ keyscan(); }}
二、GPIO输出实验——流水灯实验 实验内容:
通过数组认为定义流水灯花样; 有六种花样的流水灯依次闪烁;
实验电路图:
源程序:
#include \
/** 函数名称:DelayNS()函数功能:长软件延时入口参数:dly 延时参数,值越大,延时越久*/
void DelayNS (uint32 dly) { uint32 i; for ( ; dly>0; dly--) for (i=0; i<50000; i++);} /** 函数名称:main() 函数功能:GPIO输出测试,花样流水灯。*/ const uint32 LED_TBL[] = { // 花样流水灯,注意调用时候用了取反操作 0x00, 0xFF, // 全部熄灭后,再全部点亮 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, // 依次逐个点亮 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF, // 依次逐个叠加 0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01, // 依次逐个递减 0x81, 0x42, 0x24, 0x18, 0x18, 0x24, 0x42, 0x81, // 两个靠拢后分开 0x81, 0xC3, 0xE7, 0xFF, 0xFF, 0xE7, 0xC3, 0x81 };// 从两边叠加后递减 int main (void) { uint8 i;
PINSEL0 = 0x00000000; // 设置管脚连接GPIO IO0DIR = 0x000000ff; // 设置P0.0-P0.7控制口为输出 while (1) { for (i=0; i<42; i++) // 花样流水灯显示 { IO0SET = ~((LED_TBL[i]));DelayNS(3);IO0CLR = ((LED_TBL[i]));DelayNS(3); }}}
三、单路按键控制LED/蜂鸣器 实验内容:
按键key1一按,蜂鸣器响,LED灯亮;
实验电路图:
源程序:
#include \
#define BEEP 1<<7 //P0.7控制蜂鸣器,低电平蜂鸣 #define KEY1 1<<8
/* 函数名称:DelayNS() 函数功能:长软件延时* 入口参数:dly 延时参数,值越大,延时越久 出口参数:无*******/ void DelayNS (uint32 dly) { uint32 i; for ( ; dly>0; dly--) for (i=0; i<50000; i++); }
/** 函数名称:main()** 函数功能:用P0.7控制BEEP,让蜂鸣器蜂鸣*/ int main (void) { PINSEL0 = 0x00000000; // 设置引脚连接GPIO PINSEL1 = 0x00000000; IO0DIR = BEEP; // 设置BEEP控制口为输出 while (1) { if((IO0PIN & KEY1) == 0)IO0CLR = BEEP; else IO0SET = BEEP;}}
四、定时器0控制数码管一亮一灭 实验内容:
0.5定时时间一到,数码管闪烁一次;
实验电路图:
源程序:
#include \#include \
#define LED (1 << 7) /* P0.7引脚控制LED,低电平点亮 */ /* 函数名称:main()
* 函数功能:通过查询定时器0中断标志位控制LED点亮*/ int main(void)
{ PINSEL1 = 0x00000000; // 设置管脚连接GPIO IO0DIR = LED; // 设置LED控制口输出 T0TC = 0; // 定时器0初始化 T0PR = 99; // 设置定时器0分频为100分频,得120000Hz T0MCR = 0x03; // 匹配通道0匹配中断并复位T0TC T0MR0 = 60024; // 比较值(0.5s定时值) T0TCR = 0x03; // 启动并复位T0TC T0TCR = 0x01; while (1) { while ((T0IR & 0x01) == 0); // 等待定时时间到 T0IR = 0x01; // 清除中断标志 if ((IO0SET & LED) == 0) // 取反LED状态 IO0SET = LED; else IO0CLR = LED; } }
五、数码管动态显示 实验电路图:
源程序:
#include\void delay(uint32 x) { uint8 i; while(x--) for(i=500000;i>0;i--); }
uint8 table[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71 };
uint8 table1[]={ 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80 };
int main(void) { uint8 i,j,p=16; PINSEL0=0x00000000; PINSEL1=0x00000000; IO0DIR=0x00ffff00; while(1) { for(i=0;i<8;i++) { IO0CLR=IO0CLR|0xff00; IO0SET=~table[i]<<8;
for(j=0;j<8;j++) {
IO0CLR=IO0CLR|0xff0000; IO0SET=1<
六、将读取的DS18B20温度值转换为十进制 实验电路图:
#include \ #include \
uint8
}
/************************************
Tp[12]; *************************************
*** // 温度显示数据
uint16 tt; * 函数名称:ConvertTemperature() uint8 TMark = 0; * 函数功能: 将读取的 DS18B20 温度值转换// 温度正负标志 为十进制数 * 入口参数:tvalue 读取的DS18B20当前温/************************************度值 ***************************************************************************** *************************************
**/ * 函数名称:Init()
void ConvertTemperature(uint16 tvalue){ * 函数功能:I/O端口初始化,设置引脚连
Tp[1] = tvalue/1000+0x30; 接模块
************************************* // 百位数 ************************************* Tp[2] = tvalue00/100+0x30; **/ // 十位数 void Init(void){ Tp[3] = tvalue0/10+0x30; PINSEL0 |= 0x00000000; // 设置引脚连// 个位数
Tp[4] = 0x2E; 接模块
PINSEL1 |= 0x00000088; // 显示小数点 PINSEL2 &= 0x00000004; Tp[5] = tvalue+0x30;
for (i=0; i<50000; i++); // 显示温度小数位
Tp[6] = 0x01; }
// 显示自定义字符,用于温度符号显示
Tp[7]= 0x43; /************************************
*************************************// 显示字符\
Tp[8]= 0x20; *** // 显示字符\ * 函数名称:main() Tp[9]= 0x20; * 函数功能:主函数
// 显示字符\
Tp[10]= 0x20; // 显示字符\
Tp[11]= 0x20; // 显示字符\
if (TMark == 0){ Tp[0] = 0x20; // 正温度不显示符号
} else{ Tp[0] = 0x2D; // 负温度显示负号:- } if (Tp[1] == 0x30){ Tp[1] = 0x20; // 如果百位为0,不显示
if (Tp[2] == 0x30){ Tp[2] = 0x20; // 如果十位为0,不显示
} } } /**************************************************************************** * 函数名称:DelayNS()
* 函数功能:软件延时
* 入口参数:dly 延时参数,值越大,延时
越久
****************************************************************************/ void DelayNS(uint32 dly){ uint32 i; for ( ; dly>0; dly--)
************************************* *************************************
**/ int main(void){
uint8 i; Init(); // I/O 端口初始化
lcd_init(); // LCD初始化 DisText(0x80,\ for(i=0;i<110;i++)ReadTemp(); // 预读DS18B20 while (1){ ConvertTemperature(ReadTemp()); // 温度转换
DisText(0xc4,Tp); // 显示当前温度 }
}
七、LCD 1602显示1 实验电路图:
源程序:
#include \#define rs (1<<5) #define rw (1<<6) #define en (1<<7) #define busy (1<<15)
/****************************************************************************
* 函数名称:ChkBusy()
* 函数功能:检查总线是否忙
****************************************************************************/
void ChkBusy() { IO0DIR=0xf0; while(1) { IO0CLR=rs; IO0SET=rw; IO0SET=en;
if(!(IO0PIN & busy))break;
IO0CLR=en; } IO0DIR=0xffffffff; }
/****************************************************************************
* 函数名称:WrOp() * 函数功能:写命令
* 入口参数:dat,待写入LCD的命令 ****************************************************************************/
void WrOp(uint8 dat) { ChkBusy(); IO0CLR=rs; IO0CLR=rw; IO0CLR=IO0CLR|0xff00; //先清零 IO0SET=dat<<8; //再送数
IO0SET=en; IO0CLR=en; }
/****************************************************************************
* 函数名称:WrDat() * 函数功能:写数据
* 入口参数:dat,待写入LCD的数据 ****************************************************************************/
void WrDat(uint8 dat) { ChkBusy(); IO0SET=rs; IO0CLR=rw; IO0CLR=IO0CLR|0xff00; //先清零 IO0SET=dat<<8; //再送数 IO0SET=en; IO0CLR=en; }
/****************************************************************************
* 函数名称:lcd_init() * 函数功能:lcd初始化
****************************************************************************/
void lcd_init(void) { WrOp(0x38); WrOp(0x06); WrOp(0x0c); }
/***************************************************************************
* 函数名称:LocateXY() * 函数功能:显示光标定位
* 入口参数:posx LCD列位置,posy LCD行
位置
****************************************************************************/
void LocateXY( uint8 posx,uint8 posy) { uint8 temp; temp = posx & 0xf; posy &= 0x1; if ( posy )temp |= 0x40; temp |= 0x80; WrOp(temp); }
/***************************************************************************
* 函数名称:DispOneChar() * 函数功能:显示单字符
* 入口参数:x LCD列位置,y LCD行位置,Wdata 显示字符
****************************************************************************/
void DispOneChar(uint8 x,uint8 y,uint8 Wdata) {
LocateXY( x, y ); // 定位显示字符的x,y位置 WrDat( Wdata ); // 写字符 }
/***************************************************************************
* 函数名称:ePutstr() * 函数功能:显示字符串
* 入口参数:x LCD列,y LCD行,j 字符串长度,*ptr 字符串指针
****************************************************************************/
void ePutstr(uint8 x,uint8 y, uint8 j,uint8 *ptr){ uint8 i,l=0;
for (i=0;i /**************************************************************************** * 函数名称:DisText() * 函数功能:显示文本 * 入口参数:addr LCD DDRAM地址,*p 文本指针 ****************************************************************************/ void DisText(uint8 addr,char *p) { WrOp(addr); while(*p !='\\0')WrDat(*(p++)); } /**************************************************************************** * 函数名称:main() * 函数功能:LCD初始化,自定义汉字字符,LCD显示英文和汉字字符。 ****************************************************************************/ int main(void) { uint8 i; uint8 examp1[]={0x32,0x30,0x31,0x32,0x00,0x31,0x01,0x32,0x36,0x02}; uint8 Hzzimo[]={0x08,0x0F,0x12,0x0F,0x0A,0x1F,0x02,0x00, // 年 0x0F,0x09,0x0F,0x09,0x0F,0x09,0x11,0x00, // 月 0x0F,0x09,0x09,0x0F,0x09,0x09,0x0F,0x00}; // 日 lcd_init(); // LCD初始化 WrOp( 0x40 ); // 自定义汉字字符:年、月、日 for (i=0;i<24;i++){ WrDat(Hzzimo[i]); } DisText(0x80,\ // 第一行从第0位开始显示英文字符 ePutstr(4,1,10,examp1); // 第二行从第4位开始显示2012年1月26日 while(1); } 八、LCD 1602显示2 实验电路图: 源程序: #include \#define rs (1<<5) #define rw (1<<6) #define en (1<<7) #define busy (1<<15) /* 函数名称:ChkBusy() * 函数功能:检查总线是否忙**/ void ChkBusy() { IO0DIR=0xf0; while(1) { IO0CLR=rs; IO0SET=rw; IO0SET=en; if(!(IO0PIN & busy))break; IO0CLR=en; } IO0DIR=0xffffffff;} /* 函数名称:WrOp() * 函数功能:写命令 * 入口参数:dat,待写入LCD的命令 **/ void WrOp(uint8 dat) { ChkBusy();IO0CLR=rs;IO0CLR=rw; IO0CLR=IO0CLR|0xff00; //先清零 IO0SET=dat<<8; //再送数 IO0SET=en;IO0CLR=en;} /* 函数名称:WrDat() * 函数功能:写数据 * 入口参数:dat,待写入LCD的数据 **/ void WrDat(uint8 dat) { ChkBusy();IO0SET=rs;IO0CLR=rw; IO0CLR=IO0CLR|0xff00; //先清零 IO0SET=dat<<8; //再送数 IO0SET=en;IO0CLR=en;} /* 函数名称:lcd_init() * 函数功能:lcd初始化**/ void lcd_init(void) { WrOp(0x38);WrOp(0x06);WrOp(0x0c); } /* 函数名称:DisText() * 函数功能:显示文本 * 入口参数:addr LCD DDRAM地址,*p 文本指针 **/ void DisText(uint8 addr,char *p) { WrOp(addr); while(*p !='\\0')WrDat(*(p++));} /* 函数名称:main() * 函数功能:LCD初始化,自定义汉字字符,LCD显示英文和汉字字符。**/ int main(void) { uint8 i; lcd_init(); // LCD初始化 DisText(0x80,\ DisText(0xc0,\hijklmn\ while(1);} 九、LCD 1602显示3 实验电路图: 源程序: #include \#define rs (1<<5) #define rw (1<<6) #define en (1<<7) #define busy (1<<15) /* 函数名称:ChkBusy() * 函数功能:检查总线是否忙**/ void ChkBusy() { IO0DIR=0xf0; while(1) { IO0CLR=rs; IO0SET=rw; IO0SET=en; if(!(IO0PIN & busy))break; IO0CLR=en; } IO0DIR=0xffffffff;} /* 函数名称:WrOp() * 函数功能:写命令 * 入口参数:dat,待写入LCD的命令 **/ void WrOp(uint8 dat) { ChkBusy();IO0CLR=rs;IO0CLR=rw; IO0CLR=IO0CLR|0xff00; //先清零 IO0SET=dat<<8; //再送数 IO0SET=en;IO0CLR=en;} /* 函数名称:WrDat() * 函数功能:写数据 * 入口参数:dat,待写入LCD的数据 **/ void WrDat(uint8 dat) { ChkBusy();IO0SET=rs;IO0CLR=rw; IO0CLR=IO0CLR|0xff00; //先清零 IO0SET=dat<<8; //再送数 IO0SET=en;IO0CLR=en;} /* 函数名称:lcd_init() * 函数功能:lcd初始化**/ void lcd_init(void) { WrOp(0x38);WrOp(0x06);WrOp(0x0c); } /* 函数名称:DisText() * 函数功能:显示文本 * 入口参数:addr LCD DDRAM地址,*p 文本指针 **/ void DisText(uint8 addr,char *p) { WrOp(addr); while(*p !='\\0')WrDat(*(p++));} /* 函数名称:main() * 函数功能:LCD初始化,自定义汉字字符,LCD显示英文和汉字字符。**/ int main(void) { uint8 i; lcd_init(); // LCD初始化 DisText(0x80,\hijklmn\DisText(0xc0,\ while(1);} 十、PWM脉宽调制 实验内容: LPC2131芯片PWM模块可以实现6路单边沿控制或者3路双边沿控制,或者两者混合输出。 实验电路图: 源程序: #include uint8 Flash_Count = 0; uint8 Operation_Type = 1; void DelayMS(uint16 x) { uint16 t; while(x--) {for(t=500;t>0;t--);} } void Traffic_lignt() { switch(Operation_Type) {case 1: IO0SET=RED_A; IO0SET=YELLOW_A; IO0CLR=GREEN_A; IO0CLR=RED_B; IO0SET=YELLOW_B; IO0SET=GREEN_B; DelayMS(2000); Operation_Type = 2; break; case 2: DelayMS(200); IO0SET=YELLOW_A; DelayMS(200); IO0CLR=YELLOW_A; IO0SET=GREEN_A; if(++Flash_Count !=5) return; Flash_Count=0; Operation_Type = 3; break; case 3: IO0CLR=RED_A; IO0SET=YELLOW_A; IO0SET=GREEN_A; IO0SET=RED_B; IO0SET=YELLOW_B; IO0CLR=GREEN_B; DelayMS(2000); Operation_Type = 4; break; case 4: DelayMS(200); IO0SET=YELLOW_B; DelayMS(200); IO0CLR=YELLOW_B; IO0SET=GREEN_B; if(++Flash_Count !=5) return; Flash_Count=0; Operation_Type = 1; break; } } int main(void) { PINSEL0=0x00000000; PINSEL1=0X00000000; IO0DIR=0x00003f00; while(1) {Traffic_lignt(); }} 十一、流水灯 实验电路图: #include \ void DelayNS (uint32 dly) { uint32 i; for ( ; dly>0; dly--) for (i=0; i<50000; i++); } int main (void) { PINSEL0 = 0x00000000; IO0DIR = 0x000000ff; while (1) { IO0PIN = 0xAA; DelayNS(15); IO0PIN = 0x55 ; DelayNS(15); IO0PIN = 0x00 ; DelayNS(15); }} 十二、模拟交通灯 实验电路图: 源程序: #include void Traffic_lignt() { switch(Operation_Type) {case 1: IO0SET=RED_A; IO0SET=YELLOW_A; IO0CLR=GREEN_A; IO0CLR=RED_B; IO0SET=YELLOW_B; IO0SET=GREEN_B; DelayMS(2000); Operation_Type = 2; break; case 2: DelayMS(200); IO0SET=YELLOW_A; DelayMS(200); IO0CLR=YELLOW_A; IO0SET=GREEN_A; if(++Flash_Count !=5) return; Flash_Count=0; Operation_Type = 3; break; case 3: IO0CLR=RED_A; IO0SET=YELLOW_A; IO0SET=GREEN_A; IO0SET=RED_B; IO0SET=YELLOW_B; IO0CLR=GREEN_B; DelayMS(2000); Operation_Type = 4; break; case 4: DelayMS(200); IO0SET=YELLOW_B; DelayMS(200); IO0CLR=YELLOW_B; IO0SET=GREEN_B; if(++Flash_Count !=5) return; Flash_Count=0; Operation_Type = 1; break; } } int main(void) { PINSEL0=0x00000000; PINSEL1=0X00000000; IO0DIR=0x00003f00; while(1) {Traffic_lignt(); }} 十三、FIQ中断服务 实验电路图: #include \ #define LED1 1 << 18 #define EINT0 14 int main (void) { PINSEL1 = 0x00000001; IO0DIR = LED1; EXTMODE = 0x00; FIQEnable(); VICIntSelect = 1 << EINT0; EXTINT = 0x01; VICIntEnable = 1 << EINT0; while (1); } void FIQ_Exception(void) { uint32 i; i = IO0SET; if ((i & LED1) == 0) IO0SET = LED1; else IO0CLR = LED1; while ((EXTINT & 0x01) != 0) { EXTINT = 0x01; } } 十四、按键控制LED 实验内容: 每一按键对应一个LED灯,当按键被按下,对应的LED灯亮; 实验电路图: #include \IO0SET=LED4; else IO0CLR=LED4; break; #include \ case KEY5 :if((IO0PIN&LED5)!=LED5) void DelayNS(uint32 dly) IO0SET=LED5; else IO0CLR=LED5; break; { uint32 i; case KEY6 :if((IO0PIN&LED6)!=LED6) for(; dly>0; dly--) IO0SET=LED6; else IO0CLR=LED6; break; for(i=0; i<50000; i++); case KEY7 :if((IO0PIN&LED7)!=LED7) } IO0SET=LED7; else IO0CLR=LED7; break; void keyscan(void) case KEY8 :if((IO0PIN&LED8)!=LED8) { uint32 i,j,k; IO0SET=LED8; else IO0CLR=LED8; break; k=IO0PIN; }} if((k&keycon)!=keycon) while((k&keycon)!=keycon) k=IO0PIN; { }} for(j=0; j<50000; j++); int main(void) k=IO0PIN; { if((k&keycon)!=keycon) TargetResetInit(); { i=(k&keycon)|(~keycon); PINSEL0 = 0x00000000; i=~i; PINSEL1 = 0x00000000; switch(i) IO0DIR = 0x000000ff; { case KEY1 :if((IO0PIN&LED1)!=LED1) IO0CLR = 0xffffffff; IO0SET=LED1;else IO0CLR=LED1;break; while(1) case KEY2 :if((IO0PIN&LED2)!=LED2) { IO0SET=LED2;、else IO0CLR=LED2; break; keyscan(); } case KEY3 :if((IO0PIN&LED3)!=LED3) } IO0SET=LED3;else IO0CLR=LED3; break; case KEY4 :if((IO0PIN&LED4)!=LED4) 十五、PWM作32位定时器实验 实验内容: 将PWM作为32位定时器使用,控制蜂鸣器、LED灯的响与亮灭 实验电路图: 源程序: /****************************************Copyright (c)************************************************** ** Guangzou ZLG-MCU Development Co.,LTD. ** graduate school ** http://www.zlgmcu.com ** **--------------File Info------------------------------------------------------------------------------- ** File name: main.c ** Last modified Date: 2004-09-16 ** Last Version: 1.0 ** Descriptions: The main() function example template ** **------------------------------------------------------------------------------------------------------ ** Created by: Chenmingji ** Created date: 2004-09-16 ** Version: 1.0 ** Descriptions: The original version ** **------------------------------------------------------------------------------------------------------ ** Modified by: ** Modified date: ** Version: ** Descriptions: ** ********************************************************************************************************/ #include \ #define BEEP 1 << 7 // P0.7控制蜂鸣器 /* ******************************************************************************************************** ** 函数名称: PWM_Int() ** 功能描述: PWM中断服务函数,取反控制蜂鸣器。 ******************************************************************************************************* */ void __irq PWM_Int(void) { PWMIR = 0x01; // 复位PWM中断标志 /* 取反LED9状态 */ if((IO0SET & BEEP) == 0) IO0SET = BEEP; else IO0CLR = BEEP; VICVectAddr = 0x00; // VIC结束 } /* ******************************************************************************************************** ** 函数名称: main() ** 功能描述: 演示PWM作32位定时器使用实验。 ******************************************************************************************************* */ int main (void) { PINSEL0 = 0x00000000; // 设 置管脚连接GPIO IO0DIR = BEEP; IO0SET = BEEP; IRQEnable(); // IRQ 中断使能 /* PWM作为定时器时的初始化 */ PWMTC = 0; // 定时器设置为0 PWMPR = 0; // 时钟不分频 PWMMCR = 0x03; // 设置T0MR0匹配后复位T0TC,并产生中断标志 PWMMR0 = Fpclk / 2; // 0.5秒钟定时 PWMTCR = 0x01; // 启动定时器 /* 设置PWM中断 */ VICIntSelect = 0x00000000; // 所有中断连接IRQ VICVectCntl0 = 0x20 | 8; // 选择通道0 VICVectAddr0 = (int)PWM_Int; // PWM中断服务程序地址 VICIntEnable = (1 << 8); // 使能PWM中断 while(1); // 等待中断 return 0; } 十一、 十六、LCD 1602显示4 实验电路图: 源程序: #include \#define rs (1<<5) #define rw (1<<6) #define en (1<<7) #define busy (1<<15) /**************************************************************************** * 函数名称:ChkBusy() * 函数功能:检查总线是否忙 ****************************************************************************/ void ChkBusy() { IO0DIR=0xf0; while(1) { IO0CLR=rs; IO0SET=rw; IO0SET=en; if(!(IO0PIN & busy))break; IO0CLR=en; } IO0DIR=0xffffffff; } /**************************************************************************** * 函数名称:WrOp() * 函数功能:写命令 * 入口参数:dat,待写入LCD的命令 ****************************************************************************/ void WrOp(uint8 dat) { ChkBusy(); IO0CLR=rs; IO0CLR=rw; IO0CLR=IO0CLR|0xff00; //先清零 IO0SET=dat<<8; //再送数 IO0SET=en; IO0CLR=en; } /**************************************************************************** * 函数名称:WrDat() * 函数功能:写数据 * 入口参数:dat,待写入LCD的数据 ****************************************************************************/ void WrDat(uint8 dat) { ChkBusy(); IO0SET=rs; IO0CLR=rw; IO0CLR=IO0CLR|0xff00; //先清零 IO0SET=dat<<8; //再送数 IO0SET=en; IO0CLR=en; } /**************************************************************************** * 函数名称:lcd_init() * 函数功能:lcd初始化 ****************************************************************************/ void lcd_init(void) { WrOp(0x38); WrOp(0x06); WrOp(0x0c); } /*************************************************************************** * 函数名称:LocateXY() * 函数功能:显示光标定位 * 入口参数:posx LCD列位置,posy LCD行位置 ****************************************************************************/ void LocateXY( uint8 posx,uint8 posy) { uint8 temp; temp = posx & 0xf; posy &= 0x1; if ( posy )temp |= 0x40; temp |= 0x80; WrOp(temp); } /*************************************************************************** * 函数名称:DispOneChar() * 函数功能:显示单字符 * 入口参数:x LCD列位置,y LCD行位置,Wdata 显示字符 ****************************************************************************/ void DispOneChar(uint8 x,uint8 y,uint8 Wdata) { LocateXY( x, y ); // 定 位显示字符的x,y位置 WrDat( Wdata ); // 写字符 } /*************************************************************************** * 函数名称:ePutstr() * 函数功能:显示字符串 * 入口参数:x LCD列,y LCD行,j 字符串长度,*ptr 字符串指针 ****************************************************************************/ void ePutstr(uint8 x,uint8 y, uint8 j,uint8 *ptr){ uint8 i,l=0; for (i=0;i /**************************************************************************** * 函数名称:DisText() * 函数功能:显示文本 * 入口参数:addr LCD DDRAM地址,*p 文本指针 ****************************************************************************/ void DisText(uint8 addr,char *p) { WrOp(addr); while(*p !='\\0')WrDat(*(p++)); } /**************************************************************************** * 函数名称:main() * 函数功能:LCD初始化,自定义汉字字符,LCD显示英文和汉字字符。 ****************************************************************************/ int main(void) { uint8 i; uint8 examp1[]={0x32,0x30,0x31,0x33,0x00,0x36,0x01,0x31,0x36,0x02}; uint8 Hzzimo[]={0x08,0x0F,0x12,0x0F,0x0A,0x1F,0x02,0x00, // 年 0x0F,0x09,0x0F,0x09,0x0F,0x09,0x11,0x00, // 月 0x0F,0x09,0x09,0x0F,0x09,0x09,0x0F,0x00}; // 日 lcd_init(); // LCD初始化 WrOp( 0x40 ); // 自定义汉字字符:年、月、日 for (i=0;i<24;i++){ WrDat(Hzzimo[i]); } DisText(0x80,\ // 第一行从第0位开始显示英文字符 ePutstr(4,1,10,examp1); // 第二行从第4位开始显示2012年1月26日 while(1); } 十七、128*64显示 实验电路图: 源程序: #include #define LCD12864_RS (1<<7) #define LCD12864_RW (1<<6) #define LCD12864_E (1<<5) #define LCD12864_CS1 (1<<16) #define LCD12864_CS2 (1<<17) uint32 doyleee[] = { 0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x81,0xF1,0xF1,0xF1,0x71,0x31, 0x31,0x71,0xF1,0xF1,0xE1,0xC1,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x81,0xF1,0xF1,0xF1,0x71,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xFF, 0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0xF0,0xFF,0xFF,0xFF,0x0F,0x00,0x00, 0x00,0x00,0xC0,0xFF,0xFF,0xFF,0x7F,0x00, 0x00,0xF0,0xFC,0xFE,0xFE,0x0F,0x03,0x03, 0x07,0xFF,0xFE,0xFE,0xF8,0x00,0xE0,0xE0, 0xE0,0xE0,0x00,0x03,0x3F,0xFF,0xFF,0xFC, 0xC0,0xF0,0xFE,0x3F,0x0F,0x03,0x00,0xF0, 0xFF,0xFF,0xFF,0x0F,0x00,0x00,0xF0,0xFC, 0xFE,0xFE,0x3F,0x33,0x33,0x33,0x3F,0x3F, 0x3E,0x38,0x00,0x00,0xF0,0xFC,0xFE,0xFE, 0x3F,0x33,0x33,0x33,0x3F,0x3F,0x3E,0x38, 0x00,0x00,0xF0,0xFC,0xFE,0xFE,0x3F,0x33, 0x33,0x33,0x3F,0x3F,0x3E,0x38,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF, 0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80, 0x8E,0x8F,0x8F,0x8F,0x8C,0x8C,0x8C,0x8C, 0x8E,0x8F,0x87,0x87,0x83,0x81,0x80,0x80, 0x80,0x81,0x87,0x87,0x8F,0x8E,0x8C,0x8C, 0x8F,0x87,0x87,0x83,0x80,0x80,0x80,0xC0, 0xC0,0xC0,0xC0,0xC0,0xC0,0xF3,0x7F,0x3F, 0x0F,0x03,0x00,0x00,0x00,0x00,0x0E,0x0F, 0x0F,0x0F,0x00,0x00,0x00,0x00,0x01,0x07, 0x07,0x0F,0x0E,0x0C,0x0C,0x0F,0x07,0x03, 0x01,0x00,0x00,0x00,0x01,0x07,0x07,0x0F, 0x0E,0x0C,0x0C,0x0F,0x07,0x03,0x01,0x00, 0x00,0x00,0x01,0x07,0x07,0x0F,0x0E,0x0C, 0x0C,0x0F,0x07,0x03,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF, 0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF, 0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0x40, 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, 0x40,0x40,0x40,0x40,0x40,0x00,0x00,0xFC, 0xFC,0x04,0x0C,0xF8,0xF0,0x00,0x00,0xF0, 0xF0,0x00,0x00,0xF0,0xF0,0x00,0x00,0x40, 0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x10, 0x10,0x18,0xFC,0xFC,0x00,0x00,0x00,0x18, 0x1C,0x84,0xC4,0x7C,0x38,0x00,0x00,0xB8, 0xFC,0x64,0xC4,0xFC,0xB8,0x00,0x00,0xE0, 0xF0,0x3C,0x2C,0xE4,0xC0,0x00,0x00,0x80, 0xFC,0x7C,0x00,0xF0,0xF0,0x00,0x00,0xFC, 0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0xF8, 0xFC,0x04,0x04,0x1C,0x18,0x00,0x00,0x40, 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xFF, 0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07, 0x07,0x04,0x06,0x03,0x01,0x00,0x20,0x23, 0x27,0x34,0x1C,0x0F,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x07,0x07,0x04,0x00,0x00,0x06, 0x07,0x05,0x04,0x04,0x04,0x00,0x00,0x03, 0x07,0x04,0x04,0x07,0x03,0x00,0x00,0x03, 0x07,0x04,0x04,0x07,0x03,0x00,0x00,0x01, 0x01,0x01,0x01,0x07,0x07,0x01,0x00,0x07, 0x07,0x04,0x04,0x04,0x04,0x00,0x00,0x03, 0x07,0x04,0x04,0x07,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF, 0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xF0, 0x00,0x00,0x00,0x00,0xF0,0xF0,0x00,0x00, 0x00,0x20,0x20,0xF0,0xF0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xF0, 0x10,0x10,0x90,0x50,0xF0,0xE0,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF, 0xFF,0x80,0x80,0x80,0x80,0x80,0x80,0x80, 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, 0x80,0x80,0x80,0x80,0x80,0x80,0x81,0x83, 0x86,0x8C,0x8C,0x86,0x83,0x81,0x80,0x80, 0x88,0x88,0x88,0x8F,0x8F,0x88,0x88,0x88, 0x80,0x80,0x8C,0x8C,0x80,0x80,0x87,0x8F, 0x8A,0x89,0x88,0x88,0x8F,0x87,0x80,0x80, 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xFF }; void delayms(uint8 x) { uint8 i; while(x--) for(i=50000;i>0;i--); } void Read_busy() { IO0CLR=IO0CLR|0xff00; IO0SET=LCD12864_RW ; IO0CLR=LCD12864_RS; IO0SET=LCD12864_E; while((IO0CLR=IO0CLR|0xff00) & 0x80); IO0CLR=LCD12864_E; } void LCD12864_WriteCOM(uint8 com) { IO0CLR=LCD12864_RW; IO0CLR=LCD12864_RS; Read_busy(); IO0CLR=IO0CLR|0xff00; IO0SET=com<<8; IO0SET=LCD12864_E; IO0CLR=LCD12864_E; Read_busy(); } void LCD12864_WriteData(uint8 dat) { IO0CLR=LCD12864_RW; IO0SET=LCD12864_RS; IO0CLR=IO0CLR|0xff00; IO0SET=dat<<8; IO0SET=LCD12864_E; IO0CLR=LCD12864_E; Read_busy(); } unsigned char LCD12864_ReadData(void) { unsigned char LCD12864_data; IO0CLR=LCD12864_E; IO0SET=LCD12864_RW; IO0SET=LCD12864_RS; IO0SET=LCD12864_E; LCD12864_data =IO0DIR|0xff00; Read_busy(); //读LCM忙 return LCD12864_data; } void LCD12864_Write1Byte_X_Y( unsigned char x, unsigned char y, unsigned char LCD12864_data) { x = x&0x7f; y = y&0x3f; IO0SET=LCD12864_CS1; IO0SET=LCD12864_CS2; if(x<64) { IO0CLR=LCD12864_CS1; } else{ IO0CLR=LCD12864_CS2; x = x-64; } LCD12864_WriteCOM(0x40+x); LCD12864_WriteCOM(0xb8+y); LCD12864_WriteData(LCD12864_data); } void LCD12864_Fill_Screen( uint8 t, uint8 LCD12864_FillData) { unsigned char x,y; IO0CLR=LCD12864_CS1; IO0CLR=LCD12864_CS2; LCD12864_WriteCOM(0xc0+0); for(x=0;x<8;x++) { delayms(t); LCD12864_WriteCOM(0xb8+x); LCD12864_WriteCOM(0x40); for(y=0;y<64;y++) LCD12864_WriteData(LCD12864_FillData); } IO0SET=LCD12864_CS1; IO0SET=LCD12864_CS2; } void LCD12864_Clear_Screen(void) {LCD12864_Fill_Screen(60,0x00); } void LCD12864_Clear_black(void) {LCD12864_Fill_Screen(12,0xff); } void LCD12864_Init(void) { LCD12864_Clear_Screen(); IO0CLR=LCD12864_CS1; delayms(5); IO0CLR=LCD12864_CS2; delayms(5); LCD12864_WriteCOM(0xb8+0); delayms(5); LCD12864_WriteCOM(0xc0+0); delayms(5); LCD12864_WriteCOM(0x40+0); delayms(5); LCD12864_WriteCOM(0x3e); delayms(5); LCD12864_WriteCOM(0x3f); delayms(5); } Void LCD12864_Disp_Bitmap_12864( unsigned char t, uint32 *bitmap_12864) { unsigned char j,k; for(k=0;k<8;k++) { delayms(t); IO0CLR=LCD12864_CS1; IO0SET=LCD12864_CS2; LCD12864_WriteCOM(0xb8+k); LCD12864_WriteCOM(0x40+0); for(j=0;j<64;j++) { LCD12864_WriteData(bitmap_12864[k*128+j]); } IO0SET=LCD12864_CS1; IO0CLR=LCD12864_CS2; LCD12864_WriteCOM(0xb8+k); LCD12864_WriteCOM(0x40+0); for(j=64;j<128;j++) { LCD12864_WriteData(bitmap_12864[k*128+j]); }} } void LCD12864_Display( uint8 t, uint8 a,uint8 b,uint8 page,uint8 col,uint8 { unsigned char j=0,i=0; if(col < 64 ) {IO0CLR=LCD12864_CS1; IO0SET=LCD12864_CS2; } else{ IO0SET=LCD12864_CS1; IO0CLR=LCD12864_CS2; col = col - 64; } for(j=0;j *Char ) 十八、数码管显示 实验内容: 数码管从0到9连续显示 实验电路图: 源程序: #include\void delay(uint32 x) { uint8 i; while(x--) for(i=500000;i>0;i--); } uint8 table[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71 }; int main(void) { uint8 i; PINSEL0=0x00000000; PINSEL1=0x00000000; IO0DIR=0x0000ff00; for(i=0;i<10;i++) { IO0CLR=IO0CLR|0xff00; IO0SET=table[i]<<8; delay(5000); } }
正在阅读:
嵌入式实验报告03-08
文化部、财政部、人事部、国家税务总局关于鼓励发展民营文艺表演04-21
美文摘抄600字11-20
二年级治班理念09-07
3、对拟从事研究领域的了解和看法04-20
为什么把原电池中的盐桥换成铜导线后电流表指针还会偏转03-08
配位化学及答案03-08
中考化学二模试题及答案04-12
最新审定青岛版小学数学六年级上册百分数与分数小数的互化(精编03-08
学院2020年度意识形态工作要点范文09-20
- 计算机试题
- 【2012天津卷高考满分作文】鱼心人不知
- 教育心理学历年真题及答案--浙江教师资格考试
- 20180327-第六届“中金所杯”全国大学生金融知识大赛参考题库
- 洪林兴达煤矿2018年度水情水害预测预报
- 基本要道讲义
- 机电设备安装试运行异常现象分析与对策
- 《有机化学》复习资料-李月明
- 非常可乐非常MC2--非常可乐广告策划提案 - 图文
- 2011中考数学真题解析4 - 科学记数法(含答案)
- 企业人力资源管理师三级07- 09年真题及答案
- 基于单片机的光控自动窗帘控制系统设计说明书1 - 图文
- 20160802神华九江输煤皮带机安装方案001
- (共53套)新人教版一生物必修2(全册)教案汇总 word打印版
- 2014行政管理学总复习
- 中国银监会关于加强地方政府融资平台贷款风险监管的指导意见
- 民宿酒店核心竞争与研究
- 游园活动谜语大全2012
- 河南省天一大联考2016届高三英语5月阶段性测试试题(六)(A卷)
- 小型超市管理系统毕业论文详细设计4
- 嵌入式
- 实验
- 报告
- 机运科各项制度汇编0
- 部编语文三年级下册 - 第6单元 语文园地6六教案教学设计一课一练
- 三年级语文第四单元教学设计
- 2016年汉硕考研七大名校真题及答案解析
- 湖州市国民经济和社会发展第十二个五年规划纲要
- 孩子不能坚持上兴趣班,三天打鱼两天晒网
- 40+56+40m连续梁施工方案
- 山东建筑大学硕士学位论文撰写的基本要求
- 中国传媒大学南广学院《本科毕业创作报告》2016板模板
- 2018届徐汇区中考英语二模
- 全国旅游社及联系方式有Email
- 输血过程质量管理监控及效果评价制度
- 专题复习(离子检验除杂)学案
- 2011黑龙江省数据结构考试入门
- 求不定积分的方法及技巧小汇总~
- 《浅谈企业内部控制》会计专业专科毕业论文
- 关于桩基检测的要求、问题处理、验收条件和程序规定
- 华南农业大学 离散数学 期末考试2011试卷及答案
- 新媒体环境下的公益广告研究
- 江苏省学业水平测试模拟卷 小学语文