MEGA16单片机定时器(16位)源代码
mega16

刚学AVR想用MEGA16做过数显电源,用BASCOM-AVR编程用八段数码管分辨显示四位数电压,四位数电流,BASCOM编程(感觉比较简单学)。
其凑八凑,凑足一个程序。
只是数显,东西到手了,上面原来那个程序很不行,闪烁很严重。
于是修改了如下:$regfile = "m16def.dat" '目标单片机为ATmega16$crystal = 8000000 '系统时钟8兆Config Timer1 = Timer , Prescale = 64 '使用定时器1,64分频On Ovf1 Timer1_isr '启用定时器溢出中断Config Adc = Single , Prescaler = Auto , Reference = Avcc '设置ADC为单次转换模式,采样频率系统设定,参考电压使用AVccConfig Portb = Output '配置端口PortB输出Config Portd = Output '配置端口PortD输出Dim V As Word '定义ADC采集变量VDim I As Word '定义ADC采集变量IDim V1 As Integer , V2 As Integer , V3 As Integer , V4 As Integer '定义ADC采样变量V1为十位,V2为个位,V3为十分位,V4为百分Dim I1 As Integer , I2 As Integer , I3 As Integer , I4 As Integer '定义ADC采样变量I1为个位,I2为十分位,I3为百分位,I4为千分位Dim L(10) As Byte '定义字形数组Dim T As Byte '定义计数,循环控制变量TDim Dx As Byte : Dx = 0 '定义计数,段选DXDim _change As Byte : _change = 0 '中断发生计数变量'Enable Interrupts '使能中断'Enable Timer1 '使能timer1 中断Portd = &B11111110 '段选第一位置1Restore Daima '字形数组初始化For T = 1 To 10Read L(t)Next TStart Adc '启动ADC转换'Start Timer1 '启动定时器1DoV = Getadc(0) '取0通道ADC的转换结果,送入VV = V * 5 '10位ADC的结果最大值是1024,1024 /2 约等于512,'用以表示0~50伏的电压变化V1 = V / 1000 '将结果再除1000,得到取值范围0 ~ 9 的千位部分,存入变量V1V2 = V / 100 '将结果再除100,得到取值范围0 ~ 9 的百位部分,存入变量TV3 = V / 10 '将结果再除10,得到取值范围0 ~ 9 的十位数部分V4 = V Mod 10 '将T取10的模数,得到取值范围0 ~ 9 的个位数部分I = Getadc(1) '取0通道ADC的转换结果,送入VI = I * 5 '10位ADC的结果最大值是1024,1024 /2 约等于512,'用以表示0~50伏的电压变化I1 = I / 1000 '将结果再除1000,得到取值范围0 ~ 9 的千位部分,存入变量V1I2 = I / 100 '将结果再除100,得到取值范围0 ~ 9 的百位部分,存入变量TI3 = I / 10 '将结果再除10,得到取值范围0 ~ 9 的十位数部分I4 = I Mod 10 '将T取10的模数,得到取值范围0 ~ 9 的个位数部分Select Case DxCase 0 : T = V1 '第0位数码管显示,Case 1 : T = V2 '第1位数码管显示,Case 2 : T = V3 '第2位数码管显示,Case 3 : T = V4 '第3位数码管显示,Case 4 : T = I1 '第4位数码管显示,Case 5 : T = I2 '第5位数码管显示,Case 6 : T = I3 '第6位数码管显示,Case 7 : T = I4 '第7位数码管显示,End SelectPortb = L(t + 1)Dx = Dx + 1Rotate Portd , Left '段选左移一位,If Dx = 8 ThenDx = 0End IfLoopEndTimer1_isr: '10 毫秒定时中断服务程序Tcnt1h = &HFB '10 毫秒定时初值高字节Tcnt1l = &H1E '10 毫秒定时初值低字节_change = _change + 1 '中断发生计数If _change = 100 Then '判是否已中断2次,_change = 0 '是,已定时10豪秒,_change清零End IfReturn'字型数组Daima:Data &H3F , &H06 , &H5B , &H4F , &H66 '0,1,2,3,4Data &H6D , &H7D , &H07 , &H7F , &H6F '5,6,7,8,9首先要初始化AD的控制寄存器,主要是通道选择,转换速率选择,控制控制寄存器的开关位,打开AD功能,它自己会转换,转换完了就会有标志,转换完了的高低位它规格书也会说明存在哪里,你去那里把数拿出来,跟你计算出来的电压AD做比较,比如你的1.5V ,8位AD的话,1.5V对应的AD为1.5/5*256=77,那你就看你取出的值是比77大还是小至于你去多少次AD做平均后才比较就根据精度要求了,一般做16次平均,多的做256次平均定时器就简单了,自己看下,随便怎么设置都可以。
M16的16位定时器(普通模式)程序

//==================================================================== //==========================文件说明BEGIN================================ //---------------------------2009-4-18--------------------------------- /*本程序为M16的16位定时器普通模式最简单的应用 晶振晶振::16M (时钟频率不同时定时钟频率不同时定时器初值不同时器初值不同时器初值不同)) NUM 的值1秒加一注:程序已包含液晶显示头文件LCD12864.H *///=========================文件说明END================================= //====================================================================#include<iom16v.h> #include<macros.h> #include"LCD12864.H" #define uchar unsigned char #define uint unsigned int uchar num;/*设置中断向量设置中断向量,,miao 是自定义中断函数名是自定义中断函数名,,9是中断向量号*/(注1) #pragma interrupt_handler miao:9//******************************************** //// I/O 端口初始化 ////******************************************** void PORT_init() {/*将PA 口都设置位输出*/ DDRA=0XFF; PORTA=0XFF; }//******************************************** //// 显示函数 ////******************************************** void dis_num() {//在12864右下角显示NUM 值 lcd_w_char(0x9e,num/10+'0'); lcd_w_data(num%10+'0'); }//============================================ //// 主函数 ////============================================ void main() {PORT_init(); // I/O 端口初始化 lcd_init(); //LCD 初始化TCCR1A&=0X0F; //设置工作方式 (注2)TCCR1B=0X04; //(256分频) (注3)TCNT1=0X0BDC; //设置定时初值 (注4)TIMSK|=BIT(2);//T/C1 溢出中断使能SREG|=BIT(7); //开总中断lcd_w_str(0x9e,"00秒"); //初始显示 while(1) { } }//******************************************** // 中断函数//******************************************** void miao() {TCNT1=0X0BDC; //重新设置定时初值 num++; //中断一次NUM 值加一 if(60==num) //满60清零 num=0;dis_num(); //显示NUM 值 }要点要点::1. 定时中断产生过程定时中断产生过程::和51单片机定时中断一样单片机定时中断一样,,TCNT1从初始值计数从初始值计数,,到达TOP(即0XFFFF)后产生溢出,再从新的初始值计数到TOP ,循环循环。
ATMEGA16定时器的使用

ATMEGA16定时器的使用[日期:2012-01-07 ] [来源:本站编辑作者:佚名] [字体:大中小] (投递新闻)/*本程序简单的示范了如何使用ATMEGA16的定时器AVR定时器的要点介绍T0工作于CTC模式,输出1KHz/2KHz 50%占空比的方波T1工作于快速PWM模式兼输入捕捉T2工作于相位修正PWM模式,输出490Hz的8bit PWM波出于简化程序考虑,各种数据没有对外输出,学习时建议使用JTAG ICE硬件仿真器对于定时器,AVRstudio的软件仿真是不准确的。
*/#include <AVR/io.h>#include <AVR/signal.h>#include <AVR/interrupt.h>//时钟定为8MHz,F_CPU=8000000//管脚定义#define ICPKEY 6 //ICP1 PD6 按键模拟ICP输入#define PWM0 3 //OC0 PB3#define PWM1A 5 //OC1A PD5#define PWM1B 4 //OC1B PD4#define PWM2 7 //OC2 PD7//宏定义#define PWM1A_ON() PORTD|= (1<<PWM1A) //输出高电平,灯亮#define PWM1A_OFF() PORTD&=~(1<<PWM1A) //输出低电平,灯灭//全局变量volatile unsigned int ICP_Time; //记录ICP输入捕捉事件的发生时刻volatile unsigned char T2PWM; //设置T2的PWM值volatile unsigned char T0OCR; //设置T0的时间值//仿真时在watch窗口,监控这些变量。
void timer0_init(void) //CTC模式输出1KHz/2KHz方波{OCR0 = T0OCR; //设定TOP值//TOP=8000000/(2*64*1000)-1=61.5 选61 1.008KHz(0.992mS)//TOP=8000000/(2*64*2000)-1=30.25 选30 2.016KHz(0.496ms)TCCR0 = (1<<WGM01)|(0<<WGM00)|(0<<COM01)|(1<<COM00)|(0<<CS02)|(1<<CS01)|(1<<CS00);//64分频,CTC模式,OC0取反输出方波}void timer1_init(void){OCR1A = 39062; //设定TOP值.时间5S(0.2Hz)//TOP=8000000/(1024*0.2)=39062.5OCR1B = 15624; //设定OC1B的PWM值约2秒钟40%TCCR1A = (1<<COM1B1)|(0<<COM1B0)|(1<<WGM11)|(1<<WGM10);TCCR1B = (0<<ICES1)|(1<<WGM13)|(1<<WGM12)|(1<<CS12)|(0<<CS11)|(1<<CS10);//1024分频,WGM1=15 快速PWM模式,TOP=OCRnA,ICP下降沿触发,OC1B正向PWM输出,OC1A为普通IO}SIGNAL(SIG_INPUT_CAPTURE1) //输入捕捉中断{ICP_Time=ICR1; //读取ICP输入捕捉事件的发生时刻}SIGNAL(SIG_OUTPUT_COMPARE1A)//T1输出比较A匹配中断{//在WGM1=15 快速PWM模式下,TOP=39062等同于5S左右的定时中断T2PWM+=10;OCR2=T2PWM; //修改T2的PWM值if (T0OCR==61)T0OCR=30; //改成1KHzelseT0OCR=61; //改成2KHzOCR0=T0OCR; //修改T0的时间值}void timer2_init(void)//相位修正PWM模式{OCR2 = T2PWM; //设定PWM值(最大值固定为255,8bit)TCCR2 = (0<<WGM21)|(1<<WGM20)|(1<<COM21)|(0<<COM20)|(0<<CS22)|(1<<CS21)|(1<<CS20);//32分频,相位修正PWM模式,PWM频率为490Hz,OC2正向PWM输出//fPWM=fclk_IO/(2*N*TOP)=8000000/(2*32*255)=490Hz}int main(void){//上电默认DDRx=0x00,PORTx=0x00 输入,无上拉电阻PORTA =0xFF; //不用的管脚使能内部上拉电阻。
ATmega16定时器中断

ATmega16定时器/计数器中断及编程Atmega16内部有三个定时器/计数器T/C0,T /C1.T/C2,其中T/C0,T/C2为8为定时器,T/C1为16定时器,这里从高级语言编程的使用出发,简要介绍T/C0的使用。
定时器中断的过程是:当中断发生时,程序控制立即从主程序转移到中断服务程序,执行完中断服务程序后再返回到主程序的中断处继续执行后续的程序。
利用中断可以节省CPU资源。
先了解几个寄存器。
MCUCR---MCU控制寄存器;MCUCSR-----MCU控制与状态寄存器;GICR-----通用控制寄存器;GIFR-----通用中断标志寄存器;TIFR---定时器中断标志寄存器,TIMSK----定时器中断屏蔽寄存器。
这几寄存器保留默认设置即可,需要编程时了解并设置的寄存器为TCCR0----T/C0控制寄存器,TCNT0----T/C0的计数初始值,OCR0----输出比较寄存器,OC0/PB3----输出比较引脚。
TCCR0为8位寄存器,从高位到低位的名称依次是:FOC0,WGM00,COM01,COM00,WGM01,CS02,CS01,CS00.TCCR0各个控制位的作用:(1) CS02,CS01,CS00控制时钟选择和预分频,如100表示预分频为256(2) WGM01,WGM00控制波形产生模式,分为普通模式(用于普通计时),CTC模式(用于频率发生),快速PWM模式(用于PWM调速,功率调节),相位修正PWM模式。
如10表示CTC模式。
(3) COM01,COM00控制比较匹配输出模式。
在不同的波形产生模式下其逻辑值功能表不同,如在普通模式或CTC模式下01表示比较匹配发生OC0取反。
(4)FOC0,中断标志位,设为零即可。
至于上述控制位的逻辑值功能表可查阅Atmega16的中文数据手册,在官方网上会有英文版。
完成TCCR0的设定,接下来是设置TCNT0,OCR0寄存器了。
Atmega16的定时器time0

Atmega16的定时器time0分类:AVR 2007-09-01 05:04 3180人阅读评论(2) 收藏举报依照AVR使用范例--定时器应用范例/avr_examples/timer.html。
使用ICC application builder快速配置定时器后生成的代码如下://ICC-AVR application builder : 2007-8-28 0:55:55// Target : M16// Crystal: 7.3728Mhz#include <iom16v.h>#include <macros.h>void port_init(void){PORTA = 0x00;DDRA = 0x00;PORTB = 0x00;DDRB = 0x00;PORTC = 0x00; //m103 output onlyDDRC = 0x00;PORTD = 0x00;DDRD = 0x00;}TIMER0 initialize - prescale:1024 /*定时器预分频,预分频由TCCRn的CS02,CS01,CS00确定,详情查看数据手册*/// WGM: Normal/*定时器,也由TCCRn确定*/// desired value: 20mSec/*定时器期望设定时间*/// actual value: 19.861mSec (0.7%)/*定时器实际定时时间,误差比例*/void timer0_init(void){/*定时器停止,TCCR0寄存器完全控制timer0的运行情况,详细可参考数据手册。
*/ TCCR0 = 0x00; //stopTCNT0 = 0x71; //set count /*定时器寄存器开始值*/OCR0 = 0x8F; //set compare /*定时器比较值*/TCCR0 = 0x05; //start timer /*定时器开始*/}#pragma interrupt_handler timer0_comp_isr:20void timer0_comp_isr(void){//compare occured TCNT0=OCR0}#pragma interrupt_handler timer0_ovf_isr:10void timer0_ovf_isr(void){TCNT0 = 0x71; //reload counter value}//call this routine to initialize all peripheralsvoid init_devices(void){//stop errant interrupts until set upCLI(); //disable all interruptsport_init();timer0_init();MCUCR = 0x00;GICR = 0x00;TIMSK = 0x03; //timer interrupt sourcesSEI(); //re-enable interrupts//all peripherals are now initialized}下面我们一步一步按顺序来分析。
单片机定时器0工作模式(16位模式)

单片机定时器0工作模式(16位模式)作者:jdzj868来源:机电之家下载站录入:jdzj868更新时间:2009-10-29 14:33:35点击数:0【字体:】51单片机的定时器0工作模式1(16位模式),外中断INT0(P3_2引脚)控制T0(P3_4引脚)的按键信号,按键(P3_4引脚)作为T0时钟信号输入定时器0。
若是INT0为1,则按键的状态(不断的按下然后抬起按键),使定时/计数器0计数,溢出中断引起P2.0引脚相连的LED灯闪烁。
#include "reg_c51.h"unsigned char hex[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E}; //数码管十六进制译码表void main(void){TMOD &= 0xF0; //定时/计数器0运行在模式1,16位模式TMOD |= 0x0D; //GATE0=1; C/T0#=1; M1=0; M0=1;TH0 = 0xff; //设置初值,初值=(65536-7)/256=FFHTL0 = 0xf9; //设置初值,初值=(65536-7)%256=F9H//初值为65529,只需要再计7个数,定时/计数器就可以溢出ET0=1; //允许定时/计数器0中断EA=1; //允许总中断TR0=1; //启动定时/计数器while(1); //无限循环{P1=hex[TL0/16]; //显示TL0的高位P0=hex[TL0%16]; //显示TL0的低位}}void it_timer0(void) interrupt 1 //定时/计数器0中断服务程序{P2_0 = ~P2_0; //每次中断将P2_0引脚取反,就是使LED灯闪烁TH0 = 0xff; //重置初值TL0 = 0xf9; //重置初值}文- 汉语汉字编辑词条文,wen,从玄从爻。
AVR——Mega16制作的电子时钟(仿真图+源程序)
{ fen=0; shi++; if(shi==24)
{ shi=0; } }
}
TCNT1H=0X8f; TCNT1L=0X80; }
绥化学院电子协会 2010 级耿国辉
QQ:835751934
PORTA=0X00; PORTC=0X00; PORTB=0X07; }
/*************定时器初始化*************/ void timer1_init(void)
{ TCCR1B=0X04; //256 分频 TCNT1H=0X8f; TCNT1L=0X80; TIMSK|=BIT(2); //定时器中断使能位 SREG|=BIT(7); //设置总中断 } /*************按键扫描*****************/ void key_scan() {
PORTA=0X00;
PORTA=table[fen/10];
//5
PORTC=tab[3];
delay(1);
PORTA=0X00;
PORTA=0x40;
பைடு நூலகம்
//6
PORTC=tab[2];
delay(1);
PORTA=0X00;
PORTA=table[shi%10];
//7
PORTC=tab[1];
delay(1);
PORTA=0X00;
PORTA=table[shi/10];
//8
PORTC=tab[0];
delay(1);
PORTA=0X00;
} /************主函数*****************/ void main(void) { init(); //初始化 timer1_init(); while(1)
单片机实践-16位软件定时器模式
值 CCAP1L = temp.Result.Low; [CCAPnH和CCAPnL]为现有的值
CCAP1H = temp.Result.High;
[T_Reload为相同的数值(步长)
11 16位软件定时器模式
请注意以下4件事情: 第4件:赋初始或重装值时,必须先给CCAPnL赋值,再给CCAPnH赋值。
现了定时功能。
void PCA_Routine(void) interrupt PCA_VECTOR //PCA中断服务程序
{ if(CCF0) //CCP0模块比较/捕获中断
{ CCF0=0;
temp.num = (unsigned int)(CCAP1H<<8) + CCAP1L + T_Reload; //重新加初
IAP15W4K58S4单片机的16 位软件定时器模式
11 16位软件定时器模式
CCAPMn:PCA比较/捕获寄存器 n=0,1,2。
1 16位软件定时器模式(也称比较模式),CCAPMn寄存器只用到了三位: ECOMn、MATn和ECCFn。 ECOMn表示:允许比较器功能控制位,当ECOMn=1时,允许比较器功能;
void PCA_Routine(void) interrupt PCA_VECTOR //PCA中断服务程序
{ if(CCF0) //CCP0模块比较/捕获中断
{ CCF0=0;
temp.num = (unsigned int)(CCAP1H<<8) + CCAP1L + T_Reload; //重新加初
//CCP0模块比较/捕获中断
if(CCF0) {CCF1=0; …… }
//CCP1模块比较/捕获中断
ATmega16单片机芯片资料
ATmega16单片机芯片资料产品特性• 高性能、低功耗的8 位AVR® 微处理器• 先进的RISC 结构– 131 条指令–大多数指令执行时间为单个时钟周期– 32个8 位通用工作寄存器–全静态工作–工作于16 MHz 时性能高达16 MIPS–只需两个时钟周期的硬件乘法器• 非易失性程序和数据存储器– 16K 字节的系统内可编程Flash擦写寿命: 10,000 次–具有独立锁定位的可选Boot 代码区通过片上Boot 程序实现系统内编程真正的同时读写操作– 512 字节的EEPROM擦写寿命: 100,000 次– 1K字节的片内SRAM–可以对锁定位进行编程以实现用户程序的加密• JTAG 接口( 与IEEE 1149.1 标准兼容)–符合JTAG 标准的边界扫描功能–支持扩展的片内调试功能–通过JTAG 接口实现对Flash、EEPROM、熔丝位和锁定位的编程• 外设特点–两个具有独立预分频器和比较器功能的8 位定时器/ 计数器–一个具有预分频器、比较功能和捕捉功能的16 位定时器/ 计数器–具有独立振荡器的实时计数器RTC–四通道PWM– 8路10 位ADC8 个单端通道TQFP 封装的7 个差分通道2 个具有可编程增益(1x, 10x, 或200x)的差分通道–面向字节的两线接口–两个可编程的串行USART–可工作于主机/ 从机模式的SPI 串行接口–具有独立片内振荡器的可编程看门狗定时器–片内模拟比较器• 特殊的处理器特点–上电复位以及可编程的掉电检测–片内经过标定的RC 振荡器–片内/ 片外中断源– 6种睡眠模式: 空闲模式、ADC 噪声抑制模式、省电模式、掉电模式、Standby 模式以及扩展的Standby 模式• I/O 和封装– 32 个可编程的I/O 口– 40引脚PDIP 封装, 44 引脚TQFP 封装, 与44 引脚MLF 封装• 工作电压:– ATmega16L:2.7 - 5.5V– ATmega16:4.5 - 5.5V• 速度等级– 0 - 8 MHz ATmega16L– 0 - 16 MHz ATmega16• ATmega16L 在1 MHz, 3V, 25°C 时的功耗–正常模式: 1.1 mA–空闲模式: 0.35 mA–掉电模式: < 1 μAAVR 内核具有丰富的指令集和32 个通用工作寄存器。
个人总结的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分别控制加减。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MEGA16单片机定时器(16位)源代码
/* 程序名: mega16a 芯片16 位定时计数器;概括: 学会了控制8 位定时器,16 位定时器和它如出一辙,Its a piece of cake! 在芯片开发板上实现精确一秒闪烁... 心得: 电子技术和音乐一样,都是一门艺术,令人回味... finish time: 2014 年3 月8 日19:33:10; 作者: 肖邦;*/#include //头文件;typedef unsigned char uint8 ; //在程序中用uint8 相当于写unsigned char ;typedef unsigned int uint16; //用法同上;void reset_io(void) //初始化所有io 口;{ DDRA=0XFF; PORTA=0X00; DDRB=0XFF; PORTB=0X00; DDRC=0XFF; PORTC=0X00; PORTC|=1<<5; //12864 液晶屏复位引脚置1; PORTC&=~(1<<5); //12864 清零(复位) ; PORTC|=1<<5; //12864 液晶屏复位引脚置1; DDRD=0XFF; PORTD=0X00;}int main(void) //主函数!!!!!{ uint16 num=0; reset_io(); //初始化io 口; TCNT1=0xff44; //设置定时器初始值,1 毫秒溢出一次
0xff45==65536-(12 兆/64 分频*0.001 秒); TCCR1B=0x03; //( 64 分频)设置定时器分频并开启定时器; PORTB=1<<2; while(1) { if(TIFR&0X04) //一旦溢出
标志位置一,就进入; {// PORTA–0XFF; //物理引脚PA 口跳变,此语句没用; num++; if(num==1000) {PORTA–0XFF;num=0;} 每一毫秒num 变量加一,加1000 次是你秒; TCNT1=0XFF44; //回复初始值; TIFR|=0X04; //此语句很重要! !!!!!溢出标志位只有置一才会自动清零;}}}tips:感谢大家的阅读,本文由我司收
集整编。
仅供参阅!。