单片机部分程序单片机的C语言应用程序设计.docx
- 文档编号:3781526
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:46
- 大小:26.77KB
单片机部分程序单片机的C语言应用程序设计.docx
《单片机部分程序单片机的C语言应用程序设计.docx》由会员分享,可在线阅读,更多相关《单片机部分程序单片机的C语言应用程序设计.docx(46页珍藏版)》请在冰豆网上搜索。
单片机部分程序单片机的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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 部分 程序 语言 应用 程序设计