搜索
bottom↓
回复: 14

LCD显示的小时钟、温度计

[复制链接]

出0入0汤圆

发表于 2005-11-15 03:56:02 | 显示全部楼层 |阅读模式
这个“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编辑过

出0入0汤圆

发表于 2005-11-15 08:48:34 | 显示全部楼层
不错,刚好想学学basic

出0入0汤圆

发表于 2005-11-15 10:14:06 | 显示全部楼层
支持一下.

出0入0汤圆

 楼主| 发表于 2006-3-4 09:37:44 | 显示全部楼层
今天看到了这个主题被站长加到了“应用实例”栏目,所以发个优化后的程序

LCD显示的小时钟、温度计/LM35D传感器例子



     这个“LCD显示的小时钟、温度计”是在“LCD显示的小时钟”的基础上从ATmega8515移植到ATmega48上的,因为ATmega8515没有AD模数功能,所以就用ATmega48代替 ; 温度传感器用LM35D,LM35D在0℃时输出电压是0V, 在100℃时输出电压是1V,在0~100℃范围内温度每变化1℃电压就变化10mV,误差小于1℃,不用调试就可以比较准确的显示温度(因为我在初步的试验中通过,误差小于1℃),看来ATmega48的AD功能准确度还是挺好的。硬件很简单,两个GND接在一起,AVCC对地接1uf独石滤波电容 、同时用一个100欧的电阻接到VCC上去取电,用数字表实测AVCC比VCC只低于0.1V的电压(符合一般场合要求),AREF是外部参考电压输入端,可以悬空 ,最好用1uf独石电容接地。编译器用的是BASCOM-AVR1.11.7.9,代码大小是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

出0入0汤圆

发表于 2006-3-4 14:50:09 | 显示全部楼层
不错啊,用1602显示简单汉字。

出0入0汤圆

发表于 2006-4-23 19:44:20 | 显示全部楼层
这个不错,我试过,能够显示。但是秒的明显慢了许多。不知道是定时器初值设的不对还是其他原因。我是用双龙MCU下载程序下的,我都按那里默认烧进去的。是不是在烧写时候因该设置什么东西???

出0入0汤圆

发表于 2007-5-11 23:12:33 | 显示全部楼层
好啊,学习中

出0入0汤圆

发表于 2007-6-6 14:08:11 | 显示全部楼层
不错!有C的更好

出0入0汤圆

发表于 2010-1-29 18:29:17 | 显示全部楼层
make

出0入0汤圆

发表于 2010-1-29 18:31:39 | 显示全部楼层
make

出0入0汤圆

发表于 2010-1-30 11:27:26 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-9 13:49:41 | 显示全部楼层
不错!有C的更好,不知道编译以后哪个更小?

出0入0汤圆

发表于 2010-8-10 15:39:14 | 显示全部楼层
回复【3楼】panxiaoyi 啊艺
-----------------------------------------------------------------------

不错呢  很好呢   有没有全套的部件呢   呵呵呵  我想做做呢  可以吗?

出0入0汤圆

发表于 2010-8-10 15:39:55 | 显示全部楼层
回复【楼主位】panxiaoyi 啊艺
-----------------------------------------------------------------------

行呢   很好  我看完 不错呢

出0入0汤圆

发表于 2010-8-30 16:50:23 | 显示全部楼层
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-8 02:13

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表