电子电路设计实验报告
更新时间:2023-09-13 05:19:01 阅读量: 综合文库 文档下载
电子线路专题实验Ⅱ
一、实验要求:
1. 认真阅读学习系统线路及相关资料
2. 将键盘阵列定义为0. 1. 2------ E. F,编程实现将键盘输入内容显示在LCD显示器上。
3. 编程实现将日历、时钟显示在LED显示屏上(注意仔细阅读PCF8563资料),日历、时钟轮回显示。
4. 利用D/A转换通道(下行通道)实现锯齿波发生器;输出(1~5V)固定电压转换成(4~20mA)电流。
5. 利用A/D转换通道(上行通道)实现数据采集,将采集信号显示在LED屏上。程序要求分别具有平均值滤波、中值滤波和滑动滤波功能。
6. 将按键阵列定义成与16个语音段对应,编写程序,实现按键播放不同的语音段。
二、实验设计思路:
本次实验用c语言实现,主要包括LCD,LED,AD,DA,日历芯片,测温传感芯片。受到嵌入式系统实验的启发,将LCD,LED,I2C总线协议,键盘扫描模块接口写成一个文件库(放在library文件夹下),尽量做到调用时与底层硬件无关。通过调用库文件中的函数,实现代码的重用性。键盘,LCD的代码由于与嵌入式实验具有相通之处,因此可将高层的函数(与底层硬件无关的函数)方便地移植过来。
三、实验设计:
1.矩阵键盘扫描模块
4×4的矩阵键盘,通过扫描可得到按下键的行列值,将行列值转换为相应的对应数字0~F。函数GetKey()实现获得按键的键值。对于键盘模块对于对按键的键值识别主要是通过两次扫描而取得。对于第一次扫描,给四行键全部赋予1,然后读回键盘值,对于第二次扫描,逐行为键盘送1,每次送1后再读回键盘值,若非零,说明此行有键按下,最终确定键值。
通过调用GetKey函数构造GetChar()函数,实现获取键盘字符(’0’~’F’)的功能。 通过调用GetChar()函数构造GetDec()函数,实现获取键盘输入整数的功能,整数范围在0~99999。有按’C’键回退一格,按’E’清空当前未完输入,按’F’键结束输入的功能。
程序代码:
//键盘初始化,将标志位置1; void Key_Init(void) { bKeyUp_Flag=1;//标志(全局变量)位置1 }
//键盘扫描函数,得到键的行列位置; unsigned char GetScanKey(void) { unsigned char key, i, temp; unsigned char xdata * ptr; key=0xff; for (i=1; i<0x10; i<<=1) //i的低4位为行数位,行依次检测循环4次 {
ptr=0x8fff;
* ptr =i; temp = * ptr; //取键盘IO口的值 temp &= 0x0f; //屏蔽高四位 if (temp!=0x00) //是否有有效键值 { key = i<<4; //取行数位的值并将其放入返回值高4位 key|=temp; //列数位的值放入返回值低4位 break; } } return key; //返回行位(高四)和列位(低四) }
//取键值,长按无效
unsigned char GetKey(void) { unsigned char key, temp; if (!bKeyUp_Flag) //判断标志,是0执行 /***按键程序执行一次后会将bKeyUp_Flag标志位清零,执行此段程序, 长按键无效返回无效值,直至按键无效返回无效按键值, 置\标志位。按键输入恢复有效。屏蔽这部分则长按键有效***/ { key=GetScanKey(); if (key==0xff) //没有按键,置标志位 bKeyUp_Flag=1;
else //保持按键 return 0xff; //因为0xff大于15,故为无效键值,实现长按键无效 } key=GetScanKey(); if (key==0xff) //没有按键 return key; else //有按键有效 temp=key; //取键值 Delay_ms(20); //延时20ms 消抖 key=GetScanKey(); //键盘扫描 if(key!=temp) //判断两次键值是否相同,排除干扰信号影响确认有效信号 { key=0xff; return key; } else //取键值 { /*这部分主要作用是软件抗干扰*/ temp=Key_Value_Table[key>>4]; //见说明 /*行值有效位(键盘的4个行SEL返回的值含有的有效位\有且只有一位键值才有效否则返回无效键值*/ if (temp==0xff) { key=0xff; return key; } temp=Key_Value_Table[key&0x0f]; /*列值有效位(键盘的4个列RL返回的值含有的有效位\有且只有一位键值才有效否则返回无效键值*/ if (temp==0xff) { key=0xff; return key; } key=Key_Value_Table[key>>4]*4+Key_Value_Table[key&0x0f];//行对应的中间值的四倍与列对应的中间值之和即为按键编号0~15 /*行列组合后的值大于15无效*/ if (key>15) { key=0xff; return key; }
bKeyUp_Flag=0; return key; } }
//获得键盘输入字符 int GetChar(void) { unsigned char key=0xff; while(key==0xff)key=GetKey();/* wait input fix */ return ((int)key_arrenge[key]); /* change to ASCII code and return */ }
//获得键盘输入整数 long GetDec(void) { long out_dec = 0; /* result(decimal number) 数值范围0~99999 */ unsigned char i,j; /* variable for character count */ int temp = 0; int key; for(i = 0;i<6 ; ) { key =GetChar(); /* 获取键值’0’-’9’ */ if((key<='9')&&(key >= '0')) { temp = key - '0'; /* 获取数值0-9 */ out_dec = out_dec * 10 + (long)temp; if(out_dec == 0) { continue; /* 首位数据输入为0时,显示不变 */ } i++; LCD__putchar(key); /* 显示当前输入的数据 */ continue; } if('E'== key) /* 当前输入清零 */ { out_dec = 0; back_cursol(i); /* 清显示区 */
for(j=0;j
2. LED模块 通过送字形码和字位码可以点亮对应的一个8段LED。8个LED的同时显示通过循环扫描显示实现,即每次在一个LED上显示设定的数字,延时显示一段时间(延时越长,亮度越好),然后切换显示下一个,依次轮换。 程序代码:
unsigned char Led_table[16]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71 };
void Delay_us1(int t) {
while(t-->=0); }
//函数功能描述:给显示数组赋初始值; void Led_Init(unsigned char *show) {
unsigned char i; for (i=0;i<8;i++) { //在此处给显示数组赋值 *show= 0x00; show++; } }
正在阅读:
电子电路设计实验报告09-13
城镇化的基本含义05-17
VOLTE的SRVCC切换失败案例03-09
小学一年级20以内加减法试题、口算、速算、练习题111-17
中学英语易错集锦大全(精华珍藏版)01-01
信息论与编码考试题一01-27
电力培训心得体会(推荐五篇)03-18
入团志愿书表格样本02-11
- 必修一物理寒假作业
- 2019-201X年5月大学生入党积极分子思想汇报-word范文模板(3页)
- 药物分析习题五
- 重拾应用意识 体会数学价值(沈建军)
- 2017全国高校辅导员结构化面试题集及参考答案
- 广东徐闻县实验中学2014届高三第二次月测地理试题
- 今天你共鸣了么?
- 2018-2019正能量读后感1000字-推荐word版(6页)
- 2018年中国截切型盖板针布行业专题研究分析报告目录
- 中国移动业务处理流程大全
- 公文写作常用词汇和句子集锦2016
- ARM课程设计说明书
- 教师资格证教育学论文
- 中考试卷分析
- 环境监测试卷(五)
- 党风廉政建设广播稿1
- 快速制作香香宫煮麻辣烫教程
- 《国际金融学》习题
- 文明施工保障措施方案
- 春兰维修资料故障代码
- 电路设计
- 实验
- 报告
- 电子