PA8155EQU 0F101H
PB8155EQU 0F102H
PC8155EQU 0F103H
ORG 0000H
AJMP START
ORG 000BH
AJMP JISHU
ORG 001BH
AJMP MID
ORG 0100H
START:
MOV SP,#80H
CLR RS0
CLR RS1
MOV DPTR,#COM8155
MOV A,#03H8155初始化
MOVX @DPTR,A
----------开始充气检测--------------------
BEGIN:
MOV 20H,#17H
MOV 21H,#3BH
MOV 22H,#00H
MOV 23H,#00H
MOV 24H,#00H
MOV TMOD,#11H 定时器工作在方式1
MOV TH1,#0B1H
MOV TL1,#0DFH
MOV TH0,#0B1H
MOV TL0,#0B1H 定时器0还定时
MOV IE,#10000010B
SETB TR0
SETB TR1
START1:
ACALL DISPLAY
MOV DPTR,#PC8155
MOVX A,@DPTR
CLR C
SUBB A,#0FFH
JZ START1
MOV DPTR,#PC8155
MOVX A,@DPTR
RRC A
JNC S1
RRC A
JNC S2
RRC A
JNC S3
RRC A
JNC S4
RRC A
JNC S5
RRC A
JNC S6
AJMP START1
S1: ACALL DISPLAY
MOV DPTR,#PC8155
MOVX A,@DPTR
CLR C
SUBB A,#0FFH
JNZ S1
INC 20H
AJMP START1
S2: ACALL DISPLAY
MOV DPTR,#PC8155
MOVX A,@DPTR
CLR C
SUBB A,#0FFH
JNZ S2
DEC 20H
AJMP START1
S3: ACALL DISPLAY
MOV DPTR,#PC8155
MOVX A,@DPTR
CLR C
SUBB A,#0FFH
JNZ S3
INC 21H
AJMP START1
S4: ACALL DISPLAY
MOV DPTR,#PC8155
MOVX A,@DPTR
CLR C
SUBB A,#0FFH
JNZ S4
DEC 21H
AJMP START1
S5: ACALL DISPLAY
MOV DPTR,#PC8155
MOVX A,@DPTR
CLR C
SUBB A,#0FFH
JNZ S5
INC 22H
AJMP START1
S6: ACALL DISPLAY
MOV DPTR,#PC8155
MOVX A,@DPTR
CLR C
SUBB A,#0FFH
JNZ S6
DEC 22H
AJMP START1
-----------------------------------
MID:----开启AD转换器并读入数据 ---------------
PUSH PSW
PUSH ACC
PUSH B
PUSH DPL
PUSH DPH
SETB RS0
SETB RS1
--------------------------
SEC:
MOV A,23H
CLR C
SUBB A,#32H
JC LOOP1
MOV 23H,#00H
INC 22H
LOOP1:CLR C
MOV A,22H
SUBB A,#3CH
JC MIN1
MOV 22H,#00H
INC 21H
MIN1:MOV A,21H
CLR C
SUBB A,#3CH
JC HOU1
MOV 21H,#00H
INC 20H
HOU1: MOV A,20H
CLR C
SUBB A,#18H
JNC D0
AJMP MID1
D0:MOV 20H,#00H
AJMP MID1
--------------------------------
MID1:
MOV TMOD,#11H
MOV TH1,#0B1H
MOV TL1,#0DFH
MOV IE,#10001010B
SETB TR1
POP DPH
POP DPL
POP B
POP ACC
POP PSW
RETI
------开中断,下一个计时-----
------------AD转换中断结束-------------------------
------------调速中断-------------------------
JISHU: PUSH PSW
PUSH ACC
PUSH B
PUSH DPL
PUSH DPH
INC 23H
MOV TMOD,#11H
MOV TH0,#0FFH
MOV TL0,#55H
MOV IE,#10001010B
SETB TR0
POP DPH
POP DPL
POP B
POP ACC
POP PSW
RETI
------------调速中断-------------------------
DISPLAY:
MOV B,#0AH
MOV A,20H
DIV AB
MOV DPTR,#LED_TAB 字型码表
MOVC A,@A+DPTR
CPL A
MOV DPTR,#PA8155
MOVX @DPTR,A
MOV A,#07FH
INC DPTR
MOVX @DPTR,A
ACALL DELAY
MOV A,B
MOV DPTR,#LED_TAB 字型码表
MOVC A,@A+DPTR
CPL A
MOV DPTR,#PA8155
MOVX @DPTR,A
MOV A,#0BFH
INC DPTR
MOVX @DPTR,A
ACALL DELAY
-------------------------------
MOV DPTR,#PA8155
MOV A,#00H
MOVX @DPTR,A
MOV A,#0DFH
MOV DPTR,#PB8155
MOVX @DPTR,A
--------------------------------
MOV B,#0AH
MOV A,21H
DIV AB
MOV DPTR,#LED_TAB 字型码表
MOVC A,@A+DPTR
CPL A
MOV DPTR,#PA8155
MOVX @DPTR,A
MOV A,#0EFH
INC DPTR
MOVX @DPTR,A
ACALL DELAY
MOV A,B
MOV DPTR,#LED_TAB 字型码表
MOVC A,@A+DPTR
CPL A
MOV DPTR,#PA8155
MOVX @DPTR,A
MOV A,#0F7H
INC DPTR
MOVX @DPTR,A
ACALL DELAY
-------------------------------
MOV DPTR,#PA8155
MOV A,#00H
MOVX @DPTR,A
MOV A,#0F7H
MOV DPTR,#PB8155
MOVX @DPTR,A
--------------------------------
MOV B,#0AH
MOV A,22H
DIV AB
MOV DPTR,#LED_TAB 字型码表
MOVC A,@A+DPTR
CPL A
MOV DPTR,#PA8155
MOVX @DPTR,A
MOV A,#0FDH
INC DPTR
MOVX @DPTR,A
ACALL DELAY
MOV A,B
MOV DPTR,#LED_TAB 字型码表
MOVC A,@A+DPTR
CPL A
MOV DPTR,#PA8155
MOVX @DPTR,A
MOV A,#0FEH
INC DPTR
MOVX @DPTR,A
ACALL DELAY
RET
------------------------
----------------------
-----------------------------------
DELAY:MOV R0,0FFH
DE0:
DJNZ R0,DE0
RET
LED_TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H
DB 080H,90H,88H,83H,0C6H,0A1H,86H,8EH
END
AD0809的采集程序//---A/D转换---
//-----头文件引用------
#include <Reg51.h>
#include <absacc.h>
#include <intrins.h>
typedef unsigned char BYTE/*自定义字节类型*/
#define Set_Bit(BIT) (BIT = 1) /*定义置1函数*/
#define Clear_Bit(BIT) (BIT = 0) /*定义清0函数*/
/************************************************************************************/
void Write_Hd7279(BYTE,BYTE)/*定义HD7279写函数*/
BYTE Read_Hd7279(BYTE)/*定义HD7279读函数*/
void Send_Byte(BYTE)/*定义HD7279发送字节函数*/
BYTE Receive_Byte(void)/*定义HD7279接收字节函数*/
void Short_Delay(void)/*定义短延时函数*/
void Long_Delay(void)/*定义长延时函数*/
void Mcu_Init(void)/*定义MCU初始化函数*/
void Delay_200_mS(void)/*定义200ms延时函数*/
sbit Hd7279_Clk=P1^6/*定义HD7279时钟硬件连接*/
sbit Hd7279_Data=P1^5/*定义HD7279数据硬件连接*/
sbit cs=P1^7
void Short_Delay(void) /*短延时函数*/
{
BYTE i
for(i=0i<0x08i++)
}
/************************************************************************************/
void Long_Delay(void) /*长延时函数*/
{
BYTE i
for(i=0i<0x30i++)
}
/************************************************************************************/
void Write_Hd7279(BYTE Command,BYTE Data) /*HD7279写函数*/
{
Send_Byte(Command)
Send_Byte(Data)
}
/************************************************************************************/
void Send_Byte(BYTE Data_Out) /*HD7279发送字节函数*/
{
BYTE i
cs=0
Long_Delay()
for(i=0i<8i++)
{
if(Data_Out&0x80) Set_Bit(Hd7279_Data)
else Clear_Bit(Hd7279_Data)
Set_Bit(Hd7279_Clk)
Short_Delay()
Clear_Bit(Hd7279_Clk)
Short_Delay()
Data_Out=Data_Out<<1
}
Clear_Bit(Hd7279_Data)
}
//-----宏声明-----
#define A_DPORT XBYTE[0xFef3]//0809通道0地址
#define uchar unsigned char
//-----变量定义-----
bit bdata bz=0//定义标志
uchar val
//-----初始化-----
void first(void)
{
P1=0xff
P2=0xff
P3=0xff
P0=0xff
Send_Byte(0xa4)
IT1=1
EX1=1
EA=1//INT0 允许
}
//-----中断-----
void int_0(void) interrupt 2
{
val=A_DPORT//读 A_D 数据
bz=1//置读数标志
}
//-----主程序-----
main()
{
first()//初始化
while(1)
{
A_DPORT=val//启动 A_D
while(bz==0)//等待 A_D 转换结束
// val=~A_DPORT
//P1=val//数据输出
Write_Hd7279(0xc8,val&0x0f)
Write_Hd7279(0xc9,val>>4)
Write_Hd7279(0x92,0x00)
Write_Hd7279(0x93,0x00)
Write_Hd7279(0x94,0x00)
Write_Hd7279(0x95,0x00)
Write_Hd7279(0xce,0x0d)
Write_Hd7279(0xcf,0x0a)
bz=0//清读数标志
}
}
这就是C的程序
http://hi.baidu.com/dzkfw/blog/item/4a188216fd986b12c83d6d05.html
不平凡的单片机学习资料,很好的单片机教程,超好用,一个不占内存的教程,有案例。
1、最新版单片机编程宝典下载地址,学习单片机编程必备手册
2、单片机c语言运用例子
3、十天学会单片机c语言和单片机制作,最好的单片机资料
#include "stc2052.h"#include "main.h"
void ADC_init(void)
void del(INT8U x)
void uart_init(void)
void PutHex(INT8U *cp,INT8U len)
void ADC_SPI_Routine(void)
void Putstr(char *cs)
/*用的是5406,12M晶体,波特率不能太大,用2400,
实验过程是 在P1.6脚 接2.5v电压,开AD 读到最终值是80H,7FH 左右*/
void main()
{
EA=0
P1M0=0x40
P1M1=0x00//表示第P1.6作为AD输入
EA=1
uart_init()
ADC_init()
while(1){
del(100)
uart_s_buf[0] = ADC_DATA
uart_s_buf[1]=0x23
PutHex(uart_s_buf,2)
del(1000)
}
}
void ADC_init(void)
{
ADC_CONTR |= 0x06
ADC_CONTR |= 0x80//开启ADC电源
del(1)
ADC_CONTR |= 0x08//启动AD
AUXR |= 0x10
EADC_SPI = 1
}
void del(INT8U yj)
{
INT8U yj2=5000
while(yj!=0)
{
while(yj2!=0)
{
yj2--
}
yj2=1000
yj--
}
}
void uart_init(void)
{
SCON = 0x50
//SCON: mode 1,8-bit UART, enable rcvr
AUXR = 0x80 // 作在1T模式
// PCON = 0x80 // 加速
TMOD = 0x20 //* TMOD: timer 1,mode 2,8-bit reload TL0 NO USED
TH1 = SYS_TDATA /* 2400 Bds at 11.1184MHz */
TL1 = SYS_TDATA /* 2400 Bds at 11.1184MHz */
// ES = 1 /* Enable serial interrupt*/
TR1 = 1
/* Timer 1 run */
}
void PutHex(INT8U *cp,INT8U len)
{
ES=0
TI= 0
while(len--)
{
SBUF=*cp
cp++
while(TI==0) //等待发送结束,死循环,如果TI==0,则死循环,如果TI==1,则执行下条。 同while(TI==0){}
TI=0
}
ES=0
}
void Putstr(char *cs)
{
TI=0
while(*cs) /* 例如 :指向数组的指针,例如
int b[10]
int *a = b
a就是b[0]的地址*a就是b[0]的内容
a+1就是b[1]的地址依此类推
又如char *a = "hank"
那么通过a就能得到整个字符串"hank"
*a是h
*(a+1)是a 所以发送完k后 就是(*cs==0)0了,那就跳出循环 */
{
SBUF=*cs
cs++
while(TI==0)
TI=0
}
}
void ADC_SPI_Routine(void) interrupt 5
{
EADC_SPI = 0
ADC_CONTR |= 0x08 //ADC_START启动
ADC_CONTR &= 0xef //ADC_FLAG清零
EADC_SPI = 1
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)