AVR单片机(学习ing)—(四)、ATMEGA16的定时/计数器—03

发布者:虚拟现实迷最新更新时间:2017-11-21 来源: eefocus关键字:AVR单片机  ATMEGA16  定时  计数器 手机看文章 扫描二维码
随时随地手机看文章

四、ATMEGA16的定时/计数器

四—(03)、PWM测试实验

手控PWM测试实验
定时器T2通过比较寄存器OCR2后从OC2脚(PD7)输出PWM信号,从000~255共分256级,对应的输出电压为0.00~5.00V

AVR单片机(学习ing)—(四)、ATMEGA16的定时/计数器—03下面是图片~原理以前早就说过了~~不再赘述~~

AVR单片机(学习ing)—(四)、ATMEGA16的定时/计数器—03

AVR单片机(学习ing)—(四)、ATMEGA16的定时/计数器—03

然后就是程序:AVR单片机(学习ing)—(四)、ATMEGA16的定时/计数器—03

不过从现在开始使用模块化变成了~~你懂得,为的就是用起来方便~~

这里是主函数:

//------------------------------------------------------------------------------
//手控PWM测试实验
//定时器T2通过比较寄存器OCR2后从OC2脚(PD7)输出PWM信号,从000~255共分256级,对应的输出电压为0.00~5.00V
#include"ioavr.h"
#include"intrinsics.h"
#include"lcdinit.h"
#include"delayics.h"
#include"bitics.h"
//------------------------------------------------------------------------------
uchar __flash title[]={"PWM Test"};
uchar __flash test[]={" OCR2:000  0.00V"};
uchar wide;
//------------------------------------------------------------------------------
//端口初始化函数
void port_init()
{
  DDRA=0XFF;
  PORTA=0X00;
  DDRB=0XFF;
  PORTB=0X00;
 
  DDRD=0X80;
  __no_operation();
  PORTD=0X70;
}
//------------------------------------------------------------------------------
//定时器2初始化函数
void  timer2_init()
{
  TCNT2=0X01;             //TCNT2的初值为0X01
  OCR2=0XFF;              //输出比较寄存器初值为0XFF
  TCCR2=0X61;             //T2工作在相位修正PWM模式,没有预分频
}
//------------------------------------------------------------------------------
//芯片初始化函数
void device_init()
{
  port_init();
  timer2_init();
  TIMSK=0X00;
}
//------------------------------------------------------------------------------
//按键S1检测函数
void  s1_scan()
{
  if(GET_BIT(PIND,4)==0)
  {
    delay_ms(2);
    {
      if(GET_BIT(PIND,4)==0)
      {
        if(wide<255)
          wide++;
//        delay_ms(50);
        while(!GET_BIT(PIND,4));           //等待松手!!!
      }
    }
  }
}
//------------------------------------------------------------------------------
//按键S2检测函数
void  s2_scan()
{
  if(GET_BIT(PIND,5)==0)
  {
    delay_ms(2);
    if(GET_BIT(PIND,5)==0)
    {
      if(wide>0)
        wide--;
//      delay_ms(50);
      while(!GET_BIT(PIND,5));             //等待松手~~~~
    }
  }
}
//------------------------------------------------------------------------------
//main
void  main()
{
  uint voltage;
  device_init();
//  delay_ms(40);
  lcd_init(); 
  lcd_display_chars(0x80,title,8);
  lcd_display_chars(0x80+0x40,test,16);
  while(1)
  {
    s1_scan();
    s2_scan();
    lcd_display_onechar(0x80+0x40+6,(wide/100)+0x30);
    lcd_display_onechar(0x80+0x40+7,(wide0/10)+0x30);
    lcd_display_onechar(0x80+0x40+8,(wide)+0x30);
    OCR2=wide;
   
    voltage=(uint)wide;
    voltage=(voltage*196)/100;
    lcd_display_onechar(0x80+0x40+11,(voltage/100)+0x30);
    lcd_display_onechar(0x80+0x40+13,(voltage0/10)+0x30);
    lcd_display_onechar(0x80+0x40+14,(voltage)+0x30);
  }
}

LCD初始化函数:以后就一直用这个了:记住:AVR单片机(学习ing)—(四)、ATMEGA16的定时/计数器—03(我也是花了时间正好的~~当时电脑还特别不给力,真他妈的想换了~~擦,不过又让我给修复好了~~爽歪歪啊)

//------------------------------------------------------------------------------
//LCD1602的初始化程序—可调用函数
#include"ioavr.h"
#include"intrinsics.h"
#include"delayics.h"
#include"bitics.h"
//------------------------------------------------------------------------------
typedef unsigned char uchar;
typedef unsigned int  uint;
//------------------------------------------------------------------------------
//RS、RW、EN引脚输出高低电平的宏定义
#define lcd_rs_1  SET_BIT(PORTB,0)
#define lcd_rs_0  CLR_BIT(PORTB,0)
#define lcd_rw_1  SET_BIT(PORTB,1)
#define lcd_rw_0  CLR_BIT(PORTB,1)
#define lcd_en_1  SET_BIT(PORTB,2)
#define lcd_en_0  CLR_BIT(PORTB,2)
//------------------------------------------------------------------------------
#define data_port PORTA
#define busy  0x80
//------------------------------------------------------------------------------
//LCD写数据函数
void lcd_write_data(uchar dat)
{
  lcd_rs_1;
  lcd_rw_0;
  data_port=dat;
  delay_ms(1);
  lcd_en_1;
  delay_ms(1);
  lcd_en_0;
}
//------------------------------------------------------------------------------
//LCD写指令函数
void  lcd_write_command(uchar com)
{
  lcd_rs_0;
  lcd_rw_0;
  data_port=com;
  delay_ms(1);
  lcd_en_1;
  delay_ms(1);
  lcd_en_0;
}
//------------------------------------------------------------------------------
//LCD初始化函数
void lcd_init()
{
  lcd_write_command(0x01);
  delay_ms(1);
  lcd_write_command(0x38);
  delay_ms(1);
  lcd_write_command(0x0c);
  delay_ms(1);
  lcd_write_command(0x06);
  delay_ms(1);
}
//------------------------------------------------------------------------------
//LCD显示一个字节函数
void  lcd_display_onechar(uchar add,uchar dat)
{
  lcd_write_command(add);
  delay_ms(1);
  lcd_write_data(dat);
  delay_ms(1);
}
//------------------------------------------------------------------------------
//LCD显示多个字节函数
void  lcd_display_chars(uchar add,uchar __flash *s,uchar num)
{
  uchar i;
  lcd_write_command(add);
  for(i=0;i  {
    lcd_write_data(s[i]);
    delay_ms(1);
  }
}
这是调用的.h文件:

#ifndef __lcdinit_h
#define __lcdinit_h
typedef unsigned char uchar;
typedef unsigned int  uint;
//------------------------------------------------------------------------------
extern  void  lcd_write_data(uchar dat);                      //LCD写数据函数
extern  void  lcd_write_command(uchar com);                   //LCD写指令函数
extern  void  lcd_init();                                     //LCD初始化函数
extern  void  lcd_display_onechar(uchar add,uchar dat);       //LCD显示一个字节函数
void  lcd_display_chars(uchar add,uchar __flash *s,uchar num);//LCD显示多个字节函数
#endif

然后贴张图片~~看看我都用到了哪些程序模块~~

AVR单片机(学习ing)—(四)、ATMEGA16的定时/计数器—03


关键字:AVR单片机  ATMEGA16  定时  计数器 引用地址:AVR单片机(学习ing)—(四)、ATMEGA16的定时/计数器—03

上一篇:AVR单片机(学习ing)—(KZ)、电源管理及睡眠模式—01
下一篇:AVR单片机(学习ing)—(四)、ATMEGA16的定时/计数器—02

推荐阅读最新更新时间:2024-03-16 15:46

r8051xc2定时器2的用法
T2CON----定时器2控制寄存器 t2con.7---t2ps:时钟的选择 0:定时器2的clocked是1/12的振荡器频率 1:定时器2的clocked是1/24的振荡器频率 t2con.6---3fr :外部中断int3的活跃选择(也用来比较和获取信号) 0 :falling edge 1 :rising edge t2con.5---i2fr:外部中断int2的活跃选择(也用来比较和获取信号) 0 :falling edge 1 :rising edge t
[单片机]
51单片机实验——十六进制计数器
1.实验题目: 用P0.0- P0.03设计一个在0-15之间自动计数的十六进制计数器,每个数持0.2s。 代码采用SWITCH语句,利用for循环实现16进制的计数器设计。 四个IO口相连接的LED灯按照0000-1111的二进制变化顺序进行计数。 2.KEIL代码 #include reg51.h #include intrins.h sbit P00=P0^0; sbit P01=P0^1; sbit P02=P0^2; sbit P03=P0^3; void Delay200ms();//声明延时函数 void main() { int i=0; while(1) { for(i=0;i 1
[单片机]
51单片机实验——十六进制<font color='red'>计数器</font>
4. avr 定时器/计数器1 --TC1 --CTC模式输出PWM
T/C1是16位定时器/计数器,它的计数器由两个8位寄存器TCNT1H,TCNT1L构成,TCNT1H是高8位寄存器,TCNT1L是低8位寄存器。最大计算值为2的16次幂,十六进制是0xFFFF=65535. 例如:定时200ms ,晶振8MHZ,分频系数1024,计数时钟频率为8MHZ/1024=8000000HZ/1024=7812.5HZ,每个计数脉冲的周期时间为1/7812.5=0.128ms,计时200ms的计数器值为:65635-200ms/0.128ms=63972=0xF9E4 ,则TCNT1H付初值为0xF9,TCNT1L付初值为0xE4. //函数功能:实现PA口的led亮0.1S,灭0.9S #include
[单片机]
51单片机2路舵机驱动(定时器法)
#include reg52.h #define uchar unsigned char #define uint unsigned int sbit PWM1=P3^6; sbit PWM2=P3^7; uint aa; void tuoji_init() { TMOD=0x01; TH0=(65536-38)/256;//定时50us TL0=(65536-38)%6; EA=1; ET0=1; TR0=1; PWM1=1; PWM2=1; } void chudong_pwm(uchar temp1,uchar temp2) { if(aa==temp1) // 取值13-28-45(右转90度
[单片机]
MSP430单片机定时器面面观
对于MSP430 X449而言: 默认情况如下: ACLK = LFXT1 = 32768Hz, 低频时钟源 MCLK = SMCLK = default DCO = 32 x ACLK = 1048576Hz 高频时钟源 ACLK ,MCLK ,SMCLK的频率可以根据 FLL+相应的寄存器来调节 时钟源有: LFXT1CLK: 32768 HZ 即:32K XT2CLK: 4M DCOCLK: 选择AP18PF时 FN_2 1.04875M FN_3 1.08860M FN_4 1.710 FN_8 3.4M 以下引脚的复用功能如下: P1.5 : ACLK
[单片机]
MSP430单片机<font color='red'>定时</font>器面面观
xs128 双定时器PIT0和PIT1
/***************************************************************** ** 函数说明:xs128 双定时器PIT0和PIT1 ** 版 本:V1.00 ** 修 改:庞辉 芜湖联大飞思卡尔工作室 ** 修改日期:2011年09月19日 ** ** 说 明:PLL倍频到80Mhz,PB0口灯1s闪烁,PB1口灯2s闪烁 ** ** 版本更新:详见readme.txt **
[单片机]
51单片机定时器/计数器
一、80C51定时/计数器 定时/计数器是单片机系统一个重要的部件,其工作方式灵活、编程简单、使用方便,可用来实现定时控制、延时、频率测量、脉宽测量、信号发生、信号检测等。此外,定时/计数器还可作为串行通信中波特率发生器。 (二) 定时/计数器的控制寄存器 ⒈ 定时/计数器控制寄存器TCON (1) TCON.7 TF1:定时器1溢出标志位。当定时器1计满数产生溢出时,由硬件自动置TF1=1。在中断允许时,向CPU发出定时器1的中断请求,进入中断服务程序后,由硬件自动清0。在中断屏蔽时,TF1可作查询测试用,此时只能由软件清0。 (2) TCON.6 TR1:定时器1运行控制位。由软件置1或清0来启动或关闭定时器1。
[单片机]
51单片机<font color='red'>定时</font>器/<font color='red'>计数器</font>
MSP430单片机中的WDT研究
引 言   软件的可靠性一直是一个关键问题。任何使用软件的人都可能会经历计算机死机或程序跑飞的问题,这种情况在嵌入式系统中也同样存在。由于单片机的抗干扰能力有限,在工业现场的仪器仪表中,常会由于电压不稳、电弧干扰等造成死机。在水表、电表等无人看守的情况下,也会因系统遭受干扰而无法重启。为了保证系统在干扰后能自动恢复正常,看门狗定时器(Watchdog Timer)的利用是很有价值的。 1 看门狗的作用   看门狗定时器是一个计数器,基本功能是在发生软件问题和程序跑飞后使系统重新启动。看门狗计数器正常工作时自动计数,程序流程定期将其复位清零,如果系统在某处卡死或跑飞,该定时器将溢出,并将进入中断。在定时器中断中执行一些复位操作,使
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved