我的畢業設計市有關數顯的,我學的是機械,對這個單片機不是很清楚啊。我整了很久還是沒調試出來。有哪位大神能幫我解決一下嗎。有償的,價格合理都行。會做的請聯系我QQ:409110616,電話18875026689
下面我說一下具和我完成的進度,肯定有很多錯誤。
主要針對時柵位移傳感器的外置式數顯裝置,擬設計一個時柵傳感器數顯裝置,該系統以單片機作為控制核心,可以通過串行接口接收到的傳感器控制電路輸出的傳感器測量數據,能夠對時柵傳感器測量數據進行度、分、秒格式顯示,并且能夠設置顯示方向。大概就是用利用串口輸入一段數字信號,經過單片機處理后顯示出來。顯示格式為“多少°多少′多少″”的形式。我選用的是stc89c51單片機,還有lcd1602顯示器,和幾個按鍵功能,設置方向(原來數據的補碼,按360°算),(還有設置分別用角度、分度、秒度顯示,可帶小數點,這個不強行要求)用C語言編寫。下面是我做的一些。這關系能否順利畢業,請各位大神幫幫我。
proteus仿真圖
源程序如下,只完成主要的部分,還不能正確顯示:
#include<reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define yh 0x80 //LCD第一行的初始位置
#define er 0x80+0x40 //LCD第二行初始位置
sbit pd_key=P1^0; //+方向鍵 K0
sbit nd_key=P1^1; //-方向鍵 K1
sbit pa_key=P1^2; //+角度鍵 K2
sbit na_key=P1^3; //-角度 K3
sbit pp_key=P1^4; //+分 K4
sbit np_key=P1^5; //-分 K5
sbit ps_key=P1^6; //+秒 K6
sbit ns_key=P1^7; //-秒 K7
sbit rs=P2^0;
sbit en=P2^2;
unsigned char shiZ,check;
uchar code tab1[]={" 2017.6.7 "};//顯示的固定字符
uchar code tab2[]={"LOC: ° ′ ″"};//顯示的固定字符
uchar tate[7];
uchar bian[8];
uchar temp,a;
uchar flag;
/*LED_Buffer[7]用來存儲串口發送的數據,com_dat用來記錄串口發送的個數*/
uchar LED_Buffer[7], *q, com_dat; //從串口接收的數據
/***********延時程序***********/
void delay(uint z) //延時函數
{
uint x,y;
for(x=z;x>0;x--)
for(y=122;y>0;y--);
}
void delay_10us() //延時10us
{
uchar i;
i--;i--;i--;i--;i--;i--;
}
/****液晶寫入指令函數****/
void write_1602com(uchar com)
{
rs=0; //數據/指令選擇置為指令
P0=com; //送入數據
delay(5); //延時一小會兒,讓1602準備接收數據
en=1; //拉高使能端,為制造有效的下降沿做準備
en=0; //en由高變低,產生下降沿,液晶執行命令
}
/***液晶寫入數據函數****/
void write_1602dat(uchar dat)
{
rs=1; //數據/指令選擇置為數據
P0=dat; //送入數據
delay(5); //延時一小會兒,讓1602準備接收數據
en=1; //en置高電平,為制造下降沿做準備
en=0; //en由高變低,產生下降沿,液晶執行命令
}
/***液晶初始化函數****/
void lcd_init() //LCD初始化子程序
{
write_1602com(0x38); //顯示模式設置:顯示16×2,5×7點陣,選用8位數據接口
delay(5);
write_1602com(0x38);
delay(5); //延時5ms
write_1602com(0x38); //3次寫 設置模式
delay(5);
write_1602com(0x0c); //顯示設置:顯示打開,有光標閃爍
delay(5);
write_1602com(0x06); //顯示設置:字符不移動,光標向右移動
delay(5);
write_1602com(0x01); //清屏指令:將以前的顯示內容清除
delay(5);
write_1602com(er+0);
for(a=0;a<15;a++)
{
write_1602dat(tab2[a]);
}
write_1602com(yh+0);
for(a=0;a<15;a++)
{
write_1602dat(tab1[a]);
}
}
/*****************串口輸入數字信號函數******************/
void uart_init()
{
TMOD = 0x20; //定時器工作在定時器1的方式2
PCON = 0x00; //不倍頻
SCON = 0x50; //串口工作在方式1,并且啟動串行接收
TH1 = 0xFd; //設置波特率 9600
TL1 = 0xFd;
TR1 = 1; //啟動定時器1
ES = 1; //開串口中斷
EA = 1; //開總中斷
}
void serial() interrupt 4 // 串口中斷服務函數
{
EA = 0;
if(RI == 1) //當硬件接收到一個數據時,RI會置位
{
LED_Buffer[com_dat] = SBUF; //把從串口讀出的數存到數組
RI = 0;
com_dat++;
if(com_dat == 7) com_dat = 0; //當com_dat = 7時,清0,防止數組溢出
}
EA = 1;
}
/**********處理讀到的數字信號數據******************/
void pro_value()
{
temp=LED_Buffer[0]+LED_Buffer[1]+LED_Buffer[2]+LED_Buffer[3]+LED_Buffer[4]+LED_Buffer[5]+LED_Buffer[6];
shiZ=temp;
bian[0]=shiZ/3600; //將角度取整
tate[0]=bian[0]/100; //將角度百分位分離
bian[1]=tate[0]%100;
tate[1]=bian[1]/10; //將角度十分位分離
tate[2]=bian[1]%10; //將角度個位分離
write_1602com(er+5);
for(a=0;a<3;a++)
{
write_1602dat(tate[a]+0x30);
}
bian[2]=shiZ/60; //將分度取整
bian[3]=bian[2]%60;
tate[3]=bian[3]/10; //將分度十分位分離
tate[4]=bian[3]%10; //將分度個位分離
write_1602com(er+9);
for(a=3;a<5;a++)
{
write_1602dat(tate[a]+0x30);
}
bian[4]=shiZ%60; //將秒度取整
tate[5]=bian[4]/10; //將秒度十分位分離
tate[6]=bian[4]%10; //將秒度個位分離
write_1602com(er+12);
for(a=5;a<7;a++)
{
write_1602dat(tate[a]+0x30);
}
}
void nd_data() //反方向顯示
{
bian[5]=360-bian[0];
if(bian[2]==0,bian[4]==0)
{
bian[5]=bian[5];
}
else
{
bian[5]=bian[5]-1;
}
tate[0]=bian[5]/100; //將角度百分位分離
bian[1]=tate[0]%100;
tate[1]=bian[1]/10; //將角度十分位分離
tate[2]=bian[1]%10; //將角度個位分離
write_1602com(er+5);
for(a=0;a<3;a++)
{
write_1602dat(tate[a]+0x30);
}
bian[6]=60-bian[2];
if(bian[4]==0)
{
bian[6]=bian[6];
}
else
{
bian[6]=bian[6]-1;
}
tate[3]=bian[6]/10; //將分度十分位分離
tate[4]=bian[6]%10; //將分度個位分離
write_1602com(er+9);
for(a=3;a<5;a++)
{
write_1602dat(tate[a]+0x30);
}
bian[7]=60-bian[4];
tate[5]=bian[7]/10; //將秒度十分位分離
tate[6]=bian[7]%10; //將秒度個位分離
write_1602com(er+12);
for(a=5;a<7;a++)
{
write_1602dat(tate[a]+0x30);
}
}
void display1() //設置顯示
{
pro_value();
}
void display2() //設置顯示反方向
{
nd_data();
}
void key_caa()
{
if(pd_key==0)
{
delay(10);
if(pd_key==0)
{
display1();
while(pd_key==0);
}
}
if(nd_key==0)
{
delay(10);
if(nd_key==0)
{
display2();
while(nd_key==0);
}
}
}
/**********主函數******************/
void main()
{
lcd_init();
uart_init();
while(1)
{
pro_value();
key_caa();
}
}
|