第十一周 阅读程序(5e)

本文通过一个C++程序实例介绍了类的继承与多态的使用方式,展示了基类与派生类的构造过程及成员函数的重写与调用。此示例有助于理解C++中面向对象特性。
/*
 *Copyright(c) 2016, 烟台大学计算机与控制工程学院
 *All rights reserved.
 *文件名称:main.cpp
 *作    者:李德坤
 *完成日期:2016年5月3日
 *版本号:v1.0
 *
 *问题描述:阅读程序
 *输入描述:无
 *输出描述:无
 */
#include <iostream>
using namespace std;
class A
{
protected:
    int a,b;
public:
    A(int aa, int bb):a(aa), b(bb) {}
    void printA()
    {
        cout<<"a: "<<a<<"\tb: "<<b<<endl;
    }
    int getA(){return a;}
};
class B: public A
{
    int c;
public:
    B(int aa, int bb, int cc):A(aa,bb),c(cc) {}
    void printB()
    {
       cout<<"a: "<<a<<"\tb: "<<b<<"\tc: "<<c<<endl;
    }
};
void f(A x)
{
    cout<<"aaaaah, my a: "<<x.getA()<<endl;
}
int main()
{
    A a(1,1);
    B b(2,3,4);
    f(a);
    f(b);//此处加入下面各小题中的代码
    return 0;
}
/*
你认为输出结果是:1
                                  2
运行程序的结果是:aaaaah, my a: 1
                                  aaaaah, my a: 2
*/

#include <msp430.h> #define uint unsigned int #define uchar unsigned char // DS18B20引脚定义(P1.6) #define DQ_H P1OUT |= BIT6 #define DQ_L P1OUT &= ~BIT6 #define DQ_IN P1DIR &= ~BIT6 #define DQ_OUT P1DIR |= BIT6 #define DQ_val (P1IN & BIT6) // 数码管显示缓存(含符号位) char dis_buf[5] = {0,0,0,0,0}; uchar cnt = 0; // 共阴极数码管段码表 0-9, A-F const uchar seg_code[16] = { 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71 }; // 微秒延时函数(8MHz时钟) void Delayus(uint us) { while(us--) { __delay_cycles(8); // 8MHz下8个期=1us } } // 毫秒延时函数 void DelayMs(uint ms) { while(ms--) { __delay_cycles(8000); // 8MHz下8000期=1ms } } // DS18B20初始化 uchar DS18B20_Init() { uchar ack = 1; DQ_OUT; DQ_L; Delayus(480); // 保持低电平480us DQ_IN; Delayus(60); // 等待60us ack = DQ_val; // 检测应答信号 Delayus(420); // 等待剩余时间 return ack; // 0=存在,1=不存在 } // 写入1字节 void DS18B20_Write(uchar dat) { for(uchar i=0; i<8; i++) { DQ_OUT; DQ_L; Delayus(2); // 拉低2us if(dat & 0x01) DQ_H; // 写1 else DQ_L; // 写0 Delayus(60); // 保持60us DQ_H; dat >>= 1; __delay_cycles(10); // 恢复时间 } } // 读取1字节 uchar DS18B20_Read() { uchar value = 0; for(uchar i=0; i<8; i++) { DQ_OUT; DQ_L; __delay_cycles(2); // 拉低2us DQ_IN; __delay_cycles(8); // 等待8us if(DQ_val) value |= 0x01 << i; Delayus(50); // 等待50us DQ_H; } return value; } // 读取温度值 int Read_Temp() { uchar tempL, tempH; int temp; DS18B20_Init(); DS18B20_Write(0xCC); // 跳过ROM DS18B20_Write(0x44); // 启动转换 DelayMs(750); // 等待转换完成 DS18B20_Init(); DS18B20_Write(0xCC); // 跳过ROM DS18B20_Write(0xBE); // 读取暂存器 tempL = DS18B20_Read(); tempH = DS18B20_Read(); temp = (tempH << 8) | tempL; return temp; } // 温度数据处理 void Process_Temp(int temp) { uchar sign = 0; uint integer, decimal; // 处理负数 if(temp & 0xF800) { sign = 1; temp = ~temp + 1; } integer = temp >> 4; // 整数部分 decimal = (temp & 0x0F) * 625; // 小数部分(0.0625*10000) // 更新显示缓存 dis_buf[0] = sign ? 0x40 : seg_code[integer/100]; // 符号位或百位 dis_buf[1] = seg_code[(integer%100)/10] | 0x80; // 十位+小数点 dis_buf[2] = seg_code[integer%10]; // 个位 dis_buf[3] = seg_code[decimal/1000]; // 小数第一位 dis_buf[4] = seg_code[(decimal%1000)/100]; // 小数第二位 } int main(void) { WDTCTL = WDTPW | WDTHOLD; // 关闭看门狗 P1DIR |= BIT6; // 设置P1.6为输出 P4DIR = 0xFF; // 数码管位选 P5DIR = BIT5; // 段选锁存 P6DIR = BIT6; // 位选锁存 // 时钟初始化 BCSCTL1 = 0x87; // 设置RSEL=7(最高频率范围) DCOCTL = 0x60; // DCO=3,MOD=0(选择最高DCO频率) // 看门狗定时器配置(1.9ms间隔) WDTCTL = WDT_ADLY_1_9; IE1 |= WDTIE; __enable_interrupt(); while(1) { int temp = Read_Temp(); Process_Temp(temp); DelayMs(500); // 每500ms更新一次 } } // 看门狗中断服务程序(数码管动态扫描) #pragma vector=WDT_VECTOR __interrupt void WDT_ISR() { P5OUT |= BIT5; // 准备段选数据 P4OUT = ~(1 << cnt); // 位选信号 P5OUT = seg_code[dis_buf[cnt]]; P5OUT &= ~BIT5; // 锁存段选 P6OUT |= BIT6; // 准备位选数据 P6OUT &= ~BIT6; // 锁存位选 if(++cnt >= 5) cnt = 0; // 循环显示5位 }以上代码数码管显示数字有问题,需要修改(使用的是TS8900-MSP430F149的开发板)
05-11
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值