欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
C51單片機日歷時鐘設計
[打印本頁]
作者:
掛科比柯南
時間:
2022-5-23 10:59
標題:
C51單片機日歷時鐘設計
#include "public.h"
//共陽極數碼管顯示編碼
u16 code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//數碼管顯示內容
bit smg_show_flag = 1;
bit smg_show_flag1 = 1;
//數碼管顯示功能,1:數碼管顯示年月日,2:數碼管顯示時分秒,3:串口輸出日期
u8 smg_show_mode = 1;
u8 time_buf[50]={0};
//定義年月日變量
u16 year = 2021;
u16 month = 7;
u16 day = 3;
//定義時分秒變量
u16 hour=3,min=12,sec,ssec;
//延時函數
void delay(u8 i)
{
u8 k;
for(k=0;k<i;k++);
}
/*********************************************************************
函數名字:TIM0_IT_Init
函數功能:定時器0的中斷初始化函數
**********************************************************************/
void Timer0Init(void)
{
//1.配置定時器0為工作方式1
TMOD |= 0x01;
//2.配置TH和TL確定定時時長,50ms
//單片機時鐘頻率為12000000Hz,定時器時鐘頻率=單片機時鐘頻率/12=1000000Hz
//50ms = 50/1000 = 1/20s,所以50ms定時器計數值為1000000/20 = 50000
//由于定時器是自加計數
TH0 = (65535-50000) / 256;
TL0 = (65535-50000) % 256;
//3.啟動定時器0開始計數
TR0 = 1;
//4.清零定時器0的溢出標志位
TF0 = 0;
//5.打開定時器0中斷
ET0 = 1;
//6.打開全局中斷
EA = 1;
}
//定時器1的初始化函數
void Timer1Init()
{
TMOD|=0X10;
TH1=0Xd8;
TL1=0Xf0;
ET1=1;
EA=1;
TR1=1;
}
/*********************************************************************
函數名字:smg_display_date
函數功能:數碼管顯示日期函數
參數:顯示的內容標志:1:年,0:月和日
**********************************************************************/
void smg_display_date(u8 showflag)
{
u8 i;
if(showflag == 1)
{
for(i=0; i<4; i++)
{
switch(i)
{
//進行數碼管位選1,點亮第1位數碼管
case 0: WEI1 = 0,WEI2 = 1,WEI3 = 1,WEI4 = 1;SMG_PORT = table[year/1000%10];break;
//進行數碼管位選2,點亮第2位數碼管
case 1: WEI1 = 1;WEI2 = 0;WEI3 = 1,WEI4 = 1;SMG_PORT = table[year/100%10];break;
//進行數碼管位選3,點亮第3位數碼管
case 2: WEI1 = 1;WEI2 = 1;WEI3 = 0,WEI4 = 1;SMG_PORT = table[year/10%10];break;
//進行數碼管位選4,點亮第4位數碼管
case 3: WEI1 = 1;WEI2 = 1;WEI3 = 1,WEI4 = 0;SMG_PORT = table[year%10];break;
}
//點亮延時2ms
delay(2000);
//關顯示
SMG_PORT = 0xff;
}
}
else if(showflag == 0)
{
for(i=0; i<4; i++)
{
switch(i)
{
//進行數碼管位選1,點亮第1位數碼管
case 0: WEI1 = 0,WEI2 = 1,WEI3 = 1,WEI4 = 1;SMG_PORT = table[month/10%10];break;
//進行數碼管位選2,點亮第2位數碼管
case 1: WEI1 = 1;WEI2 = 0;WEI3 = 1,WEI4 = 1;SMG_PORT = table[month%10];break;
//進行數碼管位選3,點亮第3位數碼管
case 2: WEI1 = 1;WEI2 = 1;WEI3 = 0,WEI4 = 1;SMG_PORT = table[day/10%10];break;
//進行數碼管位選4,點亮第4位數碼管
case 3: WEI1 = 1;WEI2 = 1;WEI3 = 1,WEI4 = 0;SMG_PORT = table[day%10];break;
}
//點亮延時2ms
delay(2000);
//關顯示
SMG_PORT = 0xff;
}
}
}
void smg_display_time(u8 showflag1)
{
u8 i;
if(showflag1 == 1)
{
for(i=0; i<4; i++)
{
switch(i)
{
//進行數碼管位選1,點亮第1位數碼管
case 0: WEI1 = 0,WEI2 = 1,WEI3 = 1,WEI4 = 1;SMG_PORT = table[min/10%10];break;
//進行數碼管位選2,點亮第2位數碼管
case 1: WEI1 = 1;WEI2 = 0;WEI3 = 1,WEI4 = 1;SMG_PORT = table[min%10];break;
//進行數碼管位選3,點亮第3位數碼管
case 2: WEI1 = 1;WEI2 = 1;WEI3 = 0,WEI4 = 1;SMG_PORT = table[sec/10%10];break;
//進行數碼管位選4,點亮第4位數碼管
case 3: WEI1 = 1;WEI2 = 1;WEI3 = 1,WEI4 = 0;SMG_PORT = table[sec%10];break;
}
//點亮延時2ms
delay(2000);
//關顯示
SMG_PORT = 0xff;
}
}
else if(showflag1 == 0)
{
for(i=0; i<4; i++)
{
switch(i)
{
//進行數碼管位選1,點亮第1位數碼管
case 0: WEI1 = 0,WEI2 = 1,WEI3 = 1,WEI4 = 1;SMG_PORT = table[hour/10%10];break;
//進行數碼管位選2,點亮第2位數碼管
case 1: WEI1 = 1;WEI2 = 0;WEI3 = 1,WEI4 = 1;SMG_PORT = table[hour%10];break;
//進行數碼管位選3,點亮第3位數碼管
case 2: WEI1 = 1;WEI2 = 1;WEI3 = 0,WEI4 = 1;SMG_PORT = table[min/10%10];break;
//進行數碼管位選4,點亮第4位數碼管
case 3: WEI1 = 1;WEI2 = 1;WEI3 = 1,WEI4 = 0;SMG_PORT = table[min%10];break;
}
//點亮延時2ms
delay(2000);
//關顯示
SMG_PORT = 0xff;
}
}
}
/*********************************************************************
函數名字:USART_Init
函數功能:串口初始化函數,沒有開啟串口中斷
**********************************************************************/
void USART_Init(void)
{
T2MOD =0; //自動重載
T2CON = 0x30; //T2用做發送接收時鐘
TH2 = 0xFF; //9600波特率,11.0592Mhz晶振
TL2 = 0xDC;
RCAP2H = 0xFF;
RCAP2L = 0xDC;
SCON = 0x50; //串口方式1,1個起始位,1個停止位,8位數據,可變波特率
PCON = 0X00; //波特率不加倍
TR2 = 1; //啟動T2
// ES = 1; //開串口中斷
// EA = 1;
}
/*********************************************************************
函數名字:Send_Byte
函數功能:發送字符函數
**********************************************************************/
void Send_Byte(u8 da)
{
//發送字符H
SBUF = da;
//等待發送完成
while(TI != 1);
//清空發送標志位
TI = 0;
}
/*********************************************************************
函數名字:Send_Str
函數功能:發送封裝發送字符串函數符函數
**********************************************************************/
void Send_Str(u8 *str)
{
u8 i;
for(i=0; str[ i]!='\0'; i++)
Send_Byte(str[ i]);
}
//按鍵函數
void key_san()
{
if(KEY1==0)
{
Send_Str(" 當前運行的功能為A\r\n");
delay(200);
if(KEY1==0)
{
smg_display_date(smg_show_flag);
}
}
if(KEY2==0)
{
Send_Str(" 當前運行的功能為B\r\n");
delay(200);
if(KEY2==0)
{
smg_display_time(smg_show_flag1);
}
}
if(KEY3==0)
{
Send_Str(" 當前運行的功能為C\r\n");
delay(200);
if(KEY3==0)
{
sprintf(time_buf, "當前時間為%d年%d月%d日%d時%d分%d秒\r\n",year,month,day,hour,min,sec);
Send_Str(time_buf);
}
}
}
/*********************************************************************
函數名字:timer0_irq
函數功能:定時器0的中斷服務函數
**********************************************************************/
void timer0_irq(void) interrupt 1
{
static u8 i = 0;
//循環給定時器0裝入初值
TH0 = (65535-50000) / 256;
TL0 = (65535-50000) % 256;
//讓計數值自加
i++;
//40*50=2000ms,即2秒的延時
if(i == 40)
{
//清空計數值,讓程序進行下一次1秒的延時
i = 0;
//每2秒鐘切換數碼管顯示的內容
smg_show_flag=~smg_show_flag;
smg_show_flag1=~smg_show_flag1;
}
}
//定時器1的中斷服務函數
void Timer0() interrupt 3
{
TH1=0Xd8;
TL1=0Xf0;
ssec++;
if(ssec>=100)
{
ssec=0;
sec++;
if(sec>=60)
{
sec=0;
min++;
if(min>=60)
{
min=0;
hour++;
if(hour>=24)
{
hour=0;
}
}
}
}
}
224518vwavaaxs4xab4gib.png
(99.68 KB, 下載次數: 125)
下載附件
2022-5-23 10:57 上傳
仿真原理圖
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1