的8个位对应的位变量flag_lamp1、flag_lamp2、flag_machine1、flag_machine2、flag_port1、flag_port2、flag_calcu1和calcu2(从低位到高位)。
答:(1)unsigned char code dis_code[10]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07,0x7f,0x6f};
(2)unsigned char data TL0_L _at_ 0x30, TH0_H _at_ 0x31; (3)unsigned char idata data_buf[20]; (4)unsigned char xdata data_array[100]; (5)unsigned char bdata status; sbit flag_lamp1=status^0; sbit flag_lamp2=status^1; sbit flag_machine1=status^2; sbit flag_machine2=status^3; sbit flag_port1=status^4; sbit flag_port2=status^5; sbit flag_calcu1=status^6; sbit flag_calcu2=status^7;
18.在89C52单片机中增加了定时器/计数器2(T2),修改头文件“REG51.H”,添加如下内容:
(1)特殊功能寄存器T2CON、T2MOD、RCAP2L、RCAP2H、TL2、TH2,地址分别为0xc8~ 0xcd。 (2)对T2CON的8个位分别定义位变量CP_RL2、C_T2、TR2、EXEN2、TCLK、RCLK、EXF2、和TF2(从低位到高位)。
(3)定义位变量T2、T2EX对应于P1口的第0位和第1位;定义位变量ET2对应于EI的第5位;定义位变量PT2对应于IP的第5位;
(4)对P1口的8个位分别定义位变量P0_0、P0_1、P0_2、P0_3、P0_4、P0_5、P0_6和P0_7(从低位到高位)。 答:(1) sfr T2CON=0xc8; sfr T2MOD=0xc9; sfr RCAP2L=0xca; sfr RCAP2H=0xcb; sfr TL2=0xcc; sfr TH2=0xcd; (2)
sbit CP_RL2=T2CON^0; sbit C_T2=T2CON^1; sbit TR2=T2CON^2; sbit EXEN2=T2CON^3; sbit TCLK=T2CON^4; sbit RCLK=T2CON^5; sbit EXF2=T2CON^6; sbit TF2=T2CON^7;
11
(3)
sbit T2=P1^0; sbit T2EX=P1^1; sbit ET2=EI^5; sbit PT2=IP^5; (4)
sbit P0_0=P0^0; sbit P0_1=P0^1; sbit P0_2=P0^2; sbit P0_3=P0^3; sbit P0_4=P0^4; sbit P0_5=P0^5; sbit P0_6=P0^6; sbit P0_7=P0^7; 19.编写一C51函数,把从键盘输入的5位十进制数数转换成一个无符号整型数(假设未超出整型数范围)。设从键盘输入的数存放在一无符号数组中,低位数为低下标元素。
unsigned char data key_buffer[5]; unsigned int trans_int(void) {
unsigned char data i; unsigned int data temp=0; for(i=0;i<5;i++) {
temp=temp*10+key_buffer[i]-0x30; }
return temp; }
20.编写一C51函数,把一整型数按十进制数将其各位分离,分离后放在一无符号数组中,便于显示。要求把低位数作为低下标元素。 unsigned char data shu[5]; void main(unsigned int x) {
unsigned int temp; unsigned char i; for(i=0;i<4;i++) {
shu[i]=temp; temp=temp/10;
}
shu[4]=temp; }
12
21.编写一C51函数,使用专用指针,把片外数据存储器中从0x100开始的30个字节数据,传送到片内从0x40开始的区域中。 void main() {
unsigned char data i,*dpt; unsigned char xdata *xdpt; dpt=0x40; xdpt=0x100;
for(i=0;i<30;i++)
*(dpt+i)=*(xdpt+i); }
22.编写一C51程序,实现从P1口输出产生的流水灯,要求用汇编语言函数实现数据左移或右移。 #pragma src
#include
unsigned char temp,i; while(1) {
temp=0x55; P1=temp; delay();
#pragma asm MOV A,temp RR A
MOV temp,A #pragma endasm
P1=temp; delay(); } }
23.某单片机系统的P2口接一数模转换器DAC0832输出模拟量,现在要求从DAC0832输出连续的三角波,实现的方法是从P2口连续输出按照三角波变化的数值,从0开始逐渐增大,到某一最大值后逐渐减小,直到0,然后再从0逐渐增大,一直这样输出。试编写一函数,使从P2口输出的值产生三角波,并且使三角波的周期和最大值通过入口参数能够改变。 #include
void san(unsigned char max1,unsigned char zhou1) {
13
unsigned char i,j,max,zhou; max=max1; zhou=zhou1; while(1) {
for(i=0;i<=max,i++) {
DAC0832=i;
for(j=0;j } for(i=max-1;i>0,i--) { DAC0832=i; for(j=0;j } } 24.在数字滤波中有一种叫做“中值滤波”技术,就是对采集的数据按照从大到小或者从小到大进行排序,然后取其中在中间位置的数作为采样值。试编写一函数,对存放在片内数据存储器中从0x50开始的20个单元的采样数据用冒泡法排序进行中值滤波,把得到的采样数据存放到0x4f单元中。 void midf() { unsigned char data temp,i,j,*ptr,*ptr1; ptr=0x50; ptr1=0x4f; for(j=20;j>1,j--) { for(i=0;i if(*(ptr+i)>*(ptr+i+1)) { temp=*(ptr+i+1); *(ptr+i+1)=*(ptr+i); *(ptr+i)=temp; } } } *ptr1=*(ptr+20/2); } 25.在数字滤波中有一种叫做“去极值平均滤波”技术,就是对采集的数据按照 14 从大到小或者从小到大进行排序,然后去掉相同数目的极大值和极小值,对中间部分数据求算术平均值作为采样值。试编写一函数,对存放在片外数据存储器中从0x150开始的16个单元的采样数据,用选择法进行“去极值平均滤波”,把得到的采样数据存放到0x14f单元中。 void teaf() { unsigned char xdata *ptr; unsigned char data temp,i,j,*ptr1; ptr=0x150; ptr1=0x4f; for(j=16;j>1,j--) { for(i=0;i if(*(ptr+i)>*(ptr+i+1)) { temp=*(ptr+i+1); *(ptr+i+1)=*(ptr+i); *(ptr+i)=temp; } } } temp=0; for(i=0;i<16-2;i++) temp=temp+*(ptr+i+1); *ptr1=temp/(16-2); } 26.利用库函数_getkey编写一函数,实现从单片机串行口接收数据的C51程序,把接收的数据存放在片内数据存储器从0x40开始的区域,遇到回车符CR(ASCII码是0x0d)结束。 include unsigned char data *dpt; unsigned char i=0,temp; dpt=0x40; while(1) { temp=_getchar(); if(temp==0x0d) break; *(dpt+i)=temp; i++; 15