本文目錄一覽:
如何用c語言編程在單片機上做交通信號燈
硬件電路設計
此電中路設計採用AT89C51單片機,74LS47(數碼管驅動)74LS373(數碼管驅動輸出鎖存),8個數碼管顯示其延時值,四個紅、黃、綠指示燈。硬件設計關鍵在於,延時顯示時,要考慮到當個位數字顯示時,要確保十位數字顯示輸出的不變。因此,可加輸出鎖存器。在延時最後三秒時,要讓黃燈進行閃爍,並同時顯示數字(這一步在軟件設計上很關鍵)。
(1)電路連接圖:
三、軟件程序(C語言)
以下是整個設計的軟件程序,直接可以編譯成*。Hex代碼。通過以上電路,下載到單片機,可直接運行。
//*****************************//
//程序名:十字路口交通燈控制
//編寫人:黃庭劍
//初寫時間:2009年1月2日
//程序功能:南北為車行道,延時60秒;東西方向為人行道,延時20秒,且在最後3秒黃燈顯示2秒鐘再實現切換.
//CPU說明:AT89C51型單片機; 24MHZ晶體振蕩器
//完成時間:2009年1月6日
//*****************************//
#includestdio.h
#includereg51.h
#includeintrins.h
sfr p0 = 0x80;
sfr p1 = 0x90;
sfr p2 = 0xA0;
sfr p3 = 0xb0; //這部分內容其實在“#includereg51.h”里已經有,但裡面定義的必須區分大小寫,在這裡,因為我程序採用的是小寫,reg51.h里對各個端口與寄存器的定義都是大寫,所以在編譯連接時,會報錯,所以,在本設計程序里,我只用到了端口,在這裡也就只定義了四個,而沒有去改reg51.h裡面的內容。其實兩者是一樣的。
sbit sw = p0^0;
sbit OE =P0^6;
sbit LE =P0^7; //74LS373鎖存器控制端定義
char display[]={ 0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99 }; //p1口的數碼管時間顯示調用,利用74L74BCD碼,8位驅動輸出;
//函數聲明 begin
void delay1(int count);
void delay_long(int number1,int number2);
void people_car_drive();
//函數聲明end
//***********************//延時子程序
void delay1(int count)
{ int i;
for(i=count;i0;i–)
{ ;}
}
void delay_long(int number1,int number2)
{
int a,b;
for(a=number1;a0;a–)
{
for(b=number2;b0;b–)
{ _nop_(); }
}
}
//**********************//延時子程序
void people_car_drive()
{
int p_1=2,i,j=9,p_2=6; //****************//行人通行時,延時20秒
p2=0x09; //南北紅燈亮
p3=0x24; //東西綠燈亮
while(p_1–0)
{ LE=1;
OE=0;
if(p_1==0){OE=1;} //當十位數減到0時,只顯示個位數
p1=display[p_1];
delay1(1000);
LE=0;
j=9;
for(i=10;i0;i–)
{
if(p_1==0j==3)break; //減到3時退出循環,讓其黃燈閃爍顯示
p1=display[j–];
delay_long(16000,2);
if(sw==1)return;
}
}
//*******************************************************************************//
p2=0x12; //南北黃燈閃爍三秒,以提醒行人注意
p3=0x12;
p1=display[3];
delay_long(8000,1);
p2=0x00;
p3=0x00;
delay_long(14000,1);
p2=0x12;
p3=0x12;
p1=display[2];
delay_long(8000,1);
p2=0x00;
p3=0x00;
delay_long(14000,1);
p2=0x12;
p3=0x12;
p1=display[1];
delay_long(8000,1);
p2=0x00;
p3=0x00;
delay_long(14000,1);
//*****************以下是車輛通行時延時60秒//
p2=0x24; //南北綠燈亮
p3=0x09; //東西紅燈亮
while(p_2–0)
{ LE=1;
OE=0;
if(p_2==0){OE=1;} //當十位數減到0時,只顯示個位數
p1=display[p_2];
delay1(1000);
LE=0;
j=9;
for(i=10;i0;i–)
{
if(p_2==0j==3)break; //減到2時退出循環
p1=display[j–];
delay_long(16000,2);
if(sw==1)return;
}
}
p2=0x12; //南北黃燈閃爍三秒,以提醒行人注意
p3=0x12;
p1=display[3];
delay_long(8000,1);
p2=0x00;
p3=0x00;
delay_long(14000,1);
p2=0x12;
p3=0x12;
p1=display[2];
delay_long(8000,1);
p2=0x00;
p3=0x00;
delay_long(14000,1);
p2=0x12;
p3=0x12;
p1=display[1];
delay_long(8000,1);
p2=0x00;
p3=0x00;
delay_long(14000,1); //南北黃燈閃爍三秒完畢
}
void main() //主函數入口處
{
p0=0x01;
p1=0x00;
p2=0x00;
p3=0x00; //初始化各端口
{ while(1)
{
if(sw==0)
{ people_car_drive();}
else
{
p2=0x00;
p3=0x00; //關閉所有交通燈
}
}
}
}
自學C語言教程
沒有基礎可以入門,通過努力可以達到初、中級程序員的程度,但再往上走,就比較困難了。後面需要不少算法、英文和數學知識。
教程的話可以參考下面兩本教程:
譚浩強:《C語言程序設計》
李銘城 黃中豪 陳宇芬:《資料結構 C》
英文的話,進入初級之前都不怎麼需要。但是進入中級後,需要讀一些英文資料。不過現在翻譯比較厲害,絕大部分的資料都有翻譯。但是要進入高級,就必須要學習英文了,因為最新最核心的資料都是英文的,翻譯的往往都會有錯誤。
另外數學在早期影響不大,但是進入中級後就必須要了。因為估算算法時間複雜度、空間複雜度、圖、樹等等,都涉及不少數學知識。當然如果只是做簡單應用或者驅動的話,這方面要求就不會太高。
最後給一個學習大概的路線圖:
入門級的學習,只要能夠掌握:代碼三大結構(循環、分支、順序)、流程圖、C語言關鍵字和語法、輸入輸出、文件操作、套接字操作。就算是初級滿級了。
初級程序員:數據結構和算法(排序,查找)、了解軟件開發模型(瀑布模型、敏捷模型、原型模型等等)、了解UML、系統常用API、網絡通信、編譯和SDK環境搭建
中級程序員:設計模式、多線程編程、網絡通信(服務器、客戶端)、面向對象編程、掌握UML、系統網絡/文件/互斥/線程/事件/安全API、STL、相關法律法規、知道一些常用軟件架構(MVC等)
我需要郝斌老師c語言教程180個視頻。
verycd上的可以下的。可用迅雷下,較快。
你先打開迅雷,打開verycd中那一頁,再點“打開連接”,點允許,就會調用迅雷來下。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/257603.html