久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3122|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)的電子日歷功能 用串口在電腦屏幕顯示

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
            電子日歷功能,在電腦屏幕顯示出來,功能如下:
            按下key1鍵,顯示當(dāng)前的日期:年/月/日;
            按下key2鍵,顯示當(dāng)前的時(shí)間:時(shí)/分/秒;
            按下key3鍵,顯示當(dāng)前的日期時(shí)間:年/月/日時(shí)/分/秒;
            顯示在數(shù)碼管上.

            最好選STC89C52的芯片,因?yàn)榈匠绦蛟O(shè)計(jì)的時(shí)候,用到了三個(gè)定時(shí)器,剛剛好夠用;


單片機(jī)源程序如下:
  1. #include "public.h"


  2. //共陽極數(shù)碼管顯示編碼
  3. u16 code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};


  4. //數(shù)碼管顯示內(nèi)容
  5. bit smg_show_flag = 1;
  6. bit smg_show_flag1 = 1;



  7. //數(shù)碼管顯示功能,1:數(shù)碼管顯示年月日,2:數(shù)碼管顯示時(shí)分秒,3:串口輸出日期
  8. u8 smg_show_mode = 1;
  9. u8 time_buf[50]={0};

  10. //定義年月日變量
  11. u16  year = 2021;
  12. u16 month = 7;
  13. u16 day = 3;

  14. //定義時(shí)分秒變量
  15. u16 hour=3,min=12,sec,ssec;


  16. //延時(shí)函數(shù)
  17. void delay(u8 i)
  18. {
  19.    u8 k;
  20.         for(k=0;k<i;k++);
  21. }

  22. /*********************************************************************
  23.         函數(shù)名字:TIM0_IT_Init
  24.         函數(shù)功能:定時(shí)器0的中斷初始化函數(shù)
  25. **********************************************************************/
  26. void Timer0Init(void)
  27. {
  28.         //1.配置定時(shí)器0為工作方式1
  29.         TMOD |= 0x01;
  30.         //2.配置TH和TL確定定時(shí)時(shí)長,50ms
  31.         //單片機(jī)時(shí)鐘頻率為12000000Hz,定時(shí)器時(shí)鐘頻率=單片機(jī)時(shí)鐘頻率/12=1000000Hz
  32.         //50ms = 50/1000 = 1/20s,所以50ms定時(shí)器計(jì)數(shù)值為1000000/20 = 50000
  33.         //由于定時(shí)器是自加計(jì)數(shù)
  34.         TH0 = (65535-50000) / 256;               
  35.         TL0 = (65535-50000) % 256;               
  36.         //3.啟動(dòng)定時(shí)器0開始計(jì)數(shù)
  37.         TR0 = 1;
  38.         //4.清零定時(shí)器0的溢出標(biāo)志位
  39.         TF0 = 0;
  40.         //5.打開定時(shí)器0中斷
  41.         ET0 = 1;
  42.         //6.打開全局中斷
  43.         EA = 1;
  44. }


  45. //定時(shí)器1的初始化函數(shù)
  46. void Timer1Init()
  47. {
  48.         TMOD|=0X10;

  49.         TH1=0Xd8;        
  50.         TL1=0Xf0;        
  51.         ET1=1;
  52.         EA=1;
  53.         TR1=1;                        
  54. }


  55. /*********************************************************************
  56.         函數(shù)名字:smg_display_date
  57.         函數(shù)功能:數(shù)碼管顯示日期函數(shù)
  58.         參數(shù):顯示的內(nèi)容標(biāo)志:1:年,0:月和日
  59. **********************************************************************/
  60. void smg_display_date(u8 showflag)
  61. {
  62.         u8 i;
  63.         if(showflag == 1)
  64.         {
  65.                 for(i=0; i<4; i++)
  66.                 {
  67.                         switch(i)
  68.                         {
  69.                                 //進(jìn)行數(shù)碼管位選1,點(diǎn)亮第1位數(shù)碼管
  70.                                 case 0:        WEI1 = 0,WEI2 = 1,WEI3 = 1,WEI4 = 1;SMG_PORT = table[year/1000%10];break;
  71.                                 //進(jìn)行數(shù)碼管位選2,點(diǎn)亮第2位數(shù)碼管
  72.                                 case 1:        WEI1 = 1;WEI2 = 0;WEI3 = 1,WEI4 = 1;SMG_PORT = table[year/100%10];break;
  73.                                 //進(jìn)行數(shù)碼管位選3,點(diǎn)亮第3位數(shù)碼管
  74.                                 case 2:        WEI1 = 1;WEI2 = 1;WEI3 = 0,WEI4 = 1;SMG_PORT = table[year/10%10];break;
  75.                                 //進(jìn)行數(shù)碼管位選4,點(diǎn)亮第4位數(shù)碼管
  76.                                 case 3:        WEI1 = 1;WEI2 = 1;WEI3 = 1,WEI4 = 0;SMG_PORT = table[year%10];break;
  77.                         }
  78.                         //點(diǎn)亮延時(shí)2ms
  79.                 delay(2000);
  80.                         //關(guān)顯示
  81.                         SMG_PORT = 0xff;
  82.                 }
  83.         }
  84.         else if(showflag == 0)
  85.         {

  86.                 for(i=0; i<4; i++)
  87.                 {
  88.                         switch(i)
  89.                         {
  90.                                 //進(jìn)行數(shù)碼管位選1,點(diǎn)亮第1位數(shù)碼管
  91.                                 case 0:        WEI1 = 0,WEI2 = 1,WEI3 = 1,WEI4 = 1;SMG_PORT = table[month/10%10];break;
  92.                                 //進(jìn)行數(shù)碼管位選2,點(diǎn)亮第2位數(shù)碼管
  93.                                 case 1:        WEI1 = 1;WEI2 = 0;WEI3 = 1,WEI4 = 1;SMG_PORT = table[month%10];break;
  94.                                 //進(jìn)行數(shù)碼管位選3,點(diǎn)亮第3位數(shù)碼管
  95.                                 case 2:        WEI1 = 1;WEI2 = 1;WEI3 = 0,WEI4 = 1;SMG_PORT = table[day/10%10];break;
  96.                                 //進(jìn)行數(shù)碼管位選4,點(diǎn)亮第4位數(shù)碼管
  97.                                 case 3:        WEI1 = 1;WEI2 = 1;WEI3 = 1,WEI4 = 0;SMG_PORT = table[day%10];break;
  98.                         }
  99.                         //點(diǎn)亮延時(shí)2ms
  100.                         delay(2000);
  101.                         //關(guān)顯示
  102.                         SMG_PORT = 0xff;
  103.                 }
  104.         }        
  105. }



  106. void smg_display_time(u8 showflag1)
  107. {
  108.         u8 i;
  109.         if(showflag1 == 1)
  110.         {
  111.                 for(i=0; i<4; i++)
  112.                 {
  113.                         switch(i)
  114.                         {
  115.                                 //進(jìn)行數(shù)碼管位選1,點(diǎn)亮第1位數(shù)碼管
  116.                                 case 0:        WEI1 = 0,WEI2 = 1,WEI3 = 1,WEI4 = 1;SMG_PORT = table[min/10%10];break;
  117.                                 //進(jìn)行數(shù)碼管位選2,點(diǎn)亮第2位數(shù)碼管
  118.                                 case 1:        WEI1 = 1;WEI2 = 0;WEI3 = 1,WEI4 = 1;SMG_PORT = table[min%10];break;
  119.                                 //進(jìn)行數(shù)碼管位選3,點(diǎn)亮第3位數(shù)碼管
  120.                                 case 2:        WEI1 = 1;WEI2 = 1;WEI3 = 0,WEI4 = 1;SMG_PORT = table[sec/10%10];break;
  121.                                 //進(jìn)行數(shù)碼管位選4,點(diǎn)亮第4位數(shù)碼管
  122.                                 case 3:        WEI1 = 1;WEI2 = 1;WEI3 = 1,WEI4 = 0;SMG_PORT = table[sec%10];break;
  123.                         }
  124.                         //點(diǎn)亮延時(shí)2ms
  125.                                 delay(2000);
  126.                         //關(guān)顯示
  127.                         SMG_PORT = 0xff;
  128.                 }
  129.         }
  130.         else if(showflag1 == 0)
  131.         {

  132.                 for(i=0; i<4; i++)
  133.                 {
  134.                         switch(i)
  135.                         {
  136.                                 //進(jìn)行數(shù)碼管位選1,點(diǎn)亮第1位數(shù)碼管
  137.                                 case 0:        WEI1 = 0,WEI2 = 1,WEI3 = 1,WEI4 = 1;SMG_PORT = table[hour/10%10];break;
  138.                                 //進(jìn)行數(shù)碼管位選2,點(diǎn)亮第2位數(shù)碼管
  139.                                 case 1:        WEI1 = 1;WEI2 = 0;WEI3 = 1,WEI4 = 1;SMG_PORT = table[hour%10];break;
  140.                                 //進(jìn)行數(shù)碼管位選3,點(diǎn)亮第3位數(shù)碼管
  141.                                 case 2:        WEI1 = 1;WEI2 = 1;WEI3 = 0,WEI4 = 1;SMG_PORT = table[min/10%10];break;
  142.                                 //進(jìn)行數(shù)碼管位選4,點(diǎn)亮第4位數(shù)碼管
  143.                                 case 3:        WEI1 = 1;WEI2 = 1;WEI3 = 1,WEI4 = 0;SMG_PORT = table[min%10];break;
  144.                         }
  145.                         //點(diǎn)亮延時(shí)2ms
  146.                         delay(2000);
  147.                         //關(guān)顯示
  148.                         SMG_PORT = 0xff;
  149.                 }
  150.         }        
  151. }





  152. /*********************************************************************
  153.         函數(shù)名字:USART_Init
  154.         函數(shù)功能:串口初始化函數(shù),沒有開啟串口中斷
  155. **********************************************************************/
  156. void USART_Init(void)
  157. {                                                                                

  158.            T2MOD =0;     //自動(dòng)重載
  159.     T2CON = 0x30;     //T2用做發(fā)送接收時(shí)鐘
  160.     TH2 = 0xFF;      //9600波特率,11.0592Mhz晶振
  161.     TL2 = 0xDC;
  162.     RCAP2H = 0xFF;
  163.     RCAP2L = 0xDC;
  164.     SCON = 0x50;     //串口方式1,1個(gè)起始位,1個(gè)停止位,8位數(shù)據(jù),可變波特率
  165.     PCON = 0X00;    //波特率不加倍
  166.     TR2 = 1;          //啟動(dòng)T2
  167. //    ES = 1;         //開串口中斷
  168. //    EA = 1;        
  169. }

  170. /*********************************************************************
  171.         函數(shù)名字:Send_Byte
  172.         函數(shù)功能:發(fā)送字符函數(shù)
  173. **********************************************************************/
  174. void Send_Byte(u8 da)
  175. {
  176.         //發(fā)送字符H
  177.         SBUF = da;
  178.         //等待發(fā)送完成
  179.         while(TI != 1);
  180.         //清空發(fā)送標(biāo)志位
  181.         TI = 0;        
  182. }



  183. /*********************************************************************
  184.         函數(shù)名字:Send_Str
  185.         函數(shù)功能:發(fā)送封裝發(fā)送字符串函數(shù)符函數(shù)
  186. **********************************************************************/
  187. void Send_Str(u8  *str)
  188. {
  189.         u8 i;
  190.         for(i=0; str[i]!='\0'; i++)
  191.                 Send_Byte(str[i]);        
  192. }

  193. //按鍵函數(shù)
  194. void key_san()
  195. {
  196.   if(KEY1==0)
  197.                 {   
  198.                   Send_Str("        當(dāng)前運(yùn)行的功能為A\r\n");
  199.                         delay(200);
  200.                         if(KEY1==0)
  201.                         {
  202.                                 smg_display_date(smg_show_flag);
  203.                         }
  204.                 }
  205.                
  206.                         
  207.                         if(KEY2==0)
  208.                 {
  209.                         Send_Str("        當(dāng)前運(yùn)行的功能為B\r\n");
  210.                                 delay(200);
  211.                         if(KEY2==0)
  212.                         {
  213.                                 smg_display_time(smg_show_flag1);
  214.                                 
  215.                         }
  216.     }
  217.                
  218.                
  219.                 if(KEY3==0)
  220.                 {   
  221.                         Send_Str("        當(dāng)前運(yùn)行的功能為C\r\n");
  222.                         delay(200);
  223.                         if(KEY3==0)
  224.                         {
  225.                
  226.                         sprintf(time_buf, "當(dāng)前時(shí)間為%d年%d月%d日%d時(shí)%d分%d秒\r\n",year,month,day,hour,min,sec);
  227.                    Send_Str(time_buf);
  228.                         
  229.                         }
  230.                         
  231.     }

  232. }


  233. /*********************************************************************
  234.         函數(shù)名字:timer0_irq
  235.         函數(shù)功能:定時(shí)器0的中斷服務(wù)函數(shù)
  236. **********************************************************************/
  237. void timer0_irq(void) interrupt 1
  238. {
  239.         static u8 i = 0;
  240.         //循環(huán)給定時(shí)器0裝入初值
  241.         TH0 = (65535-50000) / 256;               
  242.         TL0 = (65535-50000) % 256;        
  243.         //讓計(jì)數(shù)值自加
  244.         i++;
  245.         //40*50=2000ms,即2秒的延時(shí)
  246.         if(i == 40)
  247.         {
  248.                 //清空計(jì)數(shù)值,讓程序進(jìn)行下一次1秒的延時(shí)
  249.                 i = 0;
  250.                 //每2秒鐘切換數(shù)碼管顯示的內(nèi)容
  251.                 smg_show_flag=~smg_show_flag;
  252.                 smg_show_flag1=~smg_show_flag1;
  253.         }        
  254. }

  255. //定時(shí)器1的中斷服務(wù)函數(shù)
  256. void Timer0() interrupt 3
  257. {
  258.                         TH1=0Xd8;
  259.                         TL1=0Xf0;
  260.                         ssec++;
  261.                         if(ssec>=100)  
  262.                         {
  263.                         ssec=0;
  264.                         sec++;
  265.                         if(sec>=60)
  266.                         {
  267.                         sec=0;
  268.                         min++;
  269.                         if(min>=60)
  270.                         {
  271.                         min=0;
  272.                         hour++;
  273.                         if(hour>=24)
  274.                         {
  275.                         hour=0;
  276.                   }
  277.                         }
  278.                 }        
  279.         }        
  280. }
復(fù)制代碼


仿真工程暫不提供,大家造帖子里面的圖直接畫一個(gè)就行了
Keil代碼工程51hei附件下載:
電子日歷代碼.7z (22.57 KB, 下載次數(shù): 24)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:513213 發(fā)表于 2021-7-23 09:51 | 只看該作者
電腦怎么接收并顯示啊?
回復(fù)

使用道具 舉報(bào)

板凳
ID:933150 發(fā)表于 2021-7-23 10:26 | 只看該作者
對的哈,在電腦屏幕上顯示出來的
回復(fù)

使用道具 舉報(bào)

地板
ID:933150 發(fā)表于 2021-7-23 10:28 | 只看該作者
lsh04 發(fā)表于 2021-7-23 09:51
電腦怎么接收并顯示啊?

是的哈,在電腦那邊顯示出來的
回復(fù)

使用道具 舉報(bào)

5#
ID:1028857 發(fā)表于 2022-5-23 10:53 | 只看該作者
好 非常好 i love
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 成人精品在线观看 | 国产一区中文字幕 | 国产黄色大片在线免费观看 | 成人久久久久久久久 | 精品一区二区三区四区 | 国产日韩欧美一区二区 | 蜜臀av日日欢夜夜爽一区 | 欧美日韩国产免费 | 国产日韩精品视频 | 九九九久久国产免费 | 日本午夜在线视频 | 精品国产乱码久久久久久丨区2区 | 中文字幕乱码一区二区三区 | 97精品视频在线 | av中文字幕在线观看 | 国产精品18hdxxxⅹ在线 | 久久精品一区二区三区四区 | 中文字幕在线观看一区二区 | 日韩一级免费大片 | 99精品久久99久久久久 | 国产一级久久久久 | 欧美一区二区三区在线看 | 国产日韩一区二区三区 | 国产精品婷婷 | 91麻豆产精品久久久久久 | 国产欧美日韩一区二区三区在线观看 | 国产极品粉嫩美女呻吟在线看人 | 国产日韩欧美在线 | 国产精品亚洲片在线播放 | 青青草一区二区三区 | 亚洲va国产日韩欧美精品色婷婷 | 日日草夜夜草 | 在线视频一区二区三区 | 精品国产精品国产偷麻豆 | 国产午夜精品一区二区三区四区 | 欧美精品一区二区三区在线 | 欧美一区二区三区在线观看 | 99精品网| 97精品久久| 日本视频在线播放 | 99久久免费精品视频 |