单片机部分程序单片机的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