找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4340|回复: 2
打印 上一主题 下一主题
收起左侧

PWM控制亮度的流水灯c51程序

[复制链接]
跳转到指定楼层
楼主
ID:91350 发表于 2015-10-1 00:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


#include <Reg52.h>

//--重定义函数变量--//
#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long
       
/* 定义常量 */
#define FOSC 12000000L                //主时钟
#define T50us (65536-FOSC/12/1000000*50)        //12T 模式下,50us 时间的计算方法
#define T10ms (65536-FOSC/12/1000*10)                //12T 模式下,10ms 时间的计算方法

//--定义全局变量--//
uchar uTime1 = 0;                //脉冲宽度数值
uchar uMove = 0;                //移动标志
uchar uCount = 0;                //每 10ms 计数值
uchar LightLevel[8] = {64,32,16,8,4,2,1,0};//亮度级别表:PWM的脉冲宽度
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
uchar code DIG_CODE[16]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,
                         0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71};

void TimeConfig();

void main(void)
{
        TimeConfig();
        while(1)
        {
                uchar Led = 0x00;                //当前点亮的Led的值
                uchar i = 0;
       
                if (uCount >= 10)
                {
                        uCount = 0;
                        uMove++;
                }

                uTime1 %= 64;
                uMove %= 8;
                for(i = 0; i < 8; i++)
                {
                        if (uTime1 < LightLevel[(i+uMove)%8])       
                                Led |= 0x01 << i;
                        else
                                Led &= ~(0x01 << i);
                }
                P0 = Led;
        }
}

void TimeConfig()
{
        TMOD = 0x11;                //设置定时计数器0和定时计数器1工作模式1

        //--定时器0赋初始值,12MHZ下定时10ms--//  
        TL0 = T10ms;
        TH0 = T10ms >> 8;

        //--定时器1赋初始值,12MHZ下定时50us--//  
        TL1 = T50us;
        TH1 = T50us >> 8;

        TF0 = 0;                //清除TF0标志
        ET0 = 1;                //开启定时器0中断

        TF1 = 0;                //清除TF1标志
        ET1 = 1;                //开启定时器1中断
       
        EA  = 1;
        TR0 = 1;                //开启定时器 0       
        TR1 = 1;                //开启定时器        1
}

void Time0(void) interrupt 1    //0:外部中断1; 1:定时器0中断; 2:外部中断2; 3:定时器1中断; 4:串口中断
{
        TL0 = T10ms;  //重新赋初值
        TH0 = T10ms >> 8;
       
        uCount++;
}

void Time1(void) interrupt 3    //0:外部中断1; 1:定时器0中断; 2:外部中断2; 3:定时器1中断; 4:串口中断
{
        TL1 = T50us;  //重新赋初值
        TH1 = T50us >> 8;
       
        uTime1++;
}



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:54731 发表于 2015-10-1 11:18 | 只看该作者
谢谢楼主:资料很不错的,分享是一种美德
回复

使用道具 举报

板凳
ID:643751 发表于 2020-2-18 21:34 | 只看该作者
虽然有一些代码没看懂 不过看了个大体流程 等彻底学完C之后再来看
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表