As Luu Vinh Phuc suggested, you can use the read int syscall to get an unsigned 16-bit integer. The syscall will actually read in a 32-bit signed integer, but for the entire range of 16-bit unsigned integers, the low 16 bits will be the same. You can manually check that the high 16 bits are zero to verify that there is no overflow.
li $v0, 5 # this is the code for reading an integer
syscall # execute the syscall, and read the int into $v0
srl $t0, $v0, 16 # get just the high 16 bits
bne $t0, $0, input_overflow # branch somewhere else if you have an overflow
This will leave you with an unsigned 16 bit integer in register $v0.