c代碼和仿真文件 毫秒級的秒表.zip
(131.34 KB, 售價: 1 E幣)
2021-4-14 16:03 上傳
點擊文件名下載附件
售價: 1 E幣 [記錄]
[ 購買]
1.png (54.53 KB)
下載附件
2021-4-14 16:01 上傳
單片機部分代碼:(完整代碼和仿真文件見本帖附件)
- #include <AT89X52.H>
- #define uint unsigned int //宏定義無符號整型數(shù)據(jù)
- #define uchar unsigned char //宏定義無符號字符型數(shù)據(jù)
- sbit key1=P3^6; //按鍵
- sbit led=P1^0; //燈
- sbit ledc=P1^1; //燈
- uchar Cntus=0,Cnt10ms=0,Cnt1s=0,Cnt1min=0;//中斷計時變量
- bit stop=0; //停止標志
- void display(); //顯示程序聲明
- void keyscan(); //按鍵掃描程序聲明
- /**************************************
- 1602液晶
- **************************************/
- sbit RS = P2^5;
- sbit RW = P2^6;
- sbit E = P2^7;
- /**********************************************************
- 函數(shù)說明: 延時程序
- **********************************************************/
- void delay(uchar t)
- {
- uint j;
- uchar i;
- for(i=0;i<t;i++)
- for(j=0;j<1000;j++);
- }
- /**************************************
- 短延時
- **************************************/
- void delay5ms()
- {
- uchar i,v,k;
- for(i=1;i>0;i--)
- for(v=168;v>0;v--)
- for(k=22;k>0;k--);
- }
- /**************************************
- 寫指令
- **************************************/
- void lcd_Write_com(uchar com)
- {
- RS=0; //定義指令寄存器
- RW=0; //寫允許
- P0=com; //寫指令
- delay5ms(); E=1; //片選端上拉
- delay5ms(); E=0; //下降沿鎖存
- }
- /**************************************
- 寫數(shù)據(jù)
- **************************************/
- void lcd_write_date(uchar date)
- {
- RS=1; //定義數(shù)據(jù)寄存器
- RW=0; //寫允許
- P0=date; //寫數(shù)據(jù)
- delay5ms(); E=1; //片選端上拉
- delay5ms(); E=0; //下降沿鎖存
- }
- /**************************************
- 顯示程序
- **************************************/
- void dis_lcd1602(uchar x,uchar y,uchar dat)
- {
- uchar add;
- if(y==1) add=(0x80+x);
- if(y==2) add=(0xc0+x);
- lcd_Write_com(add); //寫指令
- lcd_write_date(dat); //寫數(shù)據(jù)
- }
- /**************************************
- 液晶初始化
- **************************************/
- void lcd1602_init()
- {
- lcd_Write_com(0x38); //設(shè)置8位格式,2行,5*7
- lcd_Write_com(0x01); //清屏
- lcd_Write_com(0x0c); //整體顯示,關(guān)光標,不閃爍
- lcd_Write_com(0x06); //設(shè)定輸入方式,增量不移位
- lcd_Write_com(0x80); //初始坐標
- }
- /**************************************
- 液晶顯示漢字程序
- **************************************/
- void hz_lcdDis(uchar x,uchar y,uchar *p) //漢字顯示
- {
- uchar i=0,temp;
- if(x)temp = 0x40; else temp = 0;
- for(i=y;*p!='\0';i++,p++)
- {
- lcd_Write_com(i|0x80+temp);
- lcd_write_date(*p);
- delay5ms();
- }
- }
- /**************************************
- 液晶顯示數(shù)字程序
- **************************************/
- void num_lcdDis(uchar X,uchar Y,uint num,uchar n)
- {
- uint i=0,temp,hang;
- n +=1;
- if(X)hang = 0x40;else hang = 0;
- for(i=(n-1);i>0;i--)
- {
- lcd_Write_com((i+Y-1)|0x80+hang); //從個位開始顯示
- temp = num%10+0x30;
- lcd_write_date(temp);
- delay5ms();
- num/=10;
- }
- }
- void num_lcdDis1_1(uint num)//input 電壓 整數(shù)部分
- {
- uint i,temp,x;
- x=5;
- for(i=0;i<2;i++)
- { x--;
- lcd_Write_com(0x80+x); //寫指令
- temp = num%10+0x30;
- lcd_write_date(temp);// 寫數(shù)據(jù)
- num/=10;
- }
- }
- /**************************************
- 液晶顯示數(shù)字程序
- **************************************/
- void num_lcdDisx(uchar X,uchar Y,uint num,uchar n)
- {
- uint i=0,temp,hang;
- n +=1;
- if(X)hang = 0x40;
- else hang = 0;
- for(i=(n-1);i>0;i--)
- {
- lcd_Write_com((i+Y-1)|0x80+hang);//從個位開始顯示
- temp = num%10+0x30;
- lcd_write_date(temp);
- delay5ms();
- num/=10;
- }
- }
- /***********按鍵掃描程序****************/
- void keyscan()
- {
- static uint count2=0,count1=0; //計數(shù)變量
- static bit key_sign=0; //按鍵自鎖標志
- if(key1==0) //檢測按鍵為0
- { delay(50);
- if(key1==0){
- count1++;
- stop=!stop;
-
- }
- //計數(shù)延時消抖
-
- }
- else
- {
- count1=0; //計數(shù)變量清0
- }
- }
- /***********定時器初始化程序****************/
- void Timer0Init(void) //2.5毫秒@11.0592MHz
- {
- TMOD = 0x01; //設(shè)置定時器模式
- TL0 = 0x00; //設(shè)置定時初值
- TH0 = 0xF7; //設(shè)置定時初值
- TR0 = 1; //定時器0開始計時
- EA=1; //開總中斷
- ET0=1; //開定時器0中斷
- }
- /***************主程序****************/
- void main()
- {
- int cm=0;
- Timer0Init(); //定時器初始化
- lcd1602_init();//液晶初始化
- hz_lcdDis(0,0,"Timer system"); //啟動電源
- hz_lcdDis(1,7,": :"); //歡迎你
- led=1;
- while(1)
- {
- // Cnt1min Cnt1s Cnt10ms
- num_lcdDis(1,5,Cnt1min,2);
- num_lcdDis(1,8,Cnt1s,2);
- num_lcdDis(1,11,Cnt10ms,2);
- if(Cnt1min>9){
- led=0;
- }
-
- keyscan(); //按鍵掃描
- }
- }
- /**************中斷服務(wù)程序*****************/
- void timer0() interrupt 1 //2.5毫秒@11.0592MHz
- {
- TL0 = 0x00; //設(shè)置定時初值
- TH0 = 0xF7; //設(shè)置定時初值
- Cntus++; //中斷變量Cntus自+1
- if(Cntus>=4) //10ms
- {
- Cntus=0; //清0
- if(stop==1) //啟動
- Cnt10ms++; //10毫秒計數(shù)
- if(Cnt10ms>=100)
- {
- Cnt10ms=0;
- ledc=!ledc;
- Cnt1s++;
- //秒計數(shù)
- if(Cnt1s>=60)
- {
- Cnt1s=0;
- Cnt1min++; //分計數(shù)
- if(Cnt1min>=100)
- Cnt1min=0;
- }
- }
- }
- }
復(fù)制代碼
【必讀】版權(quán)免責(zé)聲明
1、本主題所有言論和內(nèi)容純屬會員個人意見,與本論壇立場無關(guān)。2、本站對所發(fā)內(nèi)容真實性、客觀性、可用性不做任何保證也不負任何責(zé)任,網(wǎng)友之間僅出于學(xué)習(xí)目的進行交流。3、對提供的數(shù)字內(nèi)容不擁有任何權(quán)利,其版權(quán)歸原著者擁有。請勿將該數(shù)字內(nèi)容進行商業(yè)交易、轉(zhuǎn)載等行為,該內(nèi)容只為學(xué)習(xí)所提供,使用后發(fā)生的一切問題與本站無關(guān)。 4、本網(wǎng)站不保證本站提供的下載資源的準確性、安全性和完整性;同時本網(wǎng)站也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的損失或傷害。 5、本網(wǎng)站所有軟件和資料均為網(wǎng)友推薦收集整理而來,僅供學(xué)習(xí)用途使用,請務(wù)必下載后兩小時內(nèi)刪除,禁止商用。6、如有侵犯你版權(quán)的,請及時聯(lián)系我們(電子郵箱1370723259@qq.com)指出,本站將立即改正。
|
|