The Flames ended a three-game losing streak with Miikka Kiprusoff making 36 saves. Detroit has dropped three in a row.
Detroit's Valtteri Filppula produced a power-play goal late in the second period to create a 2-2 tie, but Calgary dominated the final period.
All five Calgary goals came against Jonas Gustavsson on just 22 shots.
It was the second meeting between the teams this year and the Flames have won them both.