電路圖.JPG (42.22 KB, 下載次數: 103)
下載附件
2022-10-24 19:47 上傳
自制定時亮燈裝置。單片機程序如下。
- // Target : M16
- // Crystal: 12.000Mhz
- #include <iom16v.h>
- #include <macros.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define mclk 1000000
- //12000000
- //8000000
- #pragma interrupt_handler uart_rx:12
- #define key_port PORTD
- #define key_port_ddr DDRD
- #define key_port_pin PIND
- uchar WENZI1[]="JIESHOUDAOD: ...."; //WENZI1
- uchar WENZI2[]="receiving ... ..."; //WENZI2
- uint FASONGSHUZU[10]; //SHUJU1
- uint x=9;
- uchar temn,count;
- uchar temtab;
- long int i,w,e;
- long int jd,k,sz;
- int g,s;
- uchar rdata,flag=0;//baocun jieshoudao d shuju
- void delay (uint ms)
- {
- uint i,j;
- for(i=0;i<ms;i++)
- {
- for (j=0;j<1141;j++);
- }
- }
- void DelaymS (uint i)
- {
- uint j;
- for(;i!=0;i--)
- {
- for (j=20;j!=0;j--);
- }
- }
- void uart_init(uint baud)
- {
- PORTA = 0x00;
- DDRA = 0x01;
- UCSRB=0X00;
- UCSRA=0X00;//
- UCSRC=(1<<URSEL)|(0<<UPM0)|(3<<UCSZ0);//選擇UCSRC,異步模式,禁止校驗,1位停止位,8為數據位。
- baud=mclk/16/baud-1;
- UBRRL=baud;
- UBRRH=baud>>8;
- UCSRB=(1<<TXEN)|(1<<RXEN)|(1<<RXCIE);//接收、發送使能,接收中斷使能。
- SREG=BIT(7);
- DDRD = 0x3F;//portd6輸入,其他輸出,顯示程序//pd7shuru
- DDRB = 0XFF; //輸出,顯示程序
- //DDRD|=0X02;//配置pd1,TXD為輸出,通信
- DDRC = 0xFF;//配置C為輸出,通信
- }
- void uart_rx()
- {
- UCSRB&=~BIT(RXCIE);//jieshou zhongduan guanbi ,
- rdata=UDR;
- flag=1;
- UCSRB|=BIT(RXCIE);//DAKAI JIESHOU ZHOGNDUAN HANSHU
- }
- void uart_sendB(uchar data)
- {
- while(!(UCSRA&(BIT(UDRE))));//di5wei=1;DENGDAI JICUNQI WEIKONG
- UDR=data;
- while(!UCSRA&(BIT(TXC)));//fasong jieshu
- UCSRA|=BIT(TXC);
- }
- void write_com(uchar com)
- {
- PORTD &= ~BIT(4);
- PORTD &= ~BIT(5); //KONGZHIKOU,PD4,5,3 為RS,R/W,EA。數據位為PB口
- PORTB = com; //SHUJUKOU
- PORTD |= BIT(3); //
- delay(1);
- PORTD &= ~BIT(3); //
- }
- void write_data(uchar data)
- {
- PORTD |= BIT(4);
- PORTD &= ~BIT(5);
- PORTB = data;
- PORTD |= BIT(3); //
- delay(1);
- PORTD &= ~BIT(3);//
- }
- void shujuchuli(long int count)
- {
- uint i,j1,j2,j3,j4,j5,j6;
- count=count%100000;
- j1=count/100000;
- j2=count/10000;count=count%10000; //小數點后第一位 + '0'
- j3=count/1000;count=count%1000; //小數點后第一位 + '0'
- j4=count/100;count=count%100;
- j5=count/10;count=count%10;
- j6=count;
- FASONGSHUZU[0]=j1+0x30;
- FASONGSHUZU[1]=j2+0x30;
- FASONGSHUZU[2]=j3+0x30;
- FASONGSHUZU[3]=j4+0x30;
- FASONGSHUZU[4]=j5+0x30;
- FASONGSHUZU[5]=j6+0x30;
- }
- void xianshi1(uchar tab)
- {
- uint i;
- write_com(0X38);
- delay(5);
- write_com(0X01);
- delay(5);
- write_com(0X0C);
- delay(5);
- write_com(0X06);
- delay(5);
- write_com(0X80+0);
- delay(5);
- for(i=0;i<16;i++)
- {
- write_data(WENZI1[i]);
- delay(5);
- }
- }
- void DISSHUJU(uint num)
- {
- uint i;
- write_com(0X80+0X40);
- delay(5);
- for(i=0;i<6;i++)
- {
- write_data(FASONGSHUZU[i]);
- delay(5);
- }
- }
- void xianshi2(uchar tab)
- {
- uint i;
- write_com(0X38);
- delay(5);
- write_com(0X01);
- delay(5);
- write_com(0X0C);
- delay(5);
- write_com(0X06);
- delay(5);
- write_com(0X80+0);
- delay(5);
- for(i=0;i<16;i++)
- {
- write_data(WENZI2[i]);
- delay(5);
- }
- }
- void YANSHIMIN(uint i)
- {
- uint j;
- for(;i!=0;i--)
- {
- for (j=60;j!=0;j--)
- {
- DelaymS (5000);
- DelaymS (5000);
- }
- }
- }
- //************************main***********************
- void main (void) //程序主函數
- {
- uint k,i=8;
- uint j=20;
- unsigned char tem;
- uart_init(1200);//初始化端口。同時打開串口?山邮沾跀祿
- //uart_sendB(i);
- //delay(10);
- //uart_sendB(j);
- //delay(10);
- DelaymS (5000);
- PORTA=0X00;//DENGMIE
- DelaymS (5000);
- PORTA=0XFF;//DENGMIE
- //以下,接收按鍵調整延時時間
- PORTD=PORTD|0X80;//ZHI 1,pd7
- for(j;j!=0;j--)
- {
-
- tem=key_port_pin&0x80;
- if( tem==0x00)
- i=i++;
- DelaymS (5000);
- }
-
- //以下,顯示,延時
- xianshi1(WENZI1[i]);
- for(i;i!=0;i--)
- {
- PORTA=0XFF;//DENGMIE
- xianshi2(WENZI2[i]);
- shujuchuli(i);
- xianshi1(WENZI1[i]);
- DISSHUJU(FASONGSHUZU[i]);
- DelaymS (5000);
-
- YANSHIMIN(60);
-
-
-
- }
- PORTA=0X00;//
- DelaymS (5000);
-
- }
復制代碼 |