亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码
標(biāo)題:
用DS1302及DS18B20+MAX6951設(shè)計(jì)的多功能電子日歷牌
[打印本頁]
作者:
看似無情闖天涯
時(shí)間:
2016-12-6 10:26
標(biāo)題:
用DS1302及DS18B20+MAX6951設(shè)計(jì)的多功能電子日歷牌
上周做的,這個(gè)是用protues軟件的仿真的主程序如下
//-------------------------- main.c ------------------------
// 名稱: 用DS1302及DS18B20+MAX6951設(shè)計(jì)的多功能電子日歷牌
//----------------------------------------------------------
// 說明: 本例所有分立式數(shù)碼管全部用MAX6951驅(qū)動,電路中使用了
// 時(shí)鐘芯片DS1302與溫度傳感器DS18B20,實(shí)現(xiàn)了含溫度顯示
// 的多功能電子日歷牌設(shè)計(jì),其中的調(diào)節(jié)功能由讀者自行完成.
#include <xc.h>
#include <stdio.h>
#include "DS1302.h"
#include "DS18B20.h"
#define INT8 signed char
#define INT8U unsigned char
#define INT16U unsigned int
//MAX695X引腳定義
#define DIN PORTCbits.RC0 //數(shù)據(jù)線
#define CLK PORTCbits.RC1 //時(shí)鐘線
#define CS0 2 //YYYY-MM-DD驅(qū)動器片選線
#define CS1 3 //HH-MM-SS W驅(qū)動器片選線
#define CS2 4 //溫度數(shù)碼管驅(qū)動器片選線
//秒閃爍LED控制
#define LED_BLINK PORTCbits.RC7
//MAX6951片選控制端口
#define CS_PORT PORTC
//日期顯示緩沖,格式:YYYY-MM-DD(全解碼,直接發(fā)送)
INT8U Date_Buff[] = {2,0,0,0,0,0,0,0};
//時(shí)間及星期顯示緩沖,格式:HH-MM-SS W(全解碼,直接發(fā)送)
INT8U Time_w_Buff[] = {0,0,0,0,0,0,0};
//溫度顯示緩沖:XXX.X℃ ~ -XX.X℃,(范圍:125℃~-55℃)
//(全部不解碼,發(fā)送段碼)
//緩沖最后兩位固定為"℃"中的度及C的段碼
INT8U Temp_Buff[] = {0x00,0x00,0x00,0x00,0x63,0x4E};
//在非解碼模式下MAX6950/1對應(yīng)的段碼表
//此表不同于直接驅(qū)動時(shí)所使用的段碼表
//原來的各段順序是: DP,G,F,E,D,C,B,A
//MAX6950/1的驅(qū)動順序是:DP,A,B,C,D,E,F,G
//除小數(shù)點(diǎn)位未改變外,其他位是逆向排列的.
const INT8U SEGCODE_695X[] =
{ 0x7E,0x30,0x6D,0x79,0x33,0x5B,0x5F,0x70, //0~7
0x7F,0x7B,0x77,0x1F,0x4E,0x3D,0x4F,0x47, //8~F
};
#define NEG_SEGCODE 0x01 //負(fù)數(shù)符號段碼"-"
#define BLK_SEGCODE 0x00 //黑屏段碼
extern volatile INT8U DateTime[];
//----------------------------------------------------------
// 向MAX695X寫數(shù)據(jù)
//----------------------------------------------------------
void Write(INT8U Addr,INT8U Dat,INT8U CS_NO)
{
INT8U i;
CS_PORT &= ~(1<<CS_NO);
for(i = 0; i < 8; i++) //串行寫入8位地址Addr
{ CLK = 0;
if (Addr & 0x80) DIN = 1; else DIN = 0;
CLK = 1; __delay_us(20);//時(shí)鐘上升沿移入數(shù)據(jù)
Addr <<= 1;
}
for(i = 0; i < 8; i++) //串行寫入8位數(shù)據(jù)Dat
{ CLK = 0;
if (Dat & 0x80) DIN = 1; else DIN = 0;
CLK = 1; __delay_us(20);//時(shí)鐘上升沿移入數(shù)據(jù)
Dat <<= 1;
}
CS_PORT |= (1<<CS_NO);
}
//----------------------------------------------------------
// MAX695X初始化
//----------------------------------------------------------
void Init_MAX695X()
{
//設(shè)置亮度:中等亮度/掃描所有的0~7只數(shù)碼管/非關(guān)斷0x01;關(guān)斷:0x00
Write(0x02,0x07,CS0);Write(0x03,0x07,CS0); Write(0x04,0x01,CS0);
Write(0x02,0x07,CS1);Write(0x03,0x07,CS1); Write(0x04,0x01,CS1);
Write(0x02,0x07,CS2);Write(0x03,0x07,CS2); Write(0x04,0x01,CS2);
}
//----------------------------------------------------------
// 將兩位整數(shù)分解為兩個(gè)數(shù)位
//----------------------------------------------------------
void DEC_TO_2DIGIT(INT8U d, INT8U *a1, INT8U *b1)
{
*a1 = 0; *b1 = 0;
while (d >= 10) { d -= 10; ++*a1; }
*b1 = d;
}
//----------------------------------------------------------
// 讀取并顯示溫度
//----------------------------------------------------------
void Read_and_Show_Temperature()
{
INT8U i; char t[4];
INT8 _temp_sign; //溫度符號
INT8U _temp_int, _temp_df; //溫度整數(shù)部分與小數(shù)部分
if (Read_Temperature() != 1) return; //讀取溫度
//將兩字節(jié)溫度數(shù)據(jù)轉(zhuǎn)換為符號,整數(shù)及小數(shù)部分
Temperature_Convert(&_temp_sign,&_temp_int,&_temp_df);
//將整數(shù)部分轉(zhuǎn)換為字符串
sprintf(t,"%3d",(int)_temp_int);
//由字符串得到三個(gè)整數(shù)位的段碼(空格轉(zhuǎn)換為黑屏)
if (t[0] == ' ') Temp_Buff[0] = BLK_SEGCODE;
else Temp_Buff[0] = SEGCODE_695X[t[0] - '0'];
if (t[1] == ' ') Temp_Buff[1] = BLK_SEGCODE;
else Temp_Buff[1] = SEGCODE_695X[t[1] - '0'];
Temp_Buff[2] = SEGCODE_695X[t[2] - '0'] | 0x80; //個(gè)位數(shù)加小數(shù)點(diǎn)
Temp_Buff[3] = SEGCODE_695X[_temp_df]; //小數(shù)位的段碼
if (_temp_sign == -1) //處理符號位
{ if (Temp_Buff[1] == BLK_SEGCODE) Temp_Buff[1] = NEG_SEGCODE;
else //此處的else不可省略
if (Temp_Buff[0] == BLK_SEGCODE) Temp_Buff[0] = NEG_SEGCODE;
}
//顯示溫度:XXX.X℃~-XX.X℃(全部不解碼)------------------------------
Write(0x01,0B00000000,CS2);
for(i = 0; i < 6; i++) Write(0x60 | i, Temp_Buff,CS2);
__delay_ms(20);
}
//----------------------------------------------------------
// 讀取并顯示當(dāng)前日期時(shí)間
//----------------------------------------------------------
void Read_and_Show_DateTime()
{
INT8U i,a,b;
getDateTime();//讀取DS1302實(shí)時(shí)時(shí)鐘
//分解年月日
DEC_TO_2DIGIT(DateTime[6],&a,&b);
Date_Buff[2] = a; Date_Buff[3] = b;
DEC_TO_2DIGIT(DateTime[4],&a,&b);
Date_Buff[4] = a; Date_Buff[5] = b;
DEC_TO_2DIGIT(DateTime[3],&a,&b);
Date_Buff[6] = a; Date_Buff[7] = b;
//分解時(shí)分秒,星期
DEC_TO_2DIGIT(DateTime[2],&a,&b);
Time_w_Buff[0] = a; Time_w_Buff[1] = b;
DEC_TO_2DIGIT(DateTime[1],&a,&b);
Time_w_Buff[2] = a; Time_w_Buff[3] = b;
DEC_TO_2DIGIT(DateTime[0],&a,&b);
Time_w_Buff[4] = a; Time_w_Buff[5] = b;
Time_w_Buff[6] = DateTime[5] - 1;
//遇到星期0時(shí),用星期8表示,數(shù)碼管上的8顯示為“日”
if (Time_w_Buff[6] == 0) Time_w_Buff[6] = 8;
//顯示年月日:YYYY-MM-DD(全解碼,直接發(fā)送)------------------------
Write(0x01,0B11111111,CS0);
for(i = 0; i < 8; i++) Write(0x60 | i, Date_Buff, CS0);
//顯示時(shí)間及星期:HH-MM-SS W(全解碼,直接發(fā)送)--------------------
Write(0x01,0B11111111,CS1);
for(i = 0; i < 7; i++) Write(0x60 | i, Time_w_Buff,CS1);
}
//----------------------------------------------------------
// 主程序
//----------------------------------------------------------
void main()
{
T0CS = 0; //TMR0時(shí)鐘選擇:內(nèi)部時(shí)鐘
PSA = 0; //前分頻器分配給TMR0
PS2 = 1; PS1 = 0; PS0 = 0; //32分頻(OPTION低3位為100)
TMR0 = (INT8U)(256 - _XTAL_FREQ/4/32*0.005); //5ms定時(shí)初值
T0IF = 0; //清TMR0中斷標(biāo)志
GIE = 1; //開全局中斷
T0IE = 1; //使能TMR0溢出中斷
TRISC = 0x00; PORTC = 0xFF; //MAX6951控制端口
TRISD2 = TRISD3 = 0; //DS1302 SCLK,RST輸出
Init_MAX695X(); //初始化三片695X
Read_Temperature(); //預(yù)讀溫度
//初始化DS1302,并配置使能DS1302的點(diǎn)滴式充電器
init_DS1302(); __delay_ms(1000); //等待1秒
while (1)
{
Read_and_Show_DateTime(); //讀取并顯示日期時(shí)間
Read_and_Show_Temperature(); //讀取并顯示溫度
}
}
//----------------------------------------------------------
// TMR0溢出中斷控制秒閃爍功能
//----------------------------------------------------------
void interrupt TMR0_OVR_Interrupt()
{
static INT8U pre_second = 0;
static INT8U T_Count = 0; //用于延時(shí)累加的變量
if (T0IF)
{ T0IF = 0; //軟件清零
TMR0 = (INT8U)(256 - _XTAL_FREQ/4/32*0.005); //5ms定時(shí)初值
if (pre_second != Time_w_Buff[5]) //讀到新的秒數(shù)
{ pre_second = Time_w_Buff[5]; //保存當(dāng)前秒
LED_BLINK = 0; //點(diǎn)亮LED
T_Count = 0;
}
else
{ if ( ++T_Count != 100 ) return; //不到0.005*100=0.5s時(shí)返回
T_Count = 0;
LED_BLINK = 1; //0.5s后關(guān)LED
}
}
}
復(fù)制代碼
作者:
admin
時(shí)間:
2016-12-7 04:45
很好,謝謝分享,樓主能上傳一下仿真和程序的壓縮包供大家學(xué)習(xí)嗎?
歡迎光臨 (http://www.denmoz.com/bbs/)
Powered by Discuz! X3.1