日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

52单片机设计时钟(串口控制)

發布時間:2023/12/29 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 52单片机设计时钟(串口控制) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

實現目標

單片機時鐘正常工作,數碼管顯示時分秒。電腦和單片機串行通信,通過電腦串口助手,任意修改設置單片機的時鐘值。

實現的流程框圖

運用到的原理有

定時器/計數器

定時器/計數器由高8位和低8位兩個寄存器組成,本質是加1計數器。加1計數器輸入的計數脈沖有兩個來源,一個是由系統的時鐘振蕩器輸出脈沖經12分頻后送來;另一個是T0或T1引腳輸入的外部脈沖源,每來一個脈沖計數器加1,當加到計數器全為1時,再輸入一個脈沖就使計數器回零,且計數器的溢出使TCON寄存器中的TF0或TF1置1,向CPU發出中斷請求(定時器/計數器中斷允許時)。如果定時器/計數器工作于定時器模式,則表示定時時間已到;如果工作于計數模式,則表示計數值已滿。設置為定時器模式時,加1計數器是對內部機器周期計數(1個機器周期等于12個振蕩周期,即計數頻率為晶振頻率的1/12)。計數值N乘以機器周期Tcy就是定時時間t 。

中斷

中斷是為使單片機具有對外部或內部隨即發生的事件實時處理而設置的, 51單片機內部一共有5個中斷源,也就是說,有五種情況發生時,會使單片機去處理中斷程序。對于單片機來講,中斷是指CPU在處理某一事件A時,發生了另一事件B,請求CPU迅速去處理(中斷發生);CPU暫時停止當前的工作(中斷響應),轉去處理事件B(中斷服務);待CPU將事件B處理完畢后,再回到原來事件A被中斷的地方繼續處理事件A(中斷返回),這一過程稱為中斷。

引起CPU中斷的根源,稱為中斷源,中斷源向CPU提出中斷請求,CPU暫時中斷原來的事務A,轉去處理事件B,對事件B處理完畢后,再回到原來被中斷的地方(即斷點),稱為中斷返回。實現上述中斷功能的部件稱為中斷系統(中斷機構)。

數碼管動態掃描

在這里要實現數碼管每一位顯示的數字不同,我們可以使用視覺暫留的方法,在很快的時間內,不斷的將數碼管上面的顯示進行切換,如現在第一位上顯示數字1之后其它位上不顯示,再在第二位上顯示數字2其它位上不顯示,這樣不斷的來回切換,便能實現數碼管顯示12,同理便可在數碼管上顯示此時的瞬間的時間數值,具體實現在代碼中可以看到。在此基礎上,在程序中,一個大循環中不斷的在數碼管上顯示數字,利用中斷實現數字的變動,便能實現數碼管上的數字,隨著時間的變化而顯示不同的數字。

串行口通信原理

通信有并行和串行兩種方式。在單片機系統以及現代單片機測控系統中,信息的交換多采用串行通信方式。串行通信是將數據字節分成一位一位的形式在一條傳輸線上逐個地傳送,此時只需要一條數據線,外加一條公共信號地線和若干控制信號線。因為一次只能傳送一位,所以對于一個字節的數據,至少要分8位才能傳送完畢。

串行通信又有兩種方式:異步串行通信和同步串行通信。

異步串行通信是指通信的發送和接受設備使用各自的時鐘控制數據的傳送和接收過程。在單片機和單片機之間,單片機和計算機之間通信時,通常采用異步串行通信方式。同步通信要建立發送方時鐘對接收方時鐘的直接控制,使雙方達到完全同步。

實驗器材

硬件:GTX TX-1C開發板

軟件:Windows操作系統,Keil軟件,STC燒寫軟件,串口調試助手。

最終效果

實現代碼?

#include<reg52.h> #include<stdio.h>#define uchar unsigned char #define uint unsigned intsbit b5 = P3 ^ 7; sbit u1 = P2 ^ 6; sbit u2 = P2 ^ 7; sbit P36 = P3 ^ 6; //按鍵中斷unsigned char code table[] = { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0xff }; unsigned char code opt[] = { 0xff,0xdf,0xef,0xf7,0xfb,0xfd,0xfe }; int _1, _2, _3, _4, _5, _6;//數碼管的數字 int a, b, c, d, e, f;//判斷數碼管每位是否亮滅 unsigned int num = 20, flag_time, flag_guangbiao = 6; uchar temp, first = 1;//延遲快 void delay1() {unsigned int j, i;for (i = 20; i > 0; i--)for (j = 10; j > 0; j--); } //延遲 void delay(int i) {unsigned int j;for (; i > 0; i--)for (j = 110; j > 0; j--); }int key() {if (b5 == 0) {delay(5);if (b5 == 0) {while (!b5);return 1;}}return 0; }void init_chuanko() {TMOD = 0x21;TH1 = 0xfd;TL1 = 0xfd;TR1 = 1;REN = 1;SM0 = 0;SM1 = 1;EA = 1;ES = 1; }void init_display() {_1 = 0; _2 = 0; _3 = 0; _4 = 0; _5 = 2; _6 = 1;a = 1; b = 1; c = 1; d = 1; e = 1; f = 1; }void init_zhongduan() {TMOD = 0x01;TH0 = (65536 - 45872) / 256; TH0 = (65536 - 45872) % 256;TH1 = (65536 - 45872) / 256; TH1 = (65536 - 45872) % 256;EA = 1; ET0 = 1; TR0 = 1; }void init_anjian() {P36 = 0;EA = 1;IT0 = 1;TCON = 0x01;EX0 = 1;//設置按鍵中斷 }void display(int a, int b, int c, int d, int e, int f, int _1, int _2, int _3, int _4, int _5, int _6) {if (a == 1) {u1 = 1;P0 = table[_1];u1 = 0;P0 = 0xff;u2 = 1;P0 = opt[1];u2 = 0;delay1();}if (b == 1) {u1 = 1;P0 = table[_2];u1 = 0;P0 = 0xff;u2 = 1;P0 = opt[2];u2 = 0;delay1();}if (c == 1) {u1 = 1;P0 = table[_3];u1 = 0;P0 = 0xff;u2 = 1;P0 = opt[3];u2 = 0;delay1();}if (d == 1) {u1 = 1;P0 = table[_4];u1 = 0;P0 = 0xff;u2 = 1;P0 = opt[4];u2 = 0;delay1();}if (e == 1) {u1 = 1;P0 = table[_5];u1 = 0;P0 = 0xff;u2 = 1;P0 = opt[5];u2 = 0;delay1();}if (f == 1) {u1 = 1;P0 = table[_6];u1 = 0;P0 = 0xff;u2 = 1;P0 = opt[6];u2 = 0;delay1();}}//時間中斷 void jishi() interrupt 1{num--;if (num == 0) {num = 20;flag_time = 1;} }void main() {init_anjian();while (1) {if (key()) {init_zhongduan();init_display();init_chuanko();while (1) {u2 = 1;P0 = 0xff;u2 = 0;P0 = 0x0;u1 = 1;P0 = 0x0;u1 = 0;if (key()) {ET0 = 0; TR0 = 0;TR1 = 0;REN = 0;ES = 0;break;}display(a, b, c, d, e, f, _1, _2, _3, _4, _5, _6);if (flag_time == 1) {_1++;if (_1 > 9) {_1 = 0;_2++;if (_2 > 5) {_2 = 0;_3++;if (_3 > 9) {_3 = 0;_4++;if (_4 > 5) {_4 = 0;_5++;if (_5 > 9 && _6 < 2 || _5>3 && _6 == 2) {_5 = 0;_6++;if (_6 > 2) {_6 = 0;}}}}}}flag_time = 0;}}}} }void ser() interrupt 4{RI = 0;if (first == 0) {temp = SBUF;temp -= '0';if (flag_guangbiao == 6) { _6 = temp; }else if (flag_guangbiao == 5) { _5 = temp; }else if (flag_guangbiao == 4) { _4 = temp; }else if (flag_guangbiao == 3) { _3 = temp; }else if (flag_guangbiao == 2) { _2 = temp; }else if (flag_guangbiao == 1) { _1 = temp; }flag_guangbiao--;if (flag_guangbiao == 0) { flag_guangbiao = 6; }}else { first = 0; } }void exter0() interrupt 0 {init_display(); }

由于初學c語言和單片機,因此代碼有的地方寫得的確不好,很冗余,望理解。

總結

以上是生活随笔為你收集整理的52单片机设计时钟(串口控制)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。