AVR128的程序——DS18B20与12864液晶时钟综合运用

发布者:MysticDreamer最新更新时间:2016-03-04 来源: eefocus关键字:AVR128  DS18B20  液晶时钟 手机看文章 扫描二维码
随时随地手机看文章
#include
#define uchar unsigned char
#define uint  unsigned int
 
#define DQ_IN DDRE &= ~(1 << PE6)
#define DQ_OUT DDRE |= (1 << PE6)
#define DQ_CLR PORTE &= ~(1 << PE6)       
#define DQ_SET PORTE |= (1 << PE6)
#define DQ_R PINE & (1 << PE6)
 
#define psbset  DDRB |= (1<<4)
#define psbset  PORTB |= (1<<4)
#define psbclr  PORTB &=~(1<<4)
 
#define rsout  DDRB |= (1<<5)
#define rsset  PORTB |=(1<<5)
#define rsclr  PORTB &=~(1<<5)
 
#define rwout  DDRB |= (1<<6)
#define rwset  PORTB |= (1<<6)
#define rwclr  PORTB &= ~(1<<6)
 
#define enout  DDRB |= (1<<7)
#define enset  PORTB |= (1<<7)
#define enclr  PORTB &= ~(1<<7)
 
unsigned char table1[]="  2012年02月06日";
unsigned char table2[]="星期六  温度 8℃";
unsigned char table3[]="  00: 00: 00";
unsigned char table4[]="  科嵌电子创作";
                      
uint num=10,fen=07,shi=14,ri=06,yue=02;;
void mcu_init(void);
 
void timer1_init(void)
{
    TCNT1H = 0xE1;        
    TCNT1L = 0x7C;        
 
    TCCR1A = 0x00;
    TCCR1B = 0x05;       
 
    TIMSK = 0x04;         
}
 
void Delayus(uint US)  
{
     uint i;
     US=US*5/4;    
     for( i=0;i
}
 
void Delayms(uint MS)  
{
     uint i,j;
     for( i=0;i
     for(j=0;j<1141;j++);
}
 
void write_12864com(uchar com)
{
rwclr;
rsclr;
Delayus(500);
PORTA=com;
enset;
Delayus(1000);
enclr;
Delayus(1000);
}
 
void write_12864dat(uchar dat)
{
rwclr;
rsset;
Delayus(500);
PORTA=dat;
enset;
Delayus(1000);
enclr;
Delayus(1000);
}
 
void init12864lcd(void)
{
Delayms(500);
write_12864com(0x30);
Delayus(500);
write_12864com(0x30);
Delayus(500);
write_12864com(0x0f);
Delayus(500);
write_12864com(0x01);
Delayms(25);
write_12864com(0x06);
Delayus(2500);
write_12864com(0x0c);
Delayus(500);
}
 
void display(void)
{
uchar i;
write_12864com(0x80);
for(i=0;i<16;i++)
{
write_12864dat(table1[i]);
Delayms(10);
}
}
 
void display1(void)
{
uchar i;
write_12864com(0x90);
for(i=0;i<16;i++)
{
write_12864dat(table2[i]);
Delayms(10);
}
}
 
void display2(void)
{
uchar i;
write_12864com(0x88);
for(i=0;i<12;i++)
{
write_12864dat(table3[i]);
Delayms(10);
}
}
 
void display3(void)
{
uchar i;
write_12864com(0x98);
for(i=0;i<14;i++)
{
write_12864dat(table4[i]);
Delayms(10);
}
}
 
void write_sfm(uchar add,uchar date)
{
uchar shi,ge;
shi=date/10;
ge=date;
write_12864com(add);
write_12864dat(0x30+shi);
write_12864dat(0x30+ge);
}
 
void write_wendu(uchar add,uchar date)
{
uchar shi,ge;
shi=date/10;
ge=date;
write_12864com(add);
write_12864dat(0x30+shi);
write_12864dat(0x30+ge);
}
 
unsigned char ds1820_reset(void) 
{
unsigned char i;
DQ_OUT;
DQ_CLR;
Delayus(500);
DQ_SET;
DQ_IN;
Delayus(100);
i = DQ_R;
Delayus(500);
return i;
}
 
unsigned char ds1820_read_byte(void) 
{
unsigned char i;
unsigned char value = 0;
for (i = 0; i < 8; i++) 
{
value >>= 1;
DQ_OUT;
DQ_CLR;
Delayus(10);
DQ_SET;
DQ_IN;
if (DQ_R) value|=0x80;
Delayus(60);
}
return value;
}
 
void ds1820_write_byte(unsigned char value) 
{
unsigned char i;
for (i = 0; i < 8; i++) 
{
DQ_OUT;
DQ_CLR;
Delayus(10);
if (value & 0x01) DQ_SET;
Delayus(100);
DQ_SET;
value >>= 1;
}
}
 
void main(void) 
{
uchar i,j;
uint temp;
mcu_init();
init12864lcd();
timer1_init();
SEI(); 
display();
display1();
display2();
display3();  
while(1)
{
   write_sfm(0x8D,num);
write_sfm(0x8B,fen);
write_sfm(0x89,shi);
write_sfm(0x86,ri);
write_sfm(0x84,yue);
ds1820_reset();
ds1820_write_byte(0xCC);
ds1820_write_byte(0x44);
Delayms(2);
 
ds1820_reset();
ds1820_write_byte(0xCC);
ds1820_write_byte(0xbe);
 
i=ds1820_read_byte();
j=ds1820_read_byte();
temp=j*256+i;
temp=temp*0.0625;
write_wendu(0x96,temp);
}
}
 
void mcu_init(void)
{
   DDRA = 0XFF;            
   PORTA = 0XFF;
 
   DDRC = 0XFF;                   
   PORTC = 0XFF;
   
   DDRF |= 0X0E;
   PORTF |= 0X0E;
   PORTF &= 0xF0;      
   
   DDRB |= 0X10;
   PORTB |= 0X10;
   
   psbset;
   rsout;
   rwout;
   enout;
}
 
#pragma interrupt_handler timer1_ovf_isr:15
void timer1_ovf_isr(void)
{
TCNT1H = 0xE1; 
     TCNT1L = 0x7C; 
     num++;
if(num==60)
{
    num=0;
fen++;
if(fen==60)
{
    fen=0; 
shi++;
if(shi==24)
{
   shi=0;
ri++;
if(ri==32)
{
   ri=1;
   yue++;
}
}
}
}
}

关键字:AVR128  DS18B20  液晶时钟 引用地址:AVR128的程序——DS18B20与12864液晶时钟综合运用

上一篇:Linglong之AVR程例1 点亮一个LED
下一篇:AVR128的程序——步进电机顺序转动

推荐阅读最新更新时间:2024-03-16 14:46

12864无字库液晶显示
这篇文章主要来写一下12864液晶显示的程序,至于一些寄存器的设置,和12864液晶的资料介绍,大家可以参看12864液晶的datesheet,上面一般都很全面,一些具体注意事项请大家参看:http://hi.baidu.com/echoas 他的空间里面介绍的比较清楚,我在这里也没必要浪费时间重复了。 我在这里直接贴出程序,程序注释比较清楚,相信大家对照dateshee可以看明白。 /************************************ 程序功能:无字库12864液晶的显示 编译环境:keil4 运行环境:proteus7.7 整理人:张家越 QQ:435835181 整理时间:2011-04-28
[单片机]
<font color='red'>12864</font>无字库<font color='red'>液晶</font>显示
基于ds18b20温度传感器的51单片C语言程序
基于ds18b20温度传感器的51单片C语言程序 #include REG51.H #define uchar unsigned char #define uint unsigned int sbit DQ=P1^1; uchar code SEG7 ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uchar tplsb,tpmsb; /*延时tms*/ void delay(uint t) { uint i; while(t--) { for (i=0;i 125;i++) {;} } } /* 产生复位脉冲初始化DS18B20
[单片机]
【STM32】STM32驱动 LCD12864程序代码(串行方式)
引言: 这里我们只讲解接线和代码实现,具体的原理在上一篇博客中已经讲解,如果想了解具体原理可以查看上一篇博客 《STM32 LCD12864 串行通信模式 (从原理让你理解)》 下方代码的实现也是基于上一篇的讲解顺序来的 设备: STM32F407ZGT6 引脚接线: VSS——GND VDD——VCC(5V or 3.3V) V0 亮度调节 不接 CS ——接VCC,持续高电平,一直选通。 SID ——接PE1 SCLK ——接PE0 PSB——接GND 串行模式 或者飞线与1脚相连 BLA——VCC(5V or 3.3V) 或者飞线与2脚相连 BLK——
[单片机]
移植ds18b20到stm32f103遇到的问题
之前在AVR单片机上用过DS18B20温度传感器,现在需要在STM32F103平台下使用,就直接在原先的代码基础上做了相应修改,调试时遇到的问题是测量值总是显示127.9375(读取的温度数据为0x7fff),用示波器看波形也没有发现问题,以为是18B20出问题了,又回到AVR下测试,结果正常。后来发现,不同之处在于供电:AVR用的5V,而STM32是3.3V。把18B20的供电电压换成5V就能正常工作了。又测试了18B20用3.3V供电,DQ脚5V上拉,测量数据还是不对,而且与上拉电阻值无关。数据手册上明明写的供电电压3~5.5V,难道是管子的问题? 总结一下STM32与AVR单片机在使用DS18B20的区别。 1
[单片机]
基于GSM的远程智能汽车温控系统
  该系统利用GSM远程通信系统控制车内空调等器械运作。用户通过短信形式达到人机互动,克服红外线、无线等远程控制距离短的问题,还可以实现实时监控汽车的状态,为车主提供便利。   1系统原理与结构   1.1系统功能介绍   本系统能以10次/s的速度自动采集现场的环境温度和光照强度、采集空调和窗帘的开闭状态,并通过LCD液晶屏实时地显示出来。温度的感应范围-55~+125℃,精度为±0.5℃。光强的强度范围分为强、较强、中、较弱、弱5档。空调和窗帘的状态为开或者关。   用户可以通过手机或者小灵通等终端与GSM模块连接的系统之间进行无线通信,通信范围为移动网络覆盖的所有范围,做到了真正的通信范围无穷大。具体的通信为:
[单片机]
基于GSM的远程智能汽车温控系统
12864密码锁
这个程序真的花了我好长的时间调试,终于写好了,大家可以看看我的密码锁,有点花哨呕!! 下面是密码锁简约版本: main.c #include reg52.h #include 12864.h #include keyscan.h #include baojin.h uchar mima ={1,2,3,4,5}; main() { uchar length,i,flag,inputtimes,flagkaimeng;//tempÊÇÃÜÂëµÄÁÙʱ±äÁ¿ uchar itouch,flaggaimima;//ÓÃÀ´¼Ç¼ÕæÕýÊäÈëµÄÃÜÂëµÄ¸öÊý uchar mima
[单片机]
基于LCD12864和51单片机的简单小游戏Proteus仿真程序
以lcd12864作为显示屏,实现一个按钮控制的简单小游戏。主要工作集中于游戏的图形化以及相关逻辑的实现。人物场景设计通过字模提取软件转换成为段码预先储存在单片机中,动画的实现采取局部刷新的方式以提高显示的速度。 仿真原理图如下 单片机源程序如下: #include reg51.h #define LCDLCDDisp_Off 0x3e #define LCDLCDDisp_On 0x3f #define Page_Add 0xb8//ye #define LCDCol_Add 0x40//lie #define Start_Line 0xC0//hang /*****液晶显示器的端口定义*****
[单片机]
基于LCD<font color='red'>12864</font>和51单片机的简单小游戏Proteus仿真程序
FPGA与DS18B20型温度传感器通信的实现
DS18B20是DALLAS公司生产的一线式数字温度传感器,采用3引脚TO-92型小体积封装;温度测量范围为-55℃~+125℃,可编程为9位~12位A/D转换精度,测温分辨率可达0.0625℃,被测温度用符号扩展的16位数字量方式串行输出。 一线式(1-WIRE)串行总线是利用1条信号线就可以与总线上若干器件进行通信。具体应用中可以利用微处理器的I/O端口对DS18B20直接进行通信,也可以通过现场可编程门阵列(FPGA)等可编程逻辑器件(PLD)实现对1-WIRE器件的通信。 本文介绍利用ACTEL公司的ProASICplus系列FPGA实现与DS18B20的通信功能。FPGA可以将读出DS18B20的48位ID号和12位温度
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved