protues仿真器51单片机定时器内部定时方式
生活随笔
收集整理的這篇文章主要介紹了
protues仿真器51单片机定时器内部定时方式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
protues仿真器51單片機定時器內部定時方式
項目場景:
在寫程序時,用定時器0和定時器1發現定時器定時時間不一樣
問題描述:
用定時器0寫的延時函數(定時器)
void delay_ms(uint xms) {for(; xms > 0; xms--) {TL1=0x18;TH1=0xfc;while(TF1==0);TF1=0; //清零} }用定時器1寫的延時函數(定時器)
void delay_ms(uint xms) {for(; xms > 0; xms--) {TL0=0x18;TH0=0xfc;while(TF0==0);TF0=0; //清零} }兩者調用定時器運行的情況時間完全不一樣
原因分析:
初步懷疑是protues中51單片機內部定時器0和定時器1用的是兩種計數方式,即加法計數和減法計數。
解決方案:
完整代碼:
/******************************* ******************************** ******實驗名稱:定時器實驗****** *******定時器時間為:1000us****** **********使用定時器T0********** *********@author:小高*********** ********date:2021.10.11 ********* ******************************** *******************************/#include <reg51.h>#define uint unsigned int void delay_ms(uint xms) //延時函數 {for(; xms > 0; xms--) {TL1=0x18; //(65536-1000)/256晶振12mhzTH1=0xfc; //(65536-1000)%256while(TF1==0);TF1=0; //清零} }void ledBr() {delay_ms(360);P1 = (P1<<1|P1>>7);P2 = (P2<<7|P2>>1); }void allInit() //初始化函數 {TMOD=0x01; //工作模式1TL1=0x18; //初始化TH1=0xfc; //初始化TR1=1; //打開定時器P1 = 0x01;P2 = 0x80; }void main() {allInit();while(1) {ledBr();} }protues模擬圖如下:
總結
以上是生活随笔為你收集整理的protues仿真器51单片机定时器内部定时方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: shell除法计算
- 下一篇: [Oracle]使用滚动游标