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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于單片機壓控PWM波源程序 雙機串行通信

[復制鏈接]
跳轉到指定樓層
樓主
程序目的       甲機接收ADC0808轉換的電壓信號,并在四位數碼管顯示電壓值,將該電壓信號發送到乙機;
乙機接收字符串,并將該信息轉換為PWM波頻率,生成相應PWM波


Keil涉及:AD轉換、串行通信、PWM
Proteus需要:ADC0809 AT89C52 四位數碼管
甲機代碼:
  1. /*(一)用ADC0808采集電壓,完成:
  2. 將 采集結果 在數碼管上顯示出來,并將采集結果 數字量 傳送到乙機*/
  3. #include<reg52.h>
  4. #define baud 9600                        //設置波特率;
  5. bit flag = 0;               
  6. sbit START = P2^0;                         //定義p2.0為START;
  7. sbit OE = P2^2;                                  //定義P2.2為OE;
  8. unsigned char s[5];                  //定義要被發送的字符串數組;
  9. unsigned char code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0xff};
  10. unsigned char DSY_BUFF[4]={0xff,0xff,0xff,0xff};//數碼管顯示值        
  11. unsigned char d;                                                  //定義電壓測量比
  12. unsigned int dat;                                                  //定義電壓測量比d轉換后數值
  13. void main()
  14. {
  15. /*初始化*/                  
  16.         TMOD = 0x21;
  17.         SCON = 0x50;                                                  //8位異步收發,波特率可變
  18.         TH0 = (65536-922)/256;                                //設定時器T0初值,使用11.0592MHz;1ms
  19.         TL0 = (65536-922)%256;
  20.         TH1 = 256 - (11059200/12/32)/baud;                          //設定時器T1初值
  21.         TL1 = TH1;
  22.         IT0 = 1;                                                                          //設置完跳變沿觸發方式
  23.         EA = 1;                                                                                  //開啟總中斷
  24.         ET0 = 1;                                                                          //開啟定時器T0中斷
  25.         ES = 1;                                                                              //開啟串口中斷源
  26.         EX0 = 1;                                                                       //開啟外部中斷
  27.         TR1 = 1;
  28.         TR0 = 1;                                                                           //開啟定時器
  29.         START = 0;START = 1;START = 0;                                 //啟動ADC0808
  30.         while(1)
  31.         {
  32. /*標志位flag置位:執行電壓信號轉換、上位機發送程序*/
  33.                 if(flag==1)               
  34.                 {         
  35.                         flag = 0;                                                          //初始化flag
  36.                         dat = d*5000.0/255.0;                                  //計算電壓值
  37.                         DSY_BUFF[0] = DSY_CODE[11];                        //數碼管顯示數值最低位
  38.                         DSY_BUFF[1] = DSY_CODE[dat/10%10];
  39.                         DSY_BUFF[2] = DSY_CODE[dat/100%10];
  40.                         DSY_BUFF[3] = DSY_CODE[dat/1000];
  41.                         s[0]=dat/1000+0x30;                                        //定義電壓值最高位
  42.                         s[1]=dat/100%10+0x30;
  43.                         s[2]=dat/10%10+0x30;
  44.                         s[3]='V';
  45.                         s[4]='\0';
  46.                         SBUF = s[0];                                                   //上位機發送開始
  47.                 }
  48.         }
  49. }
  50. void EX0_Int() interrupt 0                                                  //外部中斷0
  51. {
  52.                 OE = 1;                                                                        //輸出使能
  53.                 d = P1;                                                                         //讀取轉換結果
  54.                 OE = 0;
  55.                 flag = 1;                                                                 //標志位flag置一
  56. }
  57. /*T0定時器中斷********數碼管動態顯示,開啟測量電壓值*/
  58. void Boom_big() interrupt 1                                                  
  59. {                             
  60.         static unsigned char i,cnt;
  61.         TH0 = (65536-922)/256;                                                 //重裝初值
  62.         TL0 = (65536-922)%256;
  63.         P0 = 0xFF;                                                                         //消鬼
  64.         P2 = (0x80>>i)|(P2&0x0F);
  65.         P0 = DSY_BUFF[i];
  66.         i++;
  67.         if(i>=4)
  68.         {
  69.                 P0 &= 0x7F;
  70.                 i = 0;
  71.         }
  72.         cnt++;
  73.         if(cnt>=200)                                                                 //每隔200ms測量電壓值
  74.         {
  75.                 cnt = 0;
  76.                 START = 0;START = 1;START = 0;
  77.         }
  78. }
  79. /*串口中斷,甲機發送電壓轉換值字符串*/
  80. void UART_ISR() interrupt 4                                                  
  81. {
  82.         static unsigned char n = 1;
  83.         if(RI)
  84.         {
  85.                 RI = 0;        
  86.         }
  87.         if(TI)
  88.         {  
  89.                 TI = 0;
  90.                 if(s[n] !='\0')                                  //直到s[6]發完為止
  91.                 {
  92.                         SBUF = s[n];                          //發送字符數組s[]
  93.                         n++;
  94.                 }
  95.                 else                                                //發完i清零,下次使用  
  96.                 {
  97.                         n = 1;        
  98.                 }
  99.         }
  100. }
復制代碼

乙機代碼:
  1. /*乙機接收數據,并產生相應PWM波*/
  2. #include<reg52.h>
  3. #define baud 9600                                                 //設置波特率
  4. bit flag = 0;
  5. sbit PWM = P2^2;                                                //PWM脈沖引腳P2^2
  6. unsigned char s[4];                                                //設置接收字符串的數組
  7. unsigned int freq;                                                 //頻率初值
  8. unsigned char dc = 25;                                           //占空比
  9. unsigned char HighTH,HighTL,LowTH,LowTL;
  10. void main()
  11. {
  12. /*初始化串口中斷、定時器中斷*/
  13.         SCON = 0x50;
  14.         TMOD = 0x21;
  15.         HighTH = (65536-11059200/12/freq*dc/100) / 256;                                //設高脈沖初值
  16.         HighTL = (65536-11059200/12/freq*dc/100) % 256;        
  17.         LowTH = (65536-11059200/12/freq*(100-dc)/100) / 256;                //設低脈沖初值
  18.         LowTL = (65536-11059200/12/freq*(100-dc)/100) % 256;
  19.         TH0=HighTH;
  20.         TL0=HighTL;
  21.         TH1 = 256-(11059200/12/32)/baud;                                                          //定時器T1設初值
  22.         TL1 = TH1;
  23.         PWM = 1;
  24.         EA = 1;
  25.         ET0 = 0;                                                                                                           //關定時器T0中斷
  26.         TR0 = 1;
  27.         ES = 1;                                                                                                           //開啟串口中斷
  28.         TR1 = 1;
  29.         while(1)
  30.         {
  31.                 if(flag==1)
  32.                 {
  33.                         flag = 0;
  34.                         freq = ((s[0]-0x30)*100+(s[1]-0x30)*10+(s[2]-0x30));//轉換字符串s[]:PWM頻率freq           
  35.                         HighTH = (65536-11059200/12/freq*dc/100) / 256;                //設高脈沖初值
  36.                         HighTL = (65536-11059200/12/freq*dc/100) % 256;        
  37.                         LowTH = (65536-11059200/12/freq*(100-dc)/100) / 256;//設低脈沖初值
  38.                         LowTL = (65536-11059200/12/freq*(100-dc)/100) % 256;         
  39.                         ET0 = 1;                                                                                           //開啟定時器T0中斷

  40.                 }
  41.         }
  42. }
  43. void Big_Boomm() interrupt 4                        //串口中斷
  44. {
  45.         static unsigned char i;
  46.         if(RI)
  47.         {
  48.                 RI =0;
  49.                 s[i] = SBUF;                                          //接收數據到數組s[]
  50.                 if(s[i]=='V')
  51.                 {
  52.                         s[i] = '\0';
  53.                         i = 0;  
  54.                         flag = 1;                                          //接收結束,標志位flag置位
  55.                 }
  56.                 else
  57.                 i++;
  58.         }
  59. }
  60. /*定時器T0 PWM發生器*/
  61. void BoooM() interrupt 1                                //定時器T0中斷
  62. {
  63.         if(PWM==1)
  64.         {
  65.                 TH0=LowTH;
  66.                 TL0=LowTL;
  67.                 PWM = 0;
  68.         }
  69.         else
  70.         {
  71.                 TH0=HighTH;
  72.                 TL0=HighTL;
  73.                 PWM = 1;
  74.         }
  75. }
復制代碼

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91黄色免费看 | 国产在线精品一区二区 | h在线播放 | 成人一区二区三区 | 欧美亚洲另类在线 | 福利视频网站 | 黑人久久 | 亚洲精品一区二区三区中文字幕 | 亚洲有码转帖 | 日日干天天干 | 国产精品伦一区二区三级视频 | a级在线免费观看 | 亚洲精品区 | 五月花丁香婷婷 | 国产一区二区三区四区 | 日韩欧美电影在线 | 中文字幕在线免费 | 成人精品一区亚洲午夜久久久 | 黄色精品 | 国产丝袜一区二区三区免费视频 | 日本精品视频在线观看 | 狠狠的干| 国产欧美视频一区二区 | 欧美精品一区二区三区在线播放 | 在线观看国产视频 | 日韩免费视频一区二区 | 午夜影院| 国产精品久久久久久久久图文区 | 国产一区二区日韩 | www视频在线观看 | 羞羞网站在线观看 | 人人干在线视频 | 欧美性生活一区二区三区 | 国产午夜精品久久久 | 色播av| 中文字幕一区在线 | 日韩欧美国产一区二区 | 激情免费视频 | 风间由美一区二区三区在线观看 | 一区二区在线免费观看 | 欧美日韩亚洲三区 |