圣龙扬特-AVR电子

标题: BASCOM例子:按0-99增加显示并输出相应占空比PWM [打印本页]

作者: 铜河    时间: 2013-2-28 19:57
标题: BASCOM例子:按0-99增加显示并输出相应占空比PWM
'////////////////////////////////////////////////////////
'/// 目    的:LED上显示0-99的百分数,按秒加1递增,   ///
'///           从OC1A输出相应占空比为0-99%的PWM信号   ///
'/// 实 验 板:M16/32精品板V3.0                       ///
'/// 编 译 器:BASCOM-1.11.8.2                        ///
'/// 文 件 名:BCD-PWM2.BAS                           ///
'/// 日    期:2006年11月2日                          ///
'/// 作    者:铜河                                   ///
'/// 编译情况:通过,364 words                         ///
'/// 联线情况:J46-12,J17-12,波形输出PD5            ///
'////////////////////////////////////////////////////////
$regfile "m16def.dat"                                       '使用CPU为M16
$crystal = 7372800                                          '晶体频率

Config Timer0 = Timer , Prescale = 1024                     'T0用于定时,分频系数为1024,产生1秒信号
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Prescale = 8       'T1用于产生PWM,8位精度,常规
Config Timer2 = Timer , Async = Off , Prescale = 64         'T2用于扫描显示,时间2MS

On Ovf0 Tim0_isr                                            '声明Timer0中断
On Ovf2 Tim2_isr                                            '声明Timer2中断

Enable Ovf0                                                 '允许定时器0中断
Enable Ovf2                                                 '允许定时器2中断
Enable Interrupts                                           '允许全局中断
Start Timer0                                                '启动Timer0
Start Timer1                                                '启动Timer1
Start Timer2                                                '启动Timer2

Ddrd = &B00110000                                           '定义PWM口为输出端
Ddrc = 255                                                  '定义接LED的C口为输出
Ddrb = Ddrb Or &B11000000                                   '定义位扫描控制为输出

Dim A As Byte , B As Byte , I As Byte , E As Byte           '定义BCD变化数据,A为十位,B为个位
Dim A1 As Byte , B1 As Byte
Dim C As Word , D As Word                                   '定义转换变量及计时参数
Dim M As Bit                                                '定义PWM变化标志位
Dim N As Bit                                                '定义扫描显示标志
Dim S(3) As Byte                                            '定义扫描显示的位数据
Dim X(16) As Byte                                           '定义LED显示字符表

Restore Daima
   For I = 0 To 15
      Read X(i)
   Next I

A = 0                                                       '初始值为0
B = 0
M = 1
Set N

Do
   If M = 1 Then                                            '如果M=1,表示0-99有变化
      Reset M                                               'M清0,等待下一次变化
      S(1) = X(b)                                           '查个位显示码
      S(2) = X(a)                                           '查十位显示码
      C = A * 10
      C = C + B                                             '将2位0-99的百分比BCD码转换为一字节数
      D = C * 255
      D = D / 100
      Pwm1a = D                                             '转换后的数据从PWM输出
   End If
Loop

'//////////////定时器0中断服务程序///////////////
Tim0_isr:                                                   'timer0中断服务
   Load Timer0 , 125                                        '重装初值
   If E >= 50 Then                                          '软件计数到40为1秒
      E = 0
      Set M                                                 '置数据变化标志
      B = B + 1                                             '每秒占空比增加1
      If B >= 10 Then
         B = 0
         A = A + 1                                          '十进制进位
         If A >= 10 Then A = 0
      End If
   End If
      E = E + 1
Return                                                      '中断服务程序结束

'//////////////定时器2中断服务程序//////////////
Tim2_isr:                                                   'timer2比较匹配中断服务
   Load Timer2 , 250
   If N = 0 Then
      Portc = S(1)
      Set Portb.7 : Reset Portb.6                           '显示个位
      Set N
   Else
      Portc = S(2)
      Reset Portb.7 : Set Portb.6                           '显示十位
      Reset N
   End If
Return                                                      '中断服务程序结束

'///////////////LED数码管显示代码///////////////
Daima:
   Data &HC0 , &HF9 , &HA4 , &HB0 , &H99 , &H92 , &H82 , &HF8
   Data &H80 , &H90 , &H88 , &H83 , &HC6 , &HA1 , &H86 , &H8E
作者: 箫天    时间: 2013-3-5 10:02
这个很实用,顶你:D
作者: 多啦A梦    时间: 2013-3-18 23:32
预留!都是高手啊!!羡慕




欢迎光临 圣龙扬特-AVR电子 (http://avr.cnta.net/) Powered by Discuz! X2.5