电子科学综合设计
{
uchar keytemp; 位)
uint total_freq; //总频率
EA=0; TR0=0; //关总中断与定时器 delay(10); //延时够吗???
if(key==0) //确实有按键按下而引发中断 {
lcd_hang2[5]=total_freq+0x30; //在液晶中显示个位,(0x30 在液 total_freq/=10; lcd_hang2[4]=total_freq+0x30; //在液晶中显示时十位 total_freq/=10; lcd_hang2[3]=total_freq+0x30; //在液晶中显示时百位 total_freq/=10; lcd_hang2[2]=total_freq+0x30; //在液晶中显示时千位 disp_lcd(0x80,&lcd_hang1[waveform*16]); //在第一行显示 disp_lcd(0xc0,lcd_hang2); //在第二行显示
keytemp=P3&0xf0; //获取P3口高四位的值 switch(keytemp) {
case 0xe0: //选择波形
waveform++;
break;
if(waveform>2) waveform=0;
case 0xd0: //频率按规定单位依次增加
wavefreq[waveform]++;
if(wavefreq[waveform]>10) wavefreq[waveform]=1; // /*这 break;
边要用\,因为它比\可靠
// 性更高,使加数有个上限,不会一直加下去*/
case 0xb0: //频率按规定单位依次衰减
wavefreq[waveform]--; }
if(wavefreq[waveform]<1) wavefreq[waveform]=10; //这边 break;
要用\,因为它比\可靠性更高
THtemp=waveTH[waveform*10+(wavefreq[waveform]-1)]; //方括号中选取TLtemp=waveTL[waveform*10+(wavefreq[waveform]-1)];
第几个数后,并把该值赋给T_temp
total_freq= wavefreq[waveform] * freq_unit[waveform]; //求输出频率(个数*单
晶显示中表示数字0)
31
电子科学综合设计
}
}
EA=1; TR0=1; //开启总中断与定时器
4.仿真结果与结果分析
图1 锯齿波
32
电子科学综合设计
图2 方波
图3 正弦波
33
电子科学综合设计
系统可以改变频率的大小,方波的频率区间为200Hz至2000Hz,锯齿波的频率区间是10Hz至100Hz,正弦波的频率区间为10Hz至100Hz,利用定时中断并改变相应的定时时间即可改变频率的大小。
五、课题12:简易温度计
1.课题任务要求及技术指标 1.1设计任务:
采用温度传感器,采集和显示室温,实现数字温度计功能。 1.2设计要求:
(1)给出正确的原理图;
(2)给出正确的程序,并结合原理图给出相应结果。 2.课题分析及设计思路 2.1功能分析:
多点测量温度,并在数码管上显示,另加报警系统。 2.2实现思路:
2基于AT89C51单片机的测温系统,并采用了数字温度传感器DS1621和IC串行总线通
信系统。 2.3难点描述:
温度的采集以及转化显示。 3.系统设计(建模) 3.1硬件设计
(1)数字温度传感器
斜坡累加电路
温度低敏感振荡器 计数器 =0 34
重预置 计数 比较器 温度低敏感振荡器 重预置电路 温度寄存器 电子科学综合设计
DS1621的构成原理框图如图所示,在测量温度时使用了独有的在线温度测量技术。它通过在一个由对温度高度敏感的振荡器决定的计数周期内对温度低敏感的振荡器时钟脉冲的计数值的计算来测量温度。DS1621在计数器中预置了一个初值,它相当于-50摄氏度。如果计数周期结束之前计数器达到0,已预置了此初值的温度寄存器中的数字就会增加,从而表明温度高于-55摄氏度。与此同时,计数器斜坡累加电路被重新预置一个值,然后计数器重新对时钟计数,直到计数值为0。通过改变增加的每1s内的计数器的计数,斜坡累加电路可以补偿振荡器的非线性误差,以提高精度,任意温度下计数器的值和每一斜坡累加电路的值对应的计数次数须为已知。
DS1621通过计算可以得到0. 5摄氏度的精度,温度输出为9位,在发出读温度值请求后还会输出两位补偿值。表2给出了所测的温度和输出数据的关系。这些数据可通过2线制串行口连续输出,MSB在前,LSB在后。 (2)七段LED数码显示电路
3.2软件流程图 (1)主程序的设计
35