這個是本人做的一個紅綠燈系統,由12864顯示,有無線傳輸兩個道路的信息以及交通擁堵情況。
單片機發送源程序如下:
- //簡介:第一行顯示,距離時間
- //
- //第二行顯示,還剩
- //
- //第三行顯示,00時,00分,00秒
- //
- //第四行顯示, 周林
- //
- //
- //
- //按下旋鈕開關,開始設定秒,秒編輯位閃動。左右旋轉設定數值,
- //
- //在按下開關,秒確定,設定分,分編輯位閃動左右調數值,
- //
- //再按下,分確定,小時位閃動。左右轉調小時,再按一下。時間確定,開始倒計時。到達定
- //
- //時時間后停止,并閃動。
-
- #include <reg52.h>
- #include <intrins.h>
-
- /********************* 定義 ********************************/
- #define LCD_data P0 //數據口
- sbit LCD_RS = P2 ^ 6; //寄存器選擇輸入
- sbit LCD_RW = P2 ^ 5; //液晶讀/寫控制
- sbit LCD_EN = P2 ^ 7; //液晶使能控制
- sbit LCD_PSB = P3 ^ 2; //串/并方式控制
- sbit LCD_RST = P3 ^ 4; //液晶復位端口
- sbit bz = P1 ^ 0;
-
- sbit hw1=P2^3;
- sbit hw2=P2^4;
- sbit sset=P3^0;//設置按鈕
- sbit spk=P3^1;
- sbit sadd=P3^3;
- sbit sdel=P1^0; //按下開始計時
- //sbit FW= RST;
- sbit d1 = P2^0;
- sbit d2 = P2^1;
- sbit d3 = P2^2;
- void TimerConfiguration();
- unsigned int Time, g, y;
- signed int second=0,minute=0,hour=0,count=0,keycount=0;
- signed char key=0;
- unsigned char code DIS1[] =
- {
- "距離綠燈時間"
- };
- unsigned char code DIS2[] =
- {
- "還剩:"
- };
- unsigned char code DIS31[] =
- {
- "堵車距離: 50m"
- };
- unsigned char code DIS32[] =
- {
- "不堵車"
- }; unsigned char code DIS33[] =
- {
- "秒"
- };
- unsigned char code DIS4[] =
- {
- "堵車距離: 100m"
- };
- unsigned char code DIS5[] =
- {
- "楊振林余偉樊曉莉"
- };
- unsigned char code table2[]="0123456789";
-
- char code reserve[3]_at_ 0x3b; //保留0x3b開始的3個字節
-
- /*********************延時子函數**************************/
-
- void delayNOP()//us延時子函數 (4.34us)
- {
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- }
-
- void delayms(unsigned int ms)//ms延時子函數
- {
- unsigned char y;
- while (ms--)
- {
- for (y = 0; y < 114; y++)
- ;
- }
- }
- //******************檢查LCD忙狀態**************************
-
-
- bit lcd_busy()//檢查LCD忙狀態 1忙,0閑
- {
- bit result;
- LCD_RS = 0;
- LCD_RW = 1;
- LCD_EN = 1;
- delayNOP();
- result = (bit)(P0 &0x80);
- LCD_EN = 0;
- return (result); }
-
- //***********************寫指令數據***********************
-
- void lcd_wcmd(unsigned char cmd)//寫指令數據到LCD
- {
- while (lcd_busy())
- {
- ;
- }
- LCD_RS = 0;
- LCD_RW = 0;
- LCD_EN = 1;
- P0 = cmd;
- delayNOP();
- LCD_EN = 0;
- }
-
- void lcd_wdat(unsigned char dat)//寫顯示數據到LCD
- {
- while (lcd_busy())
- ;
- LCD_RS = 1;
- LCD_RW = 0;
- LCD_EN = 1;
- P0 = dat;
- delayNOP();
- LCD_EN = 0;
- }
-
- void writesmh(unsigned char add,unsigned char date)//顯示個位和十位數據
- {
- unsigned char shi,ge;
- shi=date/10;
- ge=date%10;
- lcd_wcmd(0x96);
- delayms(5);
- lcd_wdat(table2[shi]);
- delayms(5);
- lcd_wdat(table2[ge]);
- delayms(5);
- }
-
- //*********************初始化設定****************************
- void lcd_init()
- {
- LCD_PSB = 1; //并口方式
-
- LCD_RST = 0; //液晶復位
- delayms(5); //液晶復位
- LCD_RST = 1; //液晶復位
- delayms(5); //液晶復位
-
- lcd_wcmd(0x34); //擴充功能設定,擴充指令,選8位數據
- delayms(5);
- lcd_wcmd(0x30); //功能設定,基本指令操作,選8位數據
- delayms(5);
- lcd_wcmd(0x0C); //顯示開,關光標,關光標反白允許。
- delayms(5);
- lcd_wcmd(0x04); //光標的移動方向
- delayms(5);
- lcd_wcmd(0x01); //清除LCD的顯示內容
- delayms(5);
-
- TMOD=0x01;
- TH0=0x3C;
- TL0=0xB0;
- EA=1;
- ET0=1;
- TR0=0;
- EX0=0; //外部中斷0允許
- IT0=1; //外部中斷0為邊沿觸發方式
- }
-
- //*********************設定顯示位置子函數**********************
-
- void lcd_pos(unsigned char X, unsigned char Y)//設定顯示位置
- {
- unsigned char pos;
-
- if (X == 1)
- {
- X = 0x80;
- }
- else if (X == 2)
- {
- X = 0x90; }
- else if (X == 3)
- {
- X = 0x88;
- }
- else if (X == 4)
- {
- X = 0x98;
- }
- pos = X + Y; //確定顯示地址
-
- lcd_wcmd(pos); //寫顯示地址
- }
-
- //*****************清屏子函數***************************
-
- void clr_screen()//清屏子函數
- {
- lcd_wcmd(0x34); //擴充指令操作
- delayms(5);
- lcd_wcmd(0x30); //基本指令操作
- delayms(5);
- lcd_wcmd(0x01); //清屏
- delayms(5);
- }
-
- //******************閃爍子函數**************************
- void lcdflag()
- {
- lcd_wcmd(0x08); //關閉顯示
- delayms(500);
- lcd_wcmd(0x0c); //開啟顯示
- delayms(500);
- lcd_wcmd(0x08);
- delayms(500);
- lcd_wcmd(0x0c);
- delayms(500);
- lcd_wcmd(0x08);
- delayms(500);
- lcd_wcmd(0x0c);
- delayms(500);
-
- }
- //******************寫字符串子函數*************************
- void wr_string(unsigned char str[])//寫字符串子函數
- {
- unsigned char num = 0;
-
- while (str[num])
- {
- lcd_wdat(str[num++]); //寫數據
-
- }
- }
-
- //********************按鍵設置時間*************************
- void keyscan()//按鍵設置時間
- {
- if(d1==0)
- {
- TR0=1; //開始計時
- EX0=1;
- bz=0;
- }
- if(d1==1)
- {
- TR0=0; //停止計時
- EX0=0;
- }
-
-
- if(keycount!=0)
- {
- if(keycount==2)//編輯秒
- {
- if(sadd==0)//數值加1
- {
- delayms(100);
- if(sadd==0)
- {
- second++;
- if(second==60)
- {
- second=0;
- }
- sadd=1;
- }
- writesmh(0x0e,second);
- lcd_wcmd(0x8e);
- lcd_wcmd(0x0d);//秒位閃爍
-
- }
- if(sdel==0)//數值減1
- {
- delayms(10);
- if(sdel==0)
- {
-
- if(second==0)
- {
- second=60;
- }
- second--;
- sdel=1;
- }
- writesmh(0x0e,second);
- lcd_wcmd(0x8e);
- lcd_wcmd(0x0d);//秒位閃爍
-
- }
-
-
-
- }
- }
- }
- //void gzhi()
- //{
- //if(hw1==0)
- //{
- // g = 1;
- //}
- ////if(d1==1&&hw2==0&&hw1==0)
- ////{
- //// g = 1;
- ////}
- //if(d1==1&&hw2==0&&hw1==1)
- //{
- // g = 2;
- //}
- //if(d1==1&&hw2==1&&hw1==0)
- //{
- // g = 3;
- //}
- //if(d1==1&&hw2==1&&hw1==1)
- //{
- // g = 4;
- //}
- //if(d1==0&&hw2==0&&hw1==0)
- //{
- // g = 5;
- //}
- //if(d1==0&&hw2==0&&hw1==1)
- //{
- // g = 6;
- //}
- //if(d1==0&&hw2==1&&hw1==0)
- //{
- // g = 7;
- //}
- //if(d1==0&&hw2==1&&hw1==1)
- //{
- // g = 8;
- //}
- //}
- void init()//初始化子程序
- {
- TMOD=0x20; //設置定時器T1為工作方式2
- TH1=0xfd;
- TL1=0xfd; //T1定時器裝初值
- TR1=1; //啟動定時器T1
- REN=1; //允許串口接收
- SM0=0;
- SM1=1; //設置串口工作方式1
- EA=1; //開總中斷
- ES=1; //開串口中斷
- }
- //主函數主函數主函數主函數主函數主函數主函數主函數主函數主函數主函數主函數主函
- //數主函數
-
- void main()
- {
- init();
- delayms(100); //上電,等待穩定
- lcd_init(); //初始化LCD
-
- lcd_pos(1, 0); //設置“距離綠燈時間”顯示位置為第一行
- wr_string(DIS1);
- lcd_pos(2, 0); //設置“還剩”顯示位置為第二行
- wr_string(DIS2);
- lcd_pos(2, 7); //設置“秒”顯示位置為第四行
- wr_string(DIS33);
- if((Time==0&&hw2==0&&hw1==0)||(Time==0&&hw2==0&&hw1==1))
- { //********************************************************
- lcd_pos(3, 0); //設置“距離綠燈時間”顯示位置為第一行
- wr_string(DIS4); //堵車100m
- }
- if(Time==0&&hw1==0&&hw2==1)
- { //********************************************************
- lcd_pos(3, 0); //設置“距離綠燈時間”顯示位置為第一行
- wr_string(DIS31); //堵車50m的
- }
- if(Time==0&&hw1==1&&hw2==1)
- { //********************************************************
- lcd_pos(3, 0); //設置“距離綠燈時間”顯示位置為第一行
- wr_string(DIS32); //不堵車
- }
- lcd_pos(4, 0); //設置“距離綠燈時間”顯示位置為第一行
- wr_string(DIS5);
- writesmh(0x0e,second); //顯示動態時間 秒
- delayms(5);
- TimerConfiguration();
- init();//調用初始化子程序
- while (1)
- {
-
- keyscan();
- // if(Time==0)
- // {
- // d1 = 0;
- //
- // }
- //
- // if(Time==1200) //********************************60 40
- // {
- // d1 = 1;
- // d2 = 0;
- // }
- // if (Time ==1600)
- // {
- // d2 = 1;
- // d3 = 0;
- // }
- // if (Time ==1660)
- // {
- // d3 = 1;
- // Time = 0;
- // }
- if(Time==0&&hw1==1&&hw2==1) //11 // 60 30
- {
-
- d1 = 0;
- }
-
- if(Time==1200)
- {
- d1 = 1;
- d2 = 0;
- }
- if (Time ==1800)
- {
- d2 = 1;
- d3 = 0;
- }
- if (Time ==1860)
- {
- d3 = 1;
- Time = 0;
- }
- if(Time==0&&hw1==0&&hw2==1) //01
- {
- d1 = 0;
- }
-
- if(Time==1000&&hw1==0&&hw2==1) //**************************50 50
- {
- d1 = 1;
- d2 = 0;
- }
- if (Time ==2000&&hw1==0&&hw2==1 )
- {
- d2 = 1;
- d3 = 0;
- }
- if (Time ==2060&&hw1==0&&hw2==1)
- {
- d3 = 1;
- Time = 0;
- }
-
- if((Time==0&&hw2==0&&hw1==0)||(Time==0&&hw2==0&&hw1==1)) //***********************************40 50
- {
- d1 = 0;
- }
-
- if(Time==800&&hw2==0&&hw1==0)
- {
- d1 = 1;
- d2 = 0;
- }
- if (Time ==1800&&hw2==0&&hw1==0)
- {
- d2 = 1;
- d3 = 0;
- }
- if (Time ==1860&&hw2==0&&hw1==0)
- {
- d3 = 1;
- Time = 0;
- }
-
- }
- }
- //**********************中斷***************************
-
- void time0() interrupt 1 using 0//倒計時中斷
- {
- TH0=0x3C;
- TL0=0xB0;
- count++;
- if(count==156&&hw1==1&&hw2==1)//11
- {
- count=0;
- second--;
- if(second<0)
- {
- second=60;
- minute--;
- if(minute<0)
- {
- minute=59;
- hour--;
- if(hour<0)
- {
- hour=24;
- }
- lcd_pos(3, 2); //設置顯示位置為第三行,第七列
- writesmh(0x0a,hour);
- } lcd_pos(3, 4); //設置顯示位置為第三行,第七列
- writesmh(0x0c,minute);
- }
- lcd_pos(3, 6); //設置顯示位置為第三行,第七列
- writesmh(0x0e,second);
- }
-
-
- if(count==155&&hw1==0&&hw2==1) // 01
- {
- count=0;
- second--;
- if(second<0)
- {
- second=50;
- if(d1==1)
- {
- second=0;
- bz=1;
- }
- }
- lcd_pos(3, 6); //設置顯示位置為第三行,第七列
- writesmh(0x0e,second);
- }
- if((count==155&&hw1==0&&hw2==0)||(count==155&&hw2==0&&hw1==1)) //00
- {
- count=0;
- second--;
-
- if(second<0)
- {
- second=40;
- if(d1==1)
- {
- second=0;
- bz=1;
- }
- }
- lcd_pos(3, 6); //設置顯示位置為第三行,第七列
- writesmh(0x0e,second);
- }
- }
-
- void encoder(void) interrupt 0//外部中斷0 旋轉碼開關中斷程序
- {
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
調皮的紅綠燈2.rar
(100.17 KB, 下載次數: 19)
2017-5-16 10:09 上傳
點擊文件名下載附件
紅綠燈系統
|