|
666黑幣
之前都是自己看書(shū)學(xué)的單片機(jī),今天我第一次接觸真正的實(shí)體,不是很熟悉板子,就是下面那個(gè)自己找了一個(gè)覺(jué)得還不錯(cuò)的交通燈程序研究,發(fā)現(xiàn)有幾個(gè)地方還是不太清楚,下面是程序源碼
想問(wèn)一下如何在以下條件下修改一下源碼
以前見(jiàn)過(guò)其他型號(hào)的試驗(yàn)臺(tái),上面那個(gè)確實(shí)不太熟悉,最好也能分享一下連接思路,謝謝各位大神了,如有冒犯,還請(qǐng)諒解。
單片機(jī)源程序如下:
- #include
- #define uint unsigned int
- #define uchar unsigned char
- #define OFF 0 //定義燈泡開(kāi)關(guān)
- #define ON 1
- sbit ew_zx_red = P1^0; //東西直行紅黃綠
- sbit ew_zx_yellow = P1^1;
- sbit ew_zx_green = P1^2;
- sbit ew_zz_red = P1^3; //東西左轉(zhuǎn)紅黃綠
- sbit ew_zz_yellow = P1^4;
- sbit ew_zz_green = P1^5;
- sbit sn_zx_red = P2^0; //南北直行紅黃綠
- sbit sn_zx_yellow = P2^1;
- sbit sn_zx_green = P2^2;
- sbit sn_zz_red = P2^3; //南北左轉(zhuǎn)紅黃綠
- sbit sn_zz_yellow = P2^4;
- sbit sn_zz_green = P2^5;
- sbit seg_1 = P1^6; //東西數(shù)碼管位選開(kāi)關(guān)
- sbit seg_2 = P1^7;
- sbit seg_3 = P2^6; //南北數(shù)碼管位選開(kāi)關(guān)
- sbit seg_4 = P2^7;
- int time = 0; //計(jì)時(shí)器
- int count = 0;
- unsigned char SEG_CA[10] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};
- unsigned char SEG_CC[10] = {0x3f, 0x06, 0x5b, 0x1f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
- void delay()
- {
- int i;
- for(i = 0; i < 10; i++);
- }
- void display_ew(unsigned int num) //東西數(shù)字顯示
- {
- P0 = SEG_CA[num/10]; //點(diǎn)亮數(shù)字高位
- seg_1 = ON;
- delay();
- seg_1 = OFF;
- P0 = SEG_CA[num%10]; //點(diǎn)亮數(shù)字低位
- seg_2 = ON;
- delay();
- seg_2 = OFF;
- }
- void display_sn(unsigned int num) //南北數(shù)字顯示
- {
- P0 = SEG_CA[num/10]; //點(diǎn)亮數(shù)字高位
- seg_3 = ON;
- delay();
- seg_3 = OFF;
- P0 = SEG_CA[num%10]; //點(diǎn)亮數(shù)字低位
- seg_4 = ON;
- delay();
- seg_4 = OFF;
- }
- void display_ew_shan(unsigned int num) //東西3s 倒計(jì)時(shí)閃爍顯示
- {
- if(count < 2000)
- display_ew(num);
- else
- {
- seg_1 = OFF;
- seg_2 = OFF;
- }
- }
- void display_sn_shan(unsigned int num) //南北3s倒計(jì)時(shí)閃爍顯示
- {
- if(count < 2000)
- display_sn(num);
- else
- {
- seg_3 = OFF;
- seg_4 = OFF;
- }
- }
- void init()
- {
- P0 = 0x00;
- P1 = 0x00;
- P2 = 0x00;
- EA = 0; //關(guān)總中斷
- ET0 = 1; //開(kāi)定時(shí)器0中斷
- TMOD = 0x02; //定時(shí)器0工作方式2
- TL0 = 6; //定時(shí)250us
- TH0 = 6;
- EA = 1; //開(kāi)總中斷
- TR0 = 1; //開(kāi)始定時(shí)
- }
- void main()
- {
- init();
- while(1)
- {
- /*************************************************************
- 開(kāi)始東西直行綠燈亮,東西左轉(zhuǎn)紅燈亮27s,顯示綠燈倒計(jì)時(shí)30s
- 南北直行、左轉(zhuǎn)紅燈亮50s,顯示紅燈倒計(jì)時(shí)50s
- *************************************************************/
- while(time%100 < 27)
- {
- ew_zx_green = ON; //東西直行綠燈亮,顯示27s
- ew_zx_yellow = OFF;
- ew_zx_red = OFF;
- display_ew(30 - time);
- ew_zz_red = ON; //東西左轉(zhuǎn)紅燈亮
- ew_zz_green = OFF;
- ew_zz_yellow = OFF;
- sn_zx_red = ON; //南北直行紅燈亮,顯示時(shí)間50s
- sn_zx_yellow = OFF;
- sn_zx_green = OFF;
- display_sn(50 - time);
- sn_zz_red = ON; //南北左轉(zhuǎn)紅燈亮,顯示時(shí)間50s
- sn_zz_yellow = OFF;
- sn_zx_green = OFF;
- }
- /*************************************************************
- 東西直行黃燈亮3s, 倒計(jì)時(shí)開(kāi)始閃爍
- 東西左轉(zhuǎn),南北方向不變
- *************************************************************/
- while(time%100 >= 27 && time%100 < 30)
- {
- ew_zx_yellow = ON; //東西直行黃燈亮 ,顯示時(shí)間3s
- ew_zx_red = OFF;
- ew_zx_green = OFF;
- display_ew_shan(30 - time);
- display_sn(50 - time);
- }
- /*************************************************************
- 東西左轉(zhuǎn)綠燈亮17s,直行紅燈亮 ,顯示綠燈倒計(jì)時(shí)20s
- 南北方向不變
- *************************************************************/
- while(time%100 >= 30 && time%100 < 47)
- {
- ew_zz_green = ON; //東西左轉(zhuǎn)綠燈亮,顯示時(shí)間17s
- ew_zz_red = OFF;
- ew_zz_yellow = OFF;
- display_ew(50-time);
- ew_zx_red = ON; //東西直行紅燈亮
- ew_zx_yellow =OFF;
- ew_zx_green = OFF;
- display_sn(50-time); //南北繼續(xù)顯示倒計(jì)時(shí)
- }
- /*************************************************************
- 東西左轉(zhuǎn)黃燈亮3s, 倒計(jì)時(shí)開(kāi)始閃爍 3s
- 東西直行,南北方向不變
- *************************************************************/
- while(time%100 >= 47 && time%100 < 50)
- {
- ew_zz_yellow = ON; //東西左轉(zhuǎn)黃燈亮,顯示時(shí)間3s
- ew_zz_red = OFF;
- ew_zz_green = OFF;
- display_ew_shan(50-time);
- display_sn(50-time); //南北繼續(xù)顯示倒計(jì)時(shí)
- }
- /*************************************************************
- 東西左轉(zhuǎn)紅燈亮50s,直行不變,顯示倒計(jì)時(shí)50s
- 南北直行綠燈亮27,左轉(zhuǎn)不變,顯示綠燈倒計(jì)時(shí)30s
- *************************************************************/
- while(time%100 >=50 && time%100 < 77)
- {
- sn_zx_green = ON; //南北直行綠燈亮,顯示時(shí)間27s
- sn_zx_yellow = OFF;
- sn_zx_red = OFF;
- display_sn(80 - time);
- ew_zz_red = ON; //東西左轉(zhuǎn)紅燈亮,顯示時(shí)間50s
- ew_zz_yellow = OFF;
- ew_zz_green = OFF;
- display_ew(100 - time);
- }
- /*************************************************************
- 南北直行黃燈亮3s,左轉(zhuǎn)不變,顯示黃燈閃爍倒計(jì)時(shí)3s
- 東西不變
- *************************************************************/
- while(time%100 >= 77 && time%100 < 80)
- {
- sn_zx_yellow = ON; //南北直行黃燈亮,顯示時(shí)間3s
- sn_zx_red = OFF;
- sn_zx_green = OFF;
- display_sn_shan(80 - time);
- display_ew(100 - time);
- }
- /*************************************************************
- 南北左轉(zhuǎn)綠燈亮17s,直行不變,顯示綠燈倒計(jì)時(shí)20s
- 東西不變
- *************************************************************/
- while(time%100 >=80 && time%100 <97)
- {
- sn_zz_green = ON; //南北左轉(zhuǎn)綠燈亮, 顯示17s
- sn_zz_red = OFF;
- sn_zz_yellow = OFF;
- display_sn(100-time);
- sn_zx_red = ON; //南北直行紅燈亮
- sn_zx_yellow = OFF;
- sn_zx_green = OFF;
- display_ew(100 - time); //東西繼續(xù)倒計(jì)時(shí)
- }
- /*************************************************************
- 南北左轉(zhuǎn)黃燈亮17s,直行不變,顯示黃燈閃爍倒計(jì)時(shí)3s
- 東西不變
- *************************************************************/
- while(time%100 >= 97 && time<=100)
- {
- sn_zz_yellow = ON; //南北左轉(zhuǎn)黃燈亮, 顯示時(shí)間3s
- sn_zz_red = OFF;
- sn_zz_green = OFF;
- display_sn_shan(100 - time);
- display_ew(100 - time); //東西繼續(xù)倒計(jì)時(shí)
- }
- }
- }
- void timer0() interrupt 1
- {
- count++;
- if(count == 4000)
- {
- time++;
- count = 0;
- }
- if(time > 100)
- time = 0;
- }
復(fù)制代碼
|
|