for(j=0;j<1827;j++);
}
4.用七色发光二极管与蜂鸣器设计声光报警电路。
项目三
三.综合题
1.简述锁存功能。
锁存功能是指将数据保存在锁存器的输出端,不会丢失。
2.简述74HC573数据锁存过程。
先传送数据,后锁存数据。
3.简述行扫描原理。
行扫描是指每次只能选中一行,所有的行轮流点亮。
4.用2线-4线译码器(使能端E1),构成3线-8线译码器。
5.简述74LS595串入-并出一个字节的过程。
第1步,串行输入一个字节至移位寄存器。
第2步,将数据传送至8位存储器。
第3步,打开三态门。
6.用74LS595构成24位移位寄存器,写出步骤并画图。
7.编写函数在32×64点阵上显示32×32的汉字。
voidhang32x32(uchartab1[],uchartab2[])
{
chari,j;
for(i=0;i<32;i++)
{
RCK=0;
for(j=3;j>=0;j--)yzimo(tab1[i*4+j]);
for(j=3;j>=0;j--)yzimo(tab2[i*4+j]);
RCK=1;
xsaomiao(i);
_nop_();
}
}
8.编写函数在32×64点阵上显示24×32的汉字。
voidhang24x32(uchartab1[],uchartab2[])
{
chari,j;
for(i=0;i<24;i++)
{
RCK=0;
for(j=3;j>=0;j--)yzimo(tab1[i*4+j]);
for(j=3;j>=0;j--)yzimo(tab2[i*4+j]);
RCK=1;
xsaomiao(i);
_nop_();
}
}
9.编程在32×64点阵上显示多屏信息。
main()
{
uchari;
while
(1)
{
for(i=0;i<220;i++)hang24x32(ji,wei);
for(i=0;i<220;i++)hang24x32(qi,tian);
}
}
10.设计一个动画,用32×64点阵显示。
项目四
三.综合题
1.简述无字库12864的屏幕管理机制。
12864显示屏的点阵大小为128列×64行。
以中间为间隔一分为二,为左屏和右屏;每半屏均分为8个数据页;每页的大小为8行、64列。
2.写出无字库12864显示信息所需的函数声明。
voidlcdkaixianshi(void);
voidlcdguanxianshi(void);
voidlcdshezhiye(ucharye);
voidlcdshezhilie(ucharlie);
voidlcdxiezimo(ucharzijie);
voidlcdshezhiyelie(ucharye,ucharlie);
voidlcdqingping(void);
voidlcdchushihua(void);
voidlcdxianshi16x16(uchartab[],ucharqiye,ucharqilie);
3.写出lcdxianshi16x16()和lcdxianshi16x8()的函数定义及函数声明,并写出显示“镇北路6号”的函数调用。
voidlcdxianshi16x16(uchartab[],ucharqiye,ucharqilie);
voidlcdxianshi16x16(uchartab[],ucharqiye,ucharqilie)
{
uchari,j;
for(i=0;i<2;i++)
{
for(j=0;j<16;j++)
{
lcdshezhiyelie(i+ye,j+lie);
lcdxiezimo(tab[i*16+j]);
}
}
}
voidlcdxianshi16x8(uchartab[],ucharqiye,ucharqilie);
voidlcdxianshi16x8(uchartab[],ucharqiye,ucharqilie)
{
uchari,j;
for(i=0;i<2;i++)
{
for(j=0;j<8;j++)
{
lcdshezhiyelie(i+ye,j+lie);
lcdxiezimo(tab[i*8+j]);
}
}
}
lcdxianshi16x16(zhen,2,0);
lcdxianshi16x16(bei,2,16);
lcdxianshi16x16(lu,2,32);
lcdxianshi16x8(liu,2,48);
lcdxianshi16x16(hao,2,56);
4.编写函数显示64×64的图片。
voidlcdxianshi64x64(uchartab[],ucharqiye,ucharqilie)
{
uchari,j;
for(i=0;i<8;i++)
{
for(j=0;j<64;j++)
{
lcdshezhiyelie(i+ye,j+lie);
lcdxiezimo(tab[i*64+j]);
}
}
}
5.声明一个数组存放表4-10中的数据,并赋初值;然后取出张同学的政治成绩,取出李同学的所有成绩。
表4-10随堂练习
C
数
政
张
85
90
70
李
85
68
65
uchara[2][3]=
{
{85,90,70},
{85,68,65},
};
张同学的政治成绩:
a[0][2]
取出李同学的所有成绩:
a[1]
6.设计一个多种信息的版面,显示在12864上。
main()
{
lcdxianshi64x128(tu);
lcdxianshi16x16(ge,6,0);
lcdxianshi16x16(zi,6,112);
}
项目五
三.综合题
1.计算+16、-16的补码。
+16补码=00010000=0x20
-16补码=~10010000+1=11101111+1=1111000=0xf0
2.如补码为0xf6,求原码。
因为,补码0xf6=11110110的符号位(位7)为1,所以是一个负数的补码。
所以,原码=~补码(除符号位)+1
=~0xf6+1
=~11110110+1
=10001001+1
=10001010
=-10
3.DS18B20输出数字量为0x00a2,计算实际温度。
保留1位小数,4舍5入。
因为数字量0x00a2的符号位为0,所以实际温度>0。
实际温度=0x00a2×0.0625
=(10×16+2×1)×0.0625
=162×0.0625
=10.125℃
(int)(10.125*10+0.5)=101
4.在12864上显示25.369,保留2位小数。
显示结果25.37,显示位置自定。
voidxianshi(void)
{
floataf=25.369;
unsignedintai;
ai=(unsignedint)(af*100+0.5);
lcdxianshi16x8(shuzi[ai/1000],0,0);
lcdxianshi16x8(shuzi[ai/100%10],0,8);
lcdxianshi16x8(dian,0,16);
lcdxianshi16x8(shuzi[ai/10%10],0,24);
lcdxianshi16x8(shuzi[ai%10],0,32);
}
5.有3个十六进制数0x6,0x2,0x3,编程合成0x236,并在12864上显示0x236*0.0625,保留一位小数。
分析:
0x236×0.0625
=(2×16×16+3×16+6×1)×0.0625
=566×0.0625=35.375
voidxianshi2(void)
{
unsignedcharc1=0x6,c2=0x2,c3=0x3;
unsignedintci1;
floatcf;
ci1=c2<<8|c3<<4|c1;
cf=ci1*0.0625;
ci1=(unsignedint)(ci1*10+0.5);
lcdxianshi16x8(shuzi[ci1/100],2,0);
lcdxianshi16x8(shuzi[ci1/10%10],2,8);
lcdxianshi16x8(dian,2,16);
lcdxianshi16x8(shuzi[ci1%10],2,24);
}
6.计算并解释运算的作用。
已知da=0x76
da&0x01da&0x80da|=0x80da|0x01
da&0x01=0x76&0x01=01110110&00000001=00000000=0x00
作用:
保留da的位0。
da&0x80=0x76&0x80=01110110&10000000=00000000=0x00
作用:
保留da的位7。
da|=0x80=0x76|0x80=01110110|10000000=11110110=0xf6
作用:
da的位7置1。
da|0x01=0x76|0x01=01110110|00000001=01110111=0x77
作用:
da的位0置1。
6.串行接收一个字节的数据,先接收的是位0,简述接收过程。
步骤如下:
(1)存放接收数据的变量先右移1位。
(2)判断待接收的数据为1时,将1存至位7。
(3)重复
(1)、
(2)8次之后,读入一个字节。
8.用DS18B20测量温度。
温度范围是-20~50℃。
voidds18b20sjcl(void)
{
ucharshuzidi8,shuzigao8;
uintshuzi16;
floatmonif;
uintmoniint;
ds18b20chushihua();//18B20初始化
ds18b20xie(0xcc);//跳过ROM,指令码0XCC
ds18b20xie(0x44);//启动18B20温度转换,指令码0X44
ds18b20chushihua();
ds18b20xie(0xcc);
ds18b20xie(0xbe);//读高速缓存RAM,指令码0XBE
shuzidi8=ds18b20du();//读数字量的低8位
shuzigao8=ds18b20du();//读数字量的高8位
shuzi16=shuzigao8<<8|shuzidi8;//合成16位数字量
if(shuzi16&0x8000==0)
{
monif=shuzi16*0.0625;//16位数字量转换为实际温度值
moniint=(uint)(monif*10+0.5);//浮点型实际温度变为整型,保留1位小数
lcdxianshi16x8(shuzi[moniint/100],4,86);//显示整型实际温度的百位
lcdxianshi16x8(shuzi[moniint/10%10],4,94);//显示整型实际温度的十位
lcdxianshi16x8(xiaoshudian,4,102);//显示小数点
lcdxianshi16x8(shuzi[moniint%10],4,110);//显示整型实际温度的个位
}
else
{
monif=(~shuzi16+1)*0.0625;//16位数字量转换为实际温度值
moniint=(uint)(monif*10+0.5);//浮点型实际温度变为整型,保留1位小数
lcdxianshi16x8(fuhao,4,86);//显示负号
lcdxianshi16x8(shuzi[moniint/100],4,86);//显示整型实际温度的百位
lcdxianshi16x8(shuzi[moniint/10%10],4,94);//显示整型实际温度的十位
lcdxianshi16x8(xiaoshudian,4,102);//显示小数点
lcdxianshi16x8(shuzi[moniint%10],4,110);//显示整型实际温度的个位
}
}
10.用DS18B20实现多点测温。
提示:
每个测温点用一块DS18B20,每块DS18B20接不同的I/O口。
项目六
三.综合题
1.将0~1000℃测温范围,按照1℃的分辨温度进行划分,确定ADC的位数。
需要(1000-0)/1=1000个状态。
因为210=1024>1000
所以ADC的位数=10位
2.根据ADC0832的时序图编写函数。
ucharadc0832du(uchartongdao)
{
uchari=0;
ucharshujv1,shujv2;
ADCCS=0;_nop_();_nop_();
ADCDI=1;_nop_();_nop_();
ADCCLK=1;_nop_();_nop_();
ADCCLK=0;_nop_();_nop_();
ADCCLK=1;_nop_();_nop_();
ADCDI=(tongdao>>1)&0x01;_nop_();_nop_();
ADCCLK=0;_nop_();_nop_();
ADCCLK=1;_nop_();_nop_();
ADCDI=tongdao&0x01;_nop_();_nop_();
ADCCLK=0;_nop_();_nop_();
ADCCLK=1;_nop_();_nop_();
ADCDI=1;_nop_();_nop_();
ADCCLK=0;_nop_();_nop_();
shujv1=0;
for(i=0;i<8;i++)
{
shujv1=shujv1<<1;
shujv1=shujv1|ADCDO;
ADCCLK=1;_nop_();_nop_();
ADCCLK=0;_nop_();_nop_();
}
shujv2=0;
for(i=0;i<8;i++)
{
shujv2=shujv2>>1;
if(ADCDO)shujv2=shujv2|0x80;
ADCCLK=1;_nop_();_nop_();
ADCCLK=0;_nop_();_nop_();
}
ADCCS=1;
ADCCLK=0;
ADCDO=1;
if(shujv1==shujv2)return(shujv1);
}
3.某10位ADC输入模拟电压范围是0~5V,试确定模拟量与数字量之间的关系。
4.设计单片机测控系统,用于测试某一场所的环境温度。
提供的传感器参数为:
测温范围-40~60℃,输出信号0~5V,测试精度1℃;试择ADC,及如何实现该环境温度的测试并显示?
需要(60+40)/1=100个状态。
因为28=256>100
所以ADC的位数=8位,U=D/51;
因为测温范围-40~60℃,输出信号0~5V,所以t=20U-40;
得:
t=0.39U-40
5.根据图6-12编写函数,实现数据的串行传送。
图6-12串行传送数据时序图
voidchuansong(uchary)
{
uchari;
for(i=0;i<8;i++)
{
CLK=0;
if(y&0x01)D=1;
elseD=0;
CLK=1;
y=y>>1;
}
}
5.简述矩形波频率的测试原理。
频率是指1s内完成周期性变化的次数。
主要解决两个问题:
第一:
定时1s;用定时/计数器T1定时50ms,T1溢出1次是50ms,溢出20次时,为20次×50ms=1000ms=1s。
第二:
在1s的时间内,统计矩形波周期的个数。
6.用DS18B20和湿度传感器监控室内环境质量。
7.通过光敏电阻监测光线的变化,使路灯自动工作。
项目七
三.综合题
1.简述直流电机的工作原理。
直流电机是根据通电导体在磁场中会受力的原理来工作的。
直流电机由定子和转子两大部分组成。
定子在直流电机运行时静止不动,定子的主要作用是产生磁场。
转子在直流电机运行时处于转动状态,其主要作用是产生电磁转距和感应电动势,是直流电机进行能量转换的枢纽,又称为电枢。
2.编程用按键控制直流电机的速度;一个按键增速,另一个按键减速。
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitzeng=P1^3;
sbitjian=P1^4;
sbitPWM=P1^0;
ucharpwmgao=100,pwmdi=100;
uchardangwei=0;
voidpwmtiaosu(void);
voidqudong(void);
voiddelayms(uinta);
voiddelayus(uinta);
voidmain()
{
while
(1)
{
qudong();
pwmtiaosu();
}
}
voidpwmtiaosu(void)
{
if(zeng==0)
{
delayms(10);
if(zeng==0)
{
dangwei++;
if(dangwei==5)dangwei=0;
while(!
zeng);
}
}
if(jian==0)
{
delayms(10);
if(jian==0)
{
if(dangwei==0)dangwei=5;
dangwei--;
while(!
jian);
}