NEXT: ADD A,B
NEXT1:DJNZ R7,LOOP (下一行)RET 第4章:
5.利用C8051F020单片机的T0计数,每计10个脉冲,P1.0取反一次,试用查询和中断两种方式编程。 确定工作方式,计算初值:选方式2计数方式,初值=256-10=246=0xf6; 查询方式程序: sbit P1_0=P1^0; void main(void) {
//关看门狗 WDTCN=0xde; WDTCN=0xad; //配置交叉开关
XBR1=0x02;//允许T0外部输入 XBR2=0x40;//使能交叉开关 //初始化定时器0
TMOD=0x06;// 方式2计数 TL0=OxF6; TH0=OxF6; TR0=1;//启动T0 While(1) {
While(!TF0);//等待计数溢出 TF0=0; P1_0=!P1_0; } }
中断方式程序: sbit P1_0=P1^0; void main(void) {
//关看门狗 WDTCN=0xde; WDTCN=0xad; //配置交叉开关
XBR1=0x02;//允许T0外部输入 XBR2=0X40; //初始化定时器0
IE|=0x82;//允许T0中断 While(1);//等待中断 }
void T0_ISR(void) interrupt 1 {
P1_0=!P1_0; }
TMOD=0x06;// 方式2计数 TL0=OxF6; TH0=OxF6; TR0=1;//启动T0
8.在C8051F020单片机中,已知系统时钟频率为12MHz,编写程序使P1.0和P1.1分别输出周期为2ms和50μs的方波。
解:P1.0和P1.1分别每1ms和25μs取反一次即可。选T0方式1定时25μs,每溢出40次P1.0取反一次。初值计算:由P157公式:TC?2N?T12(1?T0M)?fosc,选T0M=0得: 程序:
sbit P1_0=P1^0; sbit P1_1=P1^1; int count=40; void main(void) {
//关看门狗 WDTCN=0xde; WDTCN=0xad; //使能交叉开关 XBR2=0x40; //初始化定时器0
TMOD=0x01;// 方式1定时 TL0=0xe7; TH0=0xff;
IE|=0x82;//允许T0中断 TR0=1;//启动T0 While(1);//等待中断 }
void T0_ISR(void) interrupt 1 {
TL0|=0xe7; TH0=0xff; P1_0=!P1_0; Count--;
If(Count==0){ P1_1=!P1_1; Count=40;}
a=216-25=65511=0xffe7;
}
15.当C8051F020的串行口工作在方式2、3时,它的第9数据位可用作“奇偶校验位”进行传送,接收端用它来核对接收到的数据正确与否。试编写串行口方式2带奇偶校验的发送和接收程序。 解:发送程序: void send(char ch) {
ACC=ch; TB80=P; SBUF0=ch; While (!TI0); TI0=0; }
接收程序: char receive(void) {
While (!RI0); RI0=0; ACC=SBUF0;
If (RB80==P) return ch; }
16. 设甲乙两机采用UART0方式1通信,波特率为4800,甲机发送0、1、2…、1FH,乙机接受并存放在内部RAM以20H为首地址的单元,试用查询和中断两种方式编写甲、乙两机的程序(系统时钟为12MHz) 设利用T1工作在定时方式2(自动重装初值)提供波特率,T1M=0(按振荡器12分频)计数,SMOD0=0,T1初值计算如下:
12?106?12(0?1)2SMOD0?SYSCLK?(12(T1M?1))X=256-=256-=250=FAH
32?波特率32?4800#include
unsigned char xdata tbuf[]={0x0,0x1,…,0x1f}; void main(void) {
unsigned char i;
unsigned char xdata *p=tbuf;
XBR0=0x04; //配置交叉开关 XBR2=0x40;
P0MDOUT|=0x01;//TX0(P0.0)为推挽输出方式 TMOD=0x20;
TH1=0xfa;
//初始化并启动T1
}
TL1=0xfa; TR1=1;
SCON0=0x40; for(i=0;i<32;i++) { }
SBUF0=*p; p++; while(!TI0); TI0=0;
//等待发送完成
//一字节送发送SBUF0 //UART0初始化
查询方式接收程序: #include
unsigned char i; char data *p; XBR2=0x40;
P0MDOUT|=0x01;//TX0(P0.0)为推挽输出方式 TMOD=0x20; }
……参考P195例4.7
正弦波发生器程序:DAC0输出更新发生在写DAC0H时: #include
TH1=0xfa; TL1=0xfa; TR1=1;
SCON0=0x50; p=0x20; for(i=0;i<32;i++) { }
while(!RI0); //等待UART0接收一个字符 RI0=0; *p=SBUF0; p++;
//放入接收缓冲区 //UART0初始化,允许接收 //地址指针初始化
//初始化并启动T1 //发送数据块地址指针
XBR0=0x04; //配置交叉开关
sfr16 DAC0=0xd2 void dac0_init(void); void main(void) {
uninsigned int i; float x,y;
WDTCN=0xde;//关看门狗 WDTCN=0xad;
dac0_init();//DAC0初始化 while(1) {
for(x=0;x<(2*3.14159);x+=0.1) {
//12位DAC的数字容量为4K(0-0FFFH),y的值最大为4096 y=2048*(sin(x)+1); } }
void dac0_int(void) { }
方波输出:定时器T3溢出时DAC更新。 #include
unsigned int i;
WDTCN=0xde;//关看门狗 WDTCN=0xad; REF0CN=0x03; DAC0CN|=0x08;
}
DAC0=y;//设置待转换的值并启动DA转换 for(i=0;i<=200;i++);//延时可改变正弦波的周期