標(biāo)題:
單片機(jī)串口控制數(shù)碼管的動(dòng)態(tài)顯示程序問題
[打印本頁]
作者:
Wang123wan
時(shí)間:
2021-4-14 21:49
標(biāo)題:
單片機(jī)串口控制數(shù)碼管的動(dòng)態(tà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對應(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);//通過讀取標(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)測
{
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ù)制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1