AVR单片机介绍:
AVR单片机有着51没法比拟的速度,它废除了机器周期,抛弃复杂指令计算机(CISC)追求指令完备的做法;采用精简指令集,以字作为指令长度单位,将内容丰富的操作数与操作码安排在一字之中(指令集中占大多数的单周期指令都是如此),取指周期短,又可预取指令,实现流水作业,可高速执行指令。当然这种速度上的升跃,是以高可靠性为其后盾的。
AVR单片机开发工具使用教程:
AVRstudio教程(可内联WINAVR,实现编辑、编译、仿真、下载功能):
下面以一个AVR的日历程序,介绍AVR的具体应用(使用ATmegal6):
该日历程序的PROTUES仿真电路图:
main函数如下:
//实现了年月日时分秒以及温度的读取并显示在LCD1602
#include<iom16.h>
#include<macros.h>
#include"delay.h"
#define uint unsigned int //宏定义
#define uchar unsigned char
//LCD1602端口位操作:
#define E_0 PORTB&=~BIT(2); //使能低
#define E_1 PORTB|=BIT(2); //使能高
#define RS0 PORTB&=~BIT(0); //选命令?
#define RS1 PORTB|=BIT(0); //选数据
#define RW0 PORTB&=~BIT(1); //读写低
#define RW1 PORTB|=BIT(1); //读写高
#include"18B20.h"
#include"1302.h"
const uchar table[]="0123456789:-.C";
void main()
{
DDRC="0X0F"; //初始化端口
DDRB|=BIT(0)|BIT(1)|BIT(2);
DDRD="0XFF";
PORTA="0X00";
DDRA="0XFF";
init_1602(); //LCD1602初始化
Set_RTC(l_tmpdate1); //初始化时钟芯片
while(1)
{
time_date(); //时间处理函数
temp="Read"_1820_temperature( ); //读取温度
write_com(0x80+2); //写第一行数据
write_date(table[l_tmpdisplay[0]]);//时
write_date(table[l_tmpdisplay[1]]);
write_date(table[10]); //“:”
write_date(table[l_tmpdisplay[2]]);//分
write_date(table[l_tmpdisplay[3]]);
write_date(table[10]);//“:”
write_date(table[l_tmpdisplay[4]]);//秒
write_date(table[l_tmpdisplay[5]]);
write_com(0xC0); //写第二行数据
write_date(table[2]); //年
write_date(table[0]);
write_date(table[l_tmpdisplay[6]]);
write_date(table[l_tmpdisplay[7]]);
write_date(table[11]); //"-"
write_date(table[l_tmpdisplay[8]]);//月
write_date(table[l_tmpdisplay[9]]);
write_date(table[11]);//"-"
write_date(table[l_tmpdisplay[10]]);//日
write_date(table[l_tmpdisplay[11]]);
write_com(0x80+0x4b); //温度
write_date(table[(temp%10000)/1000]);//十位
write_date(table[(temp%1000)/100]);//个位
write_date(table[12]);
write_date(table[0]);
write_date(table[13]);
}
}
void init_1602() //初始化
{
E_0
write_com(0x38); //设置16*2显示,5*7点阵,8位数据接口
write_com(0x0c);//设置开显示,不显示光标
write_com(0x06);//写一个字符后地址指针自动加1
write_com(0x01);//显示清0,数据指针清0
}
void write_com(uchar com) //写命令
{
RS0
RW0
PORTD=com;
delay_ms(1);
E_1
delay_ms(1);
E_0
}
void write_date(uchar date) //写数据
{
RS1
RW0
PORTD=date;
delay_ms(1);
E_1
delay_ms(1);
E_0
}
该程序的源代码以及protues仿真下载(ICCAVR 6.31+PROTUES 6.9):https://static.assets-stash.eet-china.com/album/old-resources/2009/11/8/569a3898-ec4e-4b51-a8d7-c4fe6986a50c.rar
文章评论(0条评论)
登录后参与讨论