P1.5。电路图如下:
键扫描子程序: C程序如下:
uchar keysearch() //按键函数扫描有键按下否(返回值不等于0,说明有键按下)
{
uchar k; P1=0x0f; k=P1; k=~k;
k=k&0x0f; return k; }
uchar key() //按键函数(返回值:等于0xff,说明没有键按下)
{
uchar a,c,kr,keynumb; a=keysearch(); if(a==0) return 0xff; else delay(10); //延时去抖动
a=keysearch(); if(a==0) return 0xff; else { a=0xef; for(kr=0;kr<2;kr++) { P1 = a; c = P1; if((c & 0x01)==0)keynumb=kr+0x00; if((c & 0x02)==0)keynumb=kr+0x02; a=_crol_(a,1); //循环左移函数,需要intrins.h头文件支持 }
} do{
//按键释放检测
a=keysearch(); }while(a!=0); return keynumb; //返回按键的编码键值 }
void keybranch(uchar k) //按键的键值处理函数
{
switch(k) { case 0x00 : //添加需要执行的功能;break; case 0x01 : //添加需要执行的功能;break; case 0x02 : //添加需要执行的功能;break; case 0x03 : //添加需要执行的功能;break; default: break; } }
5.请在图7-1的基础上,设计一个以中断方式工作的开关式键盘,并编写其中断键处理程序。
答案:
电路图如下:
中断键处理程序:
void int_key() interrupt 0 {
delay(10); //delay 10 ms temp = P1;
if( (temp & 0x0f) == 0x0f ) break; temp = P1;
if((temp & 0x0f) == 0x0e) //key1处理函数
if((temp & 0x0f) == 0x0d) if((temp & 0x0f) == 0x0b) if((temp & 0x0f) == 0x07) }
//key2处理函数 //key3处理函数 //key4处理函数
6.状态或数码显示时,对LED的驱动可采用低电平驱动,也可以采用高电平驱动,二者各有什么特点?
答案:
高电平驱动要采用共阴极数码管,必须外接上拉电阻;低电平驱动要采用共阳极数码管,电源效率相对较高。
7.用DAC0832进行D/A转换时,当输出电压的范围在0~5V时,每变化一个二进制数其输出电压跳变约20mV,即输出是锯齿状的,采取何种措施可使输出信号比较平滑?
答案:
两种方法: (1)可以计算移动平均值;
(2)可以设计滤波器的办法。
8.当系统的主频为6MHz时,请计算图7-17中DAC0832产生锯齿波信号的周期。 答案:
T=2μs×8×256=4096μs
9.编写图7-17中用DAC0832产生三角波的应用程序。 答案:
程序功能:连续访问外部DAC寄存器,产生锯齿波
#include
#define uchar unsigned char #define uint unsigned int
延时函数
//头文件包含 //宏定义
void delay() {
uint i,j;
for(i=0;i<1;i++) for(j=0;j<120;j++); }
void main() 主函数
{
unsigned char a=0;
while(1) { XBYTE[0x7FFF]=a; a++;
delay( ); } }
//控制波形累加深度
//加入延时函数,控制其周期
10.对图7-24的A/D转换电路,若采用中断方式,编写相应程序。 答案:
在硬件电路上,应当将EOC引脚接到单片机的外部中断引脚上面,如INT1;
C程序如下:
//程序功能:对8路模拟信号轮流采样,并把结果依次存到数组中; #include
#include
unsigned char a[8]; unsigned char i; void main() 主程序 {
EA = 1; IT1= 1; EX1= 1;
XBYTE[0x7FF8] = a[0]; while(1) { } }
void int_adc() interrupt 0 {
a[i] = XBYTE[0x7FF8+i]; i++; if(i>7) i = 0; }
11.当图7-24的ADC0809对8路模拟信号进行A/D转换时,编写用查询方式工作的采样程序,8路采样值存放在30H~37H单元。
答案:
//程序功能:对8路模拟信号轮流采样一次,并把结果依次存放在30H~37H单元;
#include
#include unsigned char a[8]; unsigned char p;
void delay(unsigned char m) 延时函数
{
unsigned char i,j; for(i=0;i void main() 主程序 { unsigned char i; p = 0x30; XBYTE[0x7FF8] = a[0]; for(i=0;i<8;i++) { delay(10); a[i] = XBYTE[0x7FF8+i]; *[p++] = a[i]; } while(1); } 第8章 1.哪些场合适合使用单片机系统? 单片机以其自身的特点,其应用领域已渗透入各个领域。 主要应用在: 智能仪器仪表、智能家用电器、实时工业控制、机电一体化。 还广泛应用于办公自动化领域(如复印机)、汽车电路、通信系统(如手机)、计算机外围设备等,成为计算机发展和应用的一个重要方向。 单片机应用系统设计灵活,在系统硬件不变的情况下,可通过不同的程序可实现不同的功能,因此这从根本改变了传统控制系统的设计思想和设计方法。过去必须由模拟电路、数字电路及继电器控制电路实现的大部分功能,现在已能用单片机并通过软件方法实现 2.从事单片机应用系统开发需要具备哪些基本知识和设备配置? 单片机基础知识、计算机通信基础知识、单片机开发板、下载软件及上位计算机。 3.简述单片机应用开发过程。 4.什么是ISP技术?在单片机开发过程中如何使用? ISP:在系统编程. 5.设计完成一个电子时钟,可以根据需要选择实现下列功能: 1)具有显示年、月、日、时、分、秒的功能。 2)具有校正功能。 3)可以选用LED数码管或者LCD显示。 4)能够显示星期、温度等信息;(发挥部分)。 5)具有整点报时、设定闹钟等附加功能。(发挥部分)。 参考下载包第8章项目6.