C语言程序设计:位运算与温度转换实验

需积分: 0 0 下载量 103 浏览量 更新于2024-08-04 收藏 263KB DOCX 举报
本实验旨在帮助学生深入理解C语言中的运算符、数据类型以及输入输出函数的使用。实验主要分为三个部分,分别涉及温度转换、圆面积计算以及短整数的位操作。在实验过程中,学生需要通过调试和修改程序来发现并解决语法和逻辑错误,从而提高编程技能。 实验的第一部分是将华氏温度转换为摄氏温度。这涉及到基本的数学运算,即利用公式 `(F - 32) * 5 / 9` 来进行转换。在原始代码中,存在一个错误,即在计算摄氏温度时,`5/9` 应该是一个浮点数,因此需要将 `5/9` 更改为 `5.0/9` 或 `5.0/9.0`,以确保浮点数运算。此外,`printf` 语句的格式化字符串 `%d` 应更改为 `%f`,以适应浮点数输出。 第二部分是计算圆的面积。这里需要输入圆的半径,然后利用公式 `π * r * r` 计算面积。在原代码中,`printf` 函数用于输出面积时,格式化字符串 `%n` 是错误的,应更改为 `%f`,同时删除不必要的取地址符 `&`。 第三部分涉及短整数的位操作。程序要求将两个短整数的高字节和低字节进行组合。这可以通过位与 (`&`)、位移 (`<<`) 和位或 (`|`) 操作来实现。原代码中,`newint` 的定义和赋值有误,应该先声明一个变量 `newint`,然后使用位操作符进行计算。正确的代码应该是: ```c int newint; newint = ((p & 0xff00) << 8) | (k & 0xff00); ``` 通过这个实验,学生不仅能巩固基本的C语言知识,还能学习到位运算符如 `&`、`|` 和 `<<` 的应用,以及如何使用 `scanf` 和 `printf` 进行输入输出操作。这对于理解和编写涉及位操作的复杂程序至关重要。此外,实验还强调了在编程时要对语法和逻辑错误保持警惕,培养解决问题和调试代码的能力。

void CS5532_INITIAL(void) { uchar CS5532_i; EX1=0; //IE=0x00; CS5532_A0=0; CS5532_A1=0; CS5532_SDO=1; CS5532_SDI=0; CS5532_SCLK=0; CS5532_CS=0; CS5532_SDI=1; _nop_(); for(CS5532_i=0;CS5532_i<135;CS5532_i++) //sending the 16 bytes sync1 and 1 byte sync0 { CS5532_SCLK=1; _nop_(); CS5532_SCLK=0; _nop_(); } CS5532_SDI=0; _nop_(); CS5532_SCLK=1; _nop_(); CS5532_SCLK=0; _nop_(); CS5532_CS=1; CS5532_WRITE_ONE_BYTE(0x03); //reset the cs5532 namely set RS=1 CS5532_WRITE_ONE_BYTE(0x22); CS5532_WRITE_ONE_BYTE(0x40); CS5532_WRITE_ONE_BYTE(0x00); CS5532_WRITE_ONE_BYTE(0x00); DELAY_TIMES(0xAA); //delay about 20ms CS5532_WRITE_ONE_BYTE(0x0B); //read the RV bit and set RV=0 CS5532_READ_ONE_BYTE(); CS5532_READ_ONE_BYTE(); CS5532_READ_ONE_BYTE(); CS5532_READ_ONE_BYTE(); DELAY_TIMES(0xAA); //delay about 20ms CS5532_WRITE_ONE_BYTE(0x03); //set the cs5532 system configuration register CS5532_WRITE_ONE_BYTE(0x02); CS5532_WRITE_ONE_BYTE(0x40); CS5532_WRITE_ONE_BYTE(0x00); CS5532_WRITE_ONE_BYTE(0x00); DELAY_TIMES(0xAA); //delay about 20ms CS5532_WRITE_ONE_BYTE(0x05); //set the cs5532 channel setup register CS5532_WRITE_ONE_BYTE(0x32); CS5532_WRITE_ONE_BYTE(0x40); //0x00 for bipolar preforming CS5532_WRITE_ONE_BYTE(0x32); //speed 7.5sps CS5532_WRITE_ONE_BYTE(0x40); DELAY_TIMES(0xAA); //delay about 20ms CS5532_WRITE_ONE_BYTE(0xC0); //cs5532 performing successive conversion CS5532_CS=0; CS5532_SDO=1; DELAY_TIMES(0xFF); DELAY_TIMES(0xFF); //DELAY_TIMES(0xFF); //PX1=1; //set the external interrupt 1 highest prior IT1=1; //set the external interrupt 1 edge trigger mode EX1=1; EA=1; //IE=0x84; //external interrupt 1 turn on }

2023-07-13 上传