這兩天剛剛完成了一個用C編寫的程序,這是我第一個用C語言編寫的程序,并且調試成功。
第一個C程序,值得紀念,也值得以后參考。
本程序的功能是:
1.ADC0808轉換功能;
2.數據16進制顯示;
3.串行通信數據。
C51程序:工程文件下載: http://www.zg4o1577.cn/f/0808_c.rar
#include<absacc.h>
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit START=P3^6; //啟動轉換
sbit OE=P3^5; //輸出允許
sbit EOC=P3^7; //轉換結束
sbit WC=P3^4; //通道選擇
sbit WB=P3^3; //通道選擇
sbit WA=P3^2; //通道選擇
uchar data led[12];
signed data data1;
signed data data2;
signed data data3;
signed data data4;
signed data data5;
signed data data6;
signed data data7;
uchar code tv[]={0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb};
uchar code dc[]={0xC0, //"0"
0xF9, //"1"
0xA4, //"2"
0xB0, //"3"
0x99, //"4"
0x92, //"5"
0x82, //"6"
0xF8, //"7"
0x80, //"8"
0x90, //"9"
0x88, //"A"
0x83, //"B"
0xC6, //"C"
0xA1, //"D"
0x86, //"E"
0x8E, };//"F"};/十六進制顯示方式
void delay(void) //延時程序
{
uint i;
for(i=0;i<10;i++);
}
void ledxianshi(void) //顯示模塊
{
uchar k,i;
led[0]=data1%16; //編碼1個位
led[1]=data1/16%16; //編碼1十位
led[2]=data2%16; //數據1個位
led[3]=data2/16%16; //數據1十位
led[4]=data3%16; //編碼2個位
led[5]=data3/16%16; //編碼2十位
led[6]=data4%16; //數據2個位
led[7]=data4/16%16; //數據2十位
led[8]=data5%16; //編碼3個位
led[9]=data5/16%16; //編碼3十位
led[10]=data6%16; //數據3個位
led[11]=data6/16%16; //數據3十位
for(k=0;k<12;k++)
{
P2=tv[k]; //位選用
i=led[k];
P1=dc[i]; //段碼數顯示
delay();
}
}
void csh(void)
{
SM0=0;
SM1=1;
REN=1;
TI=0;
RI=0;
PCON=0;
TH1=0xF3;
TL1=0XF3;
TMOD=0X20;
EA=1;
ET1=0;
ES=1;
TR1=1;
TI=0;
SBUF=data1;
while(!TI);
TI=0;
SBUF=data2;
while(!TI);
TI=0;
SBUF=data3;
while(!TI);
TI=0;
SBUF=data4;
while(!TI);
TI=0;
SBUF=data5;
while(!TI);
TI=0;
SBUF=data6;
while(!TI);
TI=0;
}
void ad1(void)
{
WA=0; //通道1
WB=0;
WC=0;
START=1;
START=0; //啟動轉換
while(EOC==0); //轉換結束信號,為0則說明轉換結束
OE=1; //輸出允許信號,為真,可以輸出
data7=P0; //P0口的測量值送到TVDATE
OE=0; //關輸出允許
}
void ad2(void)
{
WA=1; //通道1
WB=0;
WC=0;
START=1;
START=0; //啟動轉換
while(EOC==0); //轉換結束信號,為0則說明轉換結束
OE=1; //輸出允許信號,為真,可以輸出
data4=P0; //P0口的測量值送到TVDATE
OE=0; //關輸出允許
}
void ad3(void)
{
WA=0; //通道1
WB=1;
WC=0;
START=1;
START=0; //啟動轉換
while(EOC==0); //轉換結束信號,為0則說明轉換結束
OE=1; //輸出允許信號,為真,可以輸出
data6=P0; //P0口的測量值送到TVDATE
OE=0; //關輸出允許
}
void main(void)
{
data1=0X01;
data3=0X02;
data5=0X03;
ad1();
ad2();
ad3();
loop:
ledxianshi();
ad1();
if ((data7-data2)>0)
{
data2=data7;
ad2();
ad3();
csh();
goto loop ;
}
else
goto loop ;
}
----------------------------------------------------------------------------------
A51匯編程序:
;;;;;;;;;;;;;;;;;;;;;;;;;;;
DATA1 DATA 60H
DATA2 DATA 61H
DATA3 DATA 62H
DATA4 DATA 63H
DATA5 DATA 64H
DATA6 DATA 65H
DATA7 DATA 66H
DATA8 DATA 67H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LDATA DATA 54H
;;;;;;;;;;;;;;;;;;;;;;;
EOC BIT P3.7 ;接口定義
ST BIT P3.6
OE BIT P3.5
WC BIT P3.4
WB BIT P3.3
WA BIT P3.2
K1 BIT P2.4
K2 BIT P2.5
K3 BIT P2.6
K4 BIT P2.7
ORG 0000H
AJMP SEND
ORG 0030H
SEND: MOV TMOD,#20H ;串口初始化
MOV TH1,#0F3H ;傳輸波特率2400
MOV TL1,#0F3H
MOV SCON,#50H
MOV PCON,#00H
SETB TR1
MOV DATA1,#01H ;識別碼定義,每個識別碼對應一個數據
MOV DATA3,#02H
MOV DATA5,#03H
LP1: CLR WB ;AD口選擇:000位通道0數據
CLR WA
CLR WC
CLR ST
SETB ST
CLR ST
JNB EOC,$
SETB OE
MOV DATA2,P0 ;將臨時存儲器上的數據送給數據1
LP2: CLR WC ;AD口選擇:001位通道1數據
CLR WB
SETB WA
CLR ST
SETB ST
CLR ST
JNB EOC,$
SETB OE
MOV DATA4,P0 ;將檢測的數據送給數據2
CLR OE
LP3: CLR WC ;AD口選擇:010位通道2數據
SETB WB
CLR WA
CLR ST
SETB ST
CLR ST
JNB EOC,$
SETB OE
MOV DATA6,P0 ;將檢測的數據送給數據3
CLR OE
LCALL TT0 ;調用串口數據傳輸程序
LP: LCALL LEDSHOW ;調用顯示程序
CLR WC
CLR WB
CLR WA
CLR ST
SETB ST
CLR ST
JNB EOC,$
SETB OE
MOV LDATA,P0 ;將通道0的檢測數據送送給臨時存儲器
CLR OE
MOV A,LDATA
CJNE A,DATA2,DADA ;數據1不等于臨時數據,跳轉到數據比較,
AJMP LP ;如果相等,執行這條指令;
DADA:JC XIXI ;臨時數據小于數據1,跳轉到小值指令;
AJMP LP1 ;臨時數據大于數據1,跳到重新判斷三個數據值
XIXI:AJMP LP ;數據1小于臨時數據,執行這條指令,繼續判斷;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TT0: MOV SBUF,DATA1 ;編碼1送入串口SBUF
SENT0: JBC TI,SENWT1 ;判斷發送是否完成,完成則跳到SENWT1,沒有完成,執行下一條指令
LCALL LEDSHOW ;調用數據顯示程序
SJMP SENT0 ;返回繼續檢測發送完成指令
SENWT1: CLR TI ;關閉發送
MOV SBUF ,DATA2;將數據1送入串口SBUF
SENWT2: JBC TI,SENWT3 ;判斷發送是否完成,完成則跳到SENWT3,沒有完成,執行下一條指令
LCALL LEDSHOW ;
AJMP SENWT2 ;返回繼續檢測發送完成指令
SENWT3: CLR TI ;關閉發送
;以下程序相同功能,發送另外兩組數據
TT0_2: MOV SBUF,DATA3 ;
SENT0_2: JBC TI,SENWT1_2;
LCALL LEDSHOW ;
SJMP SENT0_2 ;
SENWT1_2: CLR TI ;
MOV SBUF ,DATA4;
SENWT2_2: JBC TI,SENWT3_2;
LCALL LEDSHOW ;
AJMP SENWT2_2 ;
SENWT3_2: CLR TI ;
;
TT0_3: MOV SBUF,DATA5 ;
SENT0_3: JBC TI,SENWT1_3;
LCALL LEDSHOW ;
SJMP SENT0_3 ;
SENWT1_3: CLR TI ;
MOV SBUF ,DATA6;
SENWT2_3: JBC TI,SENWT3_3;
LCALL LEDSHOW ;
AJMP SENWT2_3 ;
SENWT3_3: CLR TI ;
RET ;數據發送完成,退出子程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;數據顯示
LEDSHOW: MOV R1,#60H
MOV P2,#0F0H
LEDSHOW_1:
MOV A,@R1
MOV B,#16
DIV AB
LCALL LED
INC P2
MOV A,B
LCALL LED
INC P2
INC R1
MOV A,R1
CJNE A,#66H,LEDSHOW_1
RET
;;;;;;;;;;;;;;數碼管顯示
LED: MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P1,A
LCALL DELAY1
RET
TABLE:
DB 0C0H ;"0"
DB 0F9H ;"1"
DB 0A4H ;"2"
DB 0B0H ;"3"
DB 99H ;"4"
DB 92H ;"5"
DB 82H ;"6"
DB 0F8H ;"7"
DB 80H ;"8"
DB 90H ;"9"
DB 0C8H ;"A"
DB 083H ;"B"
DB 0C6H ;"C"
DB 0A1H ;"D"
DB 086H ;"E"
DB 08EH ;"F"
DB 0BFH ;"-"
DELAY1:
MOV R7,#10
L1: MOV R6,#50
DJNZ R6,$
DJNZ R7,L1
RET
DELAY:
MOV R5,#250
D1: MOV R6,#200
D2: DJNZ R6,D2
DJNZ R5,D1
RET
END