求一Mcs51单片机关于采集AD转换数据的C程序

求一Mcs51单片机关于采集AD转换数据的C程序,第1张

89C52采集0809八位AD并显示出来的。现在估计没有人用了

#include<reg52h>

#include<absacch>

#define uchar unsigned char

#define uint unsigned int

#define LCDCOM XBYTE[0x8ffc] //LCD写命令寄存器地址

#define LCDDATA XBYTE[0x8ffd] //LCD写数据寄存器地址

#define LCDSTATUS XBYTE[0x8ffe] //LCD读状态寄存器地址

#define IN2 XBYTE[0x7ffa] //IN2通道地址

sbit ad_busy=P3^2;

sbit bflag=ACC^7;

//函数的声明部分

void delay1(uint x);

void lcd_busy();

void lcd_cmd(uchar lcd_cmd);

void lcd_data(uchar lcd_data);

void lcd_moveto(uchar position);

void init(void);

void ad0809(void);

uchar string[10]={"dianya is:"};

uchar temp[6]={0x00,0,0x00,0x00,0x00,0x0b};

uchar code dis_buf[13]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x2e,0x56,0x20};//为0到9的ASCLL码

void delay1(uint x) //延时1ms程序

{

uchar j;

while(x--)

{

for(j=0;j<125;j++)

{;}

}

}

void lcd_busy() //检测lcd忙程序

{

do

{

ACC=LCDSTATUS;

}

while(bflag==1); //当他忙的时候就不停的检测,直到空闲为止

}

void lcd_cmd(uchar lcd_cmd) //写命令函数

{

LCDCOM=lcd_cmd;

lcd_busy();

}

void lcd_data(uchar lcd_data) //写数据函数

{

LCDDATA=lcd_data;

lcd_busy();

}

void lcd_moveto(uchar position) //确定显示位置

{

uchar temp; //为显示位置对应的地址

if (position<16)

temp=(position+0x80-1); //为在第一行

else

temp=((position-16)+0xc0); //为第二行

lcd_cmd(temp);

}

void init(void) //lcd初始化

{

lcd_cmd(0x30); //置功能:1行,57字符

lcd_busy();

lcd_cmd(0x30); //置功能:1行,57字符

lcd_busy();

lcd_cmd(0x30); //置功能:1行,57字符

lcd_busy();

lcd_cmd(0x38); //置功能:2行,57字符

lcd_busy();

lcd_cmd(0x06); //置输入模式:地址增量,显示屏不移动

lcd_busy();

lcd_cmd(0x0c); //置显示开,不显示光标,光标不闪烁

lcd_busy();

lcd_cmd(0x01); //清显示

lcd_busy();

}

void ad0809(void)

{

uchar i;

uint a=0;

IN2=0;

i=i;

i=i;

while(ad_busy==0);

a=IN2;

a=a200/255;

a=a25;

temp[0]=a/1000;

temp[2]=a%1000/100;

temp[3]=a%100/10;

temp[4]=a%10;

}

void main(void)

{

uchar i,j;

P2=0xff;

P1=0xff;

P0=0xff;

delay1(20);

init();

while(1)

{

ad0809();

lcd_moveto(1);

for(j=0;j<10;j++)

{

lcd_data(string[j]);

}

lcd_moveto(16);

for(i=0;i<6;i++)

{

lcd_data(dis_buf[temp[i]]);

}

}

}

#include<reg51h>

#defineuint unsigned int

#defineuchar unsigned char

sbitspeaker = P2^7;

sbit key0 =P1^0;

sbit key1 =P1^1;

sbit key2 =P1^2;

sbit key3 =P1^3;

sbit key4 =P1^4;

sbit key5 =P1^5;

sbit key6 =P1^6;

sbit key7 =P1^7;

ucharled[8]={0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80};

voiddelay_1ms(uint t)

{

uchar m,n;

for(m=t;m>0;m--)

for(n=330;n>0;n--);

}

bitiskeyinput() //判断是否有按键闭合

{

if((P1 & 0xff) ==0xff ) //屏蔽高4位(列线),只检测低4位(行线)

return 0; //没有键闭合,返回0

else

return 1; //有键闭合,返回1

}

ucharkey_identify() //识别键号

{

uchar key;

if( key0==0 )key=0;

if(key1==0 )key=1;

if( key2==0 )key=2;

if( key3==0 )key=3;

if( key4==0 )key=4;

if( key5==0 )key=5;

if( key6==0 )key=6;

if( key7==0 )key=7;

return key; //输出键号

}

voidkeyprocess(uchar keynum)

{

uint i;

P0 = led[keynum];

i=500;

while(i--)

{

speaker = 0;

delay_1ms(10);

speaker = 1;

}

}

void main()

{

uchar keynum;

P0 = 0xFF;

while(1)

{

while (!iskeyinput() ); //如果没有键,则等待

delay_1ms(10); //去除键抖动

if(iskeyinput() ) //当前有按键,需要识别按键并且等待键盘松开

{

keynum= key_identify(); //识别键号

keyprocess(keynum);

while(1); //等待复位

}

}

}

将以 R2、R3 为首地址的源 RAM 区的 R6、R7 字节的数据

传送到以 R4、R5 为首地址的目的 RAM 区。

设定 R2、R3 所存储的源 RAM 首地址为 2000H(即 R2、R3 分别为 20H、00H),

R4、R5 所存储的目的 RAM 首地址为 4000H(即 R4、R5 分别为 40H、00H),

R6、R7 所存储 的字节数为 1FFFH(即 R6、R7 分别为 1FH、0FFH)。

---------------------

MOV R2,#20H

MOV R3,#00H

MOV R4,#40H

MOV R5,#00H

MOV R6,#1FH

MOV R7,#0FFH

LOOP:

MOV DPH,R2

MOV DPL,R3

MOVX A,@DPTR

INC DPTR

MOV R2,DPH

MOV R3,DPL

 

MOV DPH,R4

MOV DPL,R5

MOVX @DPTR,A

INC DPTR

MOV R4,DPH

MOV R5,DPL

 

DJNZ R7,LOOP

DJNZ R6,LOOP

 

SJMP $

 

END

挺简单的,只要你熟悉汇编指令就行了

ORG 0000H

MAIN:

MOV R0,#30H ;置数据块首地址

MOV R6,#20 ;数据长度

LOOP:

MOV A,#0AAH

SUBB A,@R0 ;A=A-((R0))

INC R0 ;读下一个数

CJNE A,#00H,LOOP1 ;判断A 是否等于零,不等,转LOOP1

MOV 51H,A ;等于零,即此数为#0AAH,存入51H中

LOOP1:

DJNZ R6,LOOP ;判断循环是否结束

END

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;系统名称: 数字钟

;创健人:济南, 日期:2005619

;系统功能描述:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;修改人: 修改日期:

;修改原因:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;蕊片型号:AT89C51 晶振:12MHZ

;-------------硬件连接---------------------

;

;

;-----------------------------------------------

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;程序名称: 声明区

;功能描述: 声明各常量和变量

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SECOND EQU 30H ;存储妙

MINITE EQU 31H ;存储分

HOUR EQU 32H ;存储时

SPEAKER BIT P37

HOURK BIT P32 ;时键

MINITEK BIT P33 ;分键

SECONDK BIT P30 ;妙键

FLAG BIT 00H

FLAG1S BIT 01H ;1S到标志

DISPBUF EQU 40H ; 段选标志

DISPBIT EQU 48H ; 位选通标志

T2SCNTA EQU 49H ; 中断次数

T2SCNTB EQU 4AH ; 中断次数

TEMP EQU 4BH ; 初始化位

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;程序名称:主程序

;功能描述;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

ORG 00H

LJMP START

ORG 0BH

LJMP INT_T0 ;T0中断入口

START: MOV SECOND,#00H ;妙初始化0

MOV MINITE,#00H ;分初始化0

MOV HOUR,#12 ;时始化送12

MOV DISPBIT,#00H ;位选通标志

MOV T2SCNTA,#00H ;标志

MOV T2SCNTB,#00H ;标志

CLR FLAG

CLR FLAG1S

SETB SPEAKER

MOV TEMP,#07FH ;初始位,让第一个位选通

LCALL DISP ;调用显示处理程序

MOV TMOD,#01H ;方式1

MOV TH0,#0F8H ;赋值20MS

MOV TL0,#030H

SETB TR0 ;开中断启动

SETB ET0

SETB EA

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;程序名称:按键程序

;功能描述;调整分,时

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

WT: JNB FLAG,CC

LCALL SPEAKING

CC: JB SECONDK,NK1 ;妙末按下,转去判断分键

LCALL DELY10MS ;按下,延时,消抖动

JB SECONDK,NK1 ;再次判断是否按下

INC SECOND ;按下,按下一次加1

MOV A,SECOND ;送A判断

CJNE A,#60,NS60 ;妙末到60转分

MOV SECOND,#00H ;到了,回0

NS60: LCALL DISP

JNB SECONDK,$ ;等待妙键释放

NK1: JB MINITEK,NK2 ;跟妙键分析相似

LCALL DELY10MS

JB MINITEK,NK2

INC MINITE

MOV A,MINITE

CJNE A,#60,NM60

MOV MINITE,#00H

NM60: LCALL DISP

JNB MINITEK,$

NK2: JB HOURK,NK3 ;时键

LCALL DELY10MS

JB HOURK,NK3

INC HOUR

MOV A,HOUR

CJNE A,#24,NH24

MOV HOUR,#00H

NH24: LCALL DISP

JNB HOURK,$ ;等待时键释放

NK3: LJMP WT ;返回

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;程序名称:显示处理程序

;功能描述;,该程序实现时,分,秒计时转换为BCD码并存储在以47H起始地址的显示

;输出数据存储单元里,即显示缓冲区47H至40H单元

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

DISP:

MOV A,#DISPBUF ;送40H

ADD A,#7 ;加8

;DEC A

MOV R1,A ;送47H

MOV A,HOUR ;送时

MOV B,#10

DIV AB

MOV @R1,A ;存储时十位

DEC R1 ;指向时个位

MOV A,B ;送时个位

MOV @R1,A ;存储时个位

DEC R1

MOV A,#10

MOV @R1,A

DEC R1

MOV A,MINITE ; 送分,处理与时处理类似

MOV B,#10

DIV AB

MOV @R1,A

DEC R1

MOV A,B

MOV @R1,A

DEC R1

MOV A,#10

MOV @R1,A

DEC R1

MOV A,SECOND ;送秒

MOV B,#10

DIV AB

MOV @R1,A

DEC R1

MOV A,B

MOV @R1,A

DEC R1

RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;程序名称:显示程序

;功能描述;在LED上显示为12-12-12显示模式

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

INT_T0:

MOV TH0,#0F8H ;重赋值

MOV TL0,#030H

MOV A,#DISPBUF ;段偏移存储

ADD A,DISPBIT ;位偏移量

MOV R0,A ;段偏移存储

MOV A,@R0 ;段偏移量

MOV DPTR,#TABLE ;指向字形表

MOVC A,@A+DPTR ;取字形

MOV P0,#0 ;防闪烁

MOV P0,A ; 字形选P1口显示

MOV A,DISPBIT ;位移偏量

MOV DPTR,#TAB ;指向位选

MOVC A,@A+DPTR ;取位选通

MOV P2,A ;位送P3口选通

INC DISPBIT ;位偏移加1

MOV A,DISPBIT ;位偏移送A

CJNE A,#08H,KNA ;八个数管码扫描完不

MOV DISPBIT,#00H ;描完重新开始

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;程序名称:1秒计时程序

;功能描述;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

KNA: INC T2SCNTA

MOV A,T2SCNTA

CJNE A,#100,DONE

MOV T2SCNTA,#00H

INC T2SCNTB

MOV A,T2SCNTB

CJNE A,#05H,DONE

SETB FLAG1S

MOV T2SCNTB,#00H

INC SECOND ;秒加1

MOV A,SECOND

CJNE A,#50,BB ;50S到

MOV A,MINITE

CJNE A,#59,BB ;59分

SETB FLAG ;打开正点响标志

BB: MOV A,SECOND

CJNE A,#60,NEXT ;秒超过60了没有 没有,调用显示处理程序

MOV SECOND,#00H

INC MINITE ;分加1

MOV A,MINITE

CJNE A,#60,NEXT

MOV MINITE,#00H ;分超过60,清0

INC HOUR ;并时加1

MOV A,HOUR

CJNE A,#24,NEXT ;是否超过24小时不是,则跳至NEXT

MOV HOUR,#00H

NEXT: LCALL DISP ; 调用显示处理程序

DONE: RETI ;中断返回

TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H ;0到9字形(40表示横扛)

TAB: DB 07FH,0BFH,0DFH,0EFH,0F7H,0FBH,0FDH,0FEH

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;程序名称:正点报时子程序

;功能描述; 前十秒报第一声,每隔一秒报一声

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

SPEAKING:MOV R5,#6

AA: CLR SPEAKER

JNB FLAG1S,$ ;延时1S

CLR FLAG1S

SETB SPEAKER

JNB FLAG1S,$

CLR FLAG1S

DJNZ R5,AA

CLR FLAG

RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;程序名称:延时子程序

;功能描述;按键消抖调用

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

DELY10MS:MOV R6,#10

D1: MOV R7,#248

DJNZ R7,$

DJNZ R6,D1

RET

:

mov A, X

cjne A, #7, QQQ ;A 试减7

QQQ: jnc DY6 ;无借位(即大于6)转移

cjne A, #2, AAA ;A 试减2

AAA: jc XY2 ;有借位(即小于2)转移

add A, X

add A, X ;A=3X

clr C

subb A, #5

mov Y, A ;Y = 3X - 5

sjmp _END

DY6:

mov B, X

mul AB ;乘

mov Y, A ;Y = XX

sjmp _END

XC2:

add A, X ;2X

add A, #1

mov Y, A ;Y = 2X+1

_END: sjmp $

PSW即程序状态寄存器,Program Status Word。

PSW各位的定义如下:

Cy(PSW7):即PSW的D7位,进位、借位标志。进位、借位CY=1;否则CY=0

AC(PSW6):即PSW的D6位,辅助进位、借位标志。当D3向D4有借位或进位时,AC=1;否则AC=0

F0(PSW5及PSW1):即PSW的D5位,用户标志位;

RS1及RS0(PSW4及PSW3):即PSW的D4、D3位,寄存器组选择控制位;

OV(PSW2):溢出标志。有溢出OV=1,否则OV=0;

F1(PSW·1):保留位,无定义;

P(PSW·0):奇偶校验标志位,由硬件置位或清0;存在ACC中的运算结果有奇数个1时P=1,否则P=0。

以上就是关于求一Mcs51单片机关于采集A/D转换数据的C程序全部的内容,包括:求一Mcs51单片机关于采集A/D转换数据的C程序、求MCS-51单片机四路抢答器的c语言程序设计、MCS-51单片机,数据块传送程序设计,汇编语言如何设计等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9450740.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存