bh组件之日期选择器

bh组件

bhTimePicker

 e.fn.bhTimePicker = function(t, a) {
        var n;
        return n = this.data("bhTimePicker"),
        n ? !0 === t ? n : "string" === e.type(t) ? n[t](a) : this : this.each(function() {
            return e(this).data("bhTimePicker", new R(this,t))
        })
    }

对外开放接口

R = function() {
        function a(a, n) {
            var i = {
                defaultType: "custom",
                width: "",
                isFixTime: !1,
                format: "YYYY-MM-DD",
                range: {
                    max: "",
                    min: ""
                },
                time: {
                    start: "",
                    end: ""
                },
                isDisable: !1,
                selectedTime: null,
                ready: null
            };
            this.settings = e.extend({}, i, n),
            this.settings.format && (this.settings.format = this.settings.format.replace("yyyy", "YYYY"),
            this.settings.format = this.settings.format.replace("-dd", "-DD")),
            this.$rootElement = e(a),
            t(this)
        }
        return a.prototype.getValue = function() {
            var e = null
              , t = null
              , a = this.startTimeDom.children("input")
              , n = this.endTimeDom.children("input");
            a.attr("disabled") || (e = a.data("DateTimePicker").date() ? a.data("DateTimePicker").date()._d : ""),
            n.attr("disabled") || (t = n.data("DateTimePicker").date() ? n.data("DateTimePicker").date()._d : "");
            var i = this.popupBoxDom.find('div[bh-time-picker-role="selectType"]').jqxDropDownList("getSelectedItem")
              , o = i.value;
            return 10 === this.settings.format.length && this.settings.isFixTime ? {
                startTime: e ? moment(e).format(this.settings.format) + " 00:00:00" : "",
                endTime: t ? moment(t).format(this.settings.format) + " 23:59:59" : "",
                type: o
            } : {
                startTime: e ? moment(e).format(this.settings.format) : "",
                endTime: t ? moment(t).format(this.settings.format) : "",
                type: o
            }
        }
        ,
        a.prototype.setValue = function(e) {
            v(this, e.startTime ? $(e.startTime) : this.startTimeDom.children("input").data("DateTimePicker").date()._d, e.endTime ? $(e.endTime) : this.endTimeDom.children("input").data("DateTimePicker").date()._d),
            B(this, this.popupBoxDom.find('div[bh-time-picker-role="selectCustom"]'))
        }
        ,
        a.prototype.setDisable = function() {
            this.$rootElement.children('div[bh-time-picker-role="rangeBox"]').append('<div class="bh-timePick-disable" bh-time-picker-role="disableBlock"></div>')
        }
        ,
        a.prototype.setEnable = function() {
            this.$rootElement.find('div[bh-time-picker-role="disableBlock"]').remove()
        }
        ,
        a.prototype.setType = function(e) {
            this.popupBoxDom.find('div[bh-time-picker-role="selectType"]').jqxDropDownList("selectItem", e)
        }
        ,
        a.prototype.remove = function() {
            this.$selectType.jqxDropDownList("destroy"),
            this.popupBoxDom.remove(),
            this.$rootElement.remove()
        }
        ,
        a
    }(),

 全部源码

function(e) {
    "use strict";
    function t(t) {
        var i = new Date
          , o = a(t, i)
          , s = e(o);
        t.rangeBoxDom = s,
        t.$rootElement.html(s),
        r(s, t);
        var l = n(t, i)
          , h = e(l);
        t.popupBoxDom = h;
        var u = e("body");
        u.append(h),
        c(t, i),
        d(t),
        u.on("click", function(a) {
            var n = e(a.target || a.srcElement);
            if (n.closest('div[bh-time-picker-role="rangeBox"]').length > 0 || n.closest('div[bh-time-picker-role="selectBoxCont"]').length > 0 || n.closest("div.jqx-calendar").length > 0 || n.closest("div.jqx-listbox").length > 0)
                return void u.removeData("bhTimePick");
            var i = t.rangeBoxDom;
            if (i.hasClass("bh-active")) {
                if (u.data("bhTimePick"))
                    return void u.removeData("bhTimePick");
                i.find('div[bh-time-picker-role="rangeBoxSelectTime"]').click()
            }
        })
    }
    function a(e, t) {
        var a, n;
        a = e.settings.time.start && "today" !== e.settings.time.start ? $(e.settings.time.start) : t,
        n = e.settings.time.end && "today" !== e.settings.time.end ? $(e.settings.time.end) : t;
        var i = P(a, e)
          , o = P(n, e)
          , r = i + "-" + o
          , s = "";
        e.settings.width && (s = "width: " + parseInt(e.settings.width, 10) + "px;");
        var l = "";
        return e.settings.isDisable && (l = '<div class="bh-timePick-disable" bh-time-picker-role="disableBlock"></div>'),
        '<div class="bh-timePicker-rangeBox bh-clearfix" bh-time-picker-role="rangeBox" style="' + s + '"><div class="bh-timePicker-rangeBox-selectIcon bh-left" bh-time-picker-role="rangeBoxPre">&lt;</div><div class="bh-timePicker-rangeBox-time" bh-time-picker-role="rangeBoxSelectTime">' + r + '</div><div class="bh-timePicker-rangeBox-selectIcon bh-right" bh-time-picker-role="rangeBoxNext">&gt;</div>' + l + '</div><div class="bh-clearfix"></div>'
    }
    function n(t, a) {
        var n = o(t, a)
          , r = 0
          , s = a.getFullYear()
          , l = t.settings.range.max && "today" !== t.settings.range.max ? $(t.settings.range.max).getFullYear() : s
          , d = t.settings.range.min && "today" !== t.settings.range.min ? $(t.settings.range.min).getFullYear() : s
          , c = t.settings.range.max && s >= l
          , h = t.settings.range.min && s <= d;
        return r = l,
        r > s && (r = s),
        '<div class="bh-timePick-selectBoxCont" bh-time-picker-role="selectBoxCont"><div class="bh-timePick-selectBox bh-card bh-card-lv2" bh-time-picker-role="selectBox"><ul class="bh-timePick-tab" bh-time-picker-role="selectTab"><li class="bh-timePick-tabItem bh-active">' + e.i18n("bha-ticker2-customSelection") + '</li><li class="bh-timePick-tabItem">' + e.i18n("bha-ticker2-chooseMonthly") + '</li></ul><div class="bh-timePick-tabContent" bh-time-picker-role="selectTabContent"><div class="bh-timePick-custom bh-active"><div class="bh-timePick-customTime bh-clearfix" bh-time-picker-role="selectCustom"><div class="bh-timePick-selectType" bh-time-picker-role="selectType"></div><div class="bhtc-input-group" bh-time-picker-role="selectStart">' + i() + '</div><div class="bh-timePick-selectConnect"></div><div class="bhtc-input-group" bh-time-picker-role="selectEnd">' + i() + '</div></div><a class="bh-btn bh-btn-primary bh-btn-block" bh-time-picker-role="selectOk" href="javascript:void(0);">' + e.i18n("bha-ticker2-confirm") + '</a></div><div class="bh-timePick-selectMonthCont" bh-time-picker-role="selectMonthBlock"><div class="bh-timePick-selectMonth bh-timePicker-rangeBox bh-clearfix"><div class="bh-timePicker-rangeBox-selectIcon bh-left ' + (h ? "bh-disabled" : "") + '" bh-time-picker-role="selectMonthPre">&lt;</div><div class="bh-timePicker-rangeBox-time" bh-time-picker-role="selectMonthYear">' + r + e.i18n("bha-ticker2-year") + '</div><div class="bh-timePicker-rangeBox-selectIcon bh-right ' + (c ? "bh-disabled" : "") + '" bh-time-picker-role="selectMonthNext">&gt;</div></div><div class="bh-timePicker-selectMonthList bh-clearfix" bh-time-picker-role="selectMonthList">' + n + "</div></div></div></div></div>"
    }
    function i() {
        return '<input type="text" class="bh-form-control"/><span class="bhtc-input-group-addon"><i class="iconfont icon-daterange"></i></span>'
    }
    function o(t, a, n) {
        var i = ""
          , o = a.getFullYear()
          , r = 0
          , s = 0
          , l = 0
          , d = 0;
        if (t.settings.range.max)
            if ("today" !== t.settings.range.max) {
                var c = $(t.settings.range.max);
                r = c.getFullYear(),
                s = c.getMonth()
            } else {
                var h = new Date;
                r = h.getFullYear(),
                s = h.getMonth()
            }
        if (t.settings.range.min)
            if ("today" !== t.settings.range.min) {
                var u = $(t.settings.range.min);
                l = u.getFullYear(),
                d = u.getMonth()
            } else {
                var h = new Date;
                l = h.getFullYear(),
                d = h.getMonth()
            }
        for (var p = 0; p < 12; p++) {
            var f = p + 1
              , b = "";
            r && l ? l !== r ? l < o && o < r ? b = "bh-pre" : l === o ? p >= d && (b = "bh-pre") : o === r && p <= s && (b = "bh-pre") : d <= p && p <= s && (b = "bh-pre") : r ? r > o ? b = "bh-pre" : p <= s && (b = "bh-pre") : l ? l < o ? b = "bh-pre" : p >= d && (b = "bh-pre") : b = "bh-pre",
            "en" === e.i18n().locale ? i += '<div class="bh-timePick-monthItem ' + b + '" data-month="' + f + '" bh-time-picker-role="selectMonthItem">' + e.i18n("bha-ticker1-month" + f) + "</div>" : i += '<div class="bh-timePick-monthItem ' + b + '" data-month="' + f + '" bh-time-picker-role="selectMonthItem">' + f + e.i18n("bha-ticker1-month") + "</div>"
        }
        return i
    }
    function r(t, a) {
        t.on("click", function(n) {
            switch (a.$rootElement.removeData("selectType"),
            e(n.target || n.srcElement).attr("bh-time-picker-role")) {
            case "rangeBoxPre":
                L("pre", a);
                break;
            case "rangeBoxNext":
                L("next", a);
                break;
            case "rangeBoxSelectTime":
                s(a, t)
            }
        })
    }
    function s(t, a) {
        var n = t.popupBoxDom
          , i = n.children('div[bh-time-picker-role="selectBox"]');
        if (a.hasClass("bh-active"))
            l(t);
        else {
            var o = BH_UTILS.getElementPosition(a)
              , r = {
                top: o.bottom,
                left: o.left + 20,
                display: "block"
            }
              , s = 0;
            e("body").find(".jqx-window").each(function() {
                var t = parseInt(e(this).css("z-index"), 10);
                t > s && (s = t)
            }),
            s > 9999 && (r["z-index"] = s),
            n.css(r),
            a.addClass("bh-active"),
            setTimeout(function() {
                i.addClass("bh-active")
            }, 10)
        }
    }
    function l(e) {
        var t = e.popupBoxDom
          , a = t.children('div[bh-time-picker-role="selectBox"]');
        a.find('div[bh-time-picker-role="rangeBoxSelectTime"]').click(),
        a.removeClass("bh-active"),
        setTimeout(function() {
            t.hide()
        }, 450),
        e.rangeBoxDom.removeClass("bh-active")
    }
    function d(t) {
        t.popupBoxDom.on("click", ".bh-timePick-tabItem", function() {
            var a = e(this);
            if (!a.hasClass("bh-active")) {
                var n = a.index();
                a.closest("ul").find("li").removeClass("bh-active"),
                a.addClass("bh-active");
                var i = t.popupBoxDom.children('div[bh-time-picker-role="selectBox"]').children('div[bh-time-picker-role="selectTabContent"]').children();
                i.removeClass("bh-active"),
                i.eq(n).addClass("bh-active")
            }
        });
        var a = t.popupBoxDom.find('div[bh-time-picker-role="selectCustom"]')
          , n = a.children('div[bh-time-picker-role="selectStart"]').children("input")
          , i = a.children('div[bh-time-picker-role="selectEnd"]').children("input")
          , o = a.find('div[bh-time-picker-role="selectType"]');
        n.on("dp.change", function(e) {
            B(t, a),
            A(a, "start", t)
        }),
        i.on("dp.change", function(e) {
            B(t, a),
            A(a, "end", t)
        }),
        n.on("mouseover", function(e) {
            t.$rootElement.removeData("selectType")
        }),
        i.on("mouseover", function(e) {
            t.$rootElement.removeData("selectType")
        }),
        o.on("change", function(e) {
            var a = e.args;
            if (a) {
                var n = a.item.value;
                t.$rootElement.data("selectType", n),
                p({
                    value: n
                }, t)
            }
        }),
        t.popupBoxDom.on("click", '[bh-time-picker-role="selectOk"]', function() {
            var e = n.data("DateTimePicker").date() ? n.data("DateTimePicker").date()._d : ""
              , o = i.data("DateTimePicker").date() ? i.data("DateTimePicker").date()._d : ""
              , r = t.getValue()
              , s = r.startTime
              , d = r.endTime;
            S(t, e, o),
            l(t);
            var c = a.find('div[bh-time-picker-role="selectType"]').jqxDropDownList("getSelectedItem").value;
            t.$rootElement.trigger("selectedTime", [s, d, c]),
            void 0 !== t.settings.selectedTime && t.settings.selectedTime instanceof Function && t.settings.selectedTime(s, d, c)
        }),
        t.popupBoxDom.on("click", '[bh-time-picker-role="selectMonthPre"]', function() {
            e(this).hasClass("bh-disabled") || D(e(this).closest('div[bh-time-picker-role="selectMonthBlock"]'), "pre", t)
        }),
        t.popupBoxDom.on("click", '[bh-time-picker-role="selectMonthNext"]', function() {
            e(this).hasClass("bh-disabled") || D(e(this).closest('div[bh-time-picker-role="selectMonthBlock"]'), "next", t)
        }),
        t.popupBoxDom.on("click", '[bh-time-picker-role="selectMonthItem"]', function() {
            I(e(this), t)
        })
    }
    function c(e, t) {
        var a = e.popupBoxDom.find('div[bh-time-picker-role="selectCustom"]')
          , n = a.find('div[bh-time-picker-role="selectType"]')
          , i = a.find('div[bh-time-picker-role="selectStart"]')
          , o = a.find('div[bh-time-picker-role="selectEnd"]');
        e.startTimeDom = i,
        e.endTimeDom = o,
        e.$selectType = n,
        h(n, e),
        u(i, t, "start", e),
        u(o, t, "end", e),
        p({
            value: e.settings.defaultType
        }, e)
    }
    function h(t, a) {
        var n = [{
            name: e.i18n("bha-ticker2-custom"),
            value: "custom"
        }, {
            name: e.i18n("bha-ticker2-all"),
            value: "all"
        }, {
            name: e.i18n("bha-ticker2-startEmpty"),
            value: "startEmpty"
        }, {
            name: e.i18n("bha-ticker2-endEmpty"),
            value: "endEmpty"
        }, {
            name: e.i18n("bha-ticker2-today"),
            value: "today"
        }, {
            name: e.i18n("bha-ticker2-currentWeek"),
            value: "currentWeek"
        }, {
            name: e.i18n("bha-ticker2-lastWeek"),
            value: "lastWeek"
        }, {
            name: e.i18n("bha-ticker2-currentMonth"),
            value: "currentMonth"
        }, {
            name: e.i18n("bha-ticker2-lastMonth"),
            value: "lastMonth"
        }, {
            name: e.i18n("bha-ticker2-currentQuarter"),
            value: "currentQuarter"
        }, {
            name: e.i18n("bha-ticker2-lastQuarter"),
            value: "lastQuarter"
        }, {
            name: e.i18n("bha-ticker2-currentYear"),
            value: "currentYear"
        }, {
            name: e.i18n("bha-ticker2-lastYear"),
            value: "lastYear"
        }, {
            name: e.i18n("bha-ticker2-last7Day"),
            value: "last7Day"
        }, {
            name: e.i18n("bha-ticker2-last30Day"),
            value: "last30Day"
        }]
          , i = 0;
        e.grep(n, function(e, t) {
            if (a.settings.defaultType === e.value)
                return i = t,
                !0
        }),
        a.settings.format && a.settings.format.match(/MM$/) && (n = n.filter(function(e) {
            return -1 === ["today", "currentWeek", "lastWeek"].indexOf(e.value)
        })),
        t.jqxDropDownList({
            width: "80px",
            source: n,
            selectedIndex: i,
            autoDropDownHeight: !0,
            valueMember: "value",
            displayMember: "name"
        })
    }
    function u(e, t, a, n) {
        var i;
        i = "start" === a ? n.settings.time.start && "today" !== n.settings.time.start ? $(n.settings.time.start) : t : n.settings.time.end && "today" !== n.settings.time.end ? $(n.settings.time.end) : t;
        var o = n.settings && n.settings.range && n.settings.range.max
          , r = n.settings && n.settings.range && n.settings.range.min;
        e.children("input").datetimepicker({
            format: n.settings.format,
            maxDate: !!o && new Date(o),
            minDate: !!r && new Date(o),
            defaultDate: i
        })
    }
    function p(e, t) {
        var a = new Date
          , n = m(a)
          , i = 0
          , o = 0;
        switch (e.value) {
        case "custom":
            var r = t.settings.time.start;
            i = r && "today" !== r ? $(r) : a;
            var s = t.settings.time.end;
            o = s && "today" !== s ? $(s) : a;
            break;
        case "all":
            i = null,
            o = null;
            break;
        case "startEmpty":
            i = null;
            var s = t.settings.time.end;
            o = s && "today" !== s ? $(s) : a;
            break;
        case "endEmpty":
            var r = t.settings.time.start;
            i = r && "today" !== r ? $(r) : a,
            o = null;
            break;
        case "today":
            i = f(),
            o = b();
            break;
        case "currentWeek":
            i = f(n.time - 864e5 * (n.week - 1)),
            o = b(n.time + 864e5 * (7 - n.week));
            break;
        case "lastWeek":
            var l = n.time - 864e5 * (n.week - 1);
            i = f(l - 6048e5),
            o = b(l - 864e5);
            break;
        case "currentMonth":
            i = f(n.time - 864e5 * (n.day - 1)),
            o = b(g());
            break;
        case "lastMonth":
            var d = k(n);
            i = d.startTime,
            o = d.endTime;
            break;
        case "currentQuarter":
            var c = x(n);
            i = c.startTime,
            o = c.endTime;
            break;
        case "lastQuarter":
            var h = T(n);
            i = h.startTime,
            o = h.endTime;
            break;
        case "currentYear":
            i = $(n.year + "/1/1"),
            o = $(n.year + "/12/31 23:59:59");
            break;
        case "lastYear":
            i = $(parseInt(n.year - 1) + "/1/1"),
            o = $(parseInt(n.year - 1) + "/12/31 23:59:59");
            break;
        case "last7Day":
            i = new Date(n.time - 6048e5),
            o = a;
            break;
        case "last30Day":
            i = new Date(n.time - 2592e6),
            o = a
        }
        v(t, i, o)
    }
    function f(e) {
        return e ? new Date(new Date(new Date(e).toLocaleDateString()).getTime()) : new Date(new Date((new Date).toLocaleDateString()).getTime())
    }
    function b(e) {
        return e ? new Date(new Date(new Date(e).toLocaleDateString()).getTime() + 864e5 - 1) : new Date(new Date((new Date).toLocaleDateString()).getTime() + 864e5 - 1)
    }
    function g(e) {
        if (e)
            var t = new Date(e);
        else
            var t = new Date;
        var a = t.getMonth()
          , n = ++a
          , i = new Date(t.getFullYear(),n,1)
          , o = new Date(i - 864e5)
          , r = parseInt(o.getMonth() + 1)
          , s = o.getDate();
        return r < 10 && (r = "0" + r),
        s < 10 && (s = "0" + s),
        t.getFullYear() + "-" + r + "-" + s
    }
    function v(e, t, a, n) {
        var i = e.popupBoxDom.find('div[bh-time-picker-role="selectCustom"]')
          , o = i.children('div[bh-time-picker-role="selectStart"]').children("input")
          , r = i.children('div[bh-time-picker-role="selectEnd"]').children("input")
          , s = r.data("DateTimePicker").date() ? r.data("DateTimePicker").date()._d : ""
          , l = e.$rootElement.find('div[bh-time-picker-role="rangeBoxSelectTime"]')
          , d = e.popupBoxDom.find('div[bh-time-picker-role="selectCustom"] div[bh-time-picker-role="selectType"]')
          , c = d.jqxDropDownList("getSelectedItem");
        if (!(t && a || (null === t ? (o.attr("disabled", !0),
        o.data("DateTimePicker").disable()) : (o.removeAttr("disabled"),
        o.data("DateTimePicker").enable()),
        null === a ? (r.attr("disabled", !0),
        r.data("DateTimePicker").disable()) : (r.removeAttr("disabled"),
        r.data("DateTimePicker").enable()),
        t || a || "all" !== c.value)))
            return void l.html(c.label);
        o.attr("disabled") && (o.removeAttr("disabled"),
        o.data("DateTimePicker").enable()),
        r.attr("disabled") && (r.removeAttr("disabled"),
        r.data("DateTimePicker").enable()),
        "startEmpty" === c.value || "endEmpty" === c.value ? "startEmpty" === c.value ? (t = "",
        o.attr("disabled", !0),
        o.data("DateTimePicker").disable()) : "endEmpty" === c.value && (a = "",
        r.attr("disabled", !0),
        r.data("DateTimePicker").disable()) : (a = a || new Date,
        t = t || new Date),
        e.settings.time.start = t,
        e.settings.time.end = a,
        "startEmpty" === c.value || "endEmpty" === c.value ? (r.data("DateTimePicker").date(a),
        o.data("DateTimePicker").date(t)) : t > s ? (r.data("DateTimePicker").date(a),
        o.data("DateTimePicker").date(t)) : (o.data("DateTimePicker").date(t),
        r.data("DateTimePicker").date(a));
        var h = o.data("DateTimePicker").date() ? o.data("DateTimePicker").date()._d : ""
          , u = r.data("DateTimePicker").date() ? r.data("DateTimePicker").date()._d : ""
          , p = e.getValue()
          , f = p.startTime
          , b = p.endTime;
        if (S(e, h, u),
        n) {
            var g = i.find('div[bh-time-picker-role="selectType"]').jqxDropDownList("getSelectedItem").value;
            e.$rootElement.trigger("selectedTime", [f, b, g]),
            void 0 !== e.settings.selectedTime && e.settings.selectedTime instanceof Function && e.settings.selectedTime(f, b, g)
        }
    }
    function m(e) {
        var t = new Date(e)
          , a = {};
        return a.year = t.getFullYear(),
        a.month = t.getMonth(),
        a.day = t.getDate(),
        a.hour = t.getHours(),
        a.minute = t.getMinutes(),
        a.second = t.getSeconds(),
        a.week = t.getDay(),
        a.time = t.getTime(),
        a
    }
    function y(e) {
        return 0 == e % 4 && (e % 100 != 0 || e % 400 == 0)
    }
    function k(e) {
        var t = e.month
          , a = e.year
          , n = t - 1;
        0 === t && (a -= 1,
        n = 11);
        var i = w(a, n + 1)
          , o = new Date(C({
            year: a,
            month: n + 1,
            day: 1
        }))
          , r = C({
            year: a,
            month: n + 1,
            day: i
        });
        return {
            startTime: o,
            endTime: new Date(new Date(r).getTime() + 864e5 - 1)
        }
    }
    function C(e) {
        return e.year + "/" + e.month + "/" + e.day
    }
    function w(e, t) {
        return 1 === t || 3 === t || 5 === t || 7 === t || 8 === t || 10 === t || 12 === t ? 31 : 4 === t || 6 === t || 9 === t || 11 === t ? 30 : y(e) ? 29 : 28
    }
    function x(e) {
        var t = N(e.month)
          , a = new Date(C({
            year: e.year,
            month: t.startMonth + 1,
            day: 1
        }))
          , n = w(e.year, t.endMonth + 1)
          , i = C({
            year: e.year,
            month: t.endMonth + 1,
            day: n
        });
        return {
            startTime: a,
            endTime: new Date(new Date(i).getTime() + 864e5 - 1)
        }
    }
    function T(e) {
        var t = N(e.month).startMonth
          , a = t - 1
          , n = e.year;
        0 === t && (a = 11,
        n -= 1);
        var i = N(a)
          , o = w(n, i.endMonth + 1)
          , r = new Date(C({
            year: n,
            month: i.startMonth + 1,
            day: 1
        }))
          , s = C({
            year: n,
            month: i.endMonth + 1,
            day: o
        });
        return {
            startTime: r,
            endTime: new Date(new Date(s).getTime() + 864e5 - 1)
        }
    }
    function N(e) {
        var t = 0
          , a = 2;
        return e >= 9 ? (t = 9,
        a = 11) : e >= 6 ? (t = 6,
        a = 8) : e >= 3 && (t = 3,
        a = 5),
        {
            startMonth: t,
            endMonth: a
        }
    }
    function D(t, a, n) {
        var i = t.find('[bh-time-picker-role="selectMonthPre"]').removeClass("bh-disabled")
          , r = t.find('[bh-time-picker-role="selectMonthNext"]').removeClass("bh-disabled")
          , s = t.find('div[bh-time-picker-role="selectMonthYear"]')
          , l = parseInt(s.text(), 10)
          , d = 0;
        n.settings.range.max && (d = "today" === n.settings.range.max ? (new Date).getFullYear() : new Date(n.settings.range.max).getFullYear());
        var c = 0;
        n.settings.range.min && (c = "today" === n.settings.range.min ? (new Date).getFullYear() : new Date(n.settings.range.min).getFullYear()),
        "pre" === a ? l-- : l++,
        s.html(l + e.i18n("bha-ticker2-year"));
        var h = o(n, $(l + "/12/1"), a);
        t.find('div[bh-time-picker-role="selectMonthList"]').html(h),
        "pre" === a ? l === c && i.addClass("bh-disabled") : l === d && r.addClass("bh-disabled")
    }
    function I(e, t) {
        if (e.hasClass("bh-pre")) {
            var a = e.closest('div[bh-time-picker-role="selectMonthBlock"]')
              , n = parseInt(a.find('div[bh-time-picker-role="selectMonthYear"]').text(), 10)
              , i = parseInt(e.attr("data-month"), 10)
              , o = w(n, i);
            t.$rootElement.removeData("selectType"),
            t.rangeBoxDom.find('div[bh-time-picker-role="rangeBoxSelectTime"]').click(),
            t.$rootElement.data("selectType", "custom"),
            v(t, new Date(n + "/" + i + "/1"), new Date(n + "/" + i + "/" + o), !0)
        }
    }
    function S(e, t, a) {
        var n = e.$rootElement.find('div[bh-time-picker-role="rangeBoxSelectTime"]')
          , i = e.popupBoxDom.find('div[bh-time-picker-role="selectCustom"] div[bh-time-picker-role="selectType"]')
          , o = i.jqxDropDownList("getSelectedItem");
        if ("all" === o.value)
            return void n.html(o.label);
        var r = "startEmpty" !== o.value ? P(t, e) : ""
          , s = "endEmpty" !== o.value ? P(a, e) : "";
        n.html(r + "-" + s)
    }
    function P(t, a) {
        return t ? /dd/i.test(a.settings.format) ? t.getFullYear() + e.i18n("bha-ticker2-Y") + E(t.getMonth() + 1) + e.i18n("bha-ticker2-M") + t.getDate() + e.i18n("bha-ticker2-D") : t.getFullYear() + e.i18n("bha-ticker2-year") + E(t.getMonth() + 1) + e.i18n("bha-ticker2-month") : ""
    }
    function E(e) {
        return e < 10 ? "0" + e : e
    }
    function B(e, t) {
        var a = e.$rootElement.data("selectType");
        "custom" !== a && void 0 !== a || t.find('div[bh-time-picker-role="selectType"]').jqxDropDownList("selectIndex", 0)
    }
    function A(t, a, n) {
        e("body").data("bhTimePick", "selectTime");
        var i = t.children('div[bh-time-picker-role="selectStart"]').children("input")
          , o = t.children('div[bh-time-picker-role="selectEnd"]').children("input")
          , r = i.data("DateTimePicker").date() ? i.data("DateTimePicker").date()._d : ""
          , s = o.data("DateTimePicker").date() ? o.data("DateTimePicker").date()._d : "";
        if (r > s)
            if ("end" === a)
                s && o.data("DateTimePicker").date(r);
            else {
                var l = m(s);
                i.data("DateTimePicker").date(new Date(l.year,l.month,l.day))
            }
        else if ("start" === a) {
            if (n.settings.range.min) {
                var d;
                d = "today" !== n.settings.range.min ? new Date(n.settings.range.min) : new Date,
                r < d && i.data("DateTimePicker").date(d)
            }
        } else if (n.settings.range.max) {
            var c;
            c = "today" !== n.settings.range.max ? new Date(n.settings.range.max) : new Date,
            s > c && o.data("DateTimePicker").date(c)
        }
    }
    function L(e, t) {
        var a = t.popupBoxDom.find('div[bh-time-picker-role="selectBox"]')
          , n = t.$rootElement.find('div[bh-time-picker-role="rangeBox"]');
        n.hasClass("bh-active") && n.find('div[bh-time-picker-role="rangeBoxSelectTime"]').click();
        var i;
        i = "pre" === e ? a.find('div[bh-time-picker-role="selectStart"]').children("input").data("DateTimePicker").date()._d : a.find('div[bh-time-picker-role="selectEnd"]').children("input").data("DateTimePicker").date()._d;
        var o, r = m(i);
        if ("pre" === e) {
            if (0 === r.month ? (r.month = 11,
            r.year = r.year - 1) : r.month = r.month - 1,
            t.settings.range.min) {
                var s = "today" === t.settings.range.min ? new Date : $(t.settings.range.min);
                o = m(s),
                s > new Date(i.getTime() - 2592e6) && (r = o)
            }
        } else if (11 === r.month ? (r.month = 0,
        r.year = r.year + 1) : r.month = r.month + 1,
        t.settings.range.max) {
            var l = "today" === t.settings.range.max ? new Date : $(t.settings.range.max);
            o = m(l),
            l < new Date(i.getTime() + 2592e6) && (r = o)
        }
        var d = {}
          , c = {};
        o && r.year === o.year ? r.month !== o.month ? (d = {
            year: r.year,
            month: r.month,
            day: 1
        },
        c = {
            year: r.year,
            month: r.month,
            day: w(r.year, r.month + 1)
        }) : "pre" === e ? (d = {
            year: r.year,
            month: r.month,
            day: o.day
        },
        c = {
            year: r.year,
            month: r.month,
            day: w(r.year, r.month + 1)
        }) : (d = {
            year: r.year,
            month: r.month,
            day: 1
        },
        c = {
            year: r.year,
            month: r.month,
            day: o.day
        }) : (d = {
            year: r.year,
            month: r.month,
            day: 1
        },
        c = {
            year: r.year,
            month: r.month,
            day: w(r.year, r.month + 1)
        });
        var h = r.month + 1 < 10 ? "0" + parseInt(r.month + 1, 10) : r.month + 1
          , u = d.year + "/" + h + "/" + E(d.day)
          , p = c.year + "/" + h + "/" + c.day;
        v(t, $(u), $(p), !0)
    }
    function $(e) {
        if ("string" == typeof e) {
            var t = Date.parse(e)
              , a = new Date(t);
            if (isNaN(a)) {
                var n = e.split("-");
                a = new Date(n[0],--n[1],n[2])
            }
            return a
        }
        return e
    }
    var R;
    R = function() {
        function a(a, n) {
            var i = {
                defaultType: "custom",
                width: "",
                isFixTime: !1,
                format: "YYYY-MM-DD",
                range: {
                    max: "",
                    min: ""
                },
                time: {
                    start: "",
                    end: ""
                },
                isDisable: !1,
                selectedTime: null,
                ready: null
            };
            this.settings = e.extend({}, i, n),
            this.settings.format && (this.settings.format = this.settings.format.replace("yyyy", "YYYY"),
            this.settings.format = this.settings.format.replace("-dd", "-DD")),
            this.$rootElement = e(a),
            t(this)
        }
        return a.prototype.getValue = function() {
            var e = null
              , t = null
              , a = this.startTimeDom.children("input")
              , n = this.endTimeDom.children("input");
            a.attr("disabled") || (e = a.data("DateTimePicker").date() ? a.data("DateTimePicker").date()._d : ""),
            n.attr("disabled") || (t = n.data("DateTimePicker").date() ? n.data("DateTimePicker").date()._d : "");
            var i = this.popupBoxDom.find('div[bh-time-picker-role="selectType"]').jqxDropDownList("getSelectedItem")
              , o = i.value;
            return 10 === this.settings.format.length && this.settings.isFixTime ? {
                startTime: e ? moment(e).format(this.settings.format) + " 00:00:00" : "",
                endTime: t ? moment(t).format(this.settings.format) + " 23:59:59" : "",
                type: o
            } : {
                startTime: e ? moment(e).format(this.settings.format) : "",
                endTime: t ? moment(t).format(this.settings.format) : "",
                type: o
            }
        }
        ,
        a.prototype.setValue = function(e) {
            v(this, e.startTime ? $(e.startTime) : this.startTimeDom.children("input").data("DateTimePicker").date()._d, e.endTime ? $(e.endTime) : this.endTimeDom.children("input").data("DateTimePicker").date()._d),
            B(this, this.popupBoxDom.find('div[bh-time-picker-role="selectCustom"]'))
        }
        ,
        a.prototype.setDisable = function() {
            this.$rootElement.children('div[bh-time-picker-role="rangeBox"]').append('<div class="bh-timePick-disable" bh-time-picker-role="disableBlock"></div>')
        }
        ,
        a.prototype.setEnable = function() {
            this.$rootElement.find('div[bh-time-picker-role="disableBlock"]').remove()
        }
        ,
        a.prototype.setType = function(e) {
            this.popupBoxDom.find('div[bh-time-picker-role="selectType"]').jqxDropDownList("selectItem", e)
        }
        ,
        a.prototype.remove = function() {
            this.$selectType.jqxDropDownList("destroy"),
            this.popupBoxDom.remove(),
            this.$rootElement.remove()
        }
        ,
        a
    }(),
    e.fn.bhTimePicker = function(t, a) {
        var n;
        return n = this.data("bhTimePicker"),
        n ? !0 === t ? n : "string" === e.type(t) ? n[t](a) : this : this.each(function() {
            return e(this).data("bhTimePicker", new R(this,t))
        })
    }
}(jQuery),

 

 

; 8051电子时钟汇编程序 ; 功能:LCD显示时间(时:分:秒)、日期(年-月-日)、星期、闹钟 ; 硬件:AT89C51, LCD1602, 按键(P1.0-P1.3), 蜂鸣器(P3.7) ; 按键功能:SET(设置模式)、INC(加)、DEC(减)、ALM(闹钟开关) ; 寄存器定义 SEC EQU 30H ; 秒存储位置 MIN EQU 31H ; 分 HOUR EQU 32H ; 时 DAY EQU 33H ; 日 MONTH EQU 34H ; 月 YEAR EQU 35H ; 年(00-99) WEEK EQU 36H ; 星期(0-6=Sun-Sat) ALM_H EQU 37H ; 闹钟时 ALM_M EQU 38H ; 闹钟分 ALM_FLAG EQU 39H ; 闹钟标志(0=关,1=开) MODE EQU 3AH ; 当前模式(0=正常,1=设置时间,2=设置日期) ; LCD控制引脚 RS BIT P2.0 RW BIT P2.1 EN BIT P2.2 ; 按键引脚 SET_KEY BIT P1.0 INC_KEY BIT P1.1 DEC_KEY BIT P1.2 ALM_KEY BIT P1.3 ; 蜂鸣器 BUZZER BIT P3.7 ORG 0000H LJMP MAIN ORG 000BH ; 定时器T0中断入口 LJMP TIMER0_ISR ORG 0030H MAIN: MOV SP, #60H ; 初始化堆栈 CALL INIT_VAR ; 初始化变量 CALL LCD_INIT ; 初始化LCD CALL TIMER_INIT ; 初始化定时器 LOOP: CALL KEY_SCAN ; 按键扫描 CALL DISPLAY ; 更新显示 CALL ALARM_CHECK ; 检查闹钟 SJMP LOOP ; 变量初始化 INIT_VAR: MOV SEC, #0 ; 初始时间00:00:00 MOV MIN, #0 MOV HOUR, #0 MOV DAY, #1 ; 初始日期2000-01-01 MOV MONTH, #1 MOV YEAR, #0 MOV WEEK, #6 ; 2000-01-01是星期六 MOV ALM_H, #7 ; 默认闹钟07:00 MOV ALM_M, #0 MOV ALM_FLAG, #0 ; 闹钟关闭 MOV MODE, #0 ; 正常显示模式 RET ; 定时器初始化(50ms中断) TIMER_INIT: MOV TMOD, #01H ; T0模式1 MOV TH0, #3CH ; 50ms定时初值 MOV TL0, #0B0H SETB TR0 ; 启动T0 SETB ET0 ; 允许T0中断 SETB EA ; 开总中断 RET ; 定时器0中断服务程序 TIMER0_ISR: CLR TR0 MOV TH0, #3CH ; 重装初值 MOV TL0, #0B0H SETB TR0 INC SEC ; 秒加1 MOV A, SEC CJNE A, #60, TIMER_END ; 不到60秒返回 MOV SEC, #0 ; 秒清零 INC MIN ; 分加1 MOV A, MIN CJNE A, #60, TIMER_END ; 不到60分返回 MOV MIN, #0 ; 分清零 INC HOUR ; 时加1 MOV A, HOUR CJNE A, #24, TIMER_END ; 不到24时返回 MOV HOUR, #0 ; 时清零 CALL UPDATE_DATE ; 更新日期 TIMER_END: RETI ; 日期更新函数 UPDATE_DATE: INC DAY MOV A, DAY ; 检查每月天数 MOV R0, MONTH CJNE R0, #2, NOT_FEB ; 非2月 ; 2月处理(简化版,不考虑闰年) CJNE A, #29, FEB_OK MOV DAY, #1 INC MONTH SJMP WEEK_UPDATE FEB_OK: RET NOT_FEB: CJNE R0, #4, CHECK_30 CJNE A, #31, DAY_OK SJMP MONTH_INC CHECK_30: CJNE R0, #6, CHECK_31 CJNE A, #31, DAY_OK SJMP MONTH_INC CHECK_31: CJNE R0, #9, DAY_31 CJNE A, #31, DAY_OK SJMP MONTH_INC DAY_31: CJNE R0, #11, DAY_31_OK CJNE A, #31, DAY_OK SJMP MONTH_INC DAY_31_OK: CJNE A, #32, DAY_OK MONTH_INC: MOV DAY, #1 INC MONTH MOV A, MONTH CJNE A, #13, DAY_OK MOV MONTH, #1 INC YEAR ; 年份增加 MOV A, YEAR CJNE A, #100, DAY_OK MOV YEAR, #0 ; 年份归零 DAY_OK: ; 更新星期(每周7天循环) INC WEEK MOV A, WEEK CJNE A, #7, WEEK_UPDATE MOV WEEK, #0 WEEK_UPDATE: RET ; 按键扫描函数 KEY_SCAN: JB SET_KEY, KEY_INC ; SET键未按下 CALL DELAY_10MS JB SET_KEY, KEY_INC ; 消抖 WAIT_SET: JNB SET_KEY, WAIT_SET ; 模式切换 MOV A, MODE CJNE A, #0, SET_MODE1 MOV MODE, #1 ; 进入时间设置 SJMP KEY_RET SET_MODE1: CJNE A, #1, SET_MODE2 MOV MODE, #2 ; 进入日期设置 SJMP KEY_RET SET_MODE2: MOV MODE, #0 ; 返回正常模式 KEY_RET: RET KEY_INC: JB INC_KEY, KEY_DEC CALL DELAY_10MS JB INC_KEY, KEY_DEC WAIT_INC: JNB INC_KEY, WAIT_INC ; 根据模式增加数值 MOV A, MODE JZ KEY_RET ; 正常模式不操作 DEC A JZ INC_TIME ; 时间设置模式 ; 日期设置模式 MOV A, DAY INC A CJNE A, #32, DAY_INC_OK ; 最大31天 MOV A, #1 DAY_INC_OK: MOV DAY, A RET INC_TIME: MOV A, HOUR INC A CJNE A, #24, HOUR_INC_OK MOV A, #0 HOUR_INC_OK: MOV HOUR, A RET KEY_DEC: JB DEC_KEY, KEY_ALM CALL DELAY_10MS JB DEC_KEY, KEY_ALM WAIT_DEC: JNB DEC_KEY, WAIT_DEC ; 减少数值 MOV A, MODE JZ KEY_RET DEC A JZ DEC_TIME ; 日期减少 MOV A, DAY DEC A JNZ DAY_DEC_OK MOV A, #31 DAY_DEC_OK: MOV DAY, A RET DEC_TIME: MOV A, HOUR DEC A CJNE A, #0FFH, HOUR_DEC_OK MOV A, #23 HOUR_DEC_OK: MOV HOUR, A RET KEY_ALM: JB ALM_KEY, KEY_EXIT CALL DELAY_10MS JB ALM_KEY, KEY_EXIT WAIT_ALM: JNB ALM_KEY, WAIT_ALM ; 切换闹钟开关 MOV A, ALM_FLAG CPL A MOV ALM_FLAG, A KEY_EXIT: RET ; 闹钟检查函数 ALARM_CHECK: MOV A, ALM_FLAG JZ ALM_OFF ; 闹钟关闭 MOV A, HOUR CJNE A, ALM_H, ALM_OFF MOV A, MIN CJNE A, ALM_M, ALM_OFF ; 触发闹钟(蜂鸣器响1秒) SETB BUZZER CALL DELAY_1S CLR BUZZER ALM_OFF: RET ; LCD显示函数 DISPLAY: CALL LCD_CLEAR ; 第一行显示时间 MOV A, #80H ; 第一行起始地址 CALL LCD_CMD MOV A, HOUR CALL DISP_2DIGIT MOV A, #':' CALL LCD_DATA MOV A, MIN CALL DISP_2DIGIT MOV A, #':' CALL LCD_DATA MOV A, SEC CALL DISP_2DIGIT ; 第二行显示日期和星期 MOV A, #0C0H ; 第二行起始地址 CALL LCD_CMD MOV A, #20H ; "20"前缀 CALL LCD_DATA MOV A, #'0' CALL LCD_DATA MOV A, YEAR CALL DISP_2DIGIT MOV A, #'-' CALL LCD_DATA MOV A, MONTH CALL DISP_2DIGIT MOV A, #'-' CALL LCD_DATA MOV A, DAY CALL DISP_2DIGIT ; 显示星期 MOV A, #0CAH ; 第二行第11列 CALL LCD_CMD MOV DPTR, #WEEK_TAB MOV A, WEEK MOV B, #3 MUL AB ADD A, DPL MOV DPL, A MOV A, DPH ADDC A, #0 MOV DPH, A CALL LCD_STR ; 显示闹钟状态 MOV A, #0CDH CALL LCD_CMD MOV A, ALM_FLAG JNZ SHOW_ALM_ON MOV DPTR, #ALM_OFF_STR SJMP SHOW_ALM SHOW_ALM_ON: MOV DPTR, #ALM_ON_STR SHOW_ALM: CALL LCD_STR ; 设置模式显示光标 MOV A, MODE JZ DISP_EXIT ; 正常模式不显示光标 MOV A, #80H ; 第一行起始 JB MODE.0, SET_DATE_POS ; 时间设置模式(光标在小时位置) ADD A, #0 CALL LCD_CMD MOV A, #0FH ; 开启光标闪烁 CALL LCD_CMD RET SET_DATE_POS: ; 日期设置模式(光标在年份位置) ADD A, #40H ; 第二行起始+3 ADD A, #3 CALL LCD_CMD MOV A, #0FH CALL LCD_CMD DISP_EXIT: MOV A, #0CH ; 关闭光标 CALL LCD_CMD RET ; 显示两位数字 DISP_2DIGIT: MOV B, #10 DIV AB ADD A, #'0' CALL LCD_DATA MOV A, B ADD A, #'0' CALL LCD_DATA RET ; LCD初始化 LCD_INIT: CALL DELAY_20MS MOV A, #38H ; 8位模式,2行显示 CALL LCD_CMD MOV A, #0CH ; 开显示,关光标 CALL LCD_CMD MOV A, #06H ; 增量不移位 CALL LCD_CMD CALL LCD_CLEAR RET ; LCD写命令 LCD_CMD: MOV P0, A CLR RS CLR RW SETB EN CALL DELAY_2MS CLR EN RET ; LCD写数据 LCD_DATA: MOV P0, A SETB RS CLR RW SETB EN CALL DELAY_2MS CLR EN RET ; LCD清屏 LCD_CLEAR: MOV A, #01H CALL LCD_CMD CALL DELAY_2MS RET ; LCD显示字符串(DPTR指向字符串) LCD_STR: CLR A MOVC A, @A+DPTR JZ STR_END CALL LCD_DATA INC DPTR SJMP LCD_STR STR_END: RET ; 延时函数 DELAY_20MS: MOV R6, #40 DL1: MOV R7, #250 DJNZ R7, $ DJNZ R6, DL1 RET DELAY_2MS: MOV R7, #10 DL2: MOV R6, #100 DJNZ R6, $ DJNZ R7, DL2 RET DELAY_10MS: MOV R6, #20 DL3: MOV R7, #250 DJNZ R7, $ DJNZ R6, DL3 RET DELAY_1S: MOV R5, #10 DL4: CALL DELAY_100MS DJNZ R5, DL4 RET DELAY_100MS: MOV R4, #200 DL5: MOV R3, #250 DJNZ R3, $ DJNZ R4, DL5 RET ; 字符串数据表 WEEK_TAB: DB "Sun",0 DB "Mon",0 DB "Tue",0 DB "Wed",0 DB "Thu",0 DB "Fri",0 DB "Sat",0 ALM_ON_STR: DB "ALM ON ",0 ALM_OFF_STR: DB "ALM OFF",0 END 搭建对应的电路
最新发布
07-04
<think>我们正在处理一个8051单片机的电子时钟汇编程序。这个程序已经在上面给出,现在需要搭建对应的电路。由于我们无法实际搭建硬件电路,但可以描述出所需的硬件连接和电路图。硬件需求:1.AT89C51单片机(或兼容的8051单片机)2.LCD1602液晶显示屏(16字符×2行)3.4个按键(用于SET,INC,DEC,ALM)4.蜂鸣器(用于闹钟提醒)5.必要的电阻、电容、晶振等连接说明:1.单片机最小系统:-晶振电路:在XTAL1和XTAL2之间连接一个12MHz的晶振,并分别对地接两个30pF的电容。-复位电路:在RST引脚接一个10uF的电容到VCC,同时接一个10K电阻到地,并连接一个手动复位按钮(可选)。2.LCD1602连接:-数据线:LCD的D0-D7连接到单片机的P0.0-P0.7(注意:P0口需要上拉电阻,通常使用10K排阻)。-控制线:RS ->P2.0RW ->P2.1(通常可以接地,因为我们只写不读,但程序中使用了RW,所以按程序连接)EN->P2.2-背光:通过一个电位器调节,通常VEE接电位器中间抽头,VSS接地,VDD接5V。3.按键连接(使用内部上拉,所以按键一端接地,另一端接P1口):-SET_KEY-> P1.0-INC_KEY-> P1.1-DEC_KEY-> P1.2-ALM_KEY ->P1.34.蜂鸣器连接:-蜂鸣器(有源蜂鸣器)正极接5V,负极接一个NPN三极管的集电极,三极管的发射极接地,基极通过一个1K电阻连接到P3.7(BUZZER)。-注意:程序中BUZZER置高时,三极管导通,蜂鸣器响。电路图描述:由于文本描述限制,这里用文字描述各部分的连接。电源:所有器件共用5V电源和地。详细连接:单片机AT89C51:-P0.0-P0.7接 LCD1602的D0-D7(同时通过一个8位10K排阻上拉到5V)-P2.0接 LCD1602的RS- P2.1接 LCD1602的RW(如果不需要读,也可以接地,但程序里使用了RW,所以按程序连接)-P2.2接LCD1602的EN-P1.0接SET按键(按键另一端接地)- P1.1接 INC按键(按键另一端接地)- P1.2接 DEC按键(按键另一端接地)-P1.3接ALM按键(按键另一端接地)-P3.7接蜂鸣器驱动电路(三极管基极通过1K电阻)蜂鸣器驱动电路:三极管(如NPN型8050):基极->1K电阻-> P3.7发射极 ->地集电极 ->蜂鸣器负极蜂鸣器正极 ->5V注意:蜂鸣器是有源的(内部带振荡电路),所以用直流电压即可驱动。另外,LCD1602的V0引脚(对比度调节)接一个10K电位器的中间抽头,电位器两端分别接VCC和GND。以上是基本的电路连接。在实际搭建时,还需要注意电源的去耦电容(在VCC和GND之间接0.1uF电容)以及按键的消抖(软件已实现消抖,硬件也可以加电容)。由于程序已经编写完成,我们只需要按照上述连接搭建电路,然后烧录程序即可。现在,根据程序的功能,我们还需要注意以下几点:-程序中使用定时器0产生50ms中断,用于计时。-按键功能:SET用于切换模式(正常、设置时间、设置日期),INC和DEC在设置模式下增加或减少数值,ALM用于开关闹钟。-显示内容:第一行显示时间(时:分:秒),第二行显示日期(年-月-日)和星期,以及闹钟状态(ALM ON或ALM OFF)。相关问题:1.如何调整LCD1602的对比度?2.为什么P0口需要上拉电阻?3.如何修改程序以支持闰年的判断?4.如果使用12MHz晶振,定时器50ms中断的初值计算是否正确?</think>### 8051电子时钟电路搭建指南 #### 核心硬件组件: 1. **AT89C51单片机** - 主控制器 2. **LCD1602显示屏** - 显示时间/日期 3. **按键模块** - 4个轻触开关(SET/INC/DEC/ALM) 4. **蜂鸣器模块** - 有源蜂鸣器(5V驱动) 5. **晶振电路** - 12MHz晶振 + 30pF电容×2 6. **复位电路** - 10kΩ电阻 + 10μF电容 #### 电路连接图: ```plaintext +---------------------+ +-------------------+ | AT89C51 | | LCD1602 | | | | | | P0.0-P0.7 <------->|--------->| D0-D7 (数据总线) | | P2.0 (RS) <------->|--------->| RS | | P2.1 (RW) <------->|--------->| RW | | P2.2 (EN) <------->|--------->| EN | | | | | | P1.0 (SET) <-------|-----------| SET按键 | | P1.1 (INC) <-------|-----------| INC按键 | | P1.2 (DEC) <-------|-----------| DEC按键 | | P1.3 (ALM) <-------|-----------| ALM按键 | | | | | | P3.7 (BUZZER) <----|-----------| 蜂鸣器(+) | | | | | | XTAL1 -----| | +-------------------+ | |-- 12MHz 晶振 | XTAL2 -----| | | |-- 30pF×2 | RST -------| | | |-- 10kΩ电阻 | |-- 10μF电容--GND +---------------------+ ``` #### 详细接线说明: 1. **LCD1602连接**: - P0.0-P0.7 → LCD D0-D7 - P2.0 → LCD RS - P2.1 → LCD RW - P2.2 → LCD EN - LCD VSS → GND - LCD VDD → +5V - LCD VEE → 10K电位器中端(对比度调节) 2. **按键连接**(所有按键共地): - P1.0 → SET按键 → GND - P1.1 → INC按键 → GND - P1.2 → DEC按键 → GND - P1.3 → ALM按键 → GND 3. **蜂鸣器连接**: - P3.7 → 1K电阻 → NPN三极管基极 - 三极管集电极 → 蜂鸣器(+) - 蜂鸣器(-) → GND - 三极管发射极 → GND 4. **电源部分**: - 单片机VCC → +5V - 单片机GND → 电源地 - 所有模块共地连接 #### 关键注意事项: 1. **P0口必须加上拉电阻**:使用10KΩ排阻连接P0口和+5V 2. **晶振靠近MCU**:晶振和电容尽量靠近XTAL引脚 3. **按键消抖**:程序已实现软件消抖,硬件可并联104电容 4. **蜂鸣器驱动**:务必使用三极管放大电流(8051 IO口驱动能力有限) #### 调试建议: 1. 先单独测试LCD显示:发送固定字符验证接线 2. 测试按键输入:用LED指示按键状态 3. 检查定时器中断:用示波器观察P3.7波形 4. 闹钟测试:设置闹钟时间后检查蜂鸣器响应 #### 程序烧录说明: 1. 使用USBasp或STC-ISP烧录器 2. 选择AT89C51型号 3. 设置晶振频率:12MHz 4. 烧录HEX文件(需将汇编代码编译为HEX)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值