count_one_bit

#include<stdio.h>
int count_one_bit(unsigned value)
{
	int ones;
	for( ones=0; value!=0; value=value>>1 )//移位是最好的除法
		if( value%2!=0 )
			ones=ones+1;
		//return ones;
		printf("%d",ones);
		return 0;
}

int main()
{
	count_one_bit(10);
	return 0;
}

解释这段代码:module e_one_mux( input clk_in, input mb_clk_en, //2048khz input [7:0] l_nrz_data1, //ʱ϶1ӳ�����źţ�8bit�������� input [7:0] l_nrz_data2, //ʱ϶2ӳ�����źţ�8bit�������� input [7:0] l_nrz_data3, //ʱ϶13ӳ�����źţ�8bit�������� output reg e_one_data, //֡�ź����� output reg e_one_fs, //֡�źű�־ output reg test1, output reg test2, output reg test3, output reg test4 ); /////////////////////////////////////////////////////////////////////////////////////// //1֡��32��ʱ϶��ÿʱ϶8bit,ÿ֡256bit // // reg [7:0] data1_reg; reg [7:0] data2_reg; reg [7:0] data3_reg; reg [255:0] e_one_data_reg; reg [7:0] count; wire [7:0] sync_code; assign sync_code = 8'h72; //8'b0111_0010 reg e_one_fs_1bs; always@(posedge clk_in) begin if(e_one_fs_1bs ==1) begin data1_reg <= l_nrz_data1; data2_reg <= l_nrz_data2; data3_reg <= l_nrz_data3; end if(mb_clk_en ==1) begin count <= count + 1'b1; //256��BITΪ���� if(count == 0) begin e_one_fs_1bs <= 1'b1; //ÿ256��bit����1�α�־ end else begin e_one_fs_1bs <= 1'b0; end if(e_one_fs_1bs == 1'b1) begin //ÿ256��bit����һ������ e_one_data_reg <= {sync_code,data1_reg,data2_reg,data3_reg,112'b0,112'h0}; end else begin e_one_data_reg <= {e_one_data_reg[254:0],1'b0}; end e_one_data <= e_one_data_reg[255]; end if(mb_clk_en ==1) begin if(e_one_fs_1bs) begin e_one_fs <= 1'b1; end else begin e_one_fs <= 1'b0; end end else begin e_one_fs <= 1'b0; end end ////////////////////////////////////////////////////////////////// always@(posedge clk_in) begin if(mb_clk_en ==1) begin test1 <= e_one_fs_1bs; test2 <= test1; test3 <= 1'b0; test4 <= 1'b0; end end endmodule
05-30
#include <reg51.h> /************************** * 引脚定义(严格对应Proteus图) **************************/ // P0口:数码管段选(共阴数码管,直接接P0) #define SEG_PORT P0 // P2口:数码管位选 + 红绿灯控制 sbit BIT_NORTH = P2^0; // 北侧数码管位选 sbit BIT_SOUTH = P2^1; // 南侧数码管位选 sbit BIT_WEST = P2^2; // 西侧数码管位选 sbit BIT_EAST = P2^3; // 东侧数码管位选 // P1口:红绿灯控制(对应Proteus图的LED引脚) sbit LED_NORTH_RED = P1^3; sbit LED_NORTH_YELLOW= P1^4; sbit LED_NORTH_GREEN = P1^5; sbit LED_SOUTH_RED = P1^3; sbit LED_SOUTH_YELLOW= P1^4; sbit LED_SOUTH_GREEN = P1^5; sbit LED_WEST_RED = P1^2; sbit LED_WEST_YELLOW = P1^1; sbit LED_WEST_GREEN = P1^0; // 注意:Proteus图中西侧绿灯可能接P3口,需确认! sbit LED_EAST_RED = P1^2; sbit LED_EAST_YELLOW = P1^1; sbit LED_EAST_GREEN = P1^0; /************************** * 数码管段选表(共阴数码管) * 0~9的段选码,直接对应P0口输出 **************************/ unsigned char code SEG_TABLE[] = { 0x3F, // 0 0x06, // 1 0x5B, // 2 0x4F, // 3 0x66, // 4 0x6D, // 5 0x7D, // 6 0x07, // 7 0x7F, // 8 0x6F // 9 }; /************************** * 延时函数(1ms延时,适配12MHz晶振) **************************/ void Delay_ms(unsigned int ms) { unsigned int i, j; for(i=0; i<ms; i++) for(j=0; j<120; j++); // 12MHz晶振下约1ms延时 } /************************** * 单个数码管显示函数 * bit_sel:选择哪个数码管(NORTH/SOUTH/WEST/EAST) * num:要显示的数字(0~9) **************************/ void Display_One(unsigned char bit_sel, unsigned char num) { SEG_PORT = SEG_TABLE[num]; // 输出段选码 // 选通对应位选引脚 switch(bit_sel) { case 0: BIT_NORTH = 0; break; case 1: BIT_SOUTH = 0; break; case 2: BIT_WEST = 0; break; case 3: BIT_EAST = 0; break; } Delay_ms(1); // 保持显示1ms SEG_PORT = 0x00; // 消影 // 关闭位选引脚 switch(bit_sel) { case 0: BIT_NORTH = 1; break; case 1: BIT_SOUTH = 1; break; case 2: BIT_WEST = 1; break; case 3: BIT_EAST = 1; break; } } /************************** * 两位数码管显示函数(处理倒计时) * 同时显示十位和个位 **************************/ void Display_Two(unsigned char bit_sel_high, unsigned char bit_sel_low, unsigned char num) { Display_One(bit_sel_high, num / 10); // 十位 Display_One(bit_sel_low, num % 10); // 个位 } /************************** * 红绿灯主逻辑函数 * 实现:南北绿灯30秒 → 黄灯3秒 → 红灯30秒 * 东西红灯30秒 → 绿灯30秒 → 黄灯3秒 **************************/ void TrafficLight_Logic() { unsigned char count; // 1. 南北绿灯亮,东西红灯亮(30秒倒计时) LED_NORTH_GREEN = 1; LED_SOUTH_GREEN = 1; LED_WEST_RED = 1; LED_EAST_RED = 1; // 其他灯熄灭 LED_NORTH_RED = 0; LED_NORTH_YELLOW= 0; LED_SOUTH_RED = 0; LED_SOUTH_YELLOW= 0; LED_WEST_YELLOW = 0; LED_WEST_GREEN = 0; LED_EAST_YELLOW = 0; LED_EAST_GREEN = 0; for(count=30; count>0; count--) { // 南北数码管显示倒计时(北侧+南侧) Display_Two(0, 1, count); // 东西数码管显示倒计时(西侧+东侧) Display_Two(2, 3, count); Delay_ms(1000); // 1秒延时 } // 2. 南北黄灯亮(3秒过渡) LED_NORTH_GREEN = 0; LED_SOUTH_GREEN = 0; LED_NORTH_YELLOW= 1; LED_SOUTH_YELLOW= 1; for(count=3; count>0; count--) { Display_Two(0, 1, count); Display_Two(2, 3, count); Delay_ms(1000); } LED_NORTH_YELLOW= 0; LED_SOUTH_YELLOW= 0; // 3. 南北红灯亮,东西绿灯亮(30秒倒计时) LED_NORTH_RED = 1; LED_SOUTH_RED = 1; LED_WEST_GREEN = 1; LED_EAST_GREEN = 1; // 其他灯熄灭 LED_NORTH_GREEN = 0; LED_NORTH_YELLOW= 0; LED_SOUTH_GREEN = 0; LED_SOUTH_YELLOW= 0; LED_WEST_RED = 0; LED_WEST_YELLOW = 0; LED_EAST_RED = 0; LED_EAST_YELLOW = 0; for(count=30; count>0; count--) { Display_Two(0, 1, count); Display_Two(2, 3, count); Delay_ms(1000); } // 4. 东西黄灯亮(3秒过渡) LED_WEST_GREEN = 0; LED_EAST_GREEN = 0; LED_WEST_YELLOW = 1; LED_EAST_YELLOW = 1; for(count=3; count>0; count--) { Display_Two(0, 1, count); Display_Two(2, 3, count); Delay_ms(1000); } LED_WEST_YELLOW = 0; LED_EAST_YELLOW = 0; } /************************** * 主函数 **************************/ void main() { // 初始化:所有位选引脚置高(关闭数码管) BIT_NORTH = 1; BIT_SOUTH = 1; BIT_WEST = 1; BIT_EAST = 1; // 初始化:所有灯熄灭 P1 = 0x00; P3 = 0x00; while(1) { TrafficLight_Logic(); // 循环执行红绿灯逻辑 } }
最新发布
06-11
### ESP32 OneShot 读取示例代码 对于ESP32上的OneShot模式,通常用于精确的时间测量或事件触发。下面是一个简单的例子来展示如何配置并使用定时器的OneShot模式。 #### 配置和初始化定时器 ```cpp #include "driver/timer.h" #define ONE_SHOT_TIMER_GROUP TIMER_GROUP_0 #define ONE_SHOT_TIMER_INDEX TIMER_0 void setup_one_shot_timer() { /* 初始化定时器 */ timer_config_t config = { .divider = 80, .counter_dir = TIMER_COUNT_UP, .counter_en = TIMER_PAUSE, .alarm_en = TIMER_ALARM_EN, .auto_reload = false }; timer_init(ONE_SHOT_TIMER_GROUP, ONE_SHOT_TIMER_INDEX, &config); } ``` 此部分设置了一个基于硬件的计数器,该计数器将以指定频率运行,并且当达到预设值时会触发中断[^1]。 #### 设置报警时间并启动定时器 ```cpp void start_one_shot_timer(uint64_t alarm_value) { // 加载警报值到定时器中 timer_set_alarm_value(ONE_SHOT_TIMER_GROUP, ONE_SHOT_TIMER_INDEX, alarm_value); // 启用定时器的警报功能 timer_enable_intr(ONE_SHOT_TIMER_GROUP, ONE_SHOT_TIMER_INDEX); // 开始计数 timer_start(ONE_SHOT_TIMER_GROUP, ONE_SHOT_TIMER_INDEX); } // 假设我们希望在大约1秒后触发一次性的动作,则可以这样调用函数: start_one_shot_timer((uint64_t)(80 * 1e6)); // 一秒等于80M ticks ``` 这段代码展示了如何设定一个特定的时间间隔,在这个案例里是一秒钟之后触发一次性操作。通过调整`alarm_value`参数,可以根据实际需求改变延迟时间。 #### 中断处理程序 为了响应由定时器产生的中断信号,还需要定义相应的ISR(Interrupt Service Routine)。这里提供了一个基本框架: ```cpp static void IRAM_ATTR oneshot_isr_handler(void* arg) { uint32_t intr_status = TIMGn_INT_ST_TIMERS; if (intr_status & BIT(TIMER_0)) { // 清除中断标志位 TIMERG0.int_clr_timers.t0 = 1; // 执行想要完成的任务... // 如果需要再次启用定时器,记得重新加载新的警报值并重启它。 // start_one_shot_timer(new_alarm_value); } } // 注册中断服务例程 timer附着回调函数(oneshot_isr_handler, NULL); // 确保使能全局中断 portENABLE_INTERRUPTS(); ``` 上述片段说明了怎样编写一个能够捕捉来自定时器中断的服务程序,并执行必要的清理工作以及任何其他期望的操作。请注意,所有这些都应在IRAM属性下实现以确保性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值