您的位置 首页 解答

AVR128的程序——12864液晶与ds1302与ds18b20的归纳运用

此程序包含子文件includeiom128vh>includemacrosh>include12864lcdhincludeds1302hincludeds18B20hvoidmcu_

此程序包括子文件

#include
#include
#include “12864lcd.h”
#include “ds1302.h”
#include “ds18B20.h”
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;
}
void main(void)
{
uchar i,j;
uint k;
mcu_init();
shi_BCD();
ds1302_init();
ds1302_write_time();
init12864lcd();
display();
display1();
display2();
display3();
while(1)
{
ds1302_read_time();
time_Process();
write_sfm(0x8D,num);
write_sfm(0x8B,fen);
write_sfm(0x89,shi);
write_sfm(0x86,ri);
write_sfm(0x84,yue);
write_sfm(0x92,zhou);
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();
k=j*256+i; //这儿k的值会大于255 所以界说的时分要写成uint型,否则会溢出。
k=k*0.0625;
write_wendu(0x96,k);
}
}
#ifndef __12864LCD_H__
#define __12864LCD_H__
#define uint unsigned int
#define uchar unsigned char
#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月04日”;
unsigned char table2[]=”星期六 温度 0℃”;
unsigned char table3[]=” 00: 00: 00″;
unsigned char table4[]=” 科嵌电子创造”;
uint num=50,fen=9,shi=8,ri=8,yue=2,zhou=3;
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);
}
#endif
#ifndef __DS1302_H__
#define __DS1302_H__
#define uchar unsigned char
#define uint unsigned int
#define ds1302_rst PE4 //界说1302的RST接在PE4
#define ds1302_io PE3 //界说1302的IO接在PE3
#define ds1302_sclk PE2 //界说1302的时钟接在PE2
#define set_ds1302_rst_ddr() DDRE|=1< //复位端置为输出
#define set_ds1302_rst() PORTE|=1< //复位端置1
#define clr_ds1302_rst() PORTE&=~(1< //复位端清0
#define set_ds1302_io_ddr() DDRE|=1< //数据端置为输出
#define set_ds1302_io() PORTE|=1< //数据端置1
#define clr_ds1302_io() PORTE&=~(1< //数据端清0
#define clr_ds1302_io_ddr() DDRE&=~(1< //数据端置为输入
#define in_ds1302_io() PINE&(1< //数据端输入数据
#define set_ds1302_sclk_ddr() DDRE|=1< //时钟端置为输出
#define set_ds1302_sclk() PORTE|=1< //时钟端置1
#define clr_ds1302_sclk() PORTE &=~(1<//时钟端清0
#define ds1302_sec_add 0x80 //秒数据地址
#define ds1302_min_add 0x82 //分数据地址
#define ds1302_hr_add 0x84 //时数据地址
#define ds1302_date_add 0x86 //日数据地址
#define ds1302_month_add 0x88 //月数据地址
#define ds1302_day_add 0x8a //星期数据地址
#define ds1302_year_add 0x8c //年数据地址
#define ds1302_control_add 0x8e //操控数据地址
#define ds1302_charger_add 0x90
#define ds1302_clkburst_add 0xbe
uchar timer[7]={12,2,29,23,59,50,3};
void shi_BCD(void)
{
uchar i,k;
for(i=0;i<7;i++)
{
k=timer[i]/10;
timer[i]=timer[i];
timer[i]=timer[i]+k*16;
}
}
void ds1302_init(void)
{
set_ds1302_rst_ddr();
set_ds1302_sclk_ddr();
clr_ds1302_rst();
clr_ds1302_sclk();
}
void ds1302_write(uchar add,uchar data)
{
uchar i=0;
set_ds1302_io_ddr(); //装备IO为输出
clr_ds1302_rst(); //清复位,中止一切操作
clr_ds1302_sclk(); //清时钟,预备操作
set_ds1302_rst(); //置复位,开端操作
add = add & 0xFE;
for(i=0;i<8;i++) //此循环写入操控码
{
if(add&0x01)
set_ds1302_io(); //当时位为1,置数据位
else
clr_ds1302_io(); //当时位为0,清数据位
set_ds1302_sclk(); //发生时钟脉冲,写入数据
clr_ds1302_sclk();
add>>=1; //移位,预备写入下1位
}
for(i=0;i<8;i++) //此循环写入数据码
{
if(data&0x01)
set_ds1302_io();
else
clr_ds1302_io();
set_ds1302_sclk();
clr_ds1302_sclk();
data>>=1;
}
clr_ds1302_rst();
clr_ds1302_io_ddr();
}
uchar ds1302_read(uchar add)
{
uchar data=0;
uchar i=0;
add+=1;
set_ds1302_io_ddr(); //端口输出
clr_ds1302_rst(); //清复位
clr_ds1302_sclk(); //清时钟
set_ds1302_rst(); //置复位
for(i=0;i<8;i++) //此循环写入地址码
{
if(add&0x01)
{set_ds1302_io();}
else
{clr_ds1302_io();}
set_ds1302_sclk();
clr_ds1302_sclk();
add>>=1;
}
clr_ds1302_io_ddr(); //端口输入
for(i=0;i<8;i++) //此循环读出1302的数据
{
data>>=1;
if(in_ds1302_io())
{data|=0x80;}
set_ds1302_sclk();
clr_ds1302_sclk();
}
clr_ds1302_rst();
return(data);
}
void ds1302_write_time(void)
{
ds1302_write(ds1302_control_add,0x00); //封闭写保护
ds1302_write(ds1302_sec_add,0x80); //暂停
ds1302_write(ds1302_charger_add,0xa9); //涓流充电
ds1302_write(ds1302_year_add,timer[0]); //年
ds1302_write(ds1302_month_add,timer[1]); //月
ds1302_write(ds1302_date_add,timer[2]); //日
ds1302_write(ds1302_day_add,timer[6]); //周
ds1302_write(ds1302_hr_add,timer[3]); //时
ds1302_write(ds1302_min_add,timer[4]); //分
ds1302_write(ds1302_sec_add,timer[5]); //秒
ds1302_write(ds1302_control_add,0x80); //翻开写保护
}
void ds1302_read_time(void)
{
timer[0]=ds1302_read(ds1302_year_add); //年
timer[1]=ds1302_read(ds1302_month_add); //月
timer[2]=ds1302_read(ds1302_date_add); //日
timer[6]=ds1302_read(ds1302_day_add); //周
timer[3]=ds1302_read(ds1302_hr_add); //时
timer[4]=ds1302_read(ds1302_min_add); //分
timer[5]=ds1302_read(ds1302_sec_add); //秒
}
void time_Process(void)
{
uchar temp1,temp2,temp3,temp4,temp5,temp6;
temp1 = timer[3]/16;
shi = timer[3]+10*temp1;
temp2 = timer[4]/16;
fen = timer[4]+10*temp2;
temp3 = timer[5]/16;
num = timer[5]+10*temp3;
temp4 = timer[2]/16;
ri = timer[2]+10*temp4;
temp5 = timer[1]/16;
yue = timer[1]+10*temp5;
temp6 = timer[6]/16;
zhou = timer[6]+10*temp6;
}
#endif
#ifndef __DS18B20_H__
#define __DS18B20_H__
#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)
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;
}
}
#endif

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/jieda/262337.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部