MEGA16单片机定时器(16位)源代码
mega16
![mega16](https://img.taocdn.com/s3/m/03af7ad628ea81c758f5782a.png)
刚学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位定时器(普通模式)程序
![M16的16位定时器(普通模式)程序](https://img.taocdn.com/s3/m/173cb03567ec102de2bd8964.png)
//==================================================================== //==========================文件说明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定时器的使用](https://img.taocdn.com/s3/m/eba58662011ca300a6c390a7.png)
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定时器中断](https://img.taocdn.com/s3/m/04828f86bceb19e8b8f6ba50.png)
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](https://img.taocdn.com/s3/m/c69cfa4249649b6648d747ae.png)
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位模式)](https://img.taocdn.com/s3/m/f40773c685254b35eefdc8d376eeaeaad1f31671.png)
单片机定时器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制作的电子时钟(仿真图+源程序)
![AVR——Mega16制作的电子时钟(仿真图+源程序)](https://img.taocdn.com/s3/m/607b8659804d2b160b4ec05c.png)
{ 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位软件定时器模式
![单片机实践-16位软件定时器模式](https://img.taocdn.com/s3/m/822e1eff3086bceb19e8b8f67c1cfad6185fe944.png)
值 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单片机芯片资料](https://img.taocdn.com/s3/m/e6b3a374f242336c1eb95ea6.png)
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单片机程序
![个人总结的AVR的ATMEGA16L单片机程序](https://img.taocdn.com/s3/m/15b7c2cbda38376baf1faedb.png)
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分别控制加减。
AVR单片机 mega16 C语言 数码管程序
![AVR单片机 mega16 C语言 数码管程序](https://img.taocdn.com/s3/m/9a9b4f8b6529647d27285297.png)
number=~BIT(number-1); //调整位选(指定时是1~6,而操作的时候是0~5)
PORTB=number; //输出位选
PORTA|=BIT(BITLK); //更新位选
Delayus(50); //调整时序
PORTA&=~BIT(BITLK); //锁存位选
函数名称: Cycle_smg_display
功 能: 6个数码管从右向左循环滚动显示指定的内容(循环一次)
参 数: *pdata--显示内容数组地址
返回值 : 无
/********************************************/
void Cycle_smg_display(uchar *pdata)
Delayus(50); //调ห้องสมุดไป่ตู้时序
PORTA&=~BIT(BITLK); //锁存位选
PORTB=SEGMENT[data]; //输出段选
PORTA|=BIT(SEGLK); //更新段选
Delayus(50); //调整时序
PORTA&=~BIT(SEGLK); //锁存段选
{
uchar i,j;
for(i=0;i<240;i++) //共滚动6次,每次内容显示40个循环
{
for(j=0;j<6;j++) //扫描6个数码管
{
One_smg_display(pdata[(i/40+j)%6],j+1);//显示
Delayus(2000); //调整显示时间和亮度(时间越长亮度越高,但是太长数码管就闪了)
mega16 C程序
![mega16 C程序](https://img.taocdn.com/s3/m/03b53e0af78a6529647d534a.png)
1.参考书P121 数码管轮流显示0~F#include <mega16.h>#include <delay.h>flash unsigned char led_7[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07, 0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};flash unsigned char position[8]={ 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};void main(void){unsigned char i=0,j=0;PORTA=0x00; // 显示控制I/O端口初始化DDRA=0xFF;PORTC=0xFF;DDRC=0xFF;while(1){for(i=0;i<=7;i++){PORTC=position[i];for(j=0;j<16;j++){PORTA=led_7[j];delay_ms(500);}}};}用定时器实现数码管轮流显示0~F#include <mega16.h>flash unsigned charled_7[17]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00};flash unsigned char position[8]={ 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsigned char disbuff[8]; // 显示缓冲区,存放要显示的8个字符的段码值unsigned char posit,time_counter;bit time_500ms_ok;void display(void) // 6位LED数码管动态扫描函数{PORTC = 0xff;PORTA = led_7[disbuff[posit]];PORTC = position[posit];if (++posit >=8 ) posit = 0;}interrupt [TIM0_COMP] void timer0_comp_isr(void){display(); // 调用LED扫描显示if (++time_counter>=250){time_counter = 0;time_500ms_ok = 1;}}void main(void){unsigned char i=0,new=0;PORTA=0x00; // 显示控制I/O端口初始化DDRA=0xFF;PORTC=0xFF;DDRC=0xFF;// T/C0 初始化TCCR0=0x0B; // 内部时钟,64分频(4M/64=62.5KHz),CTC模式TCNT0=0x00;OCR0=0x7C; // OCR0 = 0x7C(124),(124+1)/62.5=2ms(2ms中断一次,电平方向变化一次)TIMSK=0x02; // 允许T/C0比较匹配中断posit = 0;for(i=0;i<8;i++)disbuff[i]=16;#asm("sei") // 开放全局中断while (1){if(time_500ms_ok){time_500ms_ok=0;for(i=7;i>=1;i--)disbuff[i]=disbuff[i-1];disbuff[0]=new;if(++new>=16) new=0;}}}2.设计一段能够自动测试实验板上8个数码管好坏的检测系统。
AVR ATmega16 EEPROM读写程序源码
![AVR ATmega16 EEPROM读写程序源码](https://img.taocdn.com/s3/m/d360d5d2240c844769eaee02.png)
void delay(uint ms) //延迟函数 { uint i,j; for (i=0;i<ms;i++) for (j=0;j<1141;j++); } /********************************************************** LCD1602相关定义 **********************************************************/ void wr_com(uchar com) //写命令函数 { CTRL_PORT &=~BIT(0); CTRL_PORT &=~BIT(1); DATA_PORT =com; CTRL_PORT &=~BIT(2); delay(1); CTRL_PORT |=BIT(2); delay(1); } void wr_data(uchar data) { //写数据函数 //RS置0 //RW置1 //E置0 //E置1,产生上升沿,开始写入
第7页 共 9页
AVR ATmega16 EEPROM 读写程序
CTRL_PORT |=BIT(0); CTRL_PORT &=~BIT(1); DATA_PORT = data; CTRL_PORT &=~BIT(2); delay(1); CTRL_PORT |=BIT(2); delay(1); }
(3) EEPROM 控制寄存器- EECR
Bit
读/写 初始值
7
-
6
-
5
-
4
-
3
EERIE
2
EEMWE
1
EEWE
0
AVR mega16单片机编程
![AVR mega16单片机编程](https://img.taocdn.com/s3/m/a2db19116c175f0e7cd13753.png)
AVR mega16单片机C/C++初步使用如果仅仅只是从使用单片机的角度出发,单片机其实根本没有想象中的那么难,单片机内部的寄存器,运算器,结构框图,CPU时序等知识并非应用所必须,而大多数人可能就因为缺少这些很专业的知识而很少涉及单片机。
当然,这也并非说仅仅会了C/C++的编程技巧就能运用单片机了,就我的使用经验来说,需要了解的是:单片机的最小系统,4个通用的I/O端口,单片机控制的基本了解。
在已经把单片机与外围设备连接好后,接下来就是编程的问题了。
我们可以将4个通用端口用程序设定为输入端口和输出端口,简单的说,单片机控制就是程序(保存在单片机的程序存储区)根据输入端口的逻辑值给出输出端口的逻辑值,输出端口的逻辑值通过驱动电路控制相应的元件执行所要求的动作。
很明显,输出端口的逻辑值决定了执行机构的动作,而输出端口的逻辑值最终由程序控制。
在ICC AVR环境中,可以采用C/C++编程,编译好后可以用AVR Studio打开后缀为cof 的文件进行仿真。
仿真无误用JETAG下载线将编译生成的后缀为hex文件(机器代码)下载到单片机中,接通单片机电源程序便可运行。
在设置I/O端口过程的基本语法如下(以端口PA为例,其他三个端口类似):DDRA=0x00;//设置PA0~PA7为输入端口PORTA=0x00;//设置PA端口的值,在PA为输入端口的前提下,PA的值对程序的运行无影响,设定是否使用端口的内部上拉电阻unsigned char state;state=PINA;//读取输入端口PA引脚的逻辑值,即外部的输入值DDRB=0xff;//设置PB0~PB7为输出端口PORTB=0x0f;//当PB为输出端口时,PORTB的值即为实际的逻辑输出值,设置PB0~PB3为1(引脚电压为5V),PB4~PB7为0(引脚电压为0V)当只是涉及到某些位时,可以用位运算符&,|,~来操作相应的位。
对于端口的特殊用法(如PWM波形)需查阅相关资料。
Mega16的1602C代码
![Mega16的1602C代码](https://img.taocdn.com/s3/m/ac993f106edb6f1aff001fa8.png)
基于ATMega16的1602C程序一、1602管脚介绍1.Vss 电源地;2.Vdd 电源正极4.5~5.5V 通常使用5V;3.Vl 对比度调节电源调节范围0~5V。
接正电源时对比度最弱,接地对比度最高,但是对比度过高时产生“鬼影”,因此通常使用一个10K电位器来调整对比度,或者直接接一个电阻到地;4.Rs 数据/命令选择高电平选择数据寄存器,低电平选择指令寄存器;5.R/W 读/写选择高电平读取数据,低电平写入数据;6.E 模块使能端写数据需要下降沿触发模块;7~14.D0~D7 三态双向数据口MCU I/O口资源紧张可以使用4位数据线D4~D7接口传送数据;15.Blk 背光源地16.Bla 背光源正极需要背光串接一个限流电阻接Vdd,blk接地,实测该模块背光电流50mA左右。
二、试验接法Vdd、Bla -- VccVss、Vl、Blk -- GndRs -- Pd0R/W -- Pd1E -- Pd2D1~D7 -- Pb0~Pb7三、测试程序/*************************************************LCD演示程序(ICCAVR)学习AVR单片机的LCD显示MUC: ATMEGA16D0~D7: PB0~PB7RS--PD0R/W--PD1E--PD2CLOCK: 8MHz*************************************************/#include <iom16v.h>#define XTAL 8#define RS 0#define RW 1#define E 2#define lcd_data_port PORTB#define lcd_data_dir DDRB#define lcd_data_pin PINB#define lcd_ctrl_port PORTD#define lcd_ctrl_dir DDRD#define lcd_ctrl_pin PIND#define delay() delay_us(80)#define set_bit(x,y) (x|=(1<<y))#define clr_bit(x,y) (x&=~(1<<y))#define get_bit(x,y) (x&(1<<y))#define WDR() asm("wdr") // Watchdog_Reset()#define SEI() asm("sei") // Enable_Interrupt()#define CLI() asm("cli") // Disable_Interrupt()#define NOP() asm("nop") // Null_Operation()#define SLEEP() asm("sleep") // Enter_Sleepmode()//微秒级延时程序void delay_us(int time){unsigned int i=1;do{time--;while(i!=0){i--;}i=1;}while (time>1);}// 毫秒级延时程序void delay_ms(unsigned int time){while(time!=0){delay_us(1000);time--;}}void lcd_port_init(void){lcd_data_dir=0; //设置数据输入模式lcd_data_port=0; //初始化数据lcd_ctrl_dir|=(1<<RS)|(1<<RW)|(1<<E); //设置控制信号输出模式lcd_ctrl_port|=(1<<RS)|(1<<RW)|(1<<E); //设置控制信号高电平}/*****************************************************LCD初始化函数******************************************************/const unsigned char init_tabel[]={0x38,0x0c,0x01,0x06};void lcd_init(void){unsigned char i;lcd_port_init();for(i=0;i<4;i++){write_lcd(init_tabel[i],0);}}/************************************************从LCD读取数据或地址data_type:数据类型1表示数据,0表示指令************************************************/unsigned char read_lcd(unsigned char data_type){unsigned char i;lcd_data_dir=0;lcd_data_port=0; //设置为输入if (data_type==0) //根据数据类型选择命令写与数据写clr_bit(lcd_ctrl_port,RS); //RS=0elseset_bit(lcd_ctrl_port,RS); //RS=1set_bit(lcd_ctrl_port,RW); //R/W=1,读LCD状态set_bit(lcd_ctrl_port,E); //E=1delay(); //延时80usi=lcd_data_pin&0x7f ; //i=PINB&0x7f ;clr_bit(lcd_ctrl_port,E); //E=0delay(); //延时80usreturn i;}/***********************************************写数据或指令到LCDdata:数据或指令字节data_type:数据类型1表示数据,0表示指令***********************************************/void write_lcd(unsigned char data,unsigned char data_type) {lcd_data_dir=0; //lcd_data_port=0; //设置输入clr_bit(lcd_ctrl_port,RS); //RS=0set_bit(lcd_ctrl_port,RW); //R/W=1,读LCD状态set_bit(lcd_ctrl_port,E); //E=1delay(); //延时80uswhile ((lcd_data_pin&0x80)==0x80);//检查LCD是否空闲clr_bit(lcd_ctrl_port,E); //E=0if (data_type==0) //根据数据类型选择命令写与数据写clr_bit(lcd_ctrl_port,RS); //RS=0elseset_bit(lcd_ctrl_port,RS); //RS=1clr_bit(lcd_ctrl_port,RW); //R/W=0,写入LCDlcd_data_dir=0xff; //lcd_data_port=data; //写出数据set_bit(lcd_ctrl_port,E); //E=1delay();clr_bit(lcd_ctrl_port,E); //E=0delay();lcd_data_dir=0; //lcd_data_port=0; //}/*********************************清除LCD显示函数*********************************/void lcd_clear(void){write_lcd(0x01,0);}/*****************************************************将光标转移到DDRAM指定位置处x:0~39,y:0~1*****************************************************/void lcd_gotoxy(unsigned char x,unsigned char y) {unsigned char adder;if (y==1)adder=0xc0+x;// 定位1602 第二行elseadder=0x80+x;// 定位1602 第一行write_lcd(adder,0);}/*********************************单字符输出函数*********************************/void lcd_putc(char c){if (c == '\n')if (read_lcd(0)>15) //如果当前位置已在第二行,write_lcd(02,0); //则从0开始elsewrite_lcd(0xc0,0); //换行elsewrite_lcd(c,1); //写字符到LCD }/*********************************字符串输出函数*********************************/void lcd_puts(char *s){while (*s)lcd_putc(*s++);}void lcd_puts_P(char const *s){while (*s)lcd_putc(*s++);}//void lcd_puts_P(char __flash *s)// {// while (*s)// lcd_putc(*s++);// }/***************************************************** 从指定DDRAM/CGRAM位置读取数据*****************************************************/ unsigned char lcd_read(unsigned char adder) {write_lcd(adder,0);return read_lcd(1);}/************************************************LCD字符移位函数n:移动的次数p:移动方向,'l'或'L'表示左移,'r'或'R'表示右移*************************************************/void lcd_shift(unsigned char n,unsigned char p) {unsigned char i,j=1;switch (p){case 'r':i=0x1c;break;case 'R':i=0x1c;break;case 'l':i=0x18;break;case 'L':i=0x18;break;default:return;}while (j<=n){j++;write_lcd(i,0);}}/***************************************************** 写数据到指定DDRAM/CGRAM位置*****************************************************/void lcd_write(unsigned char adder,unsigned char data) {write_lcd(02,0);write_lcd(adder,0);write_lcd(data,1);}/*****************************************************写数据到DDRAM当前位置*****************************************************/void lcd_write_data(unsigned char data){write_lcd(read_lcd(0)|0x80,0);write_lcd(data,1);write_lcd((read_lcd(0)-1)|0x80,0);}void main(void){MCUCR=0;lcd_init();while(1){lcd_gotoxy(2,0);lcd_puts("TEL:");lcd_gotoxy(2,1);lcd_puts("who am i ?");delay_ms(1000);lcd_clear();lcd_gotoxy(1,0);lcd_puts("http://www.");lcd_gotoxy(1,1);lcd_puts(""); delay_ms(1000);lcd_clear();}}。
mega16头文件
![mega16头文件](https://img.taocdn.com/s3/m/8db5c7c1aa00b52acfc7ca84.png)
ATmega16 的头文件2010-08-08 16:31:51| 分类:单片机 | 标签:atmega16 的头文件|字号订阅#ifndef __iom16_h#define __iom16_h#warning "This header file may not be current. Please use iom16v.h instead" /* 2 wire serial interface */#define TWBR (*(volatile unsigned char *)0x20)#define TWSR (*(volatile unsigned char *)0x21)#define TWAR (*(volatile unsigned char *)0x22)#define TWDR (*(volatile unsigned char *)0x23)/* ADC Data register */#define ADC (*(volatile unsigned int *)0x24)#define ADCL (*(volatile unsigned char *)0x24)#define ADCH (*(volatile unsigned char *)0x25)/* ADC Control and Status Register */#define ADCSR (*(volatile unsigned char *)0x26)/* ADC MUX */#define ADMUX (*(volatile unsigned char *)0x27)/* Analog Comparator Control and Status Register */#define ACSR (*(volatile unsigned char *)0x28)/* UART Baud Rate Register */#define UBRRL (*(volatile unsigned char *)0x29)#define UBRR UBRRL/* UART Control Register */#define UCR UCSRB#define UCSRB (*(volatile unsigned char *)0x2A)#define UCSRA (*(volatile unsigned char *)0x2B)/* UART Status Register */#define USR (*(volatile unsigned char *)0x2B)/* UART I/O Data Register */#define UDR (*(volatile unsigned char *)0x2C)/* SPI Control Register */#define SPCR (*(volatile unsigned char *)0x2D)/* SPI Status Register */#define SPSR (*(volatile unsigned char *)0x2E)/* SPI I/O Data Register */#define SPDR (*(volatile unsigned char *)0x2F)/* Input Pins, Port D */#define PIND (*(volatile unsigned char *)0x30)/* Data Direction Register, Port D */#define DDRD (*(volatile unsigned char *)0x31)/* Data Register, Port D */#define PORTD (*(volatile unsigned char *)0x32)/* Input Pins, Port C */#define PINC (*(volatile unsigned char *)0x33)/* Data Direction Register, Port C */#define DDRC (*(volatile unsigned char *)0x34)/* Data Register, Port C */#define PORTC (*(volatile unsigned char *)0x35)/* Input Pins, Port B */#define PINB (*(volatile unsigned char *)0x36)/* Data Direction Register, Port B */#define DDRB (*(volatile unsigned char *)0x37)/* Data Register, Port B */#define PORTB (*(volatile unsigned char *)0x38)/* Input Pins, Port A */#define PINA (*(volatile unsigned char *)0x39)/* Data Direction Register, Port A */#define DDRA (*(volatile unsigned char *)0x3A)/* Data Register, Port A */#define PORTA (*(volatile unsigned char *)0x3B)/* EEPROM Control Register */#define EECR (*(volatile unsigned char *)0x3C)/* EEPROM Data Register */#define EEDR (*(volatile unsigned char *)0x3D)/* EEPROM Address Register */#define EEAR (*(volatile unsigned int *)0x3E)#define EEARL (*(volatile unsigned char *)0x3E) #define EEARH (*(volatile unsigned char *)0x3F)/* UART Baud rate register high */#define UBRRHI (*(volatile unsigned char *)0x40) #define UCSRC (*(volatile unsigned char *)0x40)/* Watchdog Timer Control Register */#define WDTCR (*(volatile unsigned char *)0x41)/* Asynchronous mode Status Register */#define ASSR (*(volatile unsigned char *)0x42)/* Timer/Counter2 Output Compare Register */#define OCR2 (*(volatile unsigned char *)0x43)/* Timer/Counter 2 */#define TCNT2 (*(volatile unsigned char *)0x44)/* Timer/Counter 2 Control Register */#define TCCR2 (*(volatile unsigned char *)0x45)/* T/C 1 Input Capture Register */#define ICR1 (*(volatile unsigned int *)0x46)#define ICR1L (*(volatile unsigned char *)0x46) #define ICR1H (*(volatile unsigned char *)0x47)/* Timer/Counter1 Output Compare Register B */#define OCR1B (*(volatile unsigned int *)0x48)#define OCR1BL (*(volatile unsigned char *)0x48) #define OCR1BH (*(volatile unsigned char *)0x49)/* Timer/Counter1 Output Compare Register A */#define OCR1A (*(volatile unsigned int *)0x4A)#define OCR1AL (*(volatile unsigned char *)0x4A) #define OCR1AH (*(volatile unsigned char *)0x4B)/* Timer/Counter 1 */#define TCNT1 (*(volatile unsigned int *)0x4C)#define TCNT1L (*(volatile unsigned char *)0x4C) #define TCNT1H (*(volatile unsigned char *)0x4D)/* Timer/Counter 1 Control and Status Register */#define TCCR1B (*(volatile unsigned char *)0x4E)/* Timer/Counter 1 Control Register */#define TCCR1A (*(volatile unsigned char *)0x4F)/* Special Function I/O register */#define SFIOR (*(volatile unsigned char *)0x50)/* Oscillator Calibration register */#define OSCCAL (*(volatile unsigned char *)0x51) #define OCDR (*(volatile unsigned char *)0x51)/* Timer/Counter 0 */#define TCNT0 (*(volatile unsigned char *)0x52)/* Timer/Counter 0 Control Register */#define TCCR0 (*(volatile unsigned char *)0x53)/* MCU general Status Register */#define MCUCSR (*(volatile unsigned char *)0x54)/* MCU general Control Register */#define MCUCR (*(volatile unsigned char *)0x55)/* 2-wire serial interface Control Register */#define TWCR (*(volatile unsigned char *)0x56)#define SPMCR (*(volatile unsigned char *)0x57)/* Timer/Counter Interrupt Flag register */#define TIFR (*(volatile unsigned char *)0x58)/* Timer/Counter Interrupt MaSK register */#define TIMSK (*(volatile unsigned char *)0x59)/* General Interrupt Flag Register */#define GIFR (*(volatile unsigned char *)0x5A)/* General Interrupt Control register */#define GICR (*(volatile unsigned char *)0x5B)#define OCR0 (*(volatile unsigned char *)0x5C)/* Stack Pointer */#define SP (*(volatile unsigned int *)0x5D)#define SPL (*(volatile unsigned char *)0x5D)#define SPH (*(volatile unsigned char *)0x5E)/* Status REGister */#define SREG (*(volatile unsigned char *)0x5F)/* MCU general Control Register */#define SM2 7 /* NOTE: SWAPPED with iom323.h */ #define SE 6#define SM1 5#define SM0 4#define ISC11 3#define ISC10 2#define ISC01 1#define ISC00 0/* MCU Control and Status Register */#define JTD 7#define ISC2 6#define JTRF 4#define WDRF 3#define BORF 2#define EXTRF 1#define PORF 0/* General Interrupt Control register */#define INT1 7#define INT0 6#define INT2 5#define IVSEL 1#define IVCE 0/* SFIOR */#define ADTS2 7#define ADTS1 6#define ADTS0 5#define ADHSM 4#define ACME 3#define PUD 2#define PSR2 1#define PSR10 0/* General Interrupt Flag Register */#define INTF1 7#define INTF0 6#define INTF2 5/* Timer/Counter Interrupt MaSK register */ #define OCIE2 7#define TOIE2 6#define TICIE1 5#define OCIE1A 4#define OCIE1B 3#define TOIE1 2#define OCIE0 1#define TOIE0 0/* Timer/Counter Interrupt Flag register */ #define OCF2 7#define TOV2 6#define ICF1 5#define OCF1A 4#define OCF1B 3#define TOV1 2#define OCF0 1#define TOV0 0/* MCU general Control Register */#define SE 6#define SM1 5#define SM0 4#define ISC11 3#define ISC10 2#define ISC01 1#define ISC00 0/* Timer/Counter 0 Control Register */#define CS02 2#define CS01 1#define CS00 0/* Timer/Counter 1 Control Register */#define COM1A1 7#define COM1A0 6#define COM1B1 5#define COM1B0 4#define PWM11 1#define PWM10 0/* Timer/Counter 1 Control and Status Register */ #define ICNC1 7#define ICES1 6#define WGM13 4#define WGM12 3#define CS12 2#define CS11 1#define CS10 0/* Timer/Counter 2 Control Register */#define FOC2 7#define WGM20 6#define COM21 5#define COM20 4#define WGM21 3#define CS22 2#define CS21 1#define CS20 0/* TCCR0 Timer/Counter 0 Control Register */#define FOC0 7#define WGM00 6#define COM01 5#define COM00 4#define WGM01 3#define CS02 2#define CS01 1#define CS00 0/* Asynchronous mode Status Register */#define AS2 3#define TCN2UB 2#define OCR2UB 1#define TCR2UB 0/* Watchdog Timer Control Register */ #define WDTOE 4#define WDE 3#define WDP2 2#define WDP1 1#define WDP0 0/* EEPROM Control Register */#define EERIE 3#define EEMWE 2#define EEWE 1#define EERE 0/* Data Register, Port A */#define PA7 7#define PA6 6#define PA5 5#define PA4 4#define PA3 3#define PA2 2#define PA1 1#define PA0 0/* Data Direction Register, Port A */#define DDA7 7#define DDA6 6#define DDA5 5#define DDA4 4#define DDA3 3#define DDA2 2#define DDA1 1#define DDA0 0/* Input Pins, Port A */#define PINA7 7#define PINA6 6#define PINA5 5#define PINA4 4#define PINA2 2#define PINA1 1#define PINA0 0/* Data Register, Port B */#define PB7 7#define PB6 6#define PB5 5#define PB4 4#define PB3 3#define PB2 2#define PB1 1#define PB0 0/* Data Direction Register, Port B */ #define DDB7 7#define DDB6 6#define DDB5 5#define DDB4 4#define DDB3 3#define DDB2 2#define DDB1 1#define DDB0 0/* Input Pins, Port B */#define PINB7 7#define PINB6 6#define PINB5 5#define PINB4 4#define PINB3 3#define PINB2 2#define PINB1 1#define PINB0 0/* Data Register, Port C */#define PC7 7#define PC6 6#define PC5 5#define PC4 4#define PC3 3#define PC1 1#define PC0 0/* Data Direction Register, Port C */ #define DDC7 7#define DDC6 6#define DDC5 5#define DDC4 4#define DDC3 3#define DDC2 2#define DDC1 1#define DDC0 0/* Input Pins, Port C */#define PINC7 7#define PINC6 6#define PINC5 5#define PINC4 4#define PINC3 3#define PINC2 2#define PINC1 1#define PINC0 0/* Data Register, Port D */#define PD7 7#define PD6 6#define PD5 5#define PD4 4#define PD3 3#define PD2 2#define PD1 1#define PD0 0/* Data Direction Register, Port D */ #define DDD7 7#define DDD6 6#define DDD5 5#define DDD4 4#define DDD3 3#define DDD2 2#define DDD0 0/* Input Pins, Port D */#define PIND7 7#define PIND6 6#define PIND5 5#define PIND4 4#define PIND3 3#define PIND2 2#define PIND1 1#define PIND0 0/* SPI Control Register */ #define SPIE 7#define SPE 6#define DORD 5#define MSTR 4#define CPOL 3#define CPHA 2#define SPR1 1#define SPR0 0/* SPI Status Register */#define SPIF 7#define WCOL 6#define SPI2X 0/* UART Status Register */ #define RXC 7#define TXC 6#define UDRE 5#define FE 4#define DOR 3#define PE 2#define U2X 1#define MPCM 0/* UART Control Register */ #define RXCIE 7#define TXCIE 6#define RXEN 4#define TXEN 3#define UCSZ2 2#define RXB8 1#define TXB8 0/* UCSRC */#define URSEL 7#define UMSEL 6#define UPM1 5#define UPM0 4#define USBS 3#define UCSZ1 2#define UCSZ0 1#define UCPOL 0/* Analog Comparator Control and Status Register */ #define ACD 7#define ACBG 6#define ACO 5#define ACI 4#define ACIE 3#define ACIC 2#define ACIS1 1#define ACIS0 0/* ADC MUX */#define REFS1 7#define REFS0 6#define ADLAR 5#define MUX4 4#define MUX3 3#define MUX2 2#define MUX1 1#define MUX0 0/* ADC Control and Status Register */#define ADEN 7#define ADSC 6#define ADFR 5#define ADIE 3#define ADPS2 2#define ADPS1 1#define ADPS0 0/* TWCR 2-wire Serial Interface */ #define TWINT 7#define TWEA 6#define TWSTA 5#define TWSTO 4#define TWWC 3#define TWEN 2#define TWIE 0/* TWSR */#define TWS7 7#define TWS6 6#define TWS5 5#define TWS4 4#define TWS3 3#define TWPS1 1#define TWPS0 0/* TWAR */#define TWA6 7#define TWA5 6#define TWA4 5#define TWA3 4#define TWA2 3#define TWA1 2#define TWA0 1#define TWGCE 0/* SPMCSR */#define SPMIE 7#define RWWSB 6#define RWWSRE 4#define BLBSET 3#define PGWRT 2#define SPMEN 0#define BLB12 5#define BLB11 4#define BLB02 3#define BLB01 2/* Pointer definition */#define XL r26#define XH r27#define YL r28#define YH r29#define ZL r30#define ZH r31/* Contants */#define RAMEND 0x25F /*Last On-Chip SRAM location*/ #define XRAMEND 0x25F#define E2END 0x1FF#define FLASHEND 0x1FFF/* Interrupt Vectors Numbers */#define IT_RESET 1#define IT_INT0 2#define IT_INT1 3#define IT_TIMER2_COMP 4#define IT_TIMER2_OVF 5#define IT_TIMER1_CAPT 6#define IT_TIMER1_COMPA 7#define IT_TIMER1_COMPB 8#define IT_TIMER1_OVF 9#define IT_TIMER0_OVF 10#define IT_SPI_STC 11#define IT_USART_RXC 12#define IT_USART_UDRE 13#define IT_USART_TXC 14#define IT_ADC 15#define IT_EE_RDY 16#define IT_ANA_COMP 17#define IT_TWI 18#define IT_INT2 19#define IT_TIMER0_COMP 20 #define IT_SPM_RDY 21#endif。
16位计数器
![16位计数器](https://img.taocdn.com/s3/m/88a5eb4f69eae009581becb7.png)
16位计数器一:16位计数器的源程序:module counter16(co, q, clk, r, s, en, d);output[3:0] q;output co;input clk, r, s, en;input[3:0] d;reg[3:0] q;reg co;always @(posedge clk or posedge r)if(r)begin q=0; endelsebeginif(s)begin q=d; endelseif(en)beginq=q+1;if(q==4'b1111)begin co=1; endelsebegin co=0; endendelsebegin q=q; endendendmodule二:16位计数器的测试代码:`timescale 1ns/1ns`include "counter16.v"module tb_counter16;wire[3:0] q;wire co;reg[3:0] d;reg clk, r, s, en;counter16 tb_counter16(co, q, clk, r, s, en, d);initialbeginclk=0; r=0; s=0; en=0; d=4'b0010;#10 r=1;#20 r=0; s=1;#30 r=0; s=0; en=1;#200 r=1; s=0;#20 r=0; s=0; en=0;#30 $finish;endalways #5 clk=~clk;always #10 $display($time,,,"%b %b %b %d -<%b %d %b", r, s, en, d, q, q, co); endmodule三:Transcript显示结果:# Reading D:/altera/91/modelsim_ase/tcl/vsim/pref.tcl# Loading project mult# reading D:\altera\91\modelsim_ase\win32aloem/../modelsim.ini# Loading project counter# Compile of counter16.v was successful.# Compile of tb_counter16.v was successful.# 2 compiles, 0 failed with no errors.vsim work.tb_counter16# vsim work.tb_counter16# Loading work.tb_counter16# ** Error: (vsim-3033) E:/counter/tb_counter16.v(8): Instantiation of 'cnt16' failed. The design unit was not found.# Region: /tb_counter16# Searched libraries:# E:\counter\work# Loading work.counter16# Error loading designvsim work.tb_counter16# vsim work.tb_counter16# Loading work.tb_counter16# ** Error: (vsim-3033) E:/counter/tb_counter16.v(8): Instantiation of 'cnt16' failed. The design unit was not found.# Region: /tb_counter16# Searched libraries:# E:\counter\work# Loading work.counter16# Error loading design# Compile of tb_counter16.v was successful.# Compile of counter16.v was successful.# Compile of tb_counter16.v was successful.# 2 compiles, 0 failed with no errors.vsim work.tb_counter16# vsim work.tb_counter16# Loading work.tb_counter16# Loading work.counter16add wave sim:/tb_counter16/*run -all# 10 1 0 0 2 -<xxxx x x# 20 1 0 0 2 -<0000 0 x# 30 0 1 0 2 -<0000 0 x# 40 0 1 0 2 -<0010 2 x# 50 0 1 0 2 -<0010 2 x# 60 0 0 1 2 -<0010 2 x# 70 0 0 1 2 -<0011 3 0# 80 0 0 1 2 -<0100 4 0# 90 0 0 1 2 -<0101 5 0# 100 0 0 1 2 -<0110 6 0# 110 0 0 1 2 -<0111 7 0# 120 0 0 1 2 -<1000 8 0# 130 0 0 1 2 -<1001 9 0# 140 0 0 1 2 -<1010 10 0# 150 0 0 1 2 -<1011 11 0# 160 0 0 1 2 -<1100 12 0# 170 0 0 1 2 -<1101 13 0# 180 0 0 1 2 -<1110 14 0# 190 0 0 1 2 -<1111 15 1# 200 0 0 1 2 -<0000 0 0# 210 0 0 1 2 -<0001 1 0# 220 0 0 1 2 -<0010 2 0# 230 0 0 1 2 -<0011 3 0# 240 0 0 1 2 -<0100 4 0# 250 0 0 1 2 -<0101 5 0# 260 1 0 1 2 -<0110 6 0# 270 1 0 1 2 -<0000 0 0# 280 0 0 0 2 -<0000 0 0# 290 0 0 0 2 -<0000 0 0# 300 0 0 0 2 -<0000 0 0# ** Note: $finish : E:/counter/tb_counter16.v(18)# Time: 310 ns Iteration: 0 Instance: /tb_counter16# 1# Break in Module tb_counter16 at E:/counter/tb_counter16.v line 18 四:测试波形如下图所示:。
- 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:感谢大家的阅读,本文由我司收
集整编。
仅供参阅!。