久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
51單片機學習,簡易時鐘
[打印本頁]
作者:
51黑電子迷
時間:
2017-2-9 22:22
標題:
51單片機學習,簡易時鐘
使用芯片STC89C52RC, 2個鎖存器
6個帶小數點共陰極數碼管顯示一個24時制時鐘
沒有時鐘芯片,所以掉電后時間會復位
原理圖為TX-1C開發板
暫時顯示了半小時,一秒不差,
未驗證有無其他bug,代碼貼上來,歡迎高手指點
==============================
最終顯示的<時.分.秒>是 16.31.37 形式
#include <reg52.h>
#include "MY51.H"
void show();
uint8 shi=15; //初始時間15:45:00 按復位按鈕對時
uint8 fen=45;
uint8 miao=0;
void main()
{
startT0(1000); //開始定時器
while(1)
{
show();
}
}
void show() //顯示時鐘
{
uint8 oneWela,twoWela,threeWela,foreWela,fiveWela,sixWela; //oneWela是最左邊的數碼管
sixWela =miao%10;
fiveWela=miao/10;
foreWela=fen%10;
threeWela=fen/10;
twoWela=shi%10;
oneWela=shi/10;
displaySMG(oneWela,twoWela,threeWela,foreWela,fiveWela,sixWela,0xf5); //0xf5小數點位置
}
void T0_Work() //T0定時器調用的工作函數
{
miao++;
if(miao>59)
{
miao=0;
fen++;
}
if(fen>59)
{
fen=0;
shi++;
}
if(shi>23)
{
shi=0;
}
}
復制代碼
#ifndef _MY51_H_
#define _MY51_H_
#include <math.h>
#include <intrins.h>
typedef int int16 ;
typedef int INT16 ;
typedef unsigned int uint16 ;
typedef unsigned int UINT16 ;
typedef unsigned short uint ;
typedef unsigned short UINT ;
typedef unsigned short word ;
typedef unsigned short WORD ;
typedef unsigned long uint32 ;
typedef unsigned long UINT32 ;
typedef unsigned long DWORD ;
typedef unsigned long dword ;
typedef signed long int32 ;
typedef signed long INT32 ;
typedef float float32 ;
typedef double double64 ;
typedef signed char int8 ;
typedef signed char INT8 ;
typedef unsigned char byte ;
typedef unsigned char BYTE ; //WINDOWS的windef.h里面是這么定義的
typedef unsigned char uchar ;
typedef unsigned char UCHAR ;
typedef unsigned char UINT8 ;
typedef unsigned char uint8 ;
typedef unsigned char BOOL ; //windows中定義BOOL為int
typedef unsigned char bool ; //bool是c++的內置類型
#define TRUE 1
#define true 1
#define FALSE 0
#define false 0
#define open 1 //open和close用于 標志打開和關閉狀態
#define OPEN 1
#define close 0
#define CLOSE 0
#define lock 0
#define start 1
#define START 1
#define stop 0
#define STOP 0
uint8 dulaIndex=0; //數碼管0~F段編碼索引號
uint8 welaIndex=0; //0~5位的數碼管位索引號
sbit dula =P2^6; //段選鎖存器控制 控制筆段
sbit wela =P2^7; //位選鎖存器控制 控制位置
#define led P1 //燈總線控制
sbit led0=P1^0; //8個led燈
sbit led1=P1^1;
sbit led2=P1^2;
sbit led3=P1^3;
sbit led4=P1^4;
sbit led5=P1^5;
sbit led6=P1^6;
sbit led7=P1^7;
sbit keyS2=P3^4; //4個獨立按鍵
sbit keyS3=P3^5;
sbit keyS4=P3^6;
sbit keyS5=P3^7;
void displaySMG(uint8 one,uint8 two,uint8 three,uint8 four,uint8 five,uint8 six,uint8 dot);
void delayms(uint16 ms);
void T0_Work();
//////////////////////////////////////////////////////////////////////////
void delayms(uint16 ms) //軟延時函數
{
uint16 i,j;
for(i=83;i>0;i--)
{
for(j=ms;j>0;j--)
{}
}
}
///////////////////////////////////////////////////////////////////////////
#define dark 0x11 //也就是索引第17號元素0x00,共陰極數碼管正極全部輸入低電平
uint8 code table[]= { //0~F外加小數點和空輸出的數碼管編碼
0x3f , 0x06 , 0x5b , 0x4f , // 0 1 2 3
0x66 , 0x6d , 0x7d , 0x07 , // 4 5 6 7
0x7f , 0x6f , 0x77 , 0x7c , // 8 9 A B
0x39 , 0x5e , 0x79 , 0x71 , // C D E F
0x80 , 0x00 // . 空 空時是第0x11號也就是第17號元素
};
/////////////////////////////////////////////////////////////////////////////
uint8 TH0Cout=0 ; //初值
uint8 TL0Cout=0 ;
uint16 T0IntCout=0; //中斷計數
uint16 T0IntCountAll=0; //(N-1)/65536+1; //總中斷次數
bool bT0Delay=false; //使用延時函數標志,初始未用
bool bT0Over=false; //中斷處理函數執行結果之一
void startT0(uint32 ms) //開啟定時器
{
float32 t=ms/1000.0; //定時時間
double64 fox =11.0592*(pow(10,6)); //晶振頻率
uint32 N=(t*fox)/12 ; //定時器總計數值
TH0Cout =(65536-N%65536)/256; //裝入計時值零頭計數初值
TL0Cout =(65536-N%65536)%256;
T0IntCountAll=(N-1)/65536+1; //總中斷次數
TMOD=TMOD | 0x01; //設置定時器0的工作方式為1
EA =open; //打開總中斷
ET0=open; //打開定時器中斷
TH0=TH0Cout; //定時器裝入初值
TL0=TL0Cout;
TR0=start; //啟動定時器
}
void delayT0(uint32 ms) //硬延時函數,自己亂寫的不好用,求指點
{
startT0(ms); //啟動定時器
bT0Delay=true; //告訴T0定時器,起用延時模式
while(bT0Over==false); //時間沒到的話繼續檢測
bT0Over=false; //時間到了,讓標志復位
}
void T0_times() interrupt 1 //T0定時器中斷函數
{
T0IntCout++;
if(T0IntCout==T0IntCountAll) //達到總中斷次數值
{
T0IntCout=0; //中斷次數清零,重新計時
bT0Over=true; //時間真的到了
if(bT0Delay) //本次中斷是用來延時的嗎
{
TR0=stop; //如果是由延時函數開啟T0的話,關閉T0
return;
}
TH0=TH0Cout; //循環定時的話要重裝初值,每次定時1秒,重裝一次
TL0=TL0Cout;
T0_Work(); //工作函數
}
}
////////////////////////////////////////////////////////////////////////////////
void displaySMG(uint8 oneWela,uint8 twoWela,uint8 threeWela,uint8 fourWela,uint8 fiveWela,uint8 sixWela,uint8 dot)
{ //控制6位數碼管顯示函數,不顯示的位用參數 dark
dula=1; //小數點
P0=table[16];
dula=0;
P0=0xff;
wela=1;
P0=dot;
wela=0;
delayms(1);
dula=1;
P0=table[oneWela]; //送段數據
dula=0;
P0=0xff; //送位數據前關閉所有顯示,防止打開位選鎖存后段選數據通過位選鎖存器
wela=1;
P0=0xfe;
wela=0;
delayms(1);
dula=1;
P0=table[twoWela];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delayms(1);
dula=1;
P0=table[threeWela];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delayms(1);
dula=1;
P0=table[fourWela];
dula=0;
P0=0xff;
wela=1;
P0=0xf7;
wela=0;
delayms(1);
dula=1;
P0=table[fiveWela];
dula=0;
P0=0xff;
wela=1;
P0=0xef;
wela=0;
delayms(1);
dula=1;
P0=table[sixWela];
dula=0;
P0=0xff;
wela=1;
P0=0xdf;
wela=0;
delayms(1);
}
#endif
復制代碼
作者:
毛士新
時間:
2022-2-5 00:11
:lol:loveliness::Q
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
精品欧美乱码久久久久久1区2区
|
国产在线网站
|
7777奇米影视
|
在线欧美小视频
|
亚洲永久
|
精品国产一区二区三区性色av
|
亚洲国产成人精品久久
|
精品久久久久久亚洲精品
|
香蕉二区
|
国产精品一区久久久久
|
福利社午夜影院
|
欧美日韩网站
|
国产精品视频在
|
欧美影院
|
久久久久国产一区二区三区四区
|
亚洲一区欧美
|
久草视频在线播放
|
午夜激情影院
|
久久一区二区三区四区五区
|
亚洲国产成人精品一区二区
|
亚洲精品一
|
国产精品久久久久一区二区三区
|
一区二区三区精品在线视频
|
日韩精品 电影一区 亚洲
|
欧洲成人免费视频
|
欧美日韩视频一区二区
|
精品一区二区三区在线视频
|
日韩欧美在
|
欧美理论
|
91久久国产综合久久
|
99热在线观看精品
|
久久久日韩精品一区二区三区
|
国产91黄色
|
性在线
|
亚洲一区久久
|
日韩毛片免费看
|
成人二区
|
欧美性另类
|
国产一区二区在线视频
|
亚洲国产精品99久久久久久久久
|
亚洲综合在线视频
|