|
这个“LCD显示的小时钟、温度计”是我在以前的小时钟基础上从ATmega8515移植到ATmega48上的,因为ATmega8515没有AD模数功能,所以就用ATmega48代替,温度传感器用LM35D,不用调试就可以准确的显示温度(因为我在初步的试验中通过,误差小于1度),硬件很简单,两个GND接在一起,AVCC对地接1uf滤波电容,AREF悬空,编译器用的是BASCOM-AVR1.11.7.9,我发这个帖子主要是想告诉大家,ATmega48的AD功能准确度还是挺好的。代码大小是2.01K,下面是源程序:
$regfile = "m48def.dat"
$crystal = 8000000
Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.2 , Db6 = Portb.3 , Db7 = Portb.4 , E = Portb.5 , Rs = Portb.0
Config Lcd = 16 * 2 '定义液晶显示屏
Ddrd.2 = 0 '中断口电阻上拉提高抗干扰能力
Portd.2 = 1
Ddrd.3 = 0
Portd.3 = 1
Dim A As Byte : A = 0
Dim B As Byte : B = 0
Dim C As Byte : C = 0
Dim D As Byte : D = 0 '定义几个变量
Dim E As Long
Deflcdchar 1 , 32 , 31 , 4 , 4 , 6 , 5 , 4 , 4 '自定义中文字符"下"
Deflcdchar 0 , 4 , 4 , 4 , 6 , 4 , 4 , 4 , 31 '自定义中文字符"上"
Deflcdchar 2 , 8 , 15 , 20 , 4 , 31 , 4 , 4 , 4 '自定义中文字符"午"
Config Timer1 = Timer , Prescale = 1024 '设置T/C1为计时
Enable Interrupts '打开全局中断
Enable Timer1 '打开局部中断
Enable Int0
Enable Int1
On Timer1 S '定义中断入口
On Int0 M
On Int1 H
Config Adc = Single , Prescaler = 128 , Reference = Internal '定义ADC为单次模式,128分频,使用内部参考电压
Start Adc '启动ADC
Cls '清屏
Do '死循环,等待中断
Loop
End
S: '产生秒钟中断
A = A + 1
Timer1 = 57722 '加载定时器初值,此值与系统时钟有关
Gosub A1
Return
M: '中断服务程序,调分钟用
B = B + 1
If B = 60 Then B = 0
Gosub A1
Waitms 500 '按键防抖动
Return
H:
C = C + 1 '中断服务程序,调小时用
If C = 24 Then C = 0
Gosub A1
Waitms 500 '按键防抖动
Return
A1:
'*****************************************************************************************
If A < 31 Then '这个If...End If是广告语句,可以不要
Locate 1 , 2 : Lcd "www.avrdiy.com"
Else
Locate 1 , 2 : Lcd "AVR-GCC-BASCOM"
End If
'*****************************************************************************************
E = Getadc(5) 'ADC5连接LM35D传感器的输出脚
E = E * 110 '1.1V标准内部参考电压,10毫伏为1个温度单位
E = E / 1023 '换算出实际温度
Locate 2 , 1 : Lcd E ; "C " '在LCD的第二行开头显示温度
If A = 60 Then
A = 0
B = B + 1
If B = 60 Then
B = 0
C = C + 1
If C = 24 Then C = 0
End If
End If
If C > 12 Then D = C - 12
If C < 13 Then
Locate 2 , 6 : Lcd Chr(0) ; Chr(2) '显示上午
If C < 10 Then
Locate 2 , 9 : Lcd "0" ; C '显示小时
Else
Locate 2 , 9 : Lcd C
End If
End If
If C > 12 Then
Locate 2 , 6 : Lcd Chr(1) ; Chr(2) '显示下午
If D < 10 Then
Locate 2 , 9 : Lcd "0" ; D
Else
Locate 2 , 9 : Lcd D
End If
End If
If B < 10 Then
Locate 2 , 12 : Lcd "0" ; B '显示分钟
Else
Locate 2 , 12 : Lcd B
End If
If A < 10 Then
Locate 2 , 15 : Lcd "0" ; A '显示秒钟
Else
Locate 2 , 15 : Lcd A
End If
Return
-----此内容被panxiaoyi于2005-11-15,09:01:51编辑过
-----此内容被panxiaoyi于2005-11-15,09:18:48编辑过 |
|