- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
2.4 流水灯 2.4.3 编程思路(数组查表法) 3. 一维数组引用 unsgined char led_tab3[]={0x3f,0x06,0x5b,0x4f}; 其在存储器中的存放情况可以用下表示: 0x3f 0x06 0x5b 0x4f led_tab3[0] led_tab3[1] led_tab3[2] led_tab3[3] 第1个元素 第2个元素 第3个元素 第4个元素 使用标号引用元素,从0开始标号,如led_tab3[2]取出元素0x5b,并赋给变量temp,用语句实现: temp=led_tab3[2]; 2.4 流水灯 2.4.3 编程思路(数组查表法) 4. 流程图 通过led[i] 引用数组元素 通过led[i] 引用数组元素 2.4 流水灯 2.4.3 编程思路(数组查表法) #includeiom16.h void delay(unsigned char t); void main(void) {unsigned char i; Unsigned char led[8]={????????}; DDRC=0xff; while(1) {for(i=0;i7;i++) {PORTC=led[i] delay(50); } for(i=7;7;i--) {PORTC=led[i] delay(50); } } } void delay(unsigned char t) {unsigned char i,j,k; for(i=0;i10;i++) for(j=0;j10;j++) for(k=0;kt;k++); } 2.4 流水灯 2.4.3 编程思路(数组查表法) 5. 一维数组的指针引用 定义一个指针变量p: char *p; 使它指向数组指针: P=led_tab3[0]; 指向数组的第一个元素地址(首地址);C语言规定,数组名为代表数组首地址,因此又可以写成: p=led_tab3; 上述两条指令等价,均是表示使指针变量p指向该数组。 2.4 流水灯 2.4.3 编程思路(数组查表法) 5. 一维数组的指针引用 引用标号为3的数组元素并赋给变量temp: temp=*(p+3); 等同于 temp=led_tab3[3]; p指向数组首地址即标号为0的元素,p+3指针指向偏移首地址3个存储空间(char一个存储空间占一个字节,int一个空间占2个字节,余类推)的标号为3的数组(第4个),取出该指针所指的元素0x4f,赋给temp。 事实上当执行led_tab3[3]时,编译器也是自动处理成*(led_tab3+3)。 2.5 简易电子琴 2.5.1 任务要求 设计一个简易电子琴,发1-7七个音符之音色。音符通过7个按键输入到PD口的PD0-PD6,音符的音色从PA0口输出,PA0外接喇叭,通过计算机的声卡播放音乐信号。 2.5.2 任务分析 (1)根据设计要求,PD0~PD6接输入开关,故PD口设置为输入口,PA0输出音符信号,以方波形式输出。 (2)根据音乐知识可知,不同节拍音符持续时间不同,为了编程方便,本例固定每个音符持续时间为250ms。 2.5 简易电子琴 2.5.2 任务分析 (3)声音由频率产生,频率不同音色便不同,从PA0口输出不同频率的方波便可区分音符音色。Duo(1)为例,其发声频率为523hz,即从PA0口输出周期为1.9ms的方波人耳听到的就是Duo(1)的音色。显然,250ms/1.9ms=130,即从PA0口送130个1.9ms的方波即可。 (4)要在PA0产生频率周期为1.9ms的方波的方法很简单,定义一延时函数,延时时间为1.9ms/2=0.95ms,每延时0.95ms改变一次PA0口的引脚状态,如此周而复始直到PA0口输出130个波形为止。 2.5 简易电子琴 2.5.2 任务分析 ( 5)使用循环指令可以实现延时,如for或while。通过软件测试,在CPU工作在1M的时钟下当t为无符号的char型变量时,while(t)t--这条指令与CPU的机器周期的关系为4倍关系,即t×Tcy=T,t为变量值,Tcy为机器周期1/1M=1us,T为延时时间。以0.95ms为例,t=238时执行完while(t)t--语句的延时时间正好是0.95ms,定义函数delay如下: void delay(unsigned char t) {while(t)t--; } 2.5 简易电子琴 2.5.2 任务分析 (6)250ms节拍时间固定,音符不同,波形周期不同,输出周波数不同,如下表所示: 音符 频率(HZ) 半周期(ms)
文档评论(0)