The Braves trailed 2-0 in the sixth inning but rallied to break a four-game losing streak. They won for only the third time in their past 13 road games.
Teheran (5-3) allowed five hits and two runs, which raised his ERA to 1.83. Teheran, who came into the game 2-for-25 this season, had a single and a double.
The right-hander improved to 4-0 in six career starts against the Marlins with an ERA of 2.50.
Three relievers combined to complete a five-hitter. Craig Kimbrel, who took the loss Thursday at Boston, pitched a perfect ninth for his 14th save in 16 chances.
Giancarlo Stanton hit his NL-leading 16th home run in the first inning to put the Marlins up 2-0.
Tom Koehler (4-5) allowed three runs in seven innings. The Marlins lost for only the second time in their past 13 games against NL East teams.
Freddie Freeman went hitless and struck out three times. He is 0-for-28 with 12 strikeouts against Miami this year and is batting .347 against the rest of the majors.
With the Braves trailing 2-1 to start the seventh, manager Fredi Gonzalez let Teheran hit, and the pitcher led off with a double. Jason Heyward followed with a run-scoring triple, and B.J. Upton’s sacrifice fly drove in an unearned run to put the Braves ahead.
Chris Johnson singled home Atlanta’s first run in the sixth.
Stanton’s homer was a typical tape-measure job, clearing the hedge beyond the 418-foot sign in center field. That ended a streak of 15 consecutive scoreless innings for Teheran.
The Marlins, who began the night with the best home record in baseball, fell to 20-9 at Marlins Park.
NOTES: Miami C Jarrod Saltalamacchia went 0-for-3 and is in a 1-for-18 slump. ... RHP Ervin Santana (4-2, 4.06) is scheduled to start today for the Braves against Miami RHP Jacob Turner (1-2, 5.35).