atmega16 位操作让灯闪烁

合集下载

ATmega16TC1寄存器控制说明

ATmega16TC1寄存器控制说明

◆普通模式相当于定时器计数器。

可内部计数也可接受外部引脚计数。

(0xFFFF为TOP)●第一步设置工作模式T/C控制寄存器TCCR1B中CS02CS01 CS00位●第二步设置初值T/C寄存器TCNT1H TCNT1L共16位。

(先写高位后写低位)●第三步开定时器中断T/C中断屏蔽寄存器TIMSK中TOIE1置位●第四步开总中断SREG|=BIT(7)内部状态:当到达TOP值时,T/C中断标志寄存器TIFR中TOV1位自动变为1,由此进入中断,且此标志自动清零。

但是需要在中断中重新设置初值。

以下几种模式很少用到中断。

◆CTC模式比较输入模式,当TCNT1的值计数到的值与OCR1A 或ICR1 寄存器的值匹配时,引脚输出电位发生相应变化,且TCNT1从0开始重新计数。

常用来输出50%占空比的方波。

●第一步先设置PD5(OC1A)和PD4(OC1B)为输出●第二步设置工作模式T/C控制寄存器TCCR1A和TCCR1B中WGM13 WGM12 WGM11 WGM10选择CTC的相应模式。

COM1A1 COM1B1 COM1A0 COM1B0选择匹配后具体动作(常用01)CS02CS01 CS00设置预分频●第三步设置TOP值输出比较寄存器OCR1A/ICR1写入TOP值◆快速PWM模式相对于CTC模式,可以人为设置占空比。

具体方法是有两个寄存器,一个储存匹配值,一个储存TOP值。

匹配时清0,达到TOP值时置位。

此方式用于输出脉冲来控制电机。

●第一步先设置PD5(OC1A)和PD4(OC1B)为输出●第二步设置工作模式T/C控制寄存器TCCR1A和TCCR1B中WGM13 WGM12 WGM11 WGM10选择CTC的相应模式。

(以15模式为例子)COM1A1 COM1B1 COM1A0 COM1B0选择匹配后具体动作(常用10)CS02CS01 CS00设置预分频●第三步设置TOP值和匹配值输出比较寄存器OCR1A写入TOP值输出比较寄存器OCR1B写入匹配值注意:此时OC1B能够输出此PWM波形,而因为OCR1A存储了TOP值,所以OC1A 无法输出PWM。

基于avr-Atmega16单片机实现六位时钟程序-并用proteus仿真

基于avr-Atmega16单片机实现六位时钟程序-并用proteus仿真

基于avr-Atmega16单片机实现六位时钟程序,并用proteus仿真#include<iom16v.h>#define uchar unsigned char#define uint unsigned intuchar SEG[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};uchar ACT[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};ucharsec=0,min=0,ms_sec=0,hr=0,cnt=0,set_sec=0,set_min=0,set_hr=0,key_cnt=0,flag1=0,flag2=0,i=0 ,j=0,k=0;void delay_ms(uint k){uint i,j;for(i=0;i<k;i++){for(j=0;j<1000;j++);}}void port_init(void){DDRA=0XFF;PORTA=0XFF;DDRB=0XFF;PORTB=0X00;DDRC=0XFF;PORTC=0XFF;DDRD=0X00;PORTD=0XFF;}void timer_init(void){TCNT0=0X83;TCCR0=0X03;TIMSK=0X01;}void W_EEP(uchar add,uchar dat){while(EECR&(1<<EEWE));EEAR=add;EEDR=dat;EECR|=(1<<EEMWE);EECR|=(1<<EEWE);}uchar R_EEP(uchar add){while(EECR&(1<<EEWE));EEAR=add;EECR|=(1<<EERE);return EEDR;}//10非常重要#pragma interrupt_handler timer_isr:10 void timer_isr(void){TCNT0=0X83;if(++key_cnt>5)key_cnt=0;if(++cnt>5)cnt=0;if(++ms_sec>99){sec++;ms_sec=0;}if(sec>59){min++;sec=0;}if(min>59){hr++;min=0;}if(hr>24)hr=0;if(key_cnt==0){if((PIND&0X80)==0){if(set_sec<59)set_sec++;else set_sec=0;delay_ms(30);}if((PIND&0X40)==0){if(set_min<59)set_min++;else set_min=0;delay_ms(30);}if((PIND&0X20)==0){if(set_hr<24)set_hr++;else set_hr=0;delay_ms(30);}}if(flag1==0){i=sec,j=min,k=hr;}else{i=set_sec,j=set_min,k=set_hr;}switch(cnt){case 0:/*if(flag1=1){PORTB=ACT[0];PORTA=SEG[set_sec%10];}else {*/PORTB=ACT[0];PORTA=SEG[i%10];// }break;case 1:/*if(flag1=1){PORTB=ACT[1];PORTA=SEG[set_sec/10];}else {*/PORTB=ACT[1];PORTA=SEG[i/10];//}break;case 2:/*if(flag1=1){PORTB=ACT[2];PORTA=SEG[set_min%10];}else {*/PORTB=ACT[2];PORTA=SEG[j%10];//}break;case 3:/*if(flag1=1){PORTB=ACT[2];PORTA=SEG[set_min%10];}else {*/PORTB=ACT[3];PORTA=SEG[j/10];//}break;case 4:/*if(flag1=1){PORTB=ACT[2];PORTA=SEG[set_hr%10];}else {*/PORTB=ACT[4];PORTA=SEG[k%10];//}break;case 5:/*if(flag1=1){PORTB=ACT[2];PORTA=SEG[set_hr%10];}else {*/PORTB=ACT[5];PORTA=SEG[k/10];//}break;default:PORTB=0X00;PORTA=0XFF;break;}}void main(void){uchar n;port_init();timer_init();SREG=0X80;while(1){if((PIND&0X08)==0){flag1=1;}else flag1=0;if((PIND&0x04)==0){SREG=0X00;W_EEP(200,set_sec);delay_ms(20);W_EEP(201,set_min);delay_ms(20);W_EEP(202,set_hr);delay_ms(20);SREG=0X80;}if(sec==R_EEP(200)&&min==R_EEP(201)&&hr==R_EEP(202)) {flag2=1;}if((PIND&0X10)==0)flag2=0;if(flag2==1){PORTC=0X00;delay_ms(20);PORTC=0XFF;delay_ms(20);}}}。

ATmega16实验板使用说明书

ATmega16实验板使用说明书

Atmega16实验板说明书硬件资料介绍 (2)调试软件安装 (3)编译环境的使用 (8)建立新的工程 (15)资料和例程 (18)注意:使用时先把调试器和开发板用数据线连起来,再插上USB线;停止使用时应先断开USB线切断电源,才能拔下数据线,否则可能会损坏调试器。

硬件资料介绍实验套件共分3部分,开发板,调试器,数据线(1根usb线,1根串口线)。

开发板文件夹图片/原理图里面有开发板的原理图图片和protel dxp 原理图文件。

如果开发板是没有焊好的套件可以对照元器件参数表和已焊好的图片(图片文件夹里有)先把开发板焊接完成。

焊接完成后先用万用表测量一下5V 与GND 之间是否短路,确定没有短路之后,插上USB 线接到电脑上,弹上开关SW1电源指示灯D1亮,说明电源已接通。

调试器调试软件安装要实现开发调试需要安装三个软件:PL2303驱动,avr studio 4,WinAVR。

这三个软件都在软件这个文件夹里。

首先安装usb驱动PL2303,如图点下一步。

点完成就可以了。

然后把调试器和电脑通过USB线联机。

如图这时调试器上的电源指示灯和信号指示灯都亮,而且电脑开始发现新硬件,新硬件可以安装使用。

这说明已经建立起连接,然后右击我的电脑—>属性—>硬件—>设备管理器,打开设备管理器界面,点开端口(COM和LPT)的“+”如图。

其中的Prolific usb-to-Serial Comm Port(COMx)就是调试器的usb设备。

端口号是多少根据个人电脑情况可能有差异。

下面我们要修改端口号,因为调试器里只提供COM1-COM3的通讯。

双击Prolific usb-to-Serial Comm Port(COMx)选项,弹出端口设置对话框,如图然后选端口设置—>高级,在端口号中选一个没有被占用且3以内的COM口,我的电脑上没有串口,我选的是COM1,如图然后点确定,重新打开设备管理器再看一下端口情况。

基于ATmega16的LED舞台调光控制系统的研究与实现

基于ATmega16的LED舞台调光控制系统的研究与实现

统 完全 满足舞 台调 光功能要 求 , 个 系统结构轻便 , 整 操作 简单, 性能稳定 , 可靠性较 高, 同时使用 L D舞 台灯光代 替 E
传 统 的舞 台灯 光 , 有 明显 的 节 能效 果 。 具
关 键 词 :E L D舞 台灯 光 ;A mea 6 P T gl ; WM : 流 源驱 动 恒
... .. .. .. .。 。。 ... .. .. ... 。。 .. .. ... .. .
- — . , ●含 ~ 。主要包二 一 求 ●L1个 至少 8 u 低 电平 输 出起 始 标 几 ●二 ……………山 ㈠ L 二] _ . 上 , 于 8s的
● ●●
帧 , 作 一个 控制 通道 , 以控 制灯光 设 备 的一 个 或 称 可 _ 几个 功能 。一 个 D 5 2数据 包 包含 起 始码 和 5 2 MX 1 1
逐 渐体 现 出来 。而现 有 L D调 光 控 制 设 备 通 常 体 E
1 引 言
随着 舞 台灯光 技 术 的发展 , 们 对 灯 光 效果 的 人 要 求越 来 越高 , 灯光 调 节 的实 时性 、 移性 等要 求也 便
收 稿 日期 :0 1 0 2 1 — 7—1 3
积 比较 大 , 而且功 能繁 多 , 容易 移动 和搬运 。考 虑 不 到不 同场 合 下 的使 用需 求 , 型 L D舞 台灯 光 控制 小 E 系统 的研 究开 发也 越来越 多地 受 到人们 的关 注 。本
控通道 完 成 4 4次 控 制 , 受 控 光 路 的 刷 新 频 率 即 4 Hz如 果 实际受 控通 道少 于 5 2个 , 么刷 新频 率 4 , 1 那
Absr c W i h v l p n ft e t c n lg fLED t g ih i g,h r r a o i d fLED t a t: t t e de eo me to h e h o o y o h sa e l tn t e e a e v r us k n s o g i

个人总结的AVR的ATMEGA16L单片机程序

个人总结的AVR的ATMEGA16L单片机程序

ATMAGE 16 的C语言程序ATMAGE 16 的C语言程序 (1)一、PB0 口的PB0.1 LED 发光管闪烁的程序: (3)二、PA0、PB0、PC0口的LED 发光管闪烁的程序: (5)三、I/O口的输入与输出 (6)四、跑马灯 (8)五、数码管计数显示设计 (10)六、控制直流电机正反转 (16)七、单片机的定时器(T/C0)应用 (20)AVR原理图 (24)一、PB0 口的PB0.1 LED 发光管闪烁的程序:#include <avr/io.h>int main( void ){unsigned char i, j, k,led=0;DDRB=0xFF; /* all outputs */while (1){if(led)PORTB|=0X01; /* |使最后一位为1 */elsePORTB&=0XFE; /*&最后一位为0 */ led=!led;//延时for (i=0; i<255; i++)for(j=0; j<255;j++)k++;}}/////////////////////////////////////////////////////////////// #include <avr/io.h>int main( void ){unsigned char i, j, k,led=0;DDRB=0xFF; /* all outputs */while (1){if(led)PORTB=0Xfe;elsePORTB=0Xff;led=!led;for (i=0; i<255; i++) //延时for(j=0; j<255;j++)k++;}}二、PA0、PB0、PC0口的LED 发光管闪烁的程序:#include <avr/io.h>int main( void ){unsigned char i, j, k,led=0;DDRA=0xFF;//为输出DDRB=0xFF;DDRC=0XFF;while (1){if(led){PORTA|=0XFF;PORTB|=0XFF;PORTC|=0XFF;}else{PORTA&=0X00;PORTB&=0X00;PORTC&=0X00;}led=!led;//取反////////////延时////////////////for (i=0; i<255; i++)for(j=0; j<255;j++)k++;}}三、I/O口的输入与输出#include <avr/io.h>///////////////////延时us//////////////////void delay_us(int t){dot--;while(t>1);}///////////////////延时ms///////////////// void delay_ms(unsigned int t){while(t!=0){delay_us(1142);t--;}}///////////////////主程序/////////////////////int main(void){DDRA = 0xff; /* all outputs */ DDRB = 0xff; /* all outputs */ DDRC = 0xff; /* all outputs */PORTA=0XFF;PORTB=0XFF;PORTC=0XFF;while(1){//***IO口输出低电平有效,如:0X01为十六进制数,二进制表示为00000001B,再取反////////A口输出//////PORTA=~0X01; // ~表示取反delay_ms(100);//延时N秒PORTA=~0X02;delay_ms(100);PORTA=~0X04;delay_ms(100);PORTA=~0X08;delay_ms(100);PORTA=~0X10;delay_ms(100);PORTA=~0X20;delay_ms(100);PORTA=~0X40;delay_ms(100);PORTA=~0X80;delay_ms(100);PORTA=0X00;//循环结束全亮////////B口输出//////PORTB=~0X01;delay_ms(100);PORTB=~0X02;delay_ms(100);PORTB=~0X04;delay_ms(100);PORTB=~0X08;delay_ms(100);PORTB=~0X10;delay_ms(100);PORTB=~0X20;delay_ms(100);PORTB=~0X40;delay_ms(100);PORTB=~0X80;delay_ms(100);PORTB=0X00;////////C口输出//////PORTC=~0X01;delay_ms(100);PORTC=~0X02;delay_ms(100);PORTC=~0X04;delay_ms(100);PORTC=~0X08;delay_ms(100);PORTC=~0X10;delay_ms(100);PORTC=~0X20;delay_ms(100);PORTC=~0X40;delay_ms(100);PORTC=~0X80;delay_ms(100);PORTC=0X00;}}四、跑马灯#include <avr/io.h>#define uchar unsigned char#define uint unsigned intvoid delayms(uint i){uint j;for(;i!=0;i--){for(j=8000;j!=0;j--);}}void horse(uchar i){switch (i){case 1:PORTB=0X01;break; case 2:PORTB=0X03;break; case 3:PORTB=0X07;break; case 4:PORTB=0X0f;break; case 5:PORTB=0X1f;break;case 6:PORTB=0X3f;break; case 7:PORTB=0X7f;break; case 8:PORTB=0Xff;break; default:break;}}void main(void){uchar i;DDRB=0XFF;PORTB=0XFF;PORTB=0X00;delayms(10);while(1){for(i=1;i<9;i++){horse(i);delayms(10);}for(i=7;i!=0;i--){horse(i);delayms(10);}}五、数码管计数显示设计1、两个按键PB0和PB1分别控制加减。

ATmega16熔丝位设置

ATmega16熔丝位设置

ATmega16 熔丝位详解初学者对熔丝经常不解,AVR芯片使用熔丝来设定时钟、启动时间、一些功能的使能、BOOT区设定、当然还有最让初学者头疼的保密位,设不好锁了芯片很麻烦。

要想使MCU功耗最小也要了解一些位的设定在此写下自己对熔丝的理解,参照了一些MEGA16的PDF文档,双龙的文档,以及大家的帖子。

力求易懂、全面。

首先记住:1:未编程(检查框不打钩)0:编程(检查框打钩)建议在配置熔丝之前先“读取配置”读出原来的设定,再自己编辑。

看看M16的出厂设置。

默认设置为:内部RC振荡8MHZ 6 CK + 65 ms CKSEL=0100SUT=10高位:时钟及启动时间设置:BODLEVEL: BOD电平选择1:2.7V电平;0:4.0V电平BODEN: BOD功能控制, 1:BOD功能禁止;0:BOD功能允许使用方法:BOD(Brown-out Detection) 掉电检测电路,如果BODEN使能(编程)启动掉电检测,检测电平由BODLEVEL决定一旦VCC下降到触发电平(2.7v或4.0v)以下,MUC复位,当VCC 电平大于触发电平后,经过tTOUT 延时周后重新开始工作。

注:1:因为M16L可以工作在2.7v-5.5v所以触发电平可选2.7v或4.0v。

M16工作在4.5 - 5.5V,所以BODLEVEL=0。

BODLEVEL=1不适用于ATmega16,SUT1/0: 复位启动时间选择当选择不同晶振时,SUT有所不同。

如果没有特殊要求推荐SUT1/0设置电源缓慢上升。

CKSEL3/0: 时钟源选择低位:BOOT区设置JTAGEN: JTAG允许1:JTAG禁止;0:JTAG允许OCDEN:OCD功能允许1:OCD功能禁止;0:OCD功OCDEN(On-chip Debug)片上调试使能位,JTAGEN:JTAG使能JTAG 测试访问端口。

使用方法:在JTAG调试时使能OCDEN JTAGEN两位(打勾),并保持所有的锁定位处于非锁定状态,在实际使用时为降低功耗不使能OCDEN JTAGEN,大约减少2-3mA的电流。

AVR单片机(C语言)项目开发实践教程项目4 ATmega16单片机IO接口应用

AVR单片机(C语言)项目开发实践教程项目4 ATmega16单片机IO接口应用

【知识目标】
1. 了解LED发光二极管的驱动控制方法 2. 了解ATmega16单片机数字I/O口的结构 3. 了解ATmega16单片机数字I/O口的相关寄
存器功能
2021/8/3
【项目知识点与技能点】
1. 掌握单片机控制LED发光二极管驱动电 路的连接方法
2. 掌握ATmega16单片机数字I/O口的相关 寄存器功能的设置
位 PORTA.7 PORTA.6 PORTA.5 PORTA.4 PORTA.3 PORTA.2 PORTA.1 PORTA.0
复位值 0
0
0
0
0
0
0
0
2021/8/3
二、I/O接口的寄存器
• 端口输入寄存器:PINX(PINA)-----只读
位 PINA.7 PINA.6 PINA.5 PINA.4 PINA.3 PINA.2 PINA.1 PINA.0 复位值 N/A N/A N/A N/A N/A N/A N/A N/A
①DDRA为A口数据方向寄存器,用来定义A口的通讯方 向(输入/输出);
②PORTA为A口数据寄存器,用来输出数据(输入时, PORTX为高,打开上拉电阻);当PORTx=1时,I/O引脚高 电平,可提供输出20mA电流;当PORTx=0时,I/O引脚低电 平,可吸纳20mA电流。因此,AVR的I/O在输出方式下提供 了比较大驱动能力,可以直接驱动LED等小功率外围器件。
AVR单片机(C语言)项目开发实践 教程项目4 ATmega16单片机IO接口应

项目四 ATmega6单片机I/O口应用
• 任务一 项目知识点学习 • 任务二 LED闪烁灯控制 • 任务三 LED开关灯控制 • 任务四 汽车转向灯控制 • 任务五 霓虹灯控制 • 任务六 继电器控制照明设备

最全面的AVRmega16定时计数器的学习笔记

最全面的AVRmega16定时计数器的学习笔记

定时计数器学习笔记ATmega16一共配置了2个8位和1个16位,共3个定时计数器,它们是8位的定时计数器T/C0、T/C2和16位的定时计数器T/C1。

一、学习和使用定时计数器时,必须注意以下的基本要素:1、脉冲信号源。

脉冲信号源是指输入到定时计数器的计数脉冲信号。

通常用于定时计数器计数的脉冲信号可以由外部输入引脚提供,也可以由单片机内部提供。

2、计数器类型。

计数器类型是指计数器的计数运行方式,可分为加一(减一)计数器,单程计数或双向计数等。

3、计数器的上下限。

计数器的上下限指计数单元的最小值和最大值。

一般情况下,计数器的下限值为零,上限值为计数单元的最大计数值,即255(8位)或65535(16位)。

需要注意的是,当计数器工作在不同模式下时,计数器的上限值并不都是计数单元的最大计数值255或65535,它将取决于用户的配置和设定。

4、计数器的事件。

计数器的事件指计数器处于某种状态时的输出信号,该信号通常可以向MCU申请中断。

如当计数器计数到达计数上限值255时,产生“溢出”信号,向MCU申请中断。

二、8位定时计数器T/C0、T/C2(一)T/C0、T/C2的特点:(1)单通道计数器。

(2)比较匹配时清零计数器(自动重装特性,Auto Reload)。

(3)可产生无输出抖动(glitch-free)的,相位可调的脉宽调制(PWM)信号输出。

(4)频率发生器。

(5)外部事件计数器(仅T/C0)。

(6)带10位的时钟预分频器。

(7)溢出和比较匹配中断源(TOV0、OCF0和TOV2、OCF2)。

(8)允许使用外部引脚的32kHz手表晶振作为独立的计数时钟源(仅T/C2)。

(二)寄存器1、TCNT0——TC0计数寄存器TCNT0是T/C0的计数值寄存器。

写TCNT0寄存器将在下一个定时器时钟周期中阻塞比较匹配。

因此,在计数器运行期间修改TCNT0的内容,有可能将丢失一次TCNT0与OCR0的匹配比较操作2、OCR0——输出比较寄存器8位寄存器OCR0中的数据用于同TCNT0寄存器中的计数值进行匹配比较。

北科大单片机实验报告

北科大单片机实验报告

北京科技大学《微机原理及应用》实验报告实验内容:单片机及应用班级:智能12姓名:2015年1月5日目录实验一A VR单片机硬件开发平台 (1)一、实验目的 (1)二、实验内容 (1)三、实验所用仪表及设备 (1)四、实验步骤 (1)了解A VR系列单片机 (1)认识A VR_StudyV1.1实验板的组成模块 (2)五、思考题 (6)六、心得体会 (7)实验二A VR单片机软件开发环境 (9)一、实验目的 (9)二、实验内容 (9)三、实验所用仪表及设备 (9)四、实验步骤 (9)新建项目 (9)编译项目 (11)下载程序 (11)五、思考题 (13)六、实验现象 (13)七、遇到的问题及解决方法 (14)八、心得体会 (15)实验三I/O口操作实验 (16)一、实验目的 (16)二、实验内容 (16)三、实验所用仪表及设备 (16)四、实验步骤 (16)硬件接线图: (16)新建工程,实现实验内容1。

(17)新建工程,实现实验内容2。

(18)下载程序,观察实验现象。

(19)五、实验现象 (20)六、思考题 (21)七、遇到的问题及解决方法 (22)八、心得体会 (22)实验四数码管显示实验 (24)一、实验目的 (24)二、实验内容 (24)三、实验所用仪表及设备 (24)四、实验步骤 (24)新建项目,实现实验内容1。

(24)建立新项目,实现实验内容2。

(24)五、实验现象 (25)七、遇到的问题及解决方法 (27)八、心得体会 (27)实验五按键实验 (28)一、实验目的 (28)二、实验内容 (28)三、实验所用仪表及设备 (28)四、实验步骤 (28)新建项目 (28)五、实验现象 (29)六、思考题 (30)七、遇到的问题及解决方法 (32)八、心得体会 (32)实验六外部中断实验 (34)一、实验目的 (34)二、实验内容 (34)三、实验所用仪表及设备 (34)四、实验步骤 (34)新建项目实现实验内容 (34)新建项目实现实验内容2 (36)五、实验现象 (37)六、思考题 (38)七、遇到的问题及解决方法 (39)八、心得体会 (40)实验七定时计数器实验 (42)一、实验目的 (42)二、实验内容 (42)三、实验所用仪表及设备 (42)四、实验步骤 (42)新建工程 (42)普通模式 (43)CTC模式 (43)五、实验现象 (44)六、思考题 (44)七、遇到的问题及解决方法 (45)八、心得体会 (45)选作内容:基于A VR Mega16单片机的闹表测温仪设计 (47)一、实验目的 (47)二、功能简介 (47)三、功能细节设计 (47)实验设备 (48)端口、功能分配以及硬件连接设计 (49)六、程序结构设计 (50)七、各功能模块的具体实现 (53)九、实验心得 (56)附录源程序: (57)实验一AVR单片机硬件开发平台一、实验目的1.了解ATmega16单片机的组成。

AVRATmega16实验教程

AVRATmega16实验教程

A VR学习笔记(基于LT_Mini_M16)一、点亮发光二极管一、实验内容和目的本实验通过硬件电路和软件程序,利用ATMega16单片机来控制发光二极管的点亮和熄灭。

通过此实验初步掌握单片机的I/O口功能。

二、硬件电路1、电路分析(对照LT_Mini_M16原理图)1)电源电路:外接稳压直流电源(最好是DC9V)加到电路的U1处,经过电容C16稳压滤波后加到稳压模块AMS1117-5.0上,然后连接到电源开关按钮S1,从开关按钮出来后经过发光二极管D9和电阻R7,再经过电容C1、C2、C3、C4、C5、C7稳压滤波后加到单片机以及各个模块的电源端。

分析:a) 电容的作用是稳压滤波,其中C1、C2、C3、C4、C5这5电容为0.1PF (俗称104电容,一般为瓷片电容)。

主要作用为滤出电源电路中的高频成分;而C16、C7是电解电容,主要作用是稳压,即把电源电路中的尖峰电压拉低到正常电压水平;C16是稳定外接直流电源的电压(9V),C7是稳定AMS1117-5.0输出的5V电压。

b)稳压芯片采用ASM1117-5.0,该稳压芯片输入电压范围为6.5V-15V,输出电压稳定在5.0+0.1V,最大输出电流可达1A,可以满足一般电路需要。

c) 电源开关按钮S1的作用当然是接通和断开电源了。

在此电路中S1采用的是单刀双掷开关,一旦断开电源,则电源的正负极都断开了。

d)发光二极管D9的作用是指示电源是否连接成功,如果外部电源成功的连接上,则发光二极管发光指示电源连接成功;电阻R7的作用是对发光二极管进行限流,一般发光二极管只能通过10mA左右的电流,且发光二极管上面的压降只需要1.5V左右,加到发光二极管上面的电流如果超出额定值,则会烧毁。

而系统工作的电压是5V,如果全部加在发光二极管上,则发光二极管很容易就会被烧毁。

所以要在电源和发光二极管之间串接一个限流电阻。

该限流电阻阻值的计算:(VCC-发光二极管上的电压)/流过发光二极管的电流。

Atmega16的室内照明控制系统电路设计

Atmega16的室内照明控制系统电路设计

Atmega16的室内照明控制系统电路设计本文提出了一种改进的基于智能检测技术的室内照明系统设计方案,克服了传统照明系统的不足。

采用热释人体红外以及温度传感系统,将室内是否有人和周围环境光亮度是否充足相结合,利用Atmega16单片机进行信号的处理、分析和决策,使照明设备控制更加精确,具有操作简单、人性化强等特点。

经过试验验证,系统性能可靠、稳定。

照明是室内环境设计的重要组成部分,光照的作用,对人的视觉功能尤为重要。

而长期以来,将自然光与室内智能照明系统相结合的方式一直被设计者忽略,大部分的室内场所仍沿用单一的传统照明方式,在一些公用场所的照明设备长时间打开,不仅导致能源浪费,而且加速了设备老化。

1系统结构和工作原理1.1系统结构室内照明控制系统的设计主要采用Atmega16单片机作为MCU控制器,与LED显示技术、光感技术、按键采集与处理技术、红外线传感技术、延时技术等技术相结合,然后实现室内照明设备的智能控制,其系统结构如图1所示。

图1室内照明控制方案图1.2工作原理(1)单片机通过继电器对室内照明设备的开关进行控制。

(2)照明设备周围的光照检测电路对设备周边亮度进行检测,信号通过环境亮度传感模块到达单片机,如果亮度能够满足生活需要,单片机则通过继电器保持照明设备的关闭状态,如果亮度不够,则由单片机继续检测是否采集到人体热释电感信号。

(3)如果被动式热释电红外传感器检测到人体信号,单片机则立刻控制照明设备,将其打开;如果没有检测到人体信号,单片机则保持照明设备的关闭状态。

(4)在照明设备打开的情况下,如果单片机在某一时刻没有检测到人体信号,则延长一段时间后将照明设备关闭,如果延时期间检测到人体信号则结束延时,照明设备继续打开。

(5)可以根据应用照明设备场合以及使用人群的不同,将单片机PA0~PA3引脚设置为不同的延时时间值。

(6)在照明电路正常工作时,只要按下强制按钮,就可以对照明设备进行强制控制,通过该按钮也可以使电路切换到自动控制状态。

AVR教程系列一(12):ATmega16 简介(六)

AVR教程系列一(12):ATmega16 简介(六)

A VR教程系列一(12):ATmega16 简介(六) ATmega16 操纵与状态寄存器MCUCSRAVR 操纵与状态寄存器提供了有关引起AVR复位的复位源的信息。

Bit 4 – JTRF: JTAG 复位标志通过JTAG 指令AVR_RESET 能够使JTAG 复位寄存器置位,并引发MCU 复位,并使JTRF 置位。

上电复位将使其清零,也能够通过写”0” 来清除。

Bit 3 – WDRF: 看门狗复位标志看门狗复位发生时置位。

上电复位将使其清零,也能够通过写”0” 来清除。

Bit 2 – BORF: 掉电检测复位标志掉电检测复位发生时置位。

上电复位将使其清零,也能够通过写”0” 来清除。

Bit 1 – EXTRF: 外部复位标志外部复位发生时置位。

上电复位将使其清零,也能够通过写”0” 来清除。

Bit 0 – PORF: 上电复位标志上电复位发生时置位。

只能通过写”0” 来清除。

为了使用这些复位标志来识别复位条件,用户应该尽早读取此寄存器的数据,然后将其复位。

假如在其他复位发生之前将此寄存器复位,则后续复位源能够通过检查复位标志来熟悉。

ATmega16 基准电压使能信号与启动时间ATmega16 具有片内能隙基准源,用于掉电检测,或者者是作为模拟比较器或者ADC的输入。

ADC 的2.56V 基准电压由此片内能隙基准源产生。

电压基准的启动时间可能影响其工作方式。

启动时间列于Table 16。

为了降低功耗,能够操纵基准源仅在如下情况打开:1. BOD 使能 ( 熔丝位BODEN 被编程)2. 能隙基准源连接到模拟比较器(ACSR 寄存器的ACBG 置位)3. ADC 使能因此,当BOD 被禁止时,置位ACBG 或者使能ADC 后要启动基准源。

为了降低掉电模式的功耗,用户能够禁止上述三种条件,并在进入掉电模式之前关闭基准源。

ATmega16 看门狗定时器看门狗定时器由独立的1 Mhz 片内振荡器驱动。

mage16实例遥控激光灯

mage16实例遥控激光灯

遥控激光灯设计制作摘要遥控激光灯设计制作是一个很有实际应用价值项目,用很小的激光灯为显示,ATmega16L单片机为控制核心,加以遥控器控制和电源电路以及其他电路构成。

遥控激光灯是一个很好的应用单片机技术的作品。

系统所用的单片机采用性能优秀的AVR单片机的ATMEGA16L芯片,由mega16通过IO口控制激光灯的亮与不亮来显示出不同的投影图;而不同的闪烁时通过遥控来控制。

自制了单片机电路板和程序下载ISP线,能够顺利完成激光灯的工作。

同时还可以扩展控制激光灯工作时的花样,可以改变程序文件来变激光灯闪烁的花样。

所完成的作品可以直接应用于单片机的教学之中,使自己的毕业设计有了实在的应用价值。

本作品今后可以向商品化方面进行开发,以使之有更大的价值。

关键词:激光灯;AVR单片机;遥控器THE DESIGN OF LASER LIGHT CONTROLLED BYTELECONTROLLERABSTRACTThe design of laser light controlled by telecontroller is a very practical application projects, using a small laser light for the display, ATmega16L microcontroller as the control center to remote control and power circuits and other circuits.Laser light is a good remote control application microcontroller technology works. System used in the SCM performance AVR microcontroller A TMEGA16L good chip, by the mega16 IO port to control laser light through the bright light and not to show a different projection; and different blinking through the remote control. Home of the microcontroller circuit board and program download ISP lines, to the successful completion of the work of laser light. Control also extends the work of the pattern of laser light, can change the program file to change the pattern of laser lights flashing. The completed work can be directly applied in the teaching of SCM, so that their graduates have a real design value. This works will be developing to the commercialization of the future and it could be developed to make greater value.Key words: Laser light; AVR microcontroller; Telecontroller目录1前言------------------------------------------ 错误!未定义书签。

基于AVR单片机ATmega16的8种LED闪烁灯控制

基于AVR单片机ATmega16的8种LED闪烁灯控制

基于AVR单片机ATmega16的8种LED闪烁灯控制#include <iom16v.h>#include <macros.h>#define uchar unsigned char#define uint unsigned intvoid Delay() //延时函数{uchar a, b, c;for (a = 1; a; a++)for (b = 1; b; b++)for (c = 0; c<10; c++) //循环次数=255*255*10;}void DelayMs(uint i) //1ms延时,准确性较Delay();高{while(i--){uint j;for(j=1;j<=613;j++);}}void LED_on() //打开所有LED{PORTB =0X00;Delay();}void LED_off() //关闭所有LED{PORTB = 0xFF;Delay();}void LED_01(int i) //LED亮灭控制{PORTB = ~BIT(i); //输出低电平DelayMs(100); //调用延时程序}void LED_02(int i) //间隔点亮{PORTB=~(BIT(i)|BIT(i-2));DelayMs(100);}void LED_03(int i) //相临点亮{PORTB=~(BIT(i)|BIT(i-1)); //~后内容需用括号括起来 DelayMs(100);}void LED_04(int i) //发散聚集点亮{switch(i){case 0:PORTB=0xE7;DelayMs(100);break; //延时100ms case 1:PORTB=0xDB;DelayMs(100);break;case 2:PORTB=0xBD;DelayMs(100);break;case 3:PORTB=0x7E;DelayMs(100);break;default:break;}}void LED_05(int i) //00,0F,F0,FF方式显示{switch(i){case 0:PORTB=0x00;DelayMs(100);break; //延时100ms case 1:PORTB=0x0F;DelayMs(100);break;case 2:PORTB=0xF0;DelayMs(100);break;case 3:PORTB=0xFF;DelayMs(100);break;default:break;}}void LED_06(int i){switch(i){case 0:PORTB=0XAA;DelayMs(100);break;case 1:PORTB=0X55;DelayMs(100);break;}}void main(){int l,m,n,o,p,q,r,s,i,j;DDRA =0X00; //端口上拉输入PORTA=0XFF;DDRB =0xFF; //端口输出PORTB="0xFF"; //输出高电平,LED熄灭 DDRC =0X00;PORTC=0XFF;DDRD =0X00;PORTD=0XFF;for (r=0;r<5;r++){for(l=0;l<5;l++) //模式1:顺序点亮{for (i = 0; i < 8; i++) //顺序单个点亮LEDLED_01(i);for (i = 6; i > 0; i--) //逆序单个点亮LEDLED_01(i);}LED_off();for(m=0;m<5;m++) //模式2:顺序单个间隔点亮{for (i = 0; i < 8; i += 2) //顺序间隔点亮LEDLED_01(i);for (i = 7; i > 0; i -= 2) //逆序间隔点亮LEDLED_01(i);}LED_off();for(n=0;n<5;n++) //模式3:间隔点亮{for (i = 2; i < 8; i++) //间隔顺序同时点亮LED_02(i);for (i = 6; i > 2; i--) //间隔逆序同时点亮LED_02(i);}LED_off();for(o=0;o<5;o++) //模式4:相临点亮{for (i = 1; i < 8; i++) //相临顺序同时点亮LED_03(i);for (i = 6; i > 1; i--) //相临逆序同时点亮LED_03(i);}LED_off();for(p=0;p<5;p++) //模式5:发散聚集点亮{for(i=0;i<4;i++) //发散点亮LED_04(i);for(i=2;i>0;i--) //聚集点亮LED_04(i);}LED_off();for(q=0;q<5;q++) //模式6:四四点亮{for(i=0;i<4;i++) //四四顺序点亮LED_05(i);for(i=2;i>0;i--) //四四逆序点亮LED_05(i);}LED_off();for(s=0;s<5;s++) //模式7:四四点亮{for(i=0;i<2;i++) //四四顺序点亮LED_06(i);}LED_off();for(j=0;j<10;j++) //模式8:全部点亮熄灭{LED_on();LED_off();}}//MCUCR=0x40; //空闲模式,CPU占用100%//MCUCR=0x50; //ADC噪声抑制模式,CPU占用100% //MCUCR=0x60; //掉电模式,CPU占用80%//MCUCR=0x70; //省电模式,CPU占用4%//MCUCR=0xE0; //Standby模式,CPU占用80% MCUCR=0xF0; //扩展Standby模式,CPU占用4% asm("sleep"); //CPU休眠指令}。

ATmega16时钟(完整版)

ATmega16时钟(完整版)

ATmega16时钟以CV A VR为编译环境的带校时和音乐报时功能时钟的设计与实现////////////////////////////////////////////////源程序/////////////////////////////////////////////// #include <mega16.h>#define key_input PINC // 按键输入口#define key_mask 0b11000000 // 按键输入屏蔽码#define key_no 0#define key_k1 1#define key_k2 2#define key_state_0 0#define key_state_1 1#define key_state_2 2#define Max_note 32flash unsigned char music[Max_note] ={5,2,8,2,5,2,4,2,3,2,2,2,1,4,1,2,1,2,2,2,3,2,3,2,1,2,3,2,4,2,5,8};flash unsigned char led_7[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};flash unsigned char position[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};flash unsigned char d[9] = {0,105,116,132,140,157,176,198,209};flash unsigned int t[9] = {0,956,865,759,716,638,568,506,470};unsigned int int_n;unsigned char note_n;unsigned char dis_buff[6]; // 显示缓冲区,存放要显示的6个字符的段码值unsigned char time[3],time_set[3]; // 时、分、秒计数和设置单元unsigned char clock_state = 6,return_time;unsigned char time_counter,key_stime_counter; // 时间计数单元,bit point_on,set_on,time_1s_ok,key_stime_ok;bit play_on;void display(void) // 6位LED数管动态扫描函数{static unsigned char posit=0;PORTC = 0xff;PORTA = led_7[dis_buff[posit]];if (set_on && (posit==clock_state)) PORTA= 0x00; // 校时闪烁if (point_on && (posit==2||posit==4)) PORTA |= 0x80; // 秒闪烁PORTC = position[posit];if (++posit >=6 ) posit = 0; // (3)}// Timer 0 比较匹配中断服务,2ms定时interrupt [TIM0_COMP] void timer0_comp_isr(void){display(); // LED扫描显示if (++key_stime_counter >=5){key_stime_counter = 0;key_stime_ok = 1; // 10ms到if (!(++time_counter % 25)) set_on = !set_on; // 设置校时闪烁标志if (time_counter >= 100){time_counter = 0;time_1s_ok = 1; // 1s到}}}// T/C1 比较匹配A中断服务interrupt [TIM1_COMPA] void timer1_compa_isr(void){if (!play_on){note_n = 0;int_n = 1;play_on = 1;}else{if (--int_n == 0){TCCR1B = 0x08;if (note_n < Max_note){OCR1A = t[music[note_n]];int_n = d[music[note_n]];note_n++;int_n = int_n * music[note_n];note_n++;TCCR1B = 0x09;}elseplay_on = 0;}}}void time_to_disbuffer(unsigned char *time) // 时钟时间送显示缓冲区函数{unsigned char i,j=0;for (i=0;i<=2;i++){dis_buff[j++] = time[i] % 10;dis_buff[j++] = time[i] / 10;}}unsigned char read_key(void){static unsigned char key_state = 0,key_press;unsigned char key_return = key_no;key_press = key_input & key_mask; // 读按键I/O电平switch (key_state){case key_state_0: // 按键初始态if (key_press != key_mask) key_state = key_state_1;break; // 键被按下,状态转换到键确认态case key_state_1: // 按键确认态if (key_press == (key_input & key_mask)){if (key_press == 0b01000000) key_return = key_k1;else if (key_press == 0b10000000) key_return = key_k2;key_state = key_state_2; // 状态转换到键释放态}elsekey_state = key_state_0; // 按键已抬起,转换到按键初始态break;case key_state_2:if (key_press == key_mask) key_state = key_state_0;break; //按键已释放,转换到按键初始态}return key_return;}void main(void){unsigned char key_temp,i;DDRA=0xFF; // LED段码输出PORTC=0xFF;DDRC=0x3F; // LED位控输出DDRD=0x20; // PD5音乐播放输出// T/C0初始化OCR0 = 0xF9; // OCR0 = 0xF9(249),(249+1)/125=2msTCCR0 = 0x0A; // 内部时钟,8分频(1M/8=125KHz),CTC模式// T/C1初始化TCCR1A=0x40;TCCR1B=0x08;TIMSK = 0x12; // 允许T/C1比较匹配A中断,允许T/C0比较匹配中断time[2] = 23; time[1] = 58; time[0] = 55; // 设时间初值23:58:55#asm("sei") // 开放全局中断while (1){if (time_1s_ok) // 1秒到{time_1s_ok = 0;point_on = ~point_on; // 秒闪烁标志if (++time[0] >= 60) // 秒加1,以下为时间调整{time[0] = 0;if (!play_on) TCCR1B = 0x09; // 1分钟到,播放音乐if (++time[1] >= 60){time[1] = 0;if (++time[2] >= 24) time[2] = 0;}}if ((++return_time >= 20) && (clock_state != 6)) clock_state = 6;if (clock_state == 6) time_to_disbuffer(time);}if (key_stime_ok) // 10ms到,键处理{key_stime_ok = 0;key_temp = read_key(); // 调用按键接口程序if (key_temp) // 确认有键按下{return_time = 0;if (key_temp == key_k1) // K1键按下,状态转换{if (++clock_state >= 7) clock_state = 0;if (clock_state == 0){for (i=0;i<=2;i++) time_set[i] = 0;time_to_disbuffer(time_set);}if (clock_state == 6){for (i=0;i<=2;i++) time[i] = time_set[i];time_to_disbuffer(time);}}if ((clock_state != 6) && (key_temp == key_k2)) // K2键按下{if (clock_state%2) time_set[clock_state/2] += 10;else{if ((time_set[clock_state/2] % 10) == 9)time_set[clock_state/2] -= 9;elsetime_set[clock_state/2]+=1;}if (time_set[0] >= 60) time_set[0]-= 60; // 以下设置时间调整if (time_set[1] >= 60) time_set[1]-= 60;if (time_set[2] >= 24) time_set[2]-= 10;time_to_disbuffer(time_set); // 设置时间送显示缓存}}}}}。

AVR ATmega16定时器溢出中断使用小结

AVR ATmega16定时器溢出中断使用小结

关于溢出中断不管是哪个单片机都是不断累加,使其寄存器溢出触发中断,然后跳转到中断函数处执行中断服务程序。

对于定时器初值的设定可以加深对定时器的工作原理的理解。

ATMega16 里面有8位和16位两种定时器,他们何时会溢出这个是固定的,也就是到达他们的计数范围的最大值就会产生中断,8位的定时器的最大计数范围是0~256(2的8次方),就是累加到256后他就会产生中断,16位的定时器最大计数范围是0~65536(2的16次方),累加到65536时他就会产生中断。

而我们所谓的计数初值是就是要设定定时器在什么地方开始计数,以8位定时器为例比如:初值为100,所以定时器从100开始累加,累加了156次,加到256后产生中断,这就是中间消耗的时间和指令周期就是我们要去设定的时间;再比如:初值是200,所以定时器从200开始累加,累加了56次,加到256后产生中断,可以看到第一定时要累加156次才会中断而第二次只要累加56次就会产生中断,显然第一次设定的时间要比第二次的长。

定时器不仅可以定时,而且我们用到定时器的时候往往是需要精确定时的时候。

我们可以计算出我们设定的初值会在多长时间后进入中断。

下面的是8位定时器设定的时候需要用的寄存器:实验平台:ATMega16晶振: 11.0592 MHz对初值的计算:1,11059200 / 1024 = 10800 设定为1024倍分频,得到每1秒需要进行多少次累加2,10800 / 100 = 108 得到10ms 的定时需要进行多少次累加(第一步计算出每一秒进行的累加次数,由于一秒是100个10ms,故除数为100)3,256 - 108 = 148 计算范围最大值(8位寄存器)减去要累加的时间,得到初值,即从哪里开始累加才能在溢出时为10ms的时间。

4,148 <==> 0x94 得到十六进制值,赋值给TCNT0#实验代码:定时10ms_ICCAVR#include <iom16.h>unsigned char flag = 0;void timer_init(void){TCCR0 = 0x05; //进行1024分频TCNT0 = 0x94; //赋计数初值TIMSK_TOIE0 = 1; //开使能SREG_I = 1; //开总中断}#pragma vector = TIMER0_OVF_vect__interrupt void time0_normal(void){TCNT0 = 0x94; //重新赋初值flag++;}void main(void){timer_init();DDRB_Bit0 = 1;while(1){if(flag == 100) //10ms 重复100次,即为1秒 {PORTB_Bit0 = ~PORTB_Bit0; //让LED闪烁flag = 0;}}}//+++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++//实验平台:ATMega16晶振:11.059216位定时器初值设定:1,11059200 / 256 = 43200 设定256倍分频,得到每1秒需要进行多少次累加2,65536 - 43200 = 22336 计算范围最大值减去要累加的时间,得到初值,即从哪里开始累加才能在溢出时为1s的时间。

Atmega16的解锁

Atmega16的解锁

ATmega16解锁刚刚把以前锁死的两块Mega16给解开锁,之前自己也解了很多次就是没解开。

在网上看了一些解锁的方法,都是说在ISP下载功能被禁止时,可以用JTAG下载来改变熔丝位ISPEN=0,让Mega16恢复ISP下载功能。

如果两种下载方式都被锁死的情况下,就只能用高压并行的方式来修改熔丝位。

还有一种很简单的方法就是在Mega16的XTAL1和XTAL2引脚接上一个振荡信号,使单片机能处在工作状态,改变其熔丝位。

Mega16的熔丝位配置错和对单片机的某些误操作很容易使单片机不能正常工作。

一种情况是在配置熔丝位时误将ISPEN或JTAGEN置为1(或没有在复选框中打钩),单片机的ISP和JTAG下载功能没有使能,使得单片机被锁死。

还有一种情况是配置的时钟源熔丝位CKSEL3/0与单片机本身工作的时钟源不相符,这也是单片机被锁死的原因。

我的两块Mega16都是由于时钟源选择错误导致被锁死,我也是今天刚注意到这个问题的。

我将一块正常运行的51的XTAL2与Mega16的XTAL1连接,将51的XTAL1与Mega16的XTAL2连接,这样被锁死的Mega16就可以正常运行了。

然后,先要在读取其熔丝位的配置,然后我把时钟源CKSEL3/0的熔丝位改成内部RC振荡8MHZ(改成自己单片机适合的熔丝位即可),将改后的配置写入单片机。

最后将与51连接的线断开,重新将下载器与电脑接上,就可以给M16下载程序了。

1.编程与状态说明(1)在avr的器件手册中,使用已编程(programmed)和未编程(unprogrammed)定义熔丝位的状态。

未编程表示熔丝位状态为“1”(禁止);已编程表示熔丝位状态为“0”(允许)。

(2)avr的熔丝位可以多次编程,不是一次性的opt熔丝。

(3)熔丝位的配置可以通过并行方式、isp串行方式和jtag串行方式实现。

(4)avr芯片加密锁定后(lb2/lb1=1/0,0/0)不能通过任何方式读取芯片内部的flash和eeprom数据,但是熔丝位的状态仍然可以读取,只是不能修改配置。

1602AVR单片机版报警指示功能

1602AVR单片机版报警指示功能

1602 AVR单片机版报警指示功能使用的是ATMEGA16芯片功能说明:正常状态下,8个LED不停闪烁,1602显示normal indication指示报警状态下, 8个LED全发亮不闪烁,1602显示alarm报警,只有按复位按钮才能解除报警.alarm状态时,由于PB口的低3位和,1602时能,读写,数据指令寄存器选择位复用,所以有点暗.#include ;#include ;#define uchar unsigned char#define uint unsigned int#define RS1 PORTB_Bit0=1 //数据指令寄存器选择#define RS0 PORTB_Bit0=0#define RW1 PORTB_Bit1=1 //读写选择#define RW0 PORTB_Bit1=0#define EN1 PORTB_Bit2=1 //读写时能#define EN0 PORTB_Bit2=0#define DATAPORT PORTA //1602数据口#define busy 0x80 //繁忙标志#include &quot;ku.h&quot; //调用函数库//------------------------------------------- uchar alarm[]={&quot;alarm &quot;}; //报警字符串uchar normal[]={&quot;normal&quot;}; //正常字符串uchar indication[]={&quot;indication&quot;};//-------------------------函数声明-------------- void delay_1ms(); //延时1毫秒void delay_nms(uint n); //延时n毫秒void wait(); //繁忙等待函数void writedata(uchar w); //写数据void writecmd(uchar cmd); //写指令void init(); //1602初始化void display(uchar x,uchar y,uchar *P); //显示字符串函数void delay(uint k) //常用延迟函数{uint i,j;for(i=0;i<k;i++)for(j=0;j<1140;j++);}void main(){DDRB=0xff; //设置PB口为输出PORTB=0xff;DDRD=0x00; //中断源设置为输入 PORTD=0xff;MCUCR=0x02; //中断为下降沿GICR=0xc0; //中断为int0,int1 SREG=0x80; //中断总开关init();while(1){PORTB=0xff;delay(300);PORTB=0x00;delay(300);display(5,0,normal);display(3,1,indication);}}#pragma vector = 0x04__interrupt void qq() //中断产生报警{writecmd(0x01); //清屏while(1){display(6,0,alarm);PORTB=0x00;}}//-----------------------库函数------------------------void wait(){uchar val;DATAPORT=0xff;RS0;RW1;__no_operation();EN1;__no_operation(); //注:一个__no_operation();延时130ns;__no_operation();DDRA=0x00;val=PINA;while(val&busy)val=PINA; EN0;DDRA=0xff;}void writecmd(uchar w){wait();RS0;RW0;__no_operation();DATAPORT=w;__no_operation();EN1;__no_operation();__no_operation();EN0;}void writedata(uchar data) {wait();RS1;RW0;__no_operation();DATAPORT=data;__no_operation();EN1;__no_operation();__no_operation(); EN0;}void delay_nms(uint k) {uint i,j;for(i=0;i<k;i++)for(j=0;j<1140;j++); }void init(){delay_nms(15); writecmd(0x38);delay_nms(5);writecmd(0x38);delay_nms(5);writecmd(0x38);writecmd(0x80);writecmd(0x01);writecmd(0x06);writecmd(0x0c);}void display(uchar x,uchar y,uchar *p){uchar add=0x80; //1602数据指针初值y=y&0x01;x=x&0x0f;if(y)add=add+0x40; //显示第二行加数据指针加0x40writecmd(add+x);while(*p!='\0'){writedata(*p++);}}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
# define PIN_PA2 PINA_BIT.BIT2
# define PIN_PA3 PINA_BIT.BIT3
# define PIN_PA4 PINA_BIT.BIT4
# define DDR_PA7 DDRA_BIT.BIT7
#endif
#ifdef DDRB
# define DDR_PB0 DDRB_BIT.BIT0
# define DDR_PB1 DDRB_BIT.BIT1
# define DDR_PB2 DDRB_BIT.BIT2
#include <iom16v.h>
typedef struct BYTE_BIT
{
unsigned BIT0:1;
unsigned BIT1:1;
unsigned BIT2:1;
unsigned BIT3:1;
unsigned BIT4:1;
#ifdef DDRA
# define DDRA_BIT SET_BIT8_FORMAT(DDRA)
#endif
#ifdef DDRB
# define DDRB_BIT SET_BIT8_FORMAT(DDRB)
#endif
#ifdef DDRC
# define DDRC_BIT SET_BIT8_FORMAT(DDRC)
# define _PC4 PORTC_BIT.BIT4
# define _PC5 PORTC_BIT.BIT5
# define _PC6 PORTC_BIT.BIT6
# define _PC7 PORTC_BIT.BIT7
# define DDR_PB3 DDRB_BIT.BIT3
# define DDR_PB4 DDRB_BIT.BIT4
# define DDR_PB5 DDRB_BIT.BIT5
# define DDR_PB6 DDRB_BIT.BIT6
# define DDR_PA3 DDRA_BIT.BIT3
# define DDR_PA4 DDRA_BIT.BIT4
# define DDR_PA5 DDRA_BIT.BIT5
# define DDR_PA6 DDRA_BIT.BIT6
*/
/*---------------- PORT口绑定 ---------------*/
#ifdef PORTA
# define PORTA_BIT SET_BIT8_FORMAT(PORTA)
#endif
#ifdef PORTB
# define PORTB_BIT SET_BIT8_FORMAT(PORTB)
#endif
#ifdef PORTC
# define _PC0 PORTC_BIT.BIT0
# define _PC1 PORTC_BIT.BIT1
# define _PC2 PORTC_BIT.BIT2
# define _PC3 PORTC_BIT.BIT3
# define _PB4 PORTB_BIT.BIT4
# define _PB5 PORTB_BIT.BIT5
# define _PB6 PORTB_BIT.BIT6
# define _PB7 PORTB_BIT.BIT7
# define DDR_PC3 DDRC_BIT.BIT3
# define DDR_PC4 DDRC_BIT.BIT4
# define DDR_PC5 DDRC_BIT.BIT5
# define DDR_PC6 DDRC_BIT.BIT6
#ifdef PORTA
# define _PA0 PORTA_BIT.BIT0
# define _PA1 PORTA_BIT.BIT1
# define _PA2 PORTA_BIT.BIT2
# define _PA3 PORTA_BIT.BIT3
#endif
#ifdef PINB
# define PINB_BIT SET_BIT8_FORMAT(PINB)
#endif
#ifdef PINC
# define PINC_BIT SET_BIT8_FORMAT(PINC)
#endif
#ifdef PIND
# define DDR_PC7 DDRC_BIT.BIT7
#endif
#ifdef DDRD
# define DDR_PD0 DDRD_BIT.BIT0
# define DDR_PD1 DDRD_BIT.BIT1
# define DDR_PD2 DDRD_BIT.BIT2
#endif
/*------------- DDR 位操作定义 -------------*/
#ifdef DDRA
# define DDR_PA0 DDRA_BIT.BIT0
# define DDR_PA1 DDRA_BIT.BIT1
# define DDR_PA2 DDRA_BIT.BIT2
# define DDR_PD3 DDRD_BIT.BIT3
# define DDR_PD4 DDRD_BIT.BIT4
# define DDR_PD5 DDRD_BIT.BIT5
# define DDR_PD6 DDRD_BIT.BIT6
# define _PD0 PORTD_BIT.BIT0
# define _PD1 PORTD_BIT.BIT1
# define _PD2 PORTD_BIT.BIT2
# define _PD3 PORTD_BIT.BIT3
# define _PD4 PORTD_BIT.BIT4
# define _PD5 PORTD_BIT.BIT5
# define _PD6 PORTD_BIT.BIT6
# define _PD7 PORTD_BIT.BIT7
# define _PA4 PORTA_BIT.BIT4
# define _PA5 PORTA_BIT.BIT5
# define _PA6 PORTA_BIT.BIT6
# define _PA7 PORTA_BIT.BIT7
# define DDR_PD7 DDRD_BIT.BIT7
#endif
/*------------- PIN 位操作定义 -------------*/
#ifdef PINA
# define READ_PA0 PINA_BIT.BIT0
# define READ_PA1 PINA_BIT.BIT1
#endif
#ifdef PORTD
# define _PD0 PORTD_BIT.BIT0
# define _PD1 PORTD_BIT.BIT1
# define _PD2 PORTD_BIT.BIT2
# define _PD3 PORTD_BIT.BIT3
#endif
#ifdef DDRD
# define DDRD_BIT SET_BIT8_FORMAT(DDRD)
#endif
/*---------------- PIN 口绑定 ---------------*/
#ifdef PINA
# define PINA_BIT SET_BIT8_FORMAT(PINA)
# define READ_PA2 PINA_BIT.BIT2
# define READ_PA3 PINA_BIT.BIT3
# define READ_PA4 PINA_BIT.BIT4
# define READ_PA5 PINA_BIT.BIT5
unsigned BIT5:1;
unsigned BIT6:1;
unsigned BIT7:1;
}BYTEBIT;
#define SET_BIT8_FORMAT(Addr) (*((volatile BYTEBIT *)&Addr))
/*# define PORTD_BIT SET_BIT8_FORMAT(PORTD)
# define READ_PA6 PINA_BIT.BIT6
# define READ_PA7 PINA_BIT.BIT7
Hale Waihona Puke # define PIN_PA0 PINA_BIT.BIT0
# define PIN_PA1 PINA_BIT.BIT1
# define _PD4 PORTD_BIT.BIT4
# define _PD5 PORTD_BIT.BIT5
# define _PD6 PORTD_BIT.BIT6
# define _PD7 PORTD_BIT.BIT7
#endif
#ifdef PORTB
# define _PB0 PORTB_BIT.BIT0
# define _PB1 PORTB_BIT.BIT1
# define _PB2 PORTB_BIT.BIT2
# define _PB3 PORTB_BIT.BIT3
# define PIND_BIT SET_BIT8_FORMAT(PIND)
#endif
/*------------------*
* 端 口 宏 定 义 *
*------------------*/
/*-------------PORT位操作定义--------------*/
# define DDR_PB7 DDRB_BIT.BIT7
相关文档
最新文档