[关闭]
@floatsd 2016-01-02T11:26:20.000000Z 字数 4498 阅读 1231

实验五 和米字管

CM4实验报告


实验目的

  • 了解总线通信原理
  • 学会用C语言模拟时序
  • 学会查找和利用板子上的资源,控制米字管

实验原理

  • 发送器:本次传送中发送数据(不包括地址和命令)到总线的器件。
  • 接收器:本次传送中从总线接收数据(不包括地址和命令)的器件。
  • 主机:初始化发送,产生时钟信号和终止发送的器件,它可以是发送器或接收器,主机通常是微控制器。
  • 从机:被主机寻址的器件,他可以是发送器或接收器。
SDA SCL 总线状态
高电平 高电平 空闲(stop之后)
高到低 高电平 START(之后视为忙状态)
低到高 高电平 STOP

上表所示总线起止条件如图所示:
1.jpg-23.7kB

米字管

芯片 端口 管脚
U4 P1 2
P2 3
P3 4
P4 5
P5 1
U5 P1 8
P2 9
P3 10
P4 11
P5 12
P6 13
P7 14
U6 P1 16
P2 17
P3 18
P4 7
P5 15

流程图

Created with Raphaël 2.1.2Start配置管脚为I2C模式初始化米字管编写拉高拉低电平的函数设置米字管管选信号点亮米字管相应码段End

实现功能

实验代码

预设数字码段

  1. static const char tubeDigital[10][2]=
  2. { // SegmLow, SegHigh
  3. { 0x10, 0x3E }, // 0
  4. { 0x00, 0x18 }, // 1
  5. { 0x70, 0x2C }, // 2
  6. { 0x70, 0x26 }, // 3
  7. { 0x60, 0x32 }, // 4
  8. { 0x70, 0x16 }, // 5
  9. { 0x70, 0x1E }, // 6
  10. { 0x00, 0x26 }, // 7
  11. { 0x70, 0x3E }, // 8
  12. { 0x70, 0x36 }, // 9
  13. };

中断的配置及初始化

  1. /*******************************************************************
  2. * 函数: I2C_Init()
  3. * 描述: I2C初始化
  4. * 输入值:无
  5. * 返回值:无
  6. *****************************************************************/
  7. void I2C_Init()
  8. {
  9. SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
  10. /*B2设置为SCL时钟线,B3设置为SDA串行数据线*/
  11. GPIOPinTypeI2C(GPIO_PORTB_BASE, GPIO_PIN_2 | GPIO_PIN_3);
  12. /*设置B的引脚复用功能为SCL和SDA*/
  13. GPIOPinConfigure(GPIO_PB2_I2C0SCL);
  14. GPIOPinConfigure(GPIO_PB3_I2C0SDA);
  15. GPIOPinTypeI2CSCL(GPIO_PORTB_BASE, GPIO_PIN_2);
  16. GPIOPinTypeI2C(GPIO_PORTB_BASE, GPIO_PIN_3);
  17. SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C0); //使能I2C0模块
  18. /* 设I2C主机模式, 使用系统时钟, 400kbps的快速模式(false普通模式100Kbps)*/
  19. I2CMasterInitExpClk(I2C0_BASE,1000000, true);
  20. I2CMasterEnable(I2C0_BASE); //使能I2C0主机模式
  21. I2CSlaveEnable(I2C0_BASE);//使能I2C从机模式
  22. }

米字管芯片初始化

  1. /********************************************************************
  2. * 函数: PCA9557_Init()
  3. * 描述: PCA9557初始化
  4. * 输入值:无
  5. * 返回值:无
  6. ******************************************************************/
  7. void PCA9557_Init()
  8. { uint8_t SendBuff[2] = {PCA9557_REG_CONFIG, 0x00};
  9. //PCA9557_REG_CONFIG(COMMAND BYTE)配置成读写模式
  10. I2C_SendBuff(I2C0_ADDR_TUBE_SEL, SendBuff, 2);
  11. //U21管选 I2C0_ADDR_TUBE_SEL (SLAVE ADDR)
  12. I2C_SendBuff(I2C0_ADDR_TUBE_SEG_LOW, SendBuff, 2);
  13. //U22管选 I2C0_ADDR_TUBE_SEG_LOW(SLAVE ADDR)
  14. I2C_SendBuff(I2C0_ADDR_TUBE_SEG_HIGH, SendBuff, 2);
  15. //U23管选 I2C0_ADDR_TUBE_SEG_HIGH(SLAVE ADDR)
  16. }

点亮米字管

  1. /*******************************************************************
  2. * 函数: MZG_run()
  3. * 描述: 点亮米字管为a,b,c,d(在while里的动态显示)
  4. * 输入值:uint8_t a,b,c,d
  5. * 返回值:无
  6. *****************************************************************/
  7. void MGZ_run(){
  8. int t=50;//这个延时时间
  9. I2C_ClearTheTube(); //清屏
  10. I2C_U4TubeSelect(~0x20); //选择数字管1
  11. I2C_U5TubeLowPinControl(tubeDigital[a][0]);//拉低U5的引脚
  12. I2C_U3TubeHighPinControl(tubeDigital[a][1]);//拉高U3引脚
  13. DelayMs(t);
  14. I2C_ClearTheTube(); //清屏
  15. I2C_U4TubeSelect(~0x02); //选择数字管2
  16. I2C_U5TubeLowPinControl(tubeDigital[b][0]);//拉低U5的引脚
  17. I2C_U3TubeHighPinControl(tubeDigital[b][1]);//拉高U3引脚
  18. DelayMs(t);
  19. I2C_ClearTheTube(); //清屏
  20. I2C_U4TubeSelect(~0x04); //选择数字管3
  21. I2C_U5TubeLowPinControl(tubeDigital[c][0]);//拉低U5的引脚
  22. I2C_U3TubeHighPinControl(tubeDigital[c][1]);//拉高U3引脚
  23. DelayMs(t);
  24. I2C_ClearTheTube(); //清屏
  25. I2C_U4TubeSelect(~0x08); //选择数字管4
  26. I2C_U5TubeLowPinControl(tubeDigital[d][0]);//拉低U5的引脚
  27. I2C_U3TubeHighPinControl(tubeDigital[d][1]);//拉高U3引脚
  28. DelayMs(t);
  29. }

遇到的问题和解决办法

实验结论

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注