В 1368 г. Дмитрий вмешался в усобицу тверских князей по поводу наследства князя Дорогобужа Семена Константиновича — но действовал далеко не теми методами, которые были привычны его отцу, Ивану Красному. Он пригласил в Москву тверского князя Михаила Александровича и взял под стражу вместе с боярами, заставив отдать ему Городок и часть наследства князя Семена. Князя Михаила пришлось отпустить, так как к Москве приближались ордынские послы, но той же осенью Дмитрий напал на Тверь. Это спровоцировало назревавший русско-литовский конфликт, поскольку Михаил Тверской был родственником великого князя литовского Ольгерда. Объединенная литовско-тверская рать осадила Кремль, и, хотя взять его не удалось, Дмитрий вынужден был вернуть Твери захваченную часть наследства Семена Дорогобужского, а также Городок. Далее война приобрела «циклический» характер: в 1370 г. Дмитрий опять пошел на Тверь (ему удалось захватить города Микулин и Зубцов), Михаил вновь бежал в Литву, а Ольгерд во второй раз оказался под стенами Москвы. В следующем году Дмитрий решился не признать право Михаила Александровича на великокняжеский престол вопреки полученному там ярлыку, и война вспыхнула в третий раз. Дмитрию пришлось отражать наступление тверичей, которые еще раз попытались взять, совместно с литовцами, его столицу (1372). В последней московско-тверской войне 1370-х гг. Дмитрий выступал не обороняющейся, а наступающей стороной. Поводом для нее стала очередная попытка князя Михаила перехватить у Москвы великое княжение. В 1374 г. к нему отъехали от князя Дмитрия гость Некомат Сурожанин, человек, по-видимому, состоятельный, пользовавшийся значительным политическим влиянием, и сын московского тысяцкого Иван Васильевич Вельяминов. Они отправились в Орду и доставили оттуда в Тверь ярлык на великое княжение — но он опять не был признан Дмитрием, спешно готовившимся к войне. В кампании 1375 г. на стороне Москвы выступили объединенные силы Северо-Восточной Руси, включая Новгород. После месячной осады Михаил Александрович сдал свой стольный город, и князья заключили договор, значительно ограничивший самостоятельность Твери.
Со второй половины 1370-х гг. заметно возрастает степень сопротивления князя Дмитрия Орде, московские дипломаты ведут себя все активнее при ханском дворе, ловко пользуясь противоречиями между различными группировками ханов, а московские воеводы более не страшатся выходить навстречу ордынцам. Хотя в одном из первых крупных столкновений с Ордой (на реке Пьяне в 1377) московская рать потерпела поражение, уже на следующий год Дмитрий сумел разбить на реке Воже (притоке реки Оки) войско мурзы Бегича, впервые выиграв у монголов сражение в открытом поле.
Итогом этой борьбы и самой яркой ее страницей стала победа в битве на Куликовом поле 1380 г., за которую Дмитрий был прозван «Донским», и как герой этой битвы вошел в русскую историю. Позже литературные произведения, поэма «Задонщина» и «Сказание о Мамаевом побоище», описали ряд эпизодов этого события, ставших хрестоматийными (несмотря на то, что часть их не имеет исторической основы). В них московский князь предстает доблестным и в то же время благочестивым и скромным витязем, окруженным опытными советниками и преданными слугами. Он получает благословение на поход у Сергия Радонежского и берет с собою двух принявших схиму бояр-воинов. Собирает ополчение почти со всей Руси, уверенно ведет его к Дону и переправляется через него после совета с князьями. Дмитрий тщательно готовит битву, расставляя полки, объезжая ночью вместе с воеводой Боброком поле будущего сражения, строит предположения о его исходе. В самой битве князь предпочитает участвовать неузнанным, как простой воин, желая разделить судьбу всего войска, и в результате получает множество ран. Народное сознание стремилось видеть в Дмитрии мученика и неохотно мирилось с тем, что князь вообще остался жив (вместо него принимает смерть один из ближних бояр, стоявший в княжеской одежде под главным стягом). В позднейшем фольклоре отсутствие у Дмитрия мученического венца вызывало удивление и даже известное сожаление, о чем прямо говорится в духовном стихе «Дмитровская суббота»: