久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3088|回復: 2
打印 上一主題 下一主題
收起左側

智能溫控風扇單片機仿真設計,想知道為什么仿真的時候數碼管不兩 不顯示數字

[復制鏈接]
跳轉到指定樓層
樓主
10黑幣

希望好心人幫幫我- - 下面是源代碼
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P1^7;
sbit key1=P1^3;
sbit key2=P1^4;
sbit dianji=P3^1;
float ff;
uint y3;
uchar shi,ge,xiaoshu,sheding=20,gaonum,dinum;
uchar code dispcode[]={  //段碼
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar code tablel[]={  //帶小數點的段碼
0xbf,0x86,0xdb,0xcf,
0xe6,0xed,0xfd,
0x87,0xff,0xef};
uchar dispbitcode[]={ //位選
0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f};
uchar dispbuf[8]={0,0,0,0,0,0,0,0};
void Delay(uint num)// 延時函數
{
while( --num );
}
void digitalshow(uchar a4,uchar a3,uchar a2,uchar a1,uchar a0)
{
dispbuf[0]=a0;
dispbuf[1]=a1;
dispbuf[2]=a2;
dispbuf[3]=a3;
dispbuf[4]=a4;
P2=0xff;
P0=dispcode[dispbuf[0]];
P2=dispbitcode[5];
Delay(1);
P2=0xff;
P0=dispcode[dispbuf[1]];
P2=dispbitcode[4];
Delay(1);
P2=0xff;
P0=dispcode[dispbuf[2]];
P2=dispbitcode[2];
Delay(1);
P2=0xff;
P0=tablel[dispbuf[3]];
P2=dispbitcode[1];
Delay(1);
P2=0xff;
P0=dispcode[dispbuf[4]];
P2=dispbitcode[0];
Delay(1);
}
void dmsec(uint count)
{
uint i; // 1ms 延時
while(count--)
{
for(i=0;i<125;i++){}
}
}
void tmreset(void)
{
DQ=0;
Delay(90); // 精確延時 大于 480us
DQ=1;
Delay(4); // 90,4 可以小范圍變化
}
void tmpre(void)
{
while(DQ);
while(~DQ);
Delay(4);
}
bit tmrbit(void)
{
uint i;
bit dat;
DQ=0;
i++; // i++;大概 1us
DQ=1;
i++;
i++;
dat=DQ;
Delay(8);
return(dat);
}
uchar tmrbyte(void) //讀一個比特
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmrbit();
dat=(j<<7)|(dat>>1);
}
return(dat);
}
void tmwbyte(uchar dat) //寫一個比特
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1; // 從低位開始
if(testb) // Write 1
{
DQ=0; // 先拉低
i++;
i++; // >1us
DQ=1;
Delay(4);
}
else // Write 0
{
DQ=0;
Delay(4);
DQ=1;
i++;
i++; // 再拉高
}
}
}
void tmstart(void) //ds1820 開始轉換
{
dmsec(1);
tmreset();
tmpre();
dmsec(1);
tmwbyte(0xcc); // skip rom
tmwbyte(0x44); // 轉換
}
uchar tmrtemp(void) //讀取溫度
{
uchar a,b;
tmreset();
tmpre();
dmsec(1);
tmwbyte(0xcc); // skip rom
tmwbyte(0xbe); // 轉換
a=tmrbyte(); // LSB 低 8 位
b=tmrbyte(); // MSB 高 8 位
y3=b;
y3<<=8;
y3=y3|a;
ff=y3*0.0625;
y3=ff*10+0.5;
return(y3);
}
void keyscan(void)
{
if(key1==0)
{
dmsec(5);
if(key1==0)
{
sheding++;
if(sheding==100)
sheding=20;
}
while(!key1);
}
else if(key2==0)
{
dmsec(5);
if(key2==0)
{
sheding--;
if(sheding==0)
sheding=20;
}
while(!key2);
}
}
void deal(uint tmp) //溫度處理
{
if(tmp<=sheding)
{
gaonum=0;
dinum=4;
}
else if((tmp>sheding)&&(tmp<=(sheding+5)))
{
gaonum=1;
dinum=3;
}
else if((tmp>(sheding+5))&&(tmp<=(sheding+10)))
{
gaonum=2;
dinum=2;
}
else if((tmp>(sheding+10))&&(tmp<=(sheding+15)))
{
gaonum=3;
dinum=1;
}
else
{
gaonum=4;
dinum=0;
}
}
void dianjik() //電機控制
{
uchar q,i;
for(q=0;q<dinum;q++)
{
dianji=0;
digitalshow(shi,ge,xiaoshu,sheding/10,sheding%10);
for(i=255;i>0;i--)
{
digitalshow(shi,ge,xiaoshu,sheding/10,sheding%10);
}
}
for(q=0;q<gaonum;q++)
{
dianji=1;
digitalshow(shi,ge,xiaoshu,sheding/10,sheding%10);
for(i=255;i>0;i--)
{
digitalshow(shi,ge,xiaoshu,sheding/10,sheding%10);
}
}
}
void main(void)
{
uint last;
dianji=0;
tmstart();
dmsec(450); // 初始化 ds18b20
while(1)
{
tmstart(); // ds1820 開始轉換
dmsec(2);
last=tmrtemp()+256; // 讀取溫度
shi=last/100;
ge=(last%100)/10;
xiaoshu=(last%100)%10;
keyscan();
dmsec(2);
deal(last/10);
dianjik();
}
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:96682 發表于 2019-3-28 11:55 | 只看該作者
LZ 共陰的卻用共陽接法,電路圖有誤程序上有瑕疵還不匹配
回復

使用道具 舉報

板凳
ID:213173 發表于 2019-3-28 17:33 | 只看該作者
你這程序大量采用dmsec()軟件延時,哪能正常工作?給你改好了,你試試。 智能溫控風扇單片機仿真設計+仿真.zip (118.09 KB, 下載次數: 24)


  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit DS=P1^6;
  6. sbit key1=P3^6;
  7. sbit key2=P3^7;
  8. sbit dianji=P1^0;
  9. uchar code smgdu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0~9數碼管段碼
  10. uchar code smgwei[]={0xef,0xdf,0xbf,0x7f};       //1~4數碼管位碼
  11. uchar TempData[4];//溫度顯示值緩存
  12. uchar TempData1[3];//設定顯示值緩存
  13. uchar set=25;                //設定值變量
  14. uint  count=0;                //顯示設定值計數延時變量
  15. bit Flag=0;        //讀時間標志
  16. bit Allow=0;//設置狀態標志
  17. void delay_us(uchar us)//約2us延時函數
  18. {
  19.         while(--us);
  20. }
  21. void delay(uchar z)//約1ms延時函數
  22. {
  23.         while(z--)
  24.         {
  25.                 delay_us(245);
  26.                 delay_us(245);
  27.         }
  28. }

  29. void display() //4個數碼管顯示
  30. {
  31.         static uchar i;
  32.         P0=0x00;                        //消隱
  33.         if(Allow==1)
  34.         {
  35.                 switch(i)        //顯示設定值
  36.                 {
  37.                         case 0: i++; break;
  38.                         case 1: P2=smgwei[i];P0=TempData1[i];i++; break;
  39.                         case 2: P2=smgwei[i];P0=TempData1[i];i=0; break;
  40.                 }
  41.         }
  42.         else
  43.         {
  44.                 switch(i)        //顯示溫度值
  45.                 {
  46.                         case 0: P2=smgwei[i];P0=TempData[i];i++; break;
  47.                         case 1: P2=smgwei[i];P0=TempData[i];i++; break;
  48.                         case 2: P2=smgwei[i];P0=TempData[i];i++; break;
  49.                         case 3: P2=smgwei[i];P0=TempData[i];i=0; break;
  50.                 }
  51.         }
  52. }
  53. //讀一個字節
  54. uchar read_byte()
  55. {
  56.         uchar i,dat;
  57.         for(i=0;i<8;i++)
  58.         {
  59.                 DS=0;
  60.                 dat>>=1;
  61.                 DS=1;
  62.                 if(DS)
  63.                 dat|=0x80;
  64.                 delay_us(25);
  65.         }
  66.         return (dat);
  67. }  
  68. //寫一個字節
  69. void write_byte(uchar dat)
  70. {
  71.         uchar i;
  72.         for(i=0;i<8;i++)
  73.         {
  74.                 DS=0;
  75.                 DS=dat&0x01;
  76.                 delay_us(25);
  77.                 DS=1;
  78.                 dat>>=1;
  79.         }
  80. }
  81. //單總線初始化時序         
  82. bit ds_init()
  83. {
  84.         bit i;
  85.         DS=1;
  86.         delay_us(5);
  87.         DS=0;
  88.         delay_us(200);
  89.         delay_us(200);
  90.         DS=1;
  91.         delay_us(50);
  92.         i=DS;
  93.         delay_us(25);
  94.         return (i);
  95. }
  96. uint ReadTemperature()
  97. {
  98.         uint H,i;
  99.         uchar L;
  100.         ds_init();//初始化溫度傳感器
  101.         write_byte(0xcc);//發送跳躍ROM指令
  102.         write_byte(0x44);//發送溫度轉換指令
  103.         delay(10);
  104.         ds_init();//初始化溫度傳感器
  105.         write_byte(0xcc);//發送跳躍ROM指令
  106.         write_byte(0xbe);//讀取溫度傳感器暫存器的值
  107.         L=read_byte();
  108.         H=read_byte();
  109.         H<<=8;
  110.         i=L+H;
  111.         return(i);
  112. }
  113. /*************************
  114.           按鍵掃描程序
  115. *************************/
  116. void key_scan()
  117. {
  118.         static bit key1_sign,key2_sign;                        //按鍵自鎖標志變量
  119.         static uint count1,count2;                                //消抖計數變量                       

  120.         if(!key1)                                                        //檢測按鍵1按下
  121.         {
  122.                 if((++count1>=100)&&(key1_sign==0))//檢測消抖計數與按鍵1自鎖標志
  123.                 {                       
  124.                         key1_sign=1;                        //按鍵1自鎖標志置1
  125.                         Allow=1;                                        //顯示設定值
  126.                         count=0;                                        //顯示設定值計數延時清0
  127.                         if(set<90)
  128.                                 set++;                                //調整設定值變量自+1
  129.                         TempData1[1]=smgdu[set/10];
  130.                         TempData1[2]=smgdu[set%10];
  131.                 }
  132.         }
  133.         else
  134.         {
  135.                 key1_sign=0;                                //按鍵1自鎖標志清0
  136.                 count1=0;                                        //消抖計數count1清0
  137.         }
  138.         if(!key2)                                                        //檢測按鍵2按下
  139.         {
  140.                 if((++count2>=100)&&(key2_sign==0))//檢測消抖計數與按鍵1自鎖標志
  141.                 {                       
  142.                         key2_sign=1;                        //按鍵1自鎖標志置1
  143.                         Allow=1;                                        //顯示設定值
  144.                         count=0;                                        //顯示設定值計數延時清0
  145.                         if(set>20)
  146.                                 set--;                                //調整設定值變量自-1
  147.                         TempData1[1]=smgdu[set/10];
  148.                         TempData1[2]=smgdu[set%10];
  149.                 }
  150.         }
  151.         else
  152.         {
  153.                 key2_sign=0;                                //按鍵1自鎖標志清0
  154.                 count2=0;                                        //消抖計數count1清0
  155.         }
  156. }
  157. void Timer0Init()             //2毫秒@12.000MHz
  158. {
  159.         TMOD= 0x01;                //設置定時器模式
  160.         TL0 = 0x30;                //設置定時初值
  161.         TH0 = 0xF8;                //設置定時初值
  162.         TR0 = 1;                //定時器0開始計時
  163.         EA=1;
  164.         ET0=1;
  165. }
  166. void main()
  167. {        
  168.         uint  temp;
  169.         uchar TempH,TempL;
  170.         bit   negative;//負數標志
  171.        
  172.         Timer0Init();   //初始化定時器   
  173.         while(1)           
  174.         {
  175.                 if(Flag==1)         
  176.                 {
  177.                         Flag=0;
  178.                         temp=ReadTemperature();//讀取溫度
  179.                         if(temp&0x8000)
  180.                         {
  181.                                 negative=1;                //負號標志
  182.                                 temp=~temp;                //取反加1
  183.                                 temp +=1;
  184.                         }
  185.                         else negative=0;        //正數
  186.        
  187.                         TempH=temp>>4;                //分解為整數
  188.                         TempL=temp&0x0F;        //分解為小數
  189.                         TempL=TempL*6/10;        //保留一位小數
  190.        
  191.                         if(negative==1)
  192.                         TempData[0]=0x40;//顯示負號
  193.                         else if(TempH/100==0)//小于100
  194.                         TempData[0]=0;             //百位消隱
  195.                         else
  196.                         TempData[0]=smgdu[TempH/100]; //顯示百位溫度
  197.        
  198.                         if((TempH/100==0)&&((TempH%100)/10==0))
  199.                         TempData[1]=0;              //十位消隱
  200.                         else
  201.                         TempData[1]=smgdu[(TempH%100)/10];        //顯示十位溫度
  202.                         TempData[2]=smgdu[(TempH%100)%10]|0x80;//顯示個位溫度,帶小數點
  203.                         TempData[3]=smgdu[TempL];      //顯示小數溫度1位        
  204.                 }
  205.                 if(TempH>=set)          //溫度超過設定溫度,電機啟動
  206.                         dianji=0;
  207.                 else dianji=1;        

  208.                 key_scan();
  209.         }
  210. }
  211. void timer0int() interrupt 1 //定時器,定時2ms
  212. {
  213.         static uchar num;
  214.         TL0 = 0x30;                //設置定時初值
  215.         TH0 = 0xF8;                //設置定時初值
  216.         display();
  217.         if(++num>=250)   //延時500ms讀溫度數值
  218.         {
  219.                 num=0;
  220.                 Flag=1;
  221.         }        
  222.         if(Allow==1)       
  223.         {
  224.                 if(++count>=1000)        //顯示設定值計數延時
  225.                 {
  226.                         Allow=0;                        //恢復正常顯示
  227.                         count=0;                        //計數清0
  228.                 }
  229.         }
  230. }
復制代碼



回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线观看免费毛片 | www.啪啪.com| 国产欧美精品一区二区三区 | 91视频在线看 | 久久九九免费 | 国产精品一区二区欧美黑人喷潮水 | 久久精品亚洲成在人线av网址 | www.天天操| 中文字幕在线国产 | 久久精品无码一区二区三区 | 国产精品视频久久久久久 | 日韩在线观看一区 | 91欧美精品成人综合在线观看 | 国产精品中文在线 | 天天综合久久 | 高清成人av | 777zyz色资源站在线观看 | 欧美日韩1区2区3区 欧美久久一区 | 成人免费观看男女羞羞视频 | 久久av一区 | av资源中文在线天堂 | 美女黄色在线观看 | 中文字幕日韩一区二区 | 亚洲精品国产a久久久久久 午夜影院网站 | 9999视频| 高清亚洲| 欧美精品一区二区三区在线播放 | 日韩av美女电影 | 亚洲第一av网站 | 午夜免费电影院 | 亚洲成人精品在线观看 | 成人免费一级视频 | 羞羞视频在线网站观看 | 成人黄色在线 | 欧美a√| 欧美综合久久久 | 日韩一二三区视频 | 中文字幕成人 | 国产91一区二区三区 | 在线看免费的a | 久热精品在线 |