Johnson carried the ball 23 times, logging his third 100-yard performance in four games after earning the wrath of Titans fans with a slow start to the season and a lengthy contract holdout.
Matt Hasselbeck tossed for 140 yards in a 16-of-25 passing performance as the Titans (7-5) won their second straight.
The Bills (5-7), meanwhile, dropped their fifth consecutive contest.
Ryan Fitzpatrick connected on 29-of-46 pass attempts, amassing 288 yards and hurling a TD pass in the loss.
C.J. Spiller led Buffalo's ground game with 83 yards on 14 carries.