|
制作出來(lái)的實(shí)物圖如下:
1618408009581.jpg (2.37 MB, 下載次數(shù): 28)
下載附件
2021-4-14 21:47 上傳
怎么才能讓四個(gè)燈都亮,串口可以接受數(shù)據(jù)
單片機(jī)源程序如下:
- #include "reg52.h"
- #define uchar unsigned char
- #define uint unsigned int
-
- sbit key1=P3^2;
- sbit key2=P3^3;
- int sec; //顯示的時(shí)間
- uchar flagStart; //啟動(dòng)標(biāo)志位,1表示啟動(dòng),0表示暫停
- char num; //自加,自減數(shù)
- uchar code charLed[]= //數(shù)碼管數(shù)字0~9
- {0x05,0x7D,0x46,0x54,0x3C,
- 0x94,0x84,0x5D,0x04,0x14};
- uchar code whoLed[] = {0xEF,0xDF,0xBF,0x7F}; //P2對(duì)應(yīng)的數(shù)碼管位選(從左到右)
- uchar bufLed[] = {0x05,0x01,0x05,0x05}; //sec顯示緩存區(qū)
- uchar read_cnt;
- uchar read_buff[50];
- uchar timimg[]="12:00";
- uchar cnt_all=50;
- bit flag_rx=0;
- void Display();
- void Change();
- void Init();
- void dealing();
- void uart_init_hardware();
- void send_single_byte_hardware(uchar by);
- void send_string_hardware(uchar *p);
- void main()
- {
- Init(); //初始化(串口初始化包含在內(nèi))
- while(1)
- {
- dealing();
- send_string_hardware( timimg);
- }
- }
- /*初始化函數(shù)*/
- void Init()
- {
- TMOD = 0x00; //設(shè)置定時(shí)器0,定時(shí)器1為16位自動(dòng)重裝模式
- TH0 = 0xFC; //定時(shí)器0周期設(shè)置1ms
- TL0 = 0x66;
- IE = 0x87; //啟動(dòng)總中斷,定時(shí)器0中斷,外部中斷0,外部中斷1
- TCON = 0x15; //啟動(dòng)定時(shí)器0,設(shè)置外部中斷0,外部中斷1觸發(fā)方式為下降沿觸發(fā)
- uart_init_hardware(); //串口1,定時(shí)器1初始化(9600bps,11.0592MHz)
- sec = 0; //初始顯示的秒數(shù)
- flagStart = 0; //啟動(dòng)標(biāo)志位,1表示啟動(dòng),0表示暫停
- num = 1; //開始為自加模式
- }
- /*串口硬件初始化*/
- void uart_init_hardware()
- {
- SCON=0x50;//關(guān)于sm1 sm0 ren的編輯,0101 0000 即方式01且允許串口中斷接收
- PCON=0x00;//電源相關(guān)寄存器配置 最高位為smod 即波特率翻倍標(biāo)志位
- TMOD&=0x0f;//保留用于中斷定時(shí)器1的配置
- TMOD|=0x20;//設(shè)置定時(shí)器1方式為2
- EA=1;//開總中斷
- ES=1;//串口中斷允許位
- TL1=0xfd;//定時(shí)器1配置 (11059200/(12*9600))/32=3 0xff-3=0xfd
- TH1=0xfd;
- TR1=1;//開啟定時(shí)器1,等待中斷
-
- }
- /*數(shù)碼管顯示函數(shù)*/
- void Display()
- {
- static uchar i=0;
- P0 = 0xFF; //消隱
- P2 = whoLed[i]; //選擇位選
- P0 = bufLed[i]; //顯示數(shù)字
- i++;
- i&=0x03;
- }
- /*顯示數(shù)字改變*/
- void Change()
- {
- uint x;
- char i;
- if(sec >= 6000) //如果sec大于6000
- sec = 0; //置零
- if(sec < 0 ) //如果sec小于0
- sec = 5999; //置為5999
- x=sec;
- for(i=3;i>=0;i--)
- {
- bufLed[i] = charLed[x%10]; //從高位到低位提取數(shù)字
- x/=10; //清除低位
- }
- bufLed[0] &= 0xFB; //添加小數(shù)點(diǎn)
- }
- void send_single_byte_hardware(uchar by)
- {
- SBUF = by;//參數(shù)傳遞,向SBUF中寫入數(shù)據(jù)
- while(!TI);//通過(guò)讀取標(biāo)志位,等待寫入完成
- TI = 0;//標(biāo)志位清零
- }
- void send_string_hardware(uchar *p)//發(fā)送數(shù)據(jù)直到遇到結(jié)束符
- {
- while(*p!= '\0')//在數(shù)組中未完之前一直發(fā)送
- {
- send_single_byte_hardware(*p);
- p++;
- }
- }
- void dealing()
- {
- char z=0;
- if(flag_rx)
- {
- flag_rx=0;
- for(;read_cnt<50;read_cnt++)
- {
- if(read_buff[read_cnt]=='{'&&read_buff[read_cnt+1]=='|'&&read_cnt<=40&&read_buff[read_cnt+6]=='|'&&read_buff[read_cnt+7]=='}')
- for(;z<5;z++)
- {
- if(read_buff[read_cnt+2+z]>='0'&&read_buff[read_cnt+2+z]<='9')
- timimg[z]=read_buff[read_cnt+2+z];
- else break;
- }
- else if(read_buff[read_cnt]=='S'&&read_buff[read_cnt+1]=='T'&&read_buff[read_cnt+1]=='O'&&read_buff[read_cnt+1]=='P')
- {
- flagStart=1;
- flagStart=~flagStart;
- }
- else if(read_buff[read_cnt]=='B'&&read_buff[read_cnt+1]=='A'&&read_buff[read_cnt+1]=='C'&&read_buff[read_cnt+1]=='K') ;
- }
- }
- }
- /*外部中斷0*/
- void InterruptExint_0()interrupt 0 //啟動(dòng),暫停模式切換
- {
- IE &= 0xfe; //關(guān)外部中斷0
- flagStart = ~flagStart;
- IE |= 0x01; //開外部中斷0
- }
- /*外部中斷1*/
- void InterruptExint_1()interrupt 2 //自加,自減模式切換
- {
- IE &= 0xFB; //關(guān)外部中斷1
- num = -num; //自加,自減模式切換
- IE |= 0x04; //開外部中斷1
- }
- /*定時(shí)器0*/
- void InterruptTime_0()interrupt 1 //動(dòng)態(tài)掃描,串口監(jiān)測(cè)
- {
- static uchar cnt = 0; //計(jì)時(shí)累加位ms
- Display(); //動(dòng)態(tài)掃描
- if(flagStart) //判斷是否啟動(dòng)
- {
- cnt++; //累加
- if (cnt >= 10) //10ms后
- {
- cnt = 0; //累加位清零
- sec += num; //sec自加或自減
- Change(); //改變顯示函數(shù)
- }
- }
-
- }
- void ser() interrupt 4
- {
- RI=0;//標(biāo)志位清零
- cnt_all--;
- if(cnt_all||(SBUF!='\0'))
- read_buff[cnt_all]=SBUF;//數(shù)據(jù)讀取
- else
- {
- cnt_all=50;
- flag_rx=1;
- }
-
- }
復(fù)制代碼
|
|