单片机部分程序单片机的C语言应用程序设计.docx

上传人:b****4 文档编号:3781526 上传时间:2022-11-25 格式:DOCX 页数:46 大小:26.77KB
下载 相关 举报
单片机部分程序单片机的C语言应用程序设计.docx_第1页
第1页 / 共46页
单片机部分程序单片机的C语言应用程序设计.docx_第2页
第2页 / 共46页
单片机部分程序单片机的C语言应用程序设计.docx_第3页
第3页 / 共46页
单片机部分程序单片机的C语言应用程序设计.docx_第4页
第4页 / 共46页
单片机部分程序单片机的C语言应用程序设计.docx_第5页
第5页 / 共46页
点击查看更多>>
下载资源
资源描述

单片机部分程序单片机的C语言应用程序设计.docx

《单片机部分程序单片机的C语言应用程序设计.docx》由会员分享,可在线阅读,更多相关《单片机部分程序单片机的C语言应用程序设计.docx(46页珍藏版)》请在冰豆网上搜索。

单片机部分程序单片机的C语言应用程序设计.docx

单片机部分程序单片机的C语言应用程序设计

················老师给的程序··················

第一章

1-32

ORG0000H

LJMPSTART

ORG0100H

START:

MOVR2,#00H

MOVR1,#20H

LOOP:

MOVA,@R1

JZZERO

INCR1

CJNER1,#51H,OVER

JMPLOOP

ZERO:

INCR2

MOV51H,R2

JMPLOOP

OVER:

SJMP$

END

1-34

ORG0000H

LJMPSTART

ORG0100H

START:

MOVDPTR,#1FFFH

LOOP:

INCDPTR

MOVXA,@DPTR

PUSHDPH

PUSHACC

MOVA,DPH

ADDA,#10H

MOVDPH,A

POPACC

MOVX@DPTR,A

POPDPH

MOVA,DPH

CJNEA,#21H,LOOP

END

AD转换

ADC0809

#include//绝对地址访问头文件

#include

#defineIN0XBYTE[0x7FF8]//通道0的地址

sbitad_busy=P3^3;//AD转换结束标志

voidad0809(unsignedchar*x);//AD转换函数,变量x为AD转换结果的指针

unsignedcharADC0809(unsignedintnADAddrBase,unsignedcharchChannel);

main()

{

unsignedintdatai;

staticunsignedchardataad[8];

//ad0809(ad);

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

{

ad[i]=ADC0809(0x7FF8,i);

}

}

voidad0809(unsignedchar*x)

{

unsignedchari,j;

//unsignedcharadstate;

unsignedcharxdata*ad_adr;//指向外部存储空间的指针

ad_adr=IN0;//获得AD转换通道0的地址

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

{

*ad_adr=0;//启动AD转换

for(j=0;j<2;j++);//延时,EOC在AD转换启动后10us行变成低电平

//while((adstate=P3&0x08)==0x00);//等待AD转换结束

while(ad_busy==0);//等待AD转换结束,AD转换结束后EOC变高电平

*x=*ad_adr;

ad_adr++;

x++;

}

}

//返回值为无符号字符型,变量分别为AD转换器的基地址,AD转换器的模拟通道

unsignedcharADC0809(unsignedintnADAddrBase,unsignedcharchChannel)

{

unsignedchari,chADResult;

unsignedcharxdata*pADChannel;

pADChannel=nADAddrBase+chChannel;

*pADChannel=chChannel;//启动AD转换

for(i=0;i<2;i++);//延时,EOC在AD转换启动后10us行变成低电平

while(ad_busy==0);//等待AD转换结束

chADResult=*pADChannel;//读AD转换结果

return(chADResult);

}

AD574

#include//绝对地址访问头文件,外部扩展接口时加入此头文件

#include

#defineADCOMXBYTE[0xFF7C]//A0=0,R/C=0,CS=0;

#defineADLOXBYTE[0xFF7F]//A0=1,R/C=1,CS=0;

#defineADHIXBYTE[0xFF7D]//A0=0,R/C=1,CS=0;

sbitbRead=P3^7;//读信号

sbitbWrite=P3^6;//写信号

sbitbADBusy=P1^0;//AD转换完成信号

unsignedintAD574();//AD转换程序

main()

{

unsignedintnResult;

nResult=AD574();

}

unsignedintAD574()

{

bRead=0;//使CE=1;

bWrite=0;

ADCOM=0;//启支动AD转换

while(bADBusy==1);

return((unsignedint)(ADHI<<4)+(ADLO&0x0f));

}

ADC0809_P233_11_2

//利用11_3电路,编写由ADC0809的通道6连续采集20个数据放在数组中的程序。

#include//绝对地址访问头文件

#include

#defineADC0809_6XBYTE[0x7FFE]//通道0的地址

#defineIN0XBYTE[0x7FF8]//通道0的地址

unsignedintADBaseAddr=0x7FF8;

unsignedcharADC0809(unsignedintnADAddrBase,unsignedcharchChannel);

voidad0809(unsignedchar*x);

sbitad_busy=P3^3;//AD转换结束标志

unsignedcharxdata*pADAddr;

unsignedchardataad[20];

main()

{

unsignedchardatai;

//pADAddr=0x7ffe;

pADAddr=&ADC0809_6;

*pADAddr=0x08;//用指针方式AD转换

i=*pADAddr;

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

{

ADC0809_6=0;

ad_busy=1;

ad_busy=1;

while(ad_busy==0);

ad[i]=ADC0809_6;//用绝对地址方式AD转换

}

ad0809(ad);//取8个通道的数据,存储在数组ad中

ad[0]=ADC0809(ADBaseAddr,0);//取0通道的AD采集结果

}

//AD采样函数,参数为AD采样结果的指针

voidad0809(unsignedchar*x)

{

unsignedchari,j;

unsignedcharxdata*ad_adr;//指向外部存储空间的指针

ad_adr=&IN0;//获得AD转换通道0的地址

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

{

*ad_adr=0;//启动AD转换

//for(j=0;j<2;j++);

//延时,EOC在AD转换启动后10us行变成低电平

//while((adstate=(P3&0x08))==0x00);//等待AD转换结束

while(ad_busy==0);

//等待AD转换结束,AD转换结束后EOC变高电平

*x=*ad_adr;

ad_adr++;

x++;

}

}

//返回值为无符号字符型,变量分别为AD转换器的基地址,AD转换器的模拟通道

unsignedcharADC0809(unsignedintnADAddrBase,unsignedcharchChannel)

{

unsignedchari,chADResult;

unsignedcharxdata*pADChannel;

pADChannel=nADAddrBase+chChannel;

*pADChannel=0x00;//启动AD转换

//for(i=0;i<5;i++);

//延时,EOC在AD转换启动后10us行变成低电平

while(ad_busy==0);//等待AD转换结束

chADResult=*pADChannel;//读AD转换结果

return(chADResult);

}

C

Cpara

#include

main()

{

unsignedcharx,y,z;

x=2;

y=3;

z=x*y;

x=1;

y=2;

}

Cpara2

#include

main()

{

unsignedchar*px,*py,*pz;

px=0x18;

py=0x20;

pz=0x22;

*px=2;

*py=3;

*pz=(*px)*(*py);

*px=1;

*py=2;

}

Cpara3

#include

floatmul(floatx,y);

main()

{

floatx,y,z;

float*px,*py,*pz;

x=2;

y=3;

z=x*y;

x=1;

y=2;

px=&x;

py=&y;

pz=&z;

*pz=(*px)*(*py);

x=4;

y=5;

z=mul(x,y);

z=6;

}

floatmul(floatx,y)

{

floatz;

z=x*y;

returnz;

}

Cpara4

#include

unsignedchardatax;//DATA区,内部的低128字节

unsignedcharpdatay;//外部存储区的最低地址的256个字节,称为PDATA区。

unsignedcharxdataz;//外部存储区

unsignedcharbdatau;//内部RAM的位寻址区叫做位寻址段BDATA区,包括16个字节共128位。

unsignedcharidatav;//8052有附加的128字节的内部RAM,位于从80H开始的地址空间中,这部分加上低128字节的内部RAM共256字节,被称为IDATA。

unsignedcharcodew=0xaa;//程序存储区称为CODE区

unsignedchardatatemp,temp1;

unsignedchar*pDataAddr;

unsignedcharidata*pIdataAddr;

floatmul(floatx,y);

main()

{

pDataAddr=&x;

*pDataAddr=0x01;

temp=*pDataAddr;

pDataAddr=&y;

*pDataAddr=0x02;

temp=*pDataAddr;

pDataAddr=&z;

*pDataAddr=0x03;

temp=*pDataAddr;

pDataAddr=&u;

*pDataAddr=0x04;

temp=*pDataAddr;

pDataAddr=&v;

*pDataAddr=0x05;

temp=*pDataAddr;

pDataAddr=&w;

temp=*pDataAddr;

P1=0x08;//sfrP0=0x80;sfrP1=0x90;sfrP2=0xA0;

pIdataAddr=0x90;//如果CPU选8051,则这个访问无效

*pIdataAddr=0x55;

temp=*pIdataAddr;

pIdataAddr=0x91;

temp=*pIdataAddr;

temp1=P1;

P0=0xbb;

}

floatmul(floatx,y)

{

floatz;

z=x*y;

returnz;

}

DA转换

DAC0832

#include

#defineDA0832XBYTE[0xA001]//DA转换器地址

voidstair(unsignedintchDelay,unsignedcharchVol);

voiddelay(unsignedintndelaytime);

sbitstartP1^7;

main()

{

while

(1)

{

if(start)

{

stair(200,100);

}

else

{

;

}

}

}

voidstair(unsignedintchDelay,unsignedcharchVol)

{

unsignedchari;

while

(1)

{

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

{

DA0832=i;//DA数据输出

delay(chDelay);

if(!

start)break;

}

if(!

start)break;

}

}

voiddelay(unsignedintndelaytime)

{

unsignedinti;

for(i=0;i

}

DAC0932_P218_10_4

//单片机的C语言应用程序设计第3版

//P218,第十章4题

//编程实现由DAC0832输出的幅度和频率都可以控制的三角波,即从0上升到最大值,再从最大值下降到0并不断重复。

//图参见211页

#include

#include

#defineDAC0832XBYTE[0xfffe]//DA转换器地址

voidsanjiaobo(unsignedintchDelay,unsignedcharchVol);

voiddelay(unsignedintndelaytime);

main()

{

while

(1)

{

sanjiaobo(50,200);

}

}

voidsanjiaobo(unsignedintchDelay,unsignedcharchVol)

{

unsignedchari;

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

{

DAC0832=i;

delay(chDelay);

}

for(i=chVol;i>0;i--)

{

DAC0832=i;

delay(chDelay);

}

}

voiddelay(unsignedintndelaytime)

{

unsignedinti;

for(i=0;i

}

DAC0832_P218_10_5

//用8051单片机和0832数模转换器产生梯形波。

梯形波的斜边采用步幅为1的线性波,幅度为00H~80H,

//水平部分靠调用延迟程序来维持。

写出梯形波产生的程序。

//图参见211页

#include

#include

#defineDAC0832XBYTE[0xfffe]//DA转换器地址

voidTiXingBo(unsignedintchDelay,unsignedcharchVol);

voiddelay(unsignedintndelaytime);

main()

{

while

(1)

{

TiXingBo(50,200);

}

}

voidTiXingBo(unsignedintchDelay,unsignedcharchVol)

{

unsignedchari;

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

{

DAC0832=i;

}

delay(chDelay);

for(i=chVol;i>0;i--)

{

DAC0832=i;

}

}

voiddelay(unsignedintndelaytime)

{

unsignedinti;

for(i=0;i

}

HD7279键盘显示控制程序

/**/

#include

#defineCMD_RESET0xa4//复位命令

#defineCMD_TEST0xbf//测试命令

#defineDECODE00x80//译码方式0

#defineDECODE10xc8//译码方式1

#defineCMD_READ0x15//读键盘命令

#defineUNDECODE0x90//非译码方式

#defineRTL_CYCLE0xa3//循环左移

#defineRTR_CYCLE0xa2//循环右移

#defineRTL_UNCYL0xa1//左移

#defineRTR_UNCYL0xa0//右移

#defineACTCTL0x98//消隐控制

#defineSEGON0xe0//段点亮

#defineSEGOFF0xc0//段关闭

#defineBLINKCTL0x88//闪烁控制

//******

voidinit();//初始化程序

voidkeyint();//键盘中断服务程序

voidlong_delay(void);//长延时程序

voidshort_delay(void);//短延时程序

voidwrite7279(unsignedcharcmd,unsignedchardta);//往HD7279A中写命令

unsignedcharread7279(unsignedcharcommand);//从HD7279A中读键值

voidsend_byte(unsignedcharout_byte);//往HD7279A中写入一个字节

unsignedcharreceive_byte(void);//从HD7279A中读出一个字节

voiddisplay();//显示程序

//***I/O***

sbitcs=P1^1;//片选信号接P1.1

sbitclk=P1^2;//CLK信号接P1.2

sbitdat=P1^0;//DATA信号接P1.0

sbitkey=P3^2;//键盘中断信号接P3.2

//******HD7279A******

unsignedcharchKey;//键盘返回值

bitbNewKey;//有新键值标志位。

unsignedchardispdata[6]={7,8,0,0,0,0};//要显示的数据,六位

voiddispcode(unsignedcharchData);//形成显示代码

//主程序实验功能是按下一个键,显示出相应的键。

main()

{

unsignedchari;

bitbt;

bt=dat;

init();

bNewKey=0;

display();

while

(1)

{

if(bNewKey)//是否有新键按下

{

for(i=0;i<6;i++)//如果有则在显示器中显示出键值

{

dispdata[i]=chKey;

}

display();//显示

bNewKey=0;//清有新键按下标志

}

}

}

voidinit()

{

PX0=0;/*外部中断0优先级*/

IT0=0;/*外部中断0,低电平触发*/

IE0=0;/*外部中断0中断申请标志位*/

EX0=1;/*允许外部中断0*/

EA=1;

send_byte(CMD_RESET);//HD7279A复位

}

//按照实验箱的接法,接一个3*4小键盘,它们的键值分别是:

//1:

0x04;2:

0x05;3:

0x06;4:

0x0c;5:

0x0d;6:

0x0e;7:

0x14;8:

0x15;9:

0x0x16;*:

0x1c;0:

0x1d;#:

0x1e

voidkeyint()interrupt0using1

{

unsignedchartemp;

temp=read7279(0x15);//读出键值

switch(temp)

{

case0x04:

chKey=1;

break;

case0x05:

chKey=2;

break;

case0x06:

chKey=3;

break;

case0x0c:

chKey=4;

break;

case0x0d:

chKey=5;

break;

case0x0e:

chKey=6;

break;

case0x14:

chKey=7;

break;

case0x15:

chKey=8;

break;

case0x16:

chKey=9;

break;

case0x1d:

chKey=0;

break;

case0x1c:

chKey=10;

break;

case0x1e:

chKey=11;

break;

}

bNewKey=1;//表示有新的键按下

}

//显示程序

voiddisplay()

{

unsignedcharj;

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

{

write7279((0x80+j),dispdata[j]);//把显示数据输出

}

}

//往HD7279A中写入一个字节.

voidsend_byte(unsignedcharout_byte)

{

unsignedchari;

//EA=0;

clk=0;//CLK变低电平

long_delay();

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

{

if(out_byte&0x80)//得到要输出的数据位,高位在先

{

dat=1;

}

else

{

dat=0;

}

clk=1;//CLK变高电平,这一位写入HD7279A寄存器

short_delay();//延时

clk=0;//CLK变低,为下一次写入数据作准备

short_delay();//延时

out_byte=out_by

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1