单片机部分程序单片机的C语言应用程序设计Word文件下载.docx
《单片机部分程序单片机的C语言应用程序设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《单片机部分程序单片机的C语言应用程序设计Word文件下载.docx(46页珍藏版)》请在冰豆网上搜索。
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的地址
*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;
i++);
while(ad_busy==0);
chADResult=*pADChannel;
//读AD转换结果
return(chADResult);
AD574
//绝对地址访问头文件,外部扩展接口时加入此头文件
#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转换程序
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个数据放在数组中的程序。
#defineADC0809_6XBYTE[0x7FFE]//通道0的地址
unsignedintADBaseAddr=0x7FF8;
unsignedcharxdata*pADAddr;
unsignedchardataad[20];
unsignedchardatai;
//pADAddr=0x7ffe;
pADAddr=&
ADC0809_6;
*pADAddr=0x08;
//用指针方式AD转换
i=*pADAddr;
20;
ADC0809_6=0;
ad_busy=1;
ad[i]=ADC0809_6;
//用绝对地址方式AD转换
ad0809(ad);
//取8个通道的数据,存储在数组ad中
ad[0]=ADC0809(ADBaseAddr,0);
//取0通道的AD采集结果
//AD采样函数,参数为AD采样结果的指针
ad_adr=&
IN0;
//for(j=0;
//while((adstate=(P3&
0x08))==0x00);
x++;
*pADChannel=0x00;
//for(i=0;
5;
C
Cpara
unsignedcharx,y,z;
x=2;
y=3;
z=x*y;
x=1;
y=2;
Cpara2
unsignedchar*px,*py,*pz;
px=0x18;
py=0x20;
pz=0x22;
*px=2;
*py=3;
*pz=(*px)*(*py);
*px=1;
*py=2;
Cpara3
floatmul(floatx,y);
floatx,y,z;
float*px,*py,*pz;
px=&
x;
py=&
y;
pz=&
z;
x=4;
y=5;
z=mul(x,y);
z=6;
floatmul(floatx,y)
floatz;
returnz;
Cpara4
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;
pDataAddr=&
*pDataAddr=0x01;
temp=*pDataAddr;
*pDataAddr=0x02;
*pDataAddr=0x03;
u;
*pDataAddr=0x04;
v;
*pDataAddr=0x05;
temp=*pDataAddr;
w;
P1=0x08;
//sfrP0=0x80;
sfrP1=0x90;
sfrP2=0xA0;
pIdataAddr=0x90;
//如果CPU选8051,则这个访问无效
*pIdataAddr=0x55;
temp=*pIdataAddr;
pIdataAddr=0x91;
temp1=P1;
P0=0xbb;
DA转换
DAC0832
#defineDA0832XBYTE[0xA001]//DA转换器地址
voidstair(unsignedintchDelay,unsignedcharchVol);
voiddelay(unsignedintndelaytime);
sbitstartP1^7;
while
(1)
if(start)
stair(200,100);
else
;
voidstair(unsignedintchDelay,unsignedcharchVol)
unsignedchari;
=chVol;
DA0832=i;
//DA数据输出
delay(chDelay);
if(!
start)break;
}
voiddelay(unsignedintndelaytime)
unsignedinti;
ndelaytime;
DAC0932_P218_10_4
//单片机的C语言应用程序设计第3版
//P218,第十章4题
//编程实现由DAC0832输出的幅度和频率都可以控制的三角波,即从0上升到最大值,再从最大值下降到0并不断重复。
//图参见211页
#defineDAC0832XBYTE[0xfffe]//DA转换器地址
voidsanjiaobo(unsignedintchDelay,unsignedcharchVol);
sanjiaobo(50,200);
voidsanjiaobo(unsignedintchDelay,unsignedcharchVol)
DAC0832=i;
for(i=chVol;
i>
0;
i--)
DAC0832_P218_10_5
//用8051单片机和0832数模转换器产生梯形波。
梯形波的斜边采用步幅为1的线性波,幅度为00H~80H,
//水平部分靠调用延迟程序来维持。
写出梯形波产生的程序。
voidTiXingBo(unsignedintchDelay,unsignedcharchVol);
TiXingBo(50,200);
voidTiXingBo(unsignedintchDelay,unsignedcharchVol)
HD7279键盘显示控制程序
/**/
#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);
//形成显示代码
//主程序实验功能是按下一个键,显示出相应的键。
bitbt;
bt=dat;
init();
bNewKey=0;
display();
if(bNewKey)//是否有新键按下
{
for(i=0;
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;
case0x0c:
chKey=4;
case0x0d:
chKey=5;
case0x0e:
chKey=6;
case0x14:
chKey=7;
case0x15:
chKey=8;
case0x16:
chKey=9;
case0x1d:
chKey=0;
case0x1c:
chKey=10;
case0x1e:
chKey=11;
bNewKey=1;
//表示有新的键按下
//显示程序
voiddisplay()
unsignedcharj;
j++)
write7279((0x80+j),dispdata[j]);
//把显示数据输出
//往HD7279A中写入一个字节.
voidsend_byte(unsignedcharout_byte)
//EA=0;
clk=0;
//CLK变低电平
long_delay();
for(i=0;
if(out_byte&
0x80)//得到要输出的数据位,高位在先
dat=1;
dat=0;
clk=1;
//CLK变高电平,这一位写入HD7279A寄存器
short_delay();
//延时
//CLK变低,为下一次写入数据作准备
out_byte=out_by