徐晃帶領軍隊渡過漢水,儘管王平極力勸阻,他仍不聽。渡過漢水後,他們紮下了營寨。黃忠和趙雲向劉備報告說:“我們各自帶領本部兵馬去迎戰曹軍。”劉備同意了。於是,黃忠和趙雲引兵出發。黃忠對趙雲說:“現在徐晃倚仗勇猛而來,我們暫且不要與他正面交戰。等到日暮時分,他們疲憊不堪時,我們分兵兩路攻擊他們。”趙雲同意了。他們各自率領一軍佔據了寨柵。徐晃從辰時開始挑戰,一直持續到申時,但蜀軍始終沒有動靜。徐晃命令弓箭手向蜀營射擊。黃忠對趙雲說:“徐晃讓弓箭手射擊,說明他們的軍隊將要撤退,我們可以趁機攻擊他們。”話還沒說完,就有報告說曹軍的後隊果然開始撤退了。於是,蜀營中戰鼓聲震天響,黃忠領兵從左邊出擊,趙雲領兵從右邊出擊。兩路夾攻之下,徐晃大敗,士兵們被迫跳入漢水,死者無數。徐晃拼死戰鬥才得以逃脫,回到營中後責備王平說:“你看到我們的軍隊處於危險之中,為什麼不救援?”王平回答說:“如果我前來救援,這個營寨也無法保住。我曾經勸你不要去,但你不肯聽,所以才導致了這場失敗。”徐晃大怒,想要殺死王平。但王平當夜就帶領自己的本部兵馬在營中放起火來,曹軍大亂,徐晃只好放棄營寨逃走。王平渡過漢水來投奔趙雲,趙雲帶他去見劉備。王平詳細地向劉備介紹了漢水的地理情況,劉備非常高興地說:“我得到了王子均,奪取漢中就無疑了。”於是他任命王平為偏將軍,擔任嚮導使。
徐晃逃回去見曹操,報告說:“王平反叛去投降劉備了!”曹操大怒,親自率領大軍前來奪取漢水寨柵。趙雲擔心自己的孤軍難以立足,於是退到漢水的西岸,兩軍隔水對峙。劉備和諸葛亮前來觀察形勢,諸葛亮看到漢水的上游有一座土山,可以埋伏千餘人,於是回到營中,叫來趙雲吩咐說:“你可以帶領五百人,都帶著鼓角,埋伏在土山之下。無論是半夜還是黃昏,只要聽到我們營中的炮響,就擂鼓一番。但記住,不要出戰。”子龍接受了任務離去。而諸葛亮則在高山上暗中觀察。
第二天,曹軍前來挑戰,但蜀營中卻無一人出戰,甚至連弓箭都不發射一枚。曹軍只好自行撤回。當夜深人靜時,諸葛亮看到曹營的燈火剛剛熄滅,士兵們也開始休息了。於是他下令放響號炮。子龍聽到號炮聲後,立即命令鼓角齊鳴。曹軍被驚嚇得疑是蜀軍前來劫寨了,但等他們衝出營寨時卻發現並沒有看到任何蜀軍的蹤影。當他們回到營中想要休息時號炮聲又響了起來鼓角也隨之鳴響吶喊聲震天動地山谷中都回蕩著這震耳欲聾的聲音。曹軍士兵們被嚇得徹夜難安。連續三個夜晚都是如此驚疑不定。曹操心中也感到害怕於是下令拔寨後退三十里在一個空曠的地方重新紮下營寨。諸葛亮笑著說:“曹操雖然懂得兵法但卻不知道詭計。”於是他請劉備親自渡過漢水背水結營。劉備詢問計策諸葛亮說:“可以這樣做。”
曹操看到劉備背水紮營心中感到疑惑派人送來戰書。諸葛亮批示第二天決戰。第二天兩軍在五界山前擺開陣勢。曹操出馬立在門旗下兩邊排列著龍鳳旌旗擂鼓三通後呼喚劉備出來答話。劉備帶著劉封、孟達以及川中的將領們一起出陣。曹操揮鞭大罵說:“劉備你這個忘恩負義、反叛朝廷的賊子!”劉備回答說:“我是大漢的宗室親奉詔書討伐賊寇。你弒殺母后自立為王僭用天子的車駕這不是反叛又是什麼?”曹操大怒命令徐晃出馬迎戰。劉封出陣迎戰但交戰不久劉備就先衝入陣中。劉封抵擋不住徐晃的攻擊撥馬就跑。曹操下令說:“誰能捉住劉備就封他為西川之主。”大軍齊聲吶喊殺向蜀陣。蜀兵們望向漢水而逃丟棄了全部的營寨、馬匹和兵器路上到處都是丟棄的物品曹軍士兵們紛紛爭搶。曹操急忙下令鳴金收兵。眾將問道:“我們正要捉住劉備大王為什麼要收兵呢?”
曹操說:“我看到蜀兵背靠著漢水安營扎